From c564a722f3ec6f3a035c962b5dc2d0ca0a09d3a2 Mon Sep 17 00:00:00 2001 From: Kasra Bigdeli Date: Sun, 24 Feb 2019 15:57:26 -0800 Subject: [PATCH] Added capability to change root domain forcefully --- src/datastore/AppsDataStore.ts | 20 ++++++++++++++++++-- src/routes/system/SystemRouter.ts | 2 +- src/user/ServiceManager.ts | 2 +- src/user/system/CaptainManager.ts | 10 ++++++++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/datastore/AppsDataStore.ts b/src/datastore/AppsDataStore.ts index ee52262..6659c91 100644 --- a/src/datastore/AppsDataStore.ts +++ b/src/datastore/AppsDataStore.ts @@ -6,6 +6,7 @@ import configstore = require('configstore') import Authenticator = require('../user/Authenticator') import { CaptainEncryptor } from '../utils/Encryptor' import { IBuiltImage } from '../models/IBuiltImage' +import Utils from '../utils/Utils' const isValidPath = require('is-valid-path') @@ -256,15 +257,30 @@ class AppsDataStore { }) } - enableSslForDefaultSubDomain(appName: string) { + setSslForDefaultSubDomain(appName: string, isEnabled: boolean) { const self = this return this.getAppDefinition(appName).then(function(app) { - app.hasDefaultSubDomainSsl = true + app.hasDefaultSubDomainSsl = !!isEnabled return self.saveApp(appName, app) }) } + ensureAllAppsSubDomainSslDisabled() { + const self = this + + return this.getAppDefinitions().then(function(appDefinitions) { + const promises: (() => Promise)[] = [] + Object.keys(appDefinitions).forEach(appName => { + const APP_NAME = appName + promises.push(function() { + return self.setSslForDefaultSubDomain(APP_NAME, false) + }) + }) + return Utils.runPromises(promises) + }) + } + enableCustomDomainSsl(appName: string, customDomain: string) { const self = this diff --git a/src/routes/system/SystemRouter.ts b/src/routes/system/SystemRouter.ts index 68182be..d1962e3 100644 --- a/src/routes/system/SystemRouter.ts +++ b/src/routes/system/SystemRouter.ts @@ -52,7 +52,7 @@ router.post('/changerootdomain/', function(req, res, next) { } CaptainManager.get() - .changeCaptainRootDomain(requestedCustomDomain) + .changeCaptainRootDomain(requestedCustomDomain, !!req.body.force) .then(function() { res.send( new BaseApi(ApiStatusCodes.STATUS_OK, 'Root domain changed.') diff --git a/src/user/ServiceManager.ts b/src/user/ServiceManager.ts index e4b57c2..6bc7309 100644 --- a/src/user/ServiceManager.ts +++ b/src/user/ServiceManager.ts @@ -260,7 +260,7 @@ class ServiceManager { .then(function() { return self.dataStore .getAppsDataStore() - .enableSslForDefaultSubDomain(appName) + .setSslForDefaultSubDomain(appName, true) }) .then(function() { return self.reloadLoadBalancer() diff --git a/src/user/system/CaptainManager.ts b/src/user/system/CaptainManager.ts index 8edaa59..98ff2bb 100644 --- a/src/user/system/CaptainManager.ts +++ b/src/user/system/CaptainManager.ts @@ -806,7 +806,7 @@ class CaptainManager { }) } - changeCaptainRootDomain(requestedCustomDomain: string) { + changeCaptainRootDomain(requestedCustomDomain: string, force: boolean) { const self = this // Some DNS servers do not allow wild cards. Therefore this line may fail. // We still allow users to specify the domains in their DNS settings individually @@ -827,17 +827,23 @@ class CaptainManager { }) .then(function(hasRootSsl) { if ( + !force && hasRootSsl && self.dataStore.getRootDomain() !== requestedCustomDomain ) { throw ApiStatusCodes.createError( ApiStatusCodes.STATUS_ERROR_GENERIC, - 'SSL is enabled for root. Too late to change your mind!' + 'SSL is enabled for root. You can still force change the root domain, but read docs for consequences!' ) } return self.dataStore.setCustomDomain(requestedCustomDomain) }) + .then(function() { + return self.dataStore + .getAppsDataStore() + .ensureAllAppsSubDomainSslDisabled() + }) .then(function() { return self.reloadLoadBalancer(self.dataStore) })