Files
cloudron-box/src/settings.js

217 lines
6.7 KiB
JavaScript
Raw Normal View History

'use strict';
exports = module.exports = {
2020-08-15 18:19:01 -07:00
initCache,
// these values come from the cache
2020-08-15 18:19:01 -07:00
apiServerOrigin,
webServerOrigin,
consoleServerOrigin,
2021-05-05 12:29:04 -07:00
dashboardDomain,
setDashboardLocation,
setMailLocation,
mailFqdn,
mailDomain,
2021-05-05 12:29:04 -07:00
dashboardOrigin,
dashboardFqdn,
get,
set,
getJson,
setJson,
getBlob,
setBlob,
2021-09-20 18:04:01 +02:00
// booleans. if you add an entry here, be sure to fix list()
2017-01-02 13:05:48 +01:00
DYNAMIC_DNS_KEY: 'dynamic_dns',
2021-09-20 18:04:01 +02:00
// json. if you add an entry here, be sure to fix list()
2015-11-07 18:02:45 -08:00
BACKUP_CONFIG_KEY: 'backup_config',
BACKUP_POLICY_KEY: 'backup_policy',
SERVICES_CONFIG_KEY: 'services_config',
EXTERNAL_LDAP_KEY: 'external_ldap_config',
DIRECTORY_SERVER_KEY: 'directory_server_config',
2019-10-22 22:07:44 -07:00
REGISTRY_CONFIG_KEY: 'registry_config',
IPV4_CONFIG_KEY: 'ipv4_config',
2020-02-05 14:30:56 -08:00
SUPPORT_CONFIG_KEY: 'support_config',
PROFILE_CONFIG_KEY: 'profile_config',
2021-09-20 13:05:42 +02:00
GHOSTS_CONFIG_KEY: 'ghosts_config',
REVERSE_PROXY_CONFIG_KEY: 'reverseproxy_config',
2022-02-15 13:12:34 -08:00
IPV6_CONFIG_KEY: 'ipv6_config',
// strings
AUTOUPDATE_PATTERN_KEY: 'autoupdate_pattern',
TIME_ZONE_KEY: 'time_zone',
2023-08-02 20:01:29 +05:30
OIDC_COOKIE_SECRET_KEY: 'cookie_secret',
CLOUDRON_NAME_KEY: 'cloudron_name',
2020-11-17 18:58:43 +01:00
LANGUAGE_KEY: 'language',
2019-04-30 22:57:43 -07:00
CLOUDRON_ID_KEY: 'cloudron_id',
APPSTORE_API_TOKEN_KEY: 'appstore_api_token',
APPSTORE_WEB_TOKEN_KEY: 'appstore_web_token',
FIREWALL_BLOCKLIST_KEY: 'firewall_blocklist',
TRUSTED_IPS_KEY: 'trusted_ips_key',
2019-07-25 11:16:52 -07:00
API_SERVER_ORIGIN_KEY: 'api_server_origin',
WEB_SERVER_ORIGIN_KEY: 'web_server_origin',
CONSOLE_SERVER_ORIGIN_KEY: 'console_server_origin',
2021-05-05 12:29:04 -07:00
DASHBOARD_DOMAIN_KEY: 'admin_domain',
DASHBOARD_FQDN_KEY: 'admin_fqdn',
MAIL_DOMAIN_KEY: 'mail_domain',
MAIL_FQDN_KEY: 'mail_fqdn',
2019-07-25 11:16:52 -07:00
FOOTER_KEY: 'footer',
// blobs
CLOUDRON_AVATAR_KEY: 'cloudron_avatar',
// testing
_setApiServerOrigin: setApiServerOrigin,
2021-08-19 13:24:38 -07:00
_clear: clear,
_set: set
};
const assert = require('assert'),
database = require('./database.js'),
debug = require('debug')('box:settings'),
2023-08-04 11:24:28 +05:30
safe = require('safetydance');
const SETTINGS_FIELDS = [ 'name', 'value' ].join(',');
const SETTINGS_BLOB_FIELDS = [ 'name', 'valueBlob' ].join(',');
2021-08-19 13:24:38 -07:00
const gDefaults = (function () {
2021-08-31 08:47:01 -07:00
const result = { };
2021-05-05 12:29:04 -07:00
result[exports.DASHBOARD_DOMAIN_KEY] = '';
result[exports.DASHBOARD_FQDN_KEY] = '';
result[exports.MAIL_DOMAIN_KEY] = '';
result[exports.MAIL_FQDN_KEY] = '';
result[exports.API_SERVER_ORIGIN_KEY] = 'https://api.cloudron.io';
result[exports.WEB_SERVER_ORIGIN_KEY] = 'https://cloudron.io';
result[exports.CONSOLE_SERVER_ORIGIN_KEY] = 'https://console.cloudron.io';
return result;
})();
let gCache = {};
async function get(key) {
assert.strictEqual(typeof key, 'string');
const result = await database.query(`SELECT ${SETTINGS_FIELDS} FROM settings WHERE name = ?`, [ key ]);
if (result.length === 0) return null; // can't return the default value here because we might need to massage/json parse the result
return result[0].value;
}
async function set(key, value) {
assert.strictEqual(typeof key, 'string');
assert(value === null || typeof value === 'string');
await database.query('INSERT INTO settings (name, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value=VALUES(value)', [ key, value ]); // don't rely on affectedRows here since it gives 2
}
async function getJson(key) {
assert.strictEqual(typeof key, 'string');
return safe.JSON.parse(await get(key));
}
async function setJson(key, value) {
assert.strictEqual(typeof key, 'string');
assert.strictEqual(typeof value, 'object'); // can be null
await set(key, value ? JSON.stringify(value) : null);
}
async function getBlob(key) {
assert.strictEqual(typeof key, 'string');
const result = await database.query(`SELECT ${SETTINGS_BLOB_FIELDS} FROM settings WHERE name = ?`, [ key ]);
if (result.length === 0) return null;
return result[0].valueBlob;
}
async function setBlob(key, value) {
assert.strictEqual(typeof key, 'string');
assert(value === null || Buffer.isBuffer(value));
await database.query('INSERT INTO settings (name, valueBlob) VALUES (?, ?) ON DUPLICATE KEY UPDATE valueBlob=VALUES(valueBlob)', [ key, value ]); // don't rely on affectedRows here since it gives 2
}
async function clear() {
await database.query('DELETE FROM settings');
}
async function list() {
const settings = await database.query(`SELECT ${SETTINGS_FIELDS} FROM settings WHERE value IS NOT NULL ORDER BY name`);
const result = Object.assign({}, gDefaults);
settings.forEach(function (setting) { result[setting.name] = setting.value; });
// convert booleans
result[exports.DEMO_KEY] = !!result[exports.DEMO_KEY];
return result;
}
async function initCache() {
debug('initCache: pre-load settings');
const allSettings = await list();
gCache = {
apiServerOrigin: allSettings[exports.API_SERVER_ORIGIN_KEY],
webServerOrigin: allSettings[exports.WEB_SERVER_ORIGIN_KEY],
consoleServerOrigin: allSettings[exports.CONSOLE_SERVER_ORIGIN_KEY],
dashboardDomain: allSettings[exports.DASHBOARD_DOMAIN_KEY],
dashboardFqdn: allSettings[exports.DASHBOARD_FQDN_KEY],
mailDomain: allSettings[exports.MAIL_DOMAIN_KEY],
mailFqdn: allSettings[exports.MAIL_FQDN_KEY],
};
}
// this is together so we can do this in a transaction later
2021-08-19 13:24:38 -07:00
async function setDashboardLocation(dashboardDomain, dashboardFqdn) {
assert.strictEqual(typeof dashboardDomain, 'string');
2021-05-05 12:29:04 -07:00
assert.strictEqual(typeof dashboardFqdn, 'string');
2021-08-19 13:24:38 -07:00
await set(exports.DASHBOARD_DOMAIN_KEY, dashboardDomain);
await set(exports.DASHBOARD_FQDN_KEY, dashboardFqdn);
2021-08-19 13:24:38 -07:00
gCache.dashboardDomain = dashboardDomain;
gCache.dashboardFqdn = dashboardFqdn;
}
2021-08-19 13:24:38 -07:00
async function setMailLocation(mailDomain, mailFqdn) {
assert.strictEqual(typeof mailDomain, 'string');
assert.strictEqual(typeof mailFqdn, 'string');
2021-08-19 13:24:38 -07:00
await set(exports.MAIL_DOMAIN_KEY, mailDomain);
await set(exports.MAIL_FQDN_KEY, mailFqdn);
2021-08-19 13:24:38 -07:00
gCache.mailDomain = mailDomain;
gCache.mailFqdn = mailFqdn;
}
2021-08-19 13:24:38 -07:00
async function setApiServerOrigin(origin) {
assert.strictEqual(typeof origin, 'string');
2021-08-19 13:24:38 -07:00
await set(exports.API_SERVER_ORIGIN_KEY, origin);
2021-08-19 13:24:38 -07:00
gCache.apiServerOrigin = origin;
}
function apiServerOrigin() { return gCache.apiServerOrigin; }
function webServerOrigin() { return gCache.webServerOrigin; }
function consoleServerOrigin() { return gCache.consoleServerOrigin; }
2021-05-05 12:29:04 -07:00
function dashboardDomain() { return gCache.dashboardDomain; }
function dashboardFqdn() { return gCache.dashboardFqdn; }
function mailDomain() { return gCache.mailDomain; }
function mailFqdn() { return gCache.mailFqdn; }
2021-05-05 12:29:04 -07:00
function dashboardOrigin() { return 'https://' + dashboardFqdn(); }