2015-07-20 00:09:47 -07:00
'use strict' ;
exports = module . exports = {
2020-08-15 18:19:01 -07:00
getAppAutoupdatePattern ,
setAppAutoupdatePattern ,
2018-02-06 18:57:30 +01:00
2020-08-15 18:19:01 -07:00
getBoxAutoupdatePattern ,
setBoxAutoupdatePattern ,
2015-07-20 00:09:47 -07:00
2020-08-15 18:19:01 -07:00
getTimeZone ,
setTimeZone ,
2015-07-20 00:09:47 -07:00
2020-08-15 18:19:01 -07:00
getCloudronName ,
setCloudronName ,
2015-07-20 00:09:47 -07:00
2020-08-15 18:19:01 -07:00
getCloudronAvatar ,
setCloudronAvatar ,
2015-07-20 00:09:47 -07:00
2020-08-15 18:19:01 -07:00
getDynamicDnsConfig ,
setDynamicDnsConfig ,
2017-01-02 13:05:48 +01:00
2020-08-15 18:19:01 -07:00
getUnstableAppsConfig ,
setUnstableAppsConfig ,
2019-04-27 22:30:32 +02:00
2020-08-15 18:19:01 -07:00
getBackupConfig ,
setBackupConfig ,
setBackupCredentials ,
2015-11-07 18:02:45 -08:00
2020-08-15 18:19:01 -07:00
getPlatformConfig ,
setPlatformConfig ,
2018-05-16 17:31:32 -07:00
2020-08-15 18:19:01 -07:00
getExternalLdapConfig ,
setExternalLdapConfig ,
2019-08-28 18:22:07 +02:00
2020-08-15 18:19:01 -07:00
getRegistryConfig ,
setRegistryConfig ,
2019-10-22 22:07:44 -07:00
2020-08-15 18:19:01 -07:00
getLicenseKey ,
setLicenseKey ,
2019-05-03 16:27:47 -07:00
2020-08-15 18:19:01 -07:00
getCloudronId ,
setCloudronId ,
2019-05-03 16:27:47 -07:00
2020-08-15 18:19:01 -07:00
getCloudronToken ,
setCloudronToken ,
2019-04-30 22:57:43 -07:00
2020-08-15 18:19:01 -07:00
getSysinfoConfig ,
setSysinfoConfig ,
2019-10-29 15:46:33 -07:00
2020-08-15 18:19:01 -07:00
getFooter ,
setFooter ,
2020-02-04 13:09:54 -08:00
2020-08-15 18:19:01 -07:00
getDirectoryConfig ,
setDirectoryConfig ,
2020-07-09 14:35:34 -07:00
2020-08-15 18:19:01 -07:00
getAppstoreListingConfig ,
setAppstoreListingConfig ,
2020-03-15 17:07:07 -07:00
2020-08-15 18:19:01 -07:00
getSupportConfig ,
provider ,
getAll ,
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 ,
adminDomain ,
2020-08-15 19:24:32 -07:00
setAdminLocation ,
2020-08-15 23:17:47 -07:00
setMailLocation ,
mailFqdn ,
mailDomain ,
2020-08-15 18:19:01 -07:00
adminOrigin ,
adminFqdn ,
2019-07-26 10:49:29 -07:00
2020-08-15 18:19:01 -07:00
isDemo ,
2019-07-26 10:49:29 -07:00
2017-07-18 13:31:43 -07:00
// booleans. if you add an entry here, be sure to fix getAll
2017-01-02 13:05:48 +01:00
DYNAMIC _DNS _KEY : 'dynamic_dns' ,
2019-04-27 22:30:32 +02:00
UNSTABLE _APPS _KEY : 'unstable_apps' ,
2019-07-25 11:16:52 -07:00
DEMO _KEY : 'demo' ,
2017-07-18 13:31:43 -07:00
// json. if you add an entry here, be sure to fix getAll
2015-11-07 18:02:45 -08:00
BACKUP _CONFIG _KEY : 'backup_config' ,
2018-05-16 17:31:32 -07:00
PLATFORM _CONFIG _KEY : 'platform_config' ,
2019-08-28 18:22:07 +02:00
EXTERNAL _LDAP _KEY : 'external_ldap_config' ,
2019-10-22 22:07:44 -07:00
REGISTRY _CONFIG _KEY : 'registry_config' ,
2019-10-29 15:46:33 -07:00
SYSINFO _CONFIG _KEY : 'sysinfo_config' ,
2020-02-05 11:58:10 -08:00
APPSTORE _LISTING _CONFIG _KEY : 'appstore_listing_config' ,
2020-02-05 14:30:56 -08:00
SUPPORT _CONFIG _KEY : 'support_config' ,
2020-07-09 14:35:34 -07:00
DIRECTORY _CONFIG _KEY : 'directory_config' ,
2015-07-20 00:09:47 -07:00
2017-07-18 13:31:43 -07:00
// strings
2018-02-07 16:51:53 +01:00
APP _AUTOUPDATE _PATTERN _KEY : 'app_autoupdate_pattern' ,
2018-02-06 18:57:30 +01:00
BOX _AUTOUPDATE _PATTERN _KEY : 'box_autoupdate_pattern' ,
2017-07-18 13:31:43 -07:00
TIME _ZONE _KEY : 'time_zone' ,
CLOUDRON _NAME _KEY : 'cloudron_name' ,
2019-04-30 22:57:43 -07:00
LICENSE _KEY : 'license_key' ,
CLOUDRON _ID _KEY : 'cloudron_id' ,
2019-05-03 16:01:20 -07:00
CLOUDRON _TOKEN _KEY : 'cloudron_token' ,
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' ,
ADMIN _DOMAIN _KEY : 'admin_domain' ,
ADMIN _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
PROVIDER _KEY : 'provider' ,
2020-02-04 13:09:54 -08:00
FOOTER _KEY : 'footer' ,
2019-01-25 16:33:22 -08:00
// blobs
2019-01-25 14:57:07 -08:00
CLOUDRON _AVATAR _KEY : 'cloudron_avatar' , // not stored in db but can be used for locked flag
2019-07-26 10:49:29 -07:00
// testing
_setApiServerOrigin : setApiServerOrigin
2015-07-20 00:09:47 -07:00
} ;
2018-10-16 14:07:41 -07:00
var addons = require ( './addons.js' ) ,
assert = require ( 'assert' ) ,
2016-10-11 11:36:25 +02:00
backups = require ( './backups.js' ) ,
2019-10-22 11:03:56 -07:00
BoxError = require ( './boxerror.js' ) ,
2016-12-14 14:54:17 +01:00
constants = require ( './constants.js' ) ,
2019-03-04 10:25:18 -08:00
cron = require ( './cron.js' ) ,
2015-07-20 00:09:47 -07:00
CronJob = require ( 'cron' ) . CronJob ,
2019-07-26 10:49:29 -07:00
debug = require ( 'debug' ) ( 'box:settings' ) ,
2019-10-22 22:07:44 -07:00
docker = require ( './docker.js' ) ,
2019-10-25 15:58:11 -07:00
externalLdap = require ( './externalldap.js' ) ,
2016-06-02 13:36:47 -07:00
moment = require ( 'moment-timezone' ) ,
2015-07-20 00:09:47 -07:00
paths = require ( './paths.js' ) ,
safe = require ( 'safetydance' ) ,
settingsdb = require ( './settingsdb.js' ) ,
2019-10-29 20:08:45 -07:00
sysinfo = require ( './sysinfo.js' ) ,
2015-07-20 00:09:47 -07:00
util = require ( 'util' ) ,
_ = require ( 'underscore' ) ;
2019-07-26 10:49:29 -07:00
let gDefaults = ( function ( ) {
2015-07-20 00:09:47 -07:00
var result = { } ;
2020-05-28 10:56:51 -07:00
result [ exports . APP _AUTOUPDATE _PATTERN _KEY ] = cron . DEFAULT _APP _AUTOUPDATE _PATTERN ;
result [ exports . BOX _AUTOUPDATE _PATTERN _KEY ] = cron . DEFAULT _BOX _AUTOUPDATE _PATTERN ;
2015-09-18 12:02:19 -07:00
result [ exports . TIME _ZONE _KEY ] = 'America/Los_Angeles' ;
2015-07-20 00:09:47 -07:00
result [ exports . CLOUDRON _NAME _KEY ] = 'Cloudron' ;
2017-01-02 13:05:48 +01:00
result [ exports . DYNAMIC _DNS _KEY ] = false ;
2019-11-11 08:42:00 -08:00
result [ exports . UNSTABLE _APPS _KEY ] = true ;
2019-04-30 22:57:43 -07:00
result [ exports . LICENSE _KEY ] = '' ;
result [ exports . CLOUDRON _ID _KEY ] = '' ;
2019-05-03 16:01:20 -07:00
result [ exports . CLOUDRON _TOKEN _KEY ] = '' ;
2016-10-21 12:48:48 +02:00
result [ exports . BACKUP _CONFIG _KEY ] = {
provider : 'filesystem' ,
2017-04-22 20:27:52 -07:00
backupFolder : '/var/backups' ,
2018-11-16 13:52:36 -08:00
format : 'tgz' ,
2020-05-14 20:22:10 +02:00
encryption : null ,
2020-05-14 20:05:27 -07:00
retentionPolicy : { keepWithinSecs : 2 * 24 * 60 * 60 } , // 2 days
2020-07-29 09:34:23 -07:00
schedulePattern : '00 00 23 * * *' // every day at 11pm
2016-10-21 12:48:48 +02:00
} ;
2018-05-16 17:31:32 -07:00
result [ exports . PLATFORM _CONFIG _KEY ] = { } ;
2019-10-25 15:40:22 -07:00
result [ exports . EXTERNAL _LDAP _KEY ] = {
2019-11-20 10:38:24 +01:00
provider : 'noop' ,
autoCreate : false
2019-10-25 15:40:22 -07:00
} ;
2019-10-22 22:07:44 -07:00
result [ exports . REGISTRY _CONFIG _KEY ] = { } ;
2019-10-29 15:46:33 -07:00
result [ exports . SYSINFO _CONFIG _KEY ] = {
provider : 'generic'
} ;
2020-07-09 14:35:34 -07:00
result [ exports . DIRECTORY _CONFIG _KEY ] = {
2020-07-10 10:00:03 -07:00
lockUserProfiles : false ,
mandatory2FA : false
2020-07-09 14:35:34 -07:00
} ;
2019-07-26 10:49:29 -07:00
result [ exports . ADMIN _DOMAIN _KEY ] = '' ;
result [ exports . ADMIN _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' ;
result [ exports . DEMO _KEY ] = false ;
2015-07-20 00:09:47 -07:00
2020-02-05 11:58:10 -08:00
result [ exports . APPSTORE _LISTING _CONFIG _KEY ] = {
blacklist : [ ] ,
2020-02-26 09:01:22 -08:00
whitelist : null // null imples nothing is whitelisted. this is an array
2020-02-05 11:58:10 -08:00
} ;
2020-02-05 14:30:56 -08:00
result [ exports . SUPPORT _CONFIG _KEY ] = {
email : 'support@cloudron.io' ,
remoteSupport : true ,
ticketFormBody :
'Use this form to open support tickets. You can also write directly to [support@cloudron.io](mailto:support@cloudron.io).\n\n'
+ '* [Knowledge Base & App Docs](https://cloudron.io/documentation/apps/?support_view)\n'
+ '* [Custom App Packaging & API](https://cloudron.io/developer/packaging/?support_view)\n'
+ '* [Forum](https://forum.cloudron.io/)\n\n' ,
submitTickets : true
} ;
2020-03-06 18:08:26 -08:00
result [ exports . FOOTER _KEY ] = '' ;
2020-02-04 13:09:54 -08:00
2015-07-20 00:09:47 -07:00
return result ;
} ) ( ) ;
2019-07-26 10:49:29 -07:00
let gCache = { } ;
2019-03-04 10:25:18 -08:00
function notifyChange ( key , value ) {
2019-03-04 15:45:04 -08:00
assert . strictEqual ( typeof key , 'string' ) ;
// value is a variant
2019-03-04 10:25:18 -08:00
cron . handleSettingsChanged ( key , value ) ;
2017-02-07 10:30:52 -08:00
}
2018-02-06 18:57:30 +01:00
function setAppAutoupdatePattern ( pattern , callback ) {
assert . strictEqual ( typeof pattern , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
if ( pattern !== constants . AUTOUPDATE _PATTERN _NEVER ) { // check if pattern is valid
var job = safe . safeCall ( function ( ) { return new CronJob ( pattern ) ; } ) ;
2019-10-22 11:03:56 -07:00
if ( ! job ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'Invalid pattern' , { field : 'pattern' } ) ) ;
2018-02-06 18:57:30 +01:00
}
settingsdb . set ( exports . APP _AUTOUPDATE _PATTERN _KEY , pattern , function ( error ) {
2019-10-24 20:31:45 -07:00
if ( error ) return callback ( error ) ;
2018-02-06 18:57:30 +01:00
2019-03-04 10:25:18 -08:00
notifyChange ( exports . APP _AUTOUPDATE _PATTERN _KEY , pattern ) ;
2018-02-06 18:57:30 +01:00
return callback ( null ) ;
} ) ;
}
function getAppAutoupdatePattern ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . APP _AUTOUPDATE _PATTERN _KEY , function ( error , pattern ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . APP _AUTOUPDATE _PATTERN _KEY ] ) ;
if ( error ) return callback ( error ) ;
2018-02-06 18:57:30 +01:00
callback ( null , pattern ) ;
} ) ;
}
function setBoxAutoupdatePattern ( pattern , callback ) {
2015-07-20 00:09:47 -07:00
assert . strictEqual ( typeof pattern , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2017-01-26 15:36:24 -08:00
if ( pattern !== constants . AUTOUPDATE _PATTERN _NEVER ) { // check if pattern is valid
2015-07-20 00:09:47 -07:00
var job = safe . safeCall ( function ( ) { return new CronJob ( pattern ) ; } ) ;
2019-10-22 11:03:56 -07:00
if ( ! job ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'Invalid pattern' , { field : 'pattern' } ) ) ;
2015-07-20 00:09:47 -07:00
}
2018-02-06 18:57:30 +01:00
settingsdb . set ( exports . BOX _AUTOUPDATE _PATTERN _KEY , pattern , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2015-07-20 00:09:47 -07:00
2019-03-04 10:25:18 -08:00
notifyChange ( exports . BOX _AUTOUPDATE _PATTERN _KEY , pattern ) ;
2015-07-20 00:09:47 -07:00
return callback ( null ) ;
} ) ;
}
2018-02-06 18:57:30 +01:00
function getBoxAutoupdatePattern ( callback ) {
2015-07-20 00:09:47 -07:00
assert . strictEqual ( typeof callback , 'function' ) ;
2018-02-06 18:57:30 +01:00
settingsdb . get ( exports . BOX _AUTOUPDATE _PATTERN _KEY , function ( error , pattern ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . BOX _AUTOUPDATE _PATTERN _KEY ] ) ;
if ( error ) return callback ( error ) ;
2015-07-20 00:09:47 -07:00
callback ( null , pattern ) ;
} ) ;
}
function setTimeZone ( tz , callback ) {
assert . strictEqual ( typeof tz , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2019-10-22 11:03:56 -07:00
if ( moment . tz . names ( ) . indexOf ( tz ) === - 1 ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'Bad timeZone' , { field : 'timezone' } ) ) ;
2016-06-02 13:36:47 -07:00
2015-07-20 00:09:47 -07:00
settingsdb . set ( exports . TIME _ZONE _KEY , tz , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2015-07-20 00:09:47 -07:00
2019-03-04 10:25:18 -08:00
notifyChange ( exports . TIME _ZONE _KEY , tz ) ;
2015-07-20 00:09:47 -07:00
return callback ( null ) ;
} ) ;
}
function getTimeZone ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . TIME _ZONE _KEY , function ( error , tz ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . TIME _ZONE _KEY ] ) ;
if ( error ) return callback ( error ) ;
2015-07-20 00:09:47 -07:00
callback ( null , tz ) ;
} ) ;
}
function getCloudronName ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . CLOUDRON _NAME _KEY , function ( error , name ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . CLOUDRON _NAME _KEY ] ) ;
if ( error ) return callback ( error ) ;
2015-07-20 00:09:47 -07:00
callback ( null , name ) ;
} ) ;
}
function setCloudronName ( name , callback ) {
assert . strictEqual ( typeof name , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2019-10-22 11:03:56 -07:00
if ( ! name ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'name is empty' , { field : 'name' } ) ) ;
2016-06-02 12:51:39 -07:00
// some arbitrary restrictions (for sake of ui layout)
2019-10-22 11:03:56 -07:00
if ( name . length > 32 ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'name cannot exceed 32 characters' , { field : 'name' } ) ) ;
2015-07-20 00:09:47 -07:00
settingsdb . set ( exports . CLOUDRON _NAME _KEY , name , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2015-07-20 00:09:47 -07:00
2019-03-04 10:25:18 -08:00
notifyChange ( exports . CLOUDRON _NAME _KEY , name ) ;
2015-07-20 00:09:47 -07:00
return callback ( null ) ;
} ) ;
}
function getCloudronAvatar ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
var avatar = safe . fs . readFileSync ( paths . CLOUDRON _AVATAR _FILE ) ;
if ( avatar ) return callback ( null , avatar ) ;
// try default fallback
avatar = safe . fs . readFileSync ( paths . CLOUDRON _DEFAULT _AVATAR _FILE ) ;
if ( avatar ) return callback ( null , avatar ) ;
2019-10-24 11:13:48 -07:00
callback ( new BoxError ( BoxError . FS _ERROR , safe . error ) ) ;
2015-07-20 00:09:47 -07:00
}
function setCloudronAvatar ( avatar , callback ) {
assert ( util . isBuffer ( avatar ) ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
if ( ! safe . fs . writeFileSync ( paths . CLOUDRON _AVATAR _FILE , avatar ) ) {
2019-10-24 11:13:48 -07:00
return callback ( new BoxError ( BoxError . FS _ERROR , safe . error ) ) ;
2015-07-20 00:09:47 -07:00
}
return callback ( null ) ;
}
2017-01-02 13:05:48 +01:00
function getDynamicDnsConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . DYNAMIC _DNS _KEY , function ( error , enabled ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . DYNAMIC _DNS _KEY ] ) ;
if ( error ) return callback ( error ) ;
2017-01-02 13:05:48 +01:00
2017-07-18 16:58:37 -07:00
callback ( null , ! ! enabled ) ; // settingsdb holds string values only
2017-01-02 13:05:48 +01:00
} ) ;
}
function setDynamicDnsConfig ( enabled , callback ) {
assert . strictEqual ( typeof enabled , 'boolean' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
// settingsdb takes string values only
settingsdb . set ( exports . DYNAMIC _DNS _KEY , enabled ? 'enabled' : '' , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2017-01-02 13:05:48 +01:00
2019-03-04 10:25:18 -08:00
notifyChange ( exports . DYNAMIC _DNS _KEY , enabled ) ;
2017-01-02 13:05:48 +01:00
return callback ( null ) ;
} ) ;
}
2019-04-27 22:30:32 +02:00
function getUnstableAppsConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . UNSTABLE _APPS _KEY , function ( error , enabled ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . UNSTABLE _APPS _KEY ] ) ;
if ( error ) return callback ( error ) ;
2019-04-27 22:30:32 +02:00
callback ( null , ! ! enabled ) ; // settingsdb holds string values only
} ) ;
}
function setUnstableAppsConfig ( enabled , callback ) {
assert . strictEqual ( typeof enabled , 'boolean' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
// settingsdb takes string values only
settingsdb . set ( exports . UNSTABLE _APPS _KEY , enabled ? 'enabled' : '' , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-04-27 22:30:32 +02:00
notifyChange ( exports . UNSTABLE _APPS _KEY , enabled ) ;
return callback ( null ) ;
} ) ;
}
2015-11-07 18:02:45 -08:00
function getBackupConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . BACKUP _CONFIG _KEY , function ( error , value ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . BACKUP _CONFIG _KEY ] ) ;
if ( error ) return callback ( error ) ;
2015-11-07 18:02:45 -08:00
2020-05-28 19:50:23 +02:00
callback ( null , JSON . parse ( value ) ) ; // provider, token, password, region, prefix, bucket
2015-11-07 18:02:45 -08:00
} ) ;
}
function setBackupConfig ( backupConfig , callback ) {
assert . strictEqual ( typeof backupConfig , 'object' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2020-05-11 11:58:11 -07:00
getBackupConfig ( function ( error , currentConfig ) {
2019-02-08 22:21:17 -08:00
if ( error ) return callback ( error ) ;
2017-09-27 20:52:36 -07:00
2020-05-11 11:58:11 -07:00
backups . injectPrivateFields ( backupConfig , currentConfig ) ;
2019-02-09 18:08:10 -08:00
backups . testConfig ( backupConfig , function ( error ) {
2019-10-22 20:36:20 -07:00
if ( error ) return callback ( error ) ;
2016-10-11 15:56:07 +02:00
2020-05-14 11:18:41 -07:00
if ( 'password' in backupConfig ) { // user set password
backupConfig . encryption = backups . generateEncryptionKeysSync ( backupConfig . password ) ;
delete backupConfig . password ;
2020-05-12 14:00:05 -07:00
}
2020-08-11 14:01:15 -07:00
// if any of these changes, we have to clear the cache
if ( [ 'format' , 'provider' , 'prefix' , 'bucket' , 'region' , 'endpoint' , 'backupFolder' , 'mountPoint' , 'encryption' ] . some ( p => backupConfig [ p ] !== currentConfig [ p ] ) ) {
debug ( 'setBackupConfig: clearing backup cache' ) ;
backups . cleanupCacheFilesSync ( ) ;
}
2019-02-08 22:21:17 -08:00
settingsdb . set ( exports . BACKUP _CONFIG _KEY , JSON . stringify ( backupConfig ) , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-02-08 22:21:17 -08:00
2019-03-04 10:25:18 -08:00
notifyChange ( exports . BACKUP _CONFIG _KEY , backupConfig ) ;
2016-10-11 15:56:07 +02:00
2020-01-31 13:37:07 -08:00
backups . configureCollectd ( backupConfig , callback ) ;
2019-02-08 22:21:17 -08:00
} ) ;
2016-10-11 11:36:25 +02:00
} ) ;
2015-11-07 18:02:45 -08:00
} ) ;
}
2020-02-27 12:38:17 -08:00
function setBackupCredentials ( credentials , callback ) {
assert . strictEqual ( typeof credentials , 'object' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
getBackupConfig ( function ( error , currentConfig ) {
if ( error ) return callback ( error ) ;
// preserve these fields
2020-08-11 09:14:09 -07:00
const extra = _ . pick ( currentConfig , 'retentionPolicy' , 'schedulePattern' , 'copyConcurrency' , 'syncConcurrency' , 'memoryLimit' , 'downloadConcurrency' , 'deleteConcurrency' ) ;
2020-02-27 12:38:17 -08:00
const backupConfig = _ . extend ( { } , credentials , extra ) ;
backups . cleanupCacheFilesSync ( ) ;
settingsdb . set ( exports . BACKUP _CONFIG _KEY , JSON . stringify ( backupConfig ) , function ( error ) {
if ( error ) return callback ( error ) ;
notifyChange ( exports . BACKUP _CONFIG _KEY , backupConfig ) ;
backups . configureCollectd ( backupConfig , callback ) ;
} ) ;
} ) ;
}
2018-05-16 17:31:32 -07:00
function getPlatformConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . PLATFORM _CONFIG _KEY , function ( error , value ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . PLATFORM _CONFIG _KEY ] ) ;
if ( error ) return callback ( error ) ;
2018-05-16 17:31:32 -07:00
callback ( null , JSON . parse ( value ) ) ;
} ) ;
}
function setPlatformConfig ( platformConfig , callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
2018-07-25 13:06:38 -07:00
for ( let addon of [ 'mysql' , 'postgresql' , 'mail' , 'mongodb' ] ) {
if ( ! platformConfig [ addon ] ) continue ;
2019-10-22 11:03:56 -07:00
if ( platformConfig [ addon ] . memorySwap < platformConfig [ addon ] . memory ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'memorySwap must be larger than memory' , { field : 'memory' , addon } ) ) ;
2018-07-25 13:06:38 -07:00
}
2018-05-16 17:31:32 -07:00
settingsdb . set ( exports . PLATFORM _CONFIG _KEY , JSON . stringify ( platformConfig ) , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2018-05-16 17:31:32 -07:00
2018-12-02 19:09:57 -08:00
addons . updateServiceConfig ( platformConfig , callback ) ;
2018-05-16 17:31:32 -07:00
} ) ;
}
2019-08-28 18:22:07 +02:00
function getExternalLdapConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . EXTERNAL _LDAP _KEY , function ( error , value ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . EXTERNAL _LDAP _KEY ] ) ;
if ( error ) return callback ( error ) ;
2019-08-28 18:22:07 +02:00
2019-11-20 10:38:24 +01:00
let config = JSON . parse ( value ) ;
// ensure new keys
if ( ! config . autoCreate ) config . autoCreate = false ;
callback ( null , config ) ;
2019-08-28 18:22:07 +02:00
} ) ;
}
function setExternalLdapConfig ( externalLdapConfig , callback ) {
assert . strictEqual ( typeof externalLdapConfig , 'object' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2020-07-22 17:53:04 -07:00
if ( isDemo ( ) ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'Not allowed in demo mode' ) ) ;
2020-07-22 16:18:22 -07:00
2020-02-27 12:38:17 -08:00
getExternalLdapConfig ( function ( error , currentConfig ) {
2019-10-24 13:41:41 -07:00
if ( error ) return callback ( error ) ;
2019-08-28 18:22:07 +02:00
2020-02-27 12:38:17 -08:00
externalLdap . injectPrivateFields ( externalLdapConfig , currentConfig ) ;
2019-10-25 15:58:11 -07:00
externalLdap . testConfig ( externalLdapConfig , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-08-28 18:22:07 +02:00
2019-10-25 15:58:11 -07:00
settingsdb . set ( exports . EXTERNAL _LDAP _KEY , JSON . stringify ( externalLdapConfig ) , function ( error ) {
if ( error ) return callback ( error ) ;
notifyChange ( exports . EXTERNAL _LDAP _KEY , externalLdapConfig ) ;
2019-08-28 18:22:07 +02:00
2019-10-25 15:58:11 -07:00
callback ( null ) ;
} ) ;
2019-08-28 18:22:07 +02:00
} ) ;
} ) ;
}
2019-10-22 22:07:44 -07:00
function getRegistryConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . REGISTRY _CONFIG _KEY , function ( error , value ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . REGISTRY _CONFIG _KEY ] ) ;
if ( error ) return callback ( error ) ;
2019-10-22 22:07:44 -07:00
callback ( null , JSON . parse ( value ) ) ;
} ) ;
}
function setRegistryConfig ( registryConfig , callback ) {
assert . strictEqual ( typeof registryConfig , 'object' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
getRegistryConfig ( function ( error , curentConfig ) {
if ( error ) return callback ( error ) ;
docker . injectPrivateFields ( registryConfig , curentConfig ) ;
docker . testRegistryConfig ( registryConfig , function ( error ) {
if ( error ) return callback ( error ) ;
settingsdb . set ( exports . REGISTRY _CONFIG _KEY , JSON . stringify ( registryConfig ) , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-10-22 22:07:44 -07:00
notifyChange ( exports . REGISTRY _CONFIG _KEY , registryConfig ) ;
callback ( null ) ;
} ) ;
} ) ;
} ) ;
}
2019-10-29 15:46:33 -07:00
function getSysinfoConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . SYSINFO _CONFIG _KEY , function ( error , value ) {
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . SYSINFO _CONFIG _KEY ] ) ;
if ( error ) return callback ( error ) ;
callback ( null , JSON . parse ( value ) ) ;
} ) ;
}
function setSysinfoConfig ( sysinfoConfig , callback ) {
assert . strictEqual ( typeof sysinfoConfig , 'object' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2019-12-05 16:06:21 +01:00
if ( isDemo ( ) ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'Not allowed in demo mode' ) ) ;
2019-10-29 20:08:45 -07:00
sysinfo . testConfig ( sysinfoConfig , function ( error ) {
2019-10-29 15:46:33 -07:00
if ( error ) return callback ( error ) ;
2019-10-29 20:08:45 -07:00
settingsdb . set ( exports . SYSINFO _CONFIG _KEY , JSON . stringify ( sysinfoConfig ) , function ( error ) {
if ( error ) return callback ( error ) ;
notifyChange ( exports . SYSINFO _CONFIG _KEY , sysinfoConfig ) ;
2019-10-29 15:46:33 -07:00
2019-10-29 20:08:45 -07:00
callback ( null ) ;
} ) ;
2019-10-29 15:46:33 -07:00
} ) ;
}
2020-07-09 14:35:34 -07:00
function getDirectoryConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . DIRECTORY _CONFIG _KEY , function ( error , value ) {
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . DIRECTORY _CONFIG _KEY ] ) ;
if ( error ) return callback ( error ) ;
callback ( null , JSON . parse ( value ) ) ;
} ) ;
}
function setDirectoryConfig ( directoryConfig , callback ) {
assert . strictEqual ( typeof directoryConfig , 'object' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2020-07-22 17:53:04 -07:00
if ( isDemo ( ) ) return callback ( new BoxError ( BoxError . BAD _FIELD , 'Not allowed in demo mode' ) ) ;
2020-07-22 16:18:22 -07:00
2020-07-09 14:35:34 -07:00
settingsdb . set ( exports . DIRECTORY _CONFIG _KEY , JSON . stringify ( directoryConfig ) , function ( error ) {
if ( error ) return callback ( error ) ;
notifyChange ( exports . DIRECTORY _CONFIG _KEY , directoryConfig ) ;
callback ( null ) ;
} ) ;
}
2020-02-05 11:58:10 -08:00
function getAppstoreListingConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . APPSTORE _LISTING _CONFIG _KEY , function ( error , value ) {
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . APPSTORE _LISTING _CONFIG _KEY ] ) ;
if ( error ) return callback ( error ) ;
callback ( null , JSON . parse ( value ) ) ;
} ) ;
}
2020-03-15 17:07:07 -07:00
function setAppstoreListingConfig ( listingConfig , callback ) {
assert . strictEqual ( typeof listingConfig , 'object' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . set ( exports . APPSTORE _LISTING _CONFIG _KEY , JSON . stringify ( listingConfig ) , function ( error ) {
if ( error ) return callback ( error ) ;
notifyChange ( exports . APPSTORE _LISTING _CONFIG _KEY , listingConfig ) ;
callback ( null ) ;
} ) ;
}
2020-02-05 14:30:56 -08:00
function getSupportConfig ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . SUPPORT _CONFIG _KEY , function ( error , value ) {
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . SUPPORT _CONFIG _KEY ] ) ;
if ( error ) return callback ( error ) ;
callback ( null , JSON . parse ( value ) ) ;
} ) ;
}
2019-04-30 22:57:43 -07:00
function getLicenseKey ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . LICENSE _KEY , function ( error , value ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . LICENSE _KEY ] ) ;
if ( error ) return callback ( error ) ;
2019-04-30 22:57:43 -07:00
callback ( null , value ) ;
} ) ;
}
2019-05-03 16:27:47 -07:00
function setLicenseKey ( licenseKey , callback ) {
assert . strictEqual ( typeof licenseKey , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . set ( exports . LICENSE _KEY , licenseKey , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-05-03 16:27:47 -07:00
notifyChange ( exports . LICENSE _KEY , licenseKey ) ;
callback ( null ) ;
} ) ;
}
2019-04-30 22:57:43 -07:00
function getCloudronId ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . get ( exports . CLOUDRON _ID _KEY , function ( error , value ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . CLOUDRON _ID _KEY ] ) ;
if ( error ) return callback ( error ) ;
2019-04-30 22:57:43 -07:00
callback ( null , value ) ;
} ) ;
}
2019-05-03 16:27:47 -07:00
function setCloudronId ( cid , callback ) {
assert . strictEqual ( typeof cid , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . set ( exports . CLOUDRON _ID _KEY , cid , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-05-03 16:27:47 -07:00
notifyChange ( exports . CLOUDRON _ID _KEY , cid ) ;
callback ( null ) ;
} ) ;
}
2019-05-03 16:01:20 -07:00
function getCloudronToken ( callback ) {
2019-04-30 22:57:43 -07:00
assert . strictEqual ( typeof callback , 'function' ) ;
2019-05-03 16:01:20 -07:00
settingsdb . get ( exports . CLOUDRON _TOKEN _KEY , function ( error , value ) {
2019-10-24 11:13:48 -07:00
if ( error && error . reason === BoxError . NOT _FOUND ) return callback ( null , gDefaults [ exports . CLOUDRON _TOKEN _KEY ] ) ;
if ( error ) return callback ( error ) ;
2019-04-30 22:57:43 -07:00
callback ( null , value ) ;
} ) ;
}
2019-05-03 16:27:47 -07:00
function setCloudronToken ( token , callback ) {
assert . strictEqual ( typeof token , 'string' ) ;
2016-07-26 14:31:07 +02:00
assert . strictEqual ( typeof callback , 'function' ) ;
2019-05-03 16:27:47 -07:00
settingsdb . set ( exports . CLOUDRON _TOKEN _KEY , token , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2018-11-05 17:12:04 -08:00
2019-05-03 16:27:47 -07:00
notifyChange ( exports . CLOUDRON _TOKEN _KEY , token ) ;
2016-08-01 15:10:45 +02:00
2019-05-03 16:27:47 -07:00
callback ( null ) ;
2016-07-26 14:31:07 +02:00
} ) ;
}
2015-07-20 00:09:47 -07:00
function getAll ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . getAll ( function ( error , settings ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2015-07-20 00:09:47 -07:00
var result = _ . extend ( { } , gDefaults ) ;
settings . forEach ( function ( setting ) { result [ setting . name ] = setting . value ; } ) ;
2017-01-02 13:47:49 +01:00
// convert booleans
2017-01-02 14:15:20 +01:00
result [ exports . DYNAMIC _DNS _KEY ] = ! ! result [ exports . DYNAMIC _DNS _KEY ] ;
2019-04-27 22:30:32 +02:00
result [ exports . UNSTABLE _APPS _KEY ] = ! ! result [ exports . UNSTABLE _APPS _KEY ] ;
2019-07-25 11:16:52 -07:00
result [ exports . DEMO _KEY ] = ! ! result [ exports . DEMO _KEY ] ;
2017-01-02 13:47:49 +01:00
2017-01-10 15:18:43 +01:00
// convert JSON objects
2020-07-09 14:35:34 -07:00
[ exports . BACKUP _CONFIG _KEY , exports . DIRECTORY _CONFIG _KEY , exports . PLATFORM _CONFIG _KEY , exports . EXTERNAL _LDAP _KEY , exports . REGISTRY _CONFIG _KEY , exports . SYSINFO _CONFIG _KEY ] . forEach ( function ( key ) {
2017-01-10 15:18:43 +01:00
result [ key ] = typeof result [ key ] === 'object' ? result [ key ] : safe . JSON . parse ( result [ key ] ) ;
} ) ;
2015-07-20 00:09:47 -07:00
callback ( null , result ) ;
} ) ;
}
2019-07-26 10:49:29 -07:00
function initCache ( callback ) {
debug ( 'initCache: pre-load settings' ) ;
getAll ( function ( error , allSettings ) {
if ( error ) return callback ( error ) ;
2020-02-07 09:13:33 -08:00
const provider = safe . fs . readFileSync ( paths . PROVIDER _FILE , 'utf8' ) ;
2019-07-26 10:49:29 -07:00
gCache = {
apiServerOrigin : allSettings [ exports . API _SERVER _ORIGIN _KEY ] ,
webServerOrigin : allSettings [ exports . WEB _SERVER _ORIGIN _KEY ] ,
adminDomain : allSettings [ exports . ADMIN _DOMAIN _KEY ] ,
adminFqdn : allSettings [ exports . ADMIN _FQDN _KEY ] ,
2020-08-15 23:17:47 -07:00
mailDomain : allSettings [ exports . MAIL _DOMAIN _KEY ] ,
mailFqdn : allSettings [ exports . MAIL _FQDN _KEY ] ,
2019-10-29 15:46:33 -07:00
isDemo : allSettings [ exports . DEMO _KEY ] ,
2020-02-07 09:13:33 -08:00
provider : provider ? provider . trim ( ) : 'generic'
2019-07-26 10:49:29 -07:00
} ;
callback ( ) ;
} ) ;
}
// this is together so we can do this in a transaction later
2020-08-15 19:24:32 -07:00
function setAdminLocation ( adminDomain , adminFqdn , callback ) {
2019-07-26 10:49:29 -07:00
assert . strictEqual ( typeof adminDomain , 'string' ) ;
assert . strictEqual ( typeof adminFqdn , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . set ( exports . ADMIN _DOMAIN _KEY , adminDomain , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-07-26 10:49:29 -07:00
settingsdb . set ( exports . ADMIN _FQDN _KEY , adminFqdn , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-07-26 10:49:29 -07:00
gCache . adminDomain = adminDomain ;
gCache . adminFqdn = adminFqdn ;
callback ( null ) ;
} ) ;
} ) ;
}
2020-08-15 23:17:47 -07:00
function setMailLocation ( mailDomain , mailFqdn , callback ) {
assert . strictEqual ( typeof mailDomain , 'string' ) ;
assert . strictEqual ( typeof mailFqdn , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . set ( exports . MAIL _DOMAIN _KEY , mailDomain , function ( error ) {
if ( error ) return callback ( error ) ;
settingsdb . set ( exports . MAIL _FQDN _KEY , mailFqdn , function ( error ) {
if ( error ) return callback ( error ) ;
gCache . mailDomain = mailDomain ;
gCache . mailFqdn = mailFqdn ;
callback ( null ) ;
} ) ;
} ) ;
}
2019-07-26 10:49:29 -07:00
function setApiServerOrigin ( origin , callback ) {
assert . strictEqual ( typeof origin , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
settingsdb . set ( exports . API _SERVER _ORIGIN _KEY , origin , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( error ) ;
2019-07-26 10:49:29 -07:00
gCache . apiServerOrigin = origin ;
notifyChange ( exports . API _SERVER _ORIGIN _KEY , origin ) ;
callback ( null ) ;
} ) ;
}
2020-02-04 13:09:54 -08:00
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 ) ;
} ) ;
}
2019-10-29 15:46:33 -07:00
function provider ( ) { return gCache . provider ; }
2019-07-26 10:49:29 -07:00
function apiServerOrigin ( ) { return gCache . apiServerOrigin ; }
function webServerOrigin ( ) { return gCache . webServerOrigin ; }
function adminDomain ( ) { return gCache . adminDomain ; }
function adminFqdn ( ) { return gCache . adminFqdn ; }
function isDemo ( ) { return gCache . isDemo ; }
2020-08-15 23:17:47 -07:00
function mailDomain ( ) { return gCache . mailDomain ; }
function mailFqdn ( ) { return gCache . mailFqdn ; }
2019-07-26 10:49:29 -07:00
function adminOrigin ( ) { return 'https://' + adminFqdn ( ) ; }