Files
Foundry-VTT-Docker/resources/app/dist/server/views/setup.mjs
2025-01-04 00:34:03 +01:00

1 line
5.0 KiB
JavaScript

import path from"node:path";import{expandObject,getRoute,isEmpty}from"../../../common/utils/helpers.mjs";import{PASSWORD_SAFE_STRING}from"../../../common/constants.mjs";import*as util from"../../../common/utils/helpers.mjs";import View from"./view.mjs";import sessions from"../../sessions.mjs";import{World,System,Module}from"../../packages/_module.mjs";import*as packages from"../../packages/views.mjs";import Files from"../../files/files.mjs";import S3FileStorage from"../../files/s3.mjs";export default class SetupView extends View{route="/setup";socket="getSetupData";_template="setup";_methods=["get","post"];async handleGet(e,a){if(config.license.needsSignature)return a.redirect(`${e.baseUrl}/license`);if(global.game.world)return e.user?a.redirect(`${e.baseUrl}/game`):a.redirect(`${e.baseUrl}/join`);if(!sessions.authenticateAdmin(e,a).success)return a.redirect(`${e.baseUrl}/auth`);const s=View._getStaticContent({setup:!0}),t={layout:"setup",bodyClass:["setup","auth","flexcol",`theme-${config.options.cssTheme}`].join(" "),messages:sessions.getMessages(e,{clear:!0}),requireAuth:!1,scripts:s.scripts,styles:s.styles};a.render(this._template,t)}async handlePost(e,a){let s={};const{game:t}=global,o=util.getRoute("setup"),r=e.body.action,i=sessions.authenticateAdmin(e,a);let c=!t.world&&i.success;if(t.world){if(e.body.shutdown)return await sessions.logoutWorld(e,a),s=await t.world.deactivate(e,{asAdmin:c}),a.redirect(s.redirect);const o=await db.User.get(e.user);if("editWorld"===r&&o?.hasRole("GAMEMASTER")){try{s=World.update(e.body)}catch(e){s={error:e.message,stack:e.stack}}return a.json(s)}}if(!c)return a.status(403),a.json({error:"You lack server administrator permission to submit this request."});try{switch(r){case"adminLogout":sessions.logoutAdmin(e,a),s={redirect:o};break;case"adminConfigure":s=await this.updateServerConfiguration(e);break;case"checkPackage":s=await packages.checkPackage(e.body);break;case"getPackageFromRemoteManifest":s=await packages.getPackageFromRemoteManifest(e.body);break;case"getPackages":s=await packages.getPackages(e.body);break;case"installPackage":s=await packages.installPackage(e.body);break;case"resetPackages":s=await packages.resetPackages(e.body);break;case"uninstallPackage":s=await packages.uninstallPackage(e.body);break;case"lockPackage":s=await packages.lockPackage(e.body);break;case"migratePackageManifest":s=await packages.migratePackageManifest(e.body);break;case"manageModule":s=Module.createOrUpdate(e.body);break;case"createWorld":s=World.create(e.body);break;case"editWorld":s=World.update(e.body);break;case"launchWorld":s=World.launch(e.body.world);break;case"createBackup":s=packages.handleCreateBackups(e.body);break;case"createSnapshot":s=packages.handleCreateSnapshot(e.body);break;case"deleteBackup":s=packages.handleDeleteBackups(e.body);break;case"deleteSnapshot":s=packages.handleDeleteSnapshots(e.body);break;case"restoreBackup":s=packages.handleRestoreBackups(e.body);break;case"restoreSnapshot":s=packages.handleRestoreSnapshot(e.body);break;case"listBackups":s=global.packages.backups.listBackups();break;case"checkCreateSnapshotDiskSpace":s=await global.packages.backups.checkCreateSnapshotDiskSpace();break;case"checkRestoreSnapshotDiskSpace":s=await global.packages.backups.checkRestoreSnapshotDiskSpace(e.body.snapshotData);break;default:throw new Error(`Unsupported setup configuration action ${r} provided`)}}catch(e){s={error:e.message,stack:e.stack}}return s.redirect?a.redirect(e.baseUrl+s.redirect):a.json(s)}async handleSocket(e,a){const s=global.config;if(s.adminPassword&&!e.admin||game.world)return a({});const t=s.options.vend();return t.adminPassword=t.adminPassword?PASSWORD_SAFE_STRING:"",a({coreUpdate:await s.updater.checkCoreUpdateAvailability(),featuredContent:globalThis.game.featuredContent,files:s.files.getClientConfig(),isAdmin:e.admin,isSetup:!0,languages:Module.getCoreTranslationOptions(),modules:Module.getPackages().map((e=>e.vend())),news:globalThis.game.news,options:t,packageWarnings:globalThis.packages.warnings,release:global.release,systems:System.getPackages().map((e=>e.vend())),worlds:World.getPackages().map((e=>e.vend()))})}async updateServerConfiguration(e){const a=global.config.options,s=global.paths,t=!!e.session?.admin,o=null!==a.adminPassword;if(!(!game.active&&(t||!o)))throw new Error("You do not have permission to update the core application configuration");const r=expandObject(e.body).config;let i=!1;if("adminPassword"in r&&(a.setAdministratorPassword(r.adminPassword),delete r.adminPassword,i=!0),a.validate({changes:r,clean:!0,strict:!0}),r.awsConfig&&r.awsConfig!==a.awsConfig)try{S3FileStorage.fromConfig("s3",r.awsConfig)}catch(e){throw new Error(`The AWS configuration path ${r.awsConfig} did not provide a valid configuration.`)}const c=a.updateSource(r);if(!isEmpty(c)){i=!0;const e=c.dataPath?s.envOptions:s.options;a.save(e),c.dataPath&&(await Files.copyDirectory(s.config,path.join(c.dataPath,"Config"),{ignore:["options.json"]}),a.save(path.join(c.dataPath,"Config","options.json")))}return{restart:i,changes:c}}}