dev: continue work on custom domains

Adds service for querying controlling user for a domain. If no user is
verified as allowed to control the domain then we give control to the
'admin' user (to support local configurations of Puter).

After this point, I find myself a bit stuck because DNS queries are
incredibly difficult to test locally when you use tailscale.
This commit is contained in:
KernelDeimos
2025-05-13 15:21:15 -04:00
committed by Neal Shah
parent 49b0805014
commit df602d5edb
4 changed files with 67 additions and 0 deletions

View File

@@ -39,6 +39,9 @@ const { InternetModule } = require("./src/modules/internet/InternetModule.js");
const { CaptchaModule } = require("./src/modules/captcha/CaptchaModule.js");
const { EntityStoreModule } = require("./src/modules/entitystore/EntityStoreModule.js");
const { KVStoreModule } = require("./src/modules/kvstore/KVStoreModule.js");
const { ExternalExtrasModule } = require("./src/modules/external-extras/ExternalExtrasModule.js");
const { FirebaseModule } = require("./src/modules/firebase/FirebaseModule.js");
const { DomainModule } = require("./src/modules/domain/DomainModule.js");
module.exports = {
helloworld: () => {
@@ -64,6 +67,7 @@ module.exports = {
CaptchaModule,
EntityStoreModule,
KVStoreModule,
DomainModule,
],
// Pre-built modules

View File

@@ -0,0 +1,16 @@
const { AdvancedBase } = require("@heyputer/putility");
class DomainModule extends AdvancedBase {
async install (context) {
const services = context.get('services');
const { DomainVerificationService } = require('./DomainVerificationService');
services.registerService('domain-verification', DomainVerificationService);
// TODO: enable flag
const { TXTVerifyService } = require('./TXTVerifyService');
services.registerService('__txt-verify', TXTVerifyService);
}
}
module.exports = { DomainModule };

View File

@@ -0,0 +1,26 @@
const { get_user } = require("../../helpers");
const BaseService = require("../../services/BaseService");
class DomainVerificationService extends BaseService {
async get_controlling_user ({ domain }) {
const svc_event = this.services.get('event');
// 1 :: Allow event listeners to verify domains
const event = {
domain,
user: undefined,
};
await svc_event.emit('domain.get-controlling-user', event);
if ( event.user ) {
return event.user;
}
// 2 :: If there is no controlling user, 'admin' is the
// controlling user.
return await get_user({ username: 'admin' });
}
}
module.exports = {
DomainVerificationService,
};

View File

@@ -0,0 +1,21 @@
const { get_user } = require("../../helpers");
const BaseService = require("../../services/BaseService");
class TXTVerifyService extends BaseService {
async _init () {
const require = this.require;
const dns = require('dns').promises;
const svc_event = this.services.get('event');
svc_event.on('domain.get-controlling-user', async (_, event) => {
let records = await dns.resolveTxt(`_puter-verify.${event.domain}`);
records = records.flat();
console.log('got records :: ', records);
})
}
}
module.exports = {
TXTVerifyService,
}