import * as plugins from '../../plugins.ts'; import type { OpsServer } from '../classes.opsserver.ts'; import * as interfaces from '../../../ts_interfaces/index.ts'; import { requireAdminIdentity } from '../helpers/guards.ts'; export class SettingsHandler { public typedrouter = new plugins.typedrequest.TypedRouter(); constructor(private opsServerRef: OpsServer) { this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter); this.registerHandlers(); } private getSettingsObject(): interfaces.data.ISettings { const db = this.opsServerRef.oneboxRef.database; const settingsMap = db.getAllSettings(); // Returns Record return { cloudflareToken: settingsMap['cloudflareToken'] || settingsMap['cloudflareAPIKey'] || '', cloudflareZoneId: settingsMap['cloudflareZoneId'] || '', autoRenewCerts: settingsMap['autoRenewCerts'] === 'true', renewalThreshold: parseInt(settingsMap['renewalThreshold'] || '30', 10), acmeEmail: settingsMap['acmeEmail'] || '', httpPort: parseInt(settingsMap['httpPort'] || '80', 10), httpsPort: parseInt(settingsMap['httpsPort'] || '443', 10), forceHttps: settingsMap['forceHttps'] === 'true', }; } private registerHandlers(): void { this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'getSettings', async (dataArg) => { await requireAdminIdentity(this.opsServerRef.adminHandler, dataArg); const settings = this.getSettingsObject(); return { settings }; }, ), ); this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'updateSettings', async (dataArg) => { await requireAdminIdentity(this.opsServerRef.adminHandler, dataArg); const db = this.opsServerRef.oneboxRef.database; const updates = dataArg.settings; // Store each setting as key-value pair for (const [key, value] of Object.entries(updates)) { if (value !== undefined) { if (key === 'cloudflareToken') { db.setSetting('cloudflareToken', String(value)); db.setSetting('cloudflareAPIKey', String(value)); } else { db.setSetting(key, String(value)); } } } const settings = this.getSettingsObject(); return { settings }; }, ), ); this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'setBackupPassword', async (dataArg) => { await requireAdminIdentity(this.opsServerRef.adminHandler, dataArg); this.opsServerRef.oneboxRef.database.setSetting('backup_encryption_password', dataArg.password); this.opsServerRef.oneboxRef.database.setSetting('backupPassword', dataArg.password); return { ok: true }; }, ), ); this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'getBackupPasswordStatus', async (dataArg) => { await requireAdminIdentity(this.opsServerRef.adminHandler, dataArg); const backupPassword = this.opsServerRef.oneboxRef.database.getSetting('backupPassword') || this.opsServerRef.oneboxRef.database.getSetting('backup_encryption_password'); const isConfigured = !!backupPassword; return { status: { isConfigured } }; }, ), ); } }