Files
cloudron-box/src/settings.js
2026-04-01 09:49:34 +02:00

129 lines
4.0 KiB
JavaScript

import assert from 'node:assert';
import database from './database.js';
import safe from '@cloudron/safetydance';
const APPSTORE_API_TOKEN_KEY = 'appstore_api_token';
const API_SERVER_ORIGIN_KEY = 'api_server_origin';
const AUTOUPDATE_SCHEDULE_KEY = 'autoupdate_schedule';
const AUTOUPDATE_POLICY_KEY = 'autoupdate_policy';
const CLOUDRON_AVATAR_KEY = 'cloudron_avatar';
const CLOUDRON_BACKGROUND_KEY = 'cloudron_background';
const CLOUDRON_ID_KEY = 'cloudron_id';
const CLOUDRON_NAME_KEY = 'cloudron_name';
const CONSOLE_SERVER_ORIGIN_KEY = 'console_server_origin';
const DASHBOARD_DOMAIN_KEY = 'dashboard_domain';
const DASHBOARD_SUBDOMAIN_KEY = 'dashboard_subdomain';
const DIRECTORY_SERVER_KEY = 'directory_server_config';
const DYNAMIC_DNS_KEY = 'dynamic_dns';
const EXTERNAL_LDAP_KEY = 'external_ldap_config';
const FOOTER_KEY = 'footer';
const FIREWALL_BLOCKLIST_KEY = 'firewall_blocklist';
const GHOSTS_CONFIG_KEY = 'ghosts_config';
const IPV4_CONFIG_KEY = 'ipv4_config';
const IPV6_CONFIG_KEY = 'ipv6_config';
const LANGUAGE_KEY = 'language';
const MAIL_DOMAIN_KEY = 'mail_domain';
const MAIL_SUBDOMAIN_KEY = 'mail_subdomain';
const OIDC_COOKIE_SECRET_KEY = 'cookie_secret';
const PROFILE_CONFIG_KEY = 'profile_config';
const REVERSE_PROXY_CONFIG_KEY = 'reverseproxy_config';
const SERVICES_CONFIG_KEY = 'services_config';
const TIME_ZONE_KEY = 'time_zone';
const TRUSTED_IPS_KEY = 'trusted_ips_key';
const SETTINGS_FIELDS = [ 'name', 'value' ].join(',');
const SETTINGS_BLOB_FIELDS = [ 'name', 'valueBlob' ].join(',');
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');
}
const WEB_SERVER_ORIGIN_KEY = 'web_server_origin';
const _clear = clear;
export default {
get,
set,
getJson,
setJson,
getBlob,
setBlob,
APPSTORE_API_TOKEN_KEY,
API_SERVER_ORIGIN_KEY,
AUTOUPDATE_SCHEDULE_KEY,
AUTOUPDATE_POLICY_KEY,
CLOUDRON_AVATAR_KEY,
CLOUDRON_BACKGROUND_KEY,
CLOUDRON_ID_KEY,
CLOUDRON_NAME_KEY,
CONSOLE_SERVER_ORIGIN_KEY,
DASHBOARD_DOMAIN_KEY,
DASHBOARD_SUBDOMAIN_KEY,
DIRECTORY_SERVER_KEY,
DYNAMIC_DNS_KEY,
EXTERNAL_LDAP_KEY,
FOOTER_KEY,
FIREWALL_BLOCKLIST_KEY,
GHOSTS_CONFIG_KEY,
IPV4_CONFIG_KEY,
IPV6_CONFIG_KEY,
LANGUAGE_KEY,
MAIL_DOMAIN_KEY,
MAIL_SUBDOMAIN_KEY,
OIDC_COOKIE_SECRET_KEY,
PROFILE_CONFIG_KEY,
REVERSE_PROXY_CONFIG_KEY,
SERVICES_CONFIG_KEY,
TIME_ZONE_KEY,
TRUSTED_IPS_KEY,
WEB_SERVER_ORIGIN_KEY,
_clear,
_set: set,
};