mirror of
https://github.com/HeyPuter/puter.git
synced 2026-01-05 04:30:33 -06:00
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:
@@ -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
|
||||
|
||||
16
src/backend/src/modules/domain/DomainModule.js
Normal file
16
src/backend/src/modules/domain/DomainModule.js
Normal 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 };
|
||||
26
src/backend/src/modules/domain/DomainVerificationService.js
Normal file
26
src/backend/src/modules/domain/DomainVerificationService.js
Normal 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,
|
||||
};
|
||||
21
src/backend/src/modules/domain/TXTVerifyService.js
Normal file
21
src/backend/src/modules/domain/TXTVerifyService.js
Normal 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,
|
||||
}
|
||||
Reference in New Issue
Block a user