diff --git a/src/cloudron.js b/src/cloudron.js index 53373387b..1b27240bd 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -33,11 +33,9 @@ var apps = require('./apps.js'), debug = require('debug')('box:cloudron'), domains = require('./domains.js'), eventlog = require('./eventlog.js'), - custom = require('./custom.js'), fs = require('fs'), mail = require('./mail.js'), notifications = require('./notifications.js'), - os = require('os'), path = require('path'), paths = require('./paths.js'), platform = require('./platform.js'), @@ -136,7 +134,7 @@ function getConfig(callback) { isDemo: settings.isDemo(), provider: settings.provider(), cloudronName: allSettings[settings.CLOUDRON_NAME_KEY], - uiSpec: custom.uiSpec() + footer: allSettings[settings.FOOTER_KEY] }); }); } diff --git a/src/custom.js b/src/custom.js deleted file mode 100644 index a6746cc47..000000000 --- a/src/custom.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -let debug = require('debug')('box:custom'), - lodash = require('lodash'), - paths = require('./paths.js'), - safe = require('safetydance'), - yaml = require('js-yaml'); - -exports = module.exports = { - uiSpec: uiSpec, - spec: spec -}; - -const DEFAULT_SPEC = { - footer: { - body: '© 2020 [Cloudron](https://cloudron.io) [Forum ](https://forum.cloudron.io)' - } -}; - -const gSpec = (function () { - try { - if (!safe.fs.existsSync(paths.CUSTOM_FILE)) return DEFAULT_SPEC; - const c = yaml.safeLoad(safe.fs.readFileSync(paths.CUSTOM_FILE, 'utf8')); - return lodash.merge({}, DEFAULT_SPEC, c); - } catch (e) { - debug(`Error loading features file from ${paths.CUSTOM_FILE} : ${e.message}`); - return DEFAULT_SPEC; - } -})(); - -// flags sent to the UI. this is separate because we have values that are secret to the backend -function uiSpec() { - return gSpec; -} - -function spec() { - return gSpec; -} diff --git a/src/paths.js b/src/paths.js index dcab2e592..43d52b132 100644 --- a/src/paths.js +++ b/src/paths.js @@ -23,8 +23,6 @@ exports = module.exports = { APPS_DATA_DIR: path.join(baseDir(), 'appsdata'), BOX_DATA_DIR: path.join(baseDir(), 'boxdata'), - CUSTOM_FILE: path.join(baseDir(), 'boxdata/custom.yml'), - ACME_CHALLENGES_DIR: path.join(baseDir(), 'platformdata/acme'), ADDON_CONFIG_DIR: path.join(baseDir(), 'platformdata/addons'), COLLECTD_APPCONFIG_DIR: path.join(baseDir(), 'platformdata/collectd/collectd.conf.d'), diff --git a/src/routes/settings.js b/src/routes/settings.js index 47df4ddae..9949ab68b 100644 --- a/src/routes/settings.js +++ b/src/routes/settings.js @@ -97,6 +97,26 @@ function setTimeZone(req, res, next) { }); } +function getFooter(req, res, next) { + settings.getFooter(function (error, footer) { + if (error) return next(BoxError.toHttpError(error)); + + next(new HttpSuccess(200, { footer })); + }); +} + +function setFooter(req, res, next) { + assert.strictEqual(typeof req.body, 'object'); + + if (typeof req.body.footer !== 'string') return next(new HttpError(400, 'footer is required')); + + settings.setFooter(req.body.footer, function (error) { + if (error) return next(BoxError.toHttpError(error)); + + next(new HttpSuccess(200, {})); + }); +} + function setCloudronAvatar(req, res, next) { assert.strictEqual(typeof req.files, 'object'); @@ -306,6 +326,8 @@ function get(req, res, next) { case settings.TIME_ZONE_KEY: return getTimeZone(req, res, next); case settings.CLOUDRON_NAME_KEY: return getCloudronName(req, res, next); + case settings.FOOTER_KEY: return getFooter(req, res, next); + case settings.CLOUDRON_AVATAR_KEY: return getCloudronAvatar(req, res, next); default: return next(new HttpError(404, 'No such setting')); @@ -329,6 +351,8 @@ function set(req, res, next) { case settings.TIME_ZONE_KEY: return setTimeZone(req, res, next); case settings.CLOUDRON_NAME_KEY: return setCloudronName(req, res, next); + case settings.FOOTER_KEY: return setFooter(req, res, next); + case settings.CLOUDRON_AVATAR_KEY: return setCloudronAvatar(req, res, next); default: return next(new HttpError(404, 'No such setting')); diff --git a/src/settings.js b/src/settings.js index a2d2a18ca..6583321d2 100644 --- a/src/settings.js +++ b/src/settings.js @@ -46,6 +46,9 @@ exports = module.exports = { getSysinfoConfig: getSysinfoConfig, setSysinfoConfig: setSysinfoConfig, + getFooter: getFooter, + setFooter: setFooter, + provider: provider, getAll: getAll, @@ -91,6 +94,8 @@ exports = module.exports = { ADMIN_FQDN_KEY: 'admin_fqdn', PROVIDER_KEY: 'provider', + FOOTER_KEY: 'footer', + // blobs CLOUDRON_AVATAR_KEY: 'cloudron_avatar', // not stored in db but can be used for locked flag @@ -150,6 +155,8 @@ let gDefaults = (function () { result[exports.WEB_SERVER_ORIGIN_KEY] = 'https://cloudron.io'; result[exports.DEMO_KEY] = false; + result[exports.FOOTER_KEY] = '© 2020 [Cloudron](https://cloudron.io) [Forum ](https://forum.cloudron.io)'; + return result; })(); @@ -661,6 +668,30 @@ function setApiServerOrigin(origin, callback) { }); } +function getFooter(callback) { + assert.strictEqual(typeof callback, 'function'); + + settingsdb.get(exports.FOOTER_KEY, function (error, value) { + if (error && error.reason === BoxError.NOT_FOUND) return callback(null, gDefaults[exports.FOOTER_KEY]); + if (error) return callback(error); + + callback(null, value); + }); +} + +function setFooter(footer, callback) { + assert.strictEqual(typeof footer, 'string'); + assert.strictEqual(typeof callback, 'function'); + + settingsdb.set(exports.FOOTER_KEY, footer, function (error) { + if (error) return callback(error); + + notifyChange(exports.FOOTER_KEY, footer); + + callback(null); + }); +} + function provider() { return gCache.provider; } function apiServerOrigin() { return gCache.apiServerOrigin; } function webServerOrigin() { return gCache.webServerOrigin; }