2015-07-20 00:09:47 -07:00
'use strict' ;
exports = module . exports = {
2020-08-15 18:19:01 -07:00
initCache ,
2019-07-26 10:49:29 -07:00
// these values come from the cache
2020-08-15 18:19:01 -07:00
apiServerOrigin ,
webServerOrigin ,
2022-05-05 16:51:18 +02:00
consoleServerOrigin ,
2021-05-05 12:29:04 -07:00
dashboardDomain ,
setDashboardLocation ,
2020-08-15 23:17:47 -07:00
setMailLocation ,
mailFqdn ,
mailDomain ,
2021-05-05 12:29:04 -07:00
dashboardOrigin ,
dashboardFqdn ,
2019-07-26 10:49:29 -07:00
2023-08-02 19:14:18 +05:30
get ,
set ,
2023-08-03 11:34:33 +05:30
getJson ,
setJson ,
2023-08-02 19:17:22 +05:30
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' ,
2017-07-18 13:31:43 -07:00
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' ,
2023-07-12 10:01:53 +05:30
BACKUP _POLICY _KEY : 'backup_policy' ,
2021-01-21 12:18:11 -08:00
SERVICES _CONFIG _KEY : 'services_config' ,
2019-08-28 18:22:07 +02:00
EXTERNAL _LDAP _KEY : 'external_ldap_config' ,
2023-08-03 07:35:14 +05:30
DIRECTORY _SERVER _KEY : 'directory_server_config' ,
2019-10-22 22:07:44 -07:00
REGISTRY _CONFIG _KEY : 'registry_config' ,
2023-08-03 06:05:29 +05:30
IPV4 _CONFIG _KEY : 'ipv4_config' ,
2020-02-05 14:30:56 -08:00
SUPPORT _CONFIG _KEY : 'support_config' ,
2022-01-13 14:34:02 -08:00
PROFILE _CONFIG _KEY : 'profile_config' ,
2021-09-20 13:05:42 +02:00
GHOSTS _CONFIG _KEY : 'ghosts_config' ,
2021-09-22 09:13:16 -07:00
REVERSE _PROXY _CONFIG _KEY : 'reverseproxy_config' ,
2022-02-15 13:12:34 -08:00
IPV6 _CONFIG _KEY : 'ipv6_config' ,
2015-07-20 00:09:47 -07:00
2017-07-18 13:31:43 -07:00
// strings
2020-08-19 21:39:58 -07:00
AUTOUPDATE _PATTERN _KEY : 'autoupdate_pattern' ,
2017-07-18 13:31:43 -07:00
TIME _ZONE _KEY : 'time_zone' ,
2023-08-02 20:01:29 +05:30
OIDC _COOKIE _SECRET _KEY : 'cookie_secret' ,
2017-07-18 13:31:43 -07:00
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' ,
2022-03-31 21:50:53 -07:00
APPSTORE _API _TOKEN _KEY : 'appstore_api_token' ,
2022-03-31 22:04:52 -07:00
APPSTORE _WEB _TOKEN _KEY : 'appstore_web_token' ,
2021-05-04 15:21:38 -07:00
FIREWALL _BLOCKLIST _KEY : 'firewall_blocklist' ,
2023-05-13 14:59:57 +02:00
TRUSTED _IPS _KEY : 'trusted_ips_key' ,
2017-07-18 13:31:43 -07:00
2019-07-25 11:16:52 -07:00
API _SERVER _ORIGIN _KEY : 'api_server_origin' ,
WEB _SERVER _ORIGIN _KEY : 'web_server_origin' ,
2022-05-05 16:51:18 +02:00
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' ,
2020-08-15 23:17:47 -07:00
MAIL _DOMAIN _KEY : 'mail_domain' ,
MAIL _FQDN _KEY : 'mail_fqdn' ,
2019-07-25 11:16:52 -07:00
2020-02-04 13:09:54 -08:00
FOOTER _KEY : 'footer' ,
2019-01-25 16:33:22 -08:00
// blobs
2021-04-29 15:46:11 -07:00
CLOUDRON _AVATAR _KEY : 'cloudron_avatar' ,
2019-07-26 10:49:29 -07:00
// testing
2021-08-18 15:40:28 -07:00
_setApiServerOrigin : setApiServerOrigin ,
2021-08-19 13:24:38 -07:00
_clear : clear ,
_set : set
2015-07-20 00:09:47 -07:00
} ;
2021-01-20 11:10:17 -08:00
const assert = require ( 'assert' ) ,
2021-08-18 13:25:42 -07:00
database = require ( './database.js' ) ,
2019-07-26 10:49:29 -07:00
debug = require ( 'debug' ) ( 'box:settings' ) ,
2023-08-04 11:24:28 +05:30
safe = require ( 'safetydance' ) ;
2015-07-20 00:09:47 -07:00
2021-08-18 13:25:42 -07:00
const SETTINGS _FIELDS = [ 'name' , 'value' ] . join ( ',' ) ;
2021-08-18 15:31:07 -07:00
const SETTINGS _BLOB _FIELDS = [ 'name' , 'valueBlob' ] . join ( ',' ) ;
2021-08-18 13:25:42 -07:00
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 ] = '' ;
2020-08-15 23:17:47 -07:00
result [ exports . MAIL _DOMAIN _KEY ] = '' ;
result [ exports . MAIL _FQDN _KEY ] = '' ;
2019-07-26 10:49:29 -07:00
result [ exports . API _SERVER _ORIGIN _KEY ] = 'https://api.cloudron.io' ;
result [ exports . WEB _SERVER _ORIGIN _KEY ] = 'https://cloudron.io' ;
2022-05-05 09:37:05 -07:00
result [ exports . CONSOLE _SERVER _ORIGIN _KEY ] = 'https://console.cloudron.io' ;
2015-07-20 00:09:47 -07:00
return result ;
} ) ( ) ;
2019-07-26 10:49:29 -07:00
let gCache = { } ;
2021-08-18 15:31:07 -07:00
async function get ( key ) {
assert . strictEqual ( typeof key , 'string' ) ;
const result = await database . query ( ` SELECT ${ SETTINGS _FIELDS } FROM settings WHERE name = ? ` , [ key ] ) ;
2021-08-18 15:40:28 -07:00
if ( result . length === 0 ) return null ; // can't return the default value here because we might need to massage/json parse the result
2021-08-18 15:31:07 -07:00
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
}
2023-08-03 11:34:33 +05:30
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 ) ;
}
2021-08-18 15:31:07 -07:00
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' ) ;
}
2021-08-18 13:25:42 -07:00
async function list ( ) {
const settings = await database . query ( ` SELECT ${ SETTINGS _FIELDS } FROM settings WHERE value IS NOT NULL ORDER BY name ` ) ;
2015-07-20 00:09:47 -07:00
2023-05-25 11:27:23 +02:00
const result = Object . assign ( { } , gDefaults ) ;
2021-08-18 13:25:42 -07:00
settings . forEach ( function ( setting ) { result [ setting . name ] = setting . value ; } ) ;
2015-07-20 00:09:47 -07:00
2021-08-18 13:25:42 -07:00
// convert booleans
result [ exports . DEMO _KEY ] = ! ! result [ exports . DEMO _KEY ] ;
2017-01-02 13:47:49 +01:00
2021-08-18 13:25:42 -07:00
return result ;
2015-07-20 00:09:47 -07:00
}
2019-07-26 10:49:29 -07:00
2021-08-18 13:25:42 -07:00
async function initCache ( ) {
2019-07-26 10:49:29 -07:00
debug ( 'initCache: pre-load settings' ) ;
2021-08-18 13:25:42 -07:00
const allSettings = await list ( ) ;
gCache = {
apiServerOrigin : allSettings [ exports . API _SERVER _ORIGIN _KEY ] ,
webServerOrigin : allSettings [ exports . WEB _SERVER _ORIGIN _KEY ] ,
2022-05-05 16:51:18 +02:00
consoleServerOrigin : allSettings [ exports . CONSOLE _SERVER _ORIGIN _KEY ] ,
2021-08-18 13:25:42 -07:00
dashboardDomain : allSettings [ exports . DASHBOARD _DOMAIN _KEY ] ,
dashboardFqdn : allSettings [ exports . DASHBOARD _FQDN _KEY ] ,
mailDomain : allSettings [ exports . MAIL _DOMAIN _KEY ] ,
mailFqdn : allSettings [ exports . MAIL _FQDN _KEY ] ,
} ;
2019-07-26 10:49:29 -07:00
}
// 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 ) {
2021-06-03 21:33:40 -07:00
assert . strictEqual ( typeof dashboardDomain , 'string' ) ;
2021-05-05 12:29:04 -07:00
assert . strictEqual ( typeof dashboardFqdn , 'string' ) ;
2019-07-26 10:49:29 -07:00
2021-08-19 13:24:38 -07:00
await set ( exports . DASHBOARD _DOMAIN _KEY , dashboardDomain ) ;
await set ( exports . DASHBOARD _FQDN _KEY , dashboardFqdn ) ;
2019-07-26 10:49:29 -07:00
2021-08-19 13:24:38 -07:00
gCache . dashboardDomain = dashboardDomain ;
gCache . dashboardFqdn = dashboardFqdn ;
2019-07-26 10:49:29 -07:00
}
2021-08-19 13:24:38 -07:00
async function setMailLocation ( mailDomain , mailFqdn ) {
2020-08-15 23:17:47 -07:00
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 ) ;
2020-08-15 23:17:47 -07:00
2021-08-19 13:24:38 -07:00
gCache . mailDomain = mailDomain ;
gCache . mailFqdn = mailFqdn ;
2020-08-15 23:17:47 -07:00
}
2021-08-19 13:24:38 -07:00
async function setApiServerOrigin ( origin ) {
2019-07-26 10:49:29 -07:00
assert . strictEqual ( typeof origin , 'string' ) ;
2021-08-19 13:24:38 -07:00
await set ( exports . API _SERVER _ORIGIN _KEY , origin ) ;
2019-07-26 10:49:29 -07:00
2021-08-19 13:24:38 -07:00
gCache . apiServerOrigin = origin ;
2019-07-26 10:49:29 -07:00
}
function apiServerOrigin ( ) { return gCache . apiServerOrigin ; }
function webServerOrigin ( ) { return gCache . webServerOrigin ; }
2022-05-05 16:51:18 +02:00
function consoleServerOrigin ( ) { return gCache . consoleServerOrigin ; }
2021-05-05 12:29:04 -07:00
function dashboardDomain ( ) { return gCache . dashboardDomain ; }
function dashboardFqdn ( ) { return gCache . dashboardFqdn ; }
2020-08-15 23:17:47 -07:00
function mailDomain ( ) { return gCache . mailDomain ; }
function mailFqdn ( ) { return gCache . mailFqdn ; }
2021-05-05 12:29:04 -07:00
function dashboardOrigin ( ) { return 'https://' + dashboardFqdn ( ) ; }