2015-07-20 00:09:47 -07:00
'use strict' ;
exports = module . exports = {
2021-05-01 11:21:09 -07:00
start ,
stop
2015-07-20 00:09:47 -07:00
} ;
2021-05-03 22:55:43 -07:00
const assert = require ( 'assert' ) ,
2023-08-26 08:18:58 +05:30
AuditSource = require ( './auditsource.js' ) ,
2019-07-25 14:40:52 -07:00
constants = require ( './constants.js' ) ,
2020-08-04 09:34:03 -07:00
debug = require ( 'debug' ) ( 'box:server' ) ,
2016-05-02 09:39:38 -07:00
eventlog = require ( './eventlog.js' ) ,
2015-07-20 00:09:47 -07:00
express = require ( 'express' ) ,
http = require ( 'http' ) ,
2023-09-07 17:01:50 +05:30
HttpError = require ( 'connect-lastmile' ) . HttpError ,
2015-07-20 00:09:47 -07:00
middleware = require ( './middleware' ) ,
2023-08-12 19:28:07 +05:30
platform = require ( './platform.js' ) ,
2017-08-18 17:56:01 -07:00
routes = require ( './routes/index.js' ) ,
2021-09-07 09:57:49 -07:00
safe = require ( 'safetydance' ) ,
2020-02-21 12:17:06 -08:00
users = require ( './users.js' ) ,
2021-09-07 09:57:49 -07:00
util = require ( 'util' ) ,
2017-08-18 17:56:01 -07:00
ws = require ( 'ws' ) ;
2015-07-20 00:09:47 -07:00
2020-11-09 20:34:48 -08:00
let gHttpServer = null ;
2015-07-20 00:09:47 -07:00
2023-09-07 17:01:50 +05:30
function notFoundHandler ( req , res , next ) {
const cleanUrl = req . url . replace ( /(access_token=)[^&]+/ , '$1' + '<redacted>' ) ;
debug ( ` no such route: ${ req . method } ${ cleanUrl } ` ) ;
return next ( new HttpError ( 404 , 'No such route' ) ) ;
}
2023-03-08 16:41:59 +01:00
async function initializeExpressSync ( ) {
2021-09-07 09:57:49 -07:00
const app = express ( ) ;
2023-04-10 10:35:25 +02:00
// disable slowloris prevention: https://github.com/nodejs/node/issues/47421
const httpServer = http . createServer ( { headersTimeout : 0 , requestTimeout : 0 } , app ) ; // see also nginx client_header_timeout (30s)
2015-07-20 00:09:47 -07:00
2017-08-18 17:56:01 -07:00
const wsServer = new ws . Server ( { noServer : true } ) ; // in noServer mode, we have to handle 'upgrade' and call handleUpgrade
2017-08-15 20:00:52 +02:00
2022-03-01 11:28:34 -08:00
const QUERY _LIMIT = '2mb' , // max size for json and urlencoded queries (see also client_max_body_size in nginx)
2015-07-20 00:09:47 -07:00
FIELD _LIMIT = 2 * 1024 * 1024 ; // max fields that can appear in multipart
2021-09-07 09:57:49 -07:00
const REQUEST _TIMEOUT = 20000 ; // timeout for all requests (see also setTimeout on the httpServer)
2015-07-20 00:09:47 -07:00
2021-09-07 09:57:49 -07:00
const json = middleware . json ( { strict : true , limit : QUERY _LIMIT } ) , // application/json
2015-07-20 00:09:47 -07:00
urlencoded = middleware . urlencoded ( { extended : false , limit : QUERY _LIMIT } ) ; // application/x-www-form-urlencoded
2016-05-31 11:14:59 -07:00
app . set ( 'json spaces' , 2 ) ; // pretty json
2015-07-20 00:09:47 -07:00
2017-01-16 16:49:01 +01:00
// for rate limiting
app . enable ( 'trust proxy' ) ;
2021-09-07 09:57:49 -07:00
const router = new express . Router ( ) ;
2015-07-20 00:09:47 -07:00
router . del = router . delete ; // amend router.del for readability further on
app
2018-03-08 09:27:56 -08:00
// the timeout middleware will respond with a 503. the request itself cannot be 'aborted' and will continue
// search for req.clearTimeout in route handlers to see places where this timeout is reset
. use ( middleware . timeout ( REQUEST _TIMEOUT , { respond : true } ) )
2017-10-31 12:04:26 -07:00
. use ( urlencoded )
. use ( middleware . cors ( { origins : [ '*' ] , allowCredentials : false } ) )
. use ( router )
2023-09-07 17:01:50 +05:30
. use ( notFoundHandler )
2017-10-31 12:04:26 -07:00
. use ( middleware . lastMile ( ) ) ;
2015-07-20 00:09:47 -07:00
2019-12-09 15:02:51 -08:00
// NOTE: routes that use multi-part have to be whitelisted in the reverse proxy
2021-09-07 09:57:49 -07:00
const FILE _SIZE _LIMIT = '256mb' , // max file size that can be uploaded (see also client_max_body_size in nginx)
2015-07-20 00:09:47 -07:00
FILE _TIMEOUT = 60 * 1000 ; // increased timeout for file uploads (1 min)
2021-09-07 09:57:49 -07:00
const multipart = middleware . multipart ( { maxFieldsSize : FIELD _LIMIT , limit : FILE _SIZE _LIMIT , timeout : FILE _TIMEOUT } ) ;
2015-07-20 00:09:47 -07:00
2022-09-24 21:27:43 +02:00
// authentication
2020-02-06 14:50:12 +01:00
const password = routes . accesscontrol . passwordAuth ;
const token = routes . accesscontrol . tokenAuth ;
2022-09-24 21:27:43 +02:00
// authorization
2020-03-15 11:32:18 -07:00
const authorizeOwner = routes . accesscontrol . authorize ( users . ROLE _OWNER ) ;
2020-02-21 12:17:06 -08:00
const authorizeAdmin = routes . accesscontrol . authorize ( users . ROLE _ADMIN ) ;
2021-09-21 10:11:27 -07:00
const authorizeOperator = routes . accesscontrol . authorizeOperator ;
2020-02-21 12:17:06 -08:00
const authorizeUserManager = routes . accesscontrol . authorize ( users . ROLE _USER _MANAGER ) ;
2021-12-01 09:27:24 -08:00
const authorizeMailManager = routes . accesscontrol . authorize ( users . ROLE _MAIL _MANAGER ) ;
2022-09-24 21:27:43 +02:00
const authorizeUser = routes . accesscontrol . authorize ( users . ROLE _USER ) ;
2015-07-20 00:09:47 -07:00
2023-08-10 16:50:29 +05:30
// boostrapping/provision routes
router . post ( '/api/v1/provision/setup' , json , routes . provision . setupTokenAuth , routes . provision . providerTokenAuth , routes . provision . setup ) ; // only available until no-domain
router . post ( '/api/v1/provision/restore' , json , routes . provision . setupTokenAuth , routes . provision . restore ) ; // only available until activated
router . post ( '/api/v1/provision/activate' , json , routes . provision . setupTokenAuth , routes . provision . activate ) ;
router . get ( '/api/v1/provision/block_devices' , routes . provision . getBlockDevices ) ;
2023-08-10 18:45:27 +05:30
router . get ( '/api/v1/provision/status' , routes . provision . getStatus ) ;
2015-07-20 00:09:47 -07:00
2023-08-10 16:21:22 +05:30
// auth routes
router . post ( '/api/v1/auth/login' , json , password , routes . auth . login ) ;
router . get ( '/api/v1/auth/logout' , token , routes . auth . logout ) ; // this will invalidate the token if any and redirect to / always
router . post ( '/api/v1/auth/password_reset_request' , json , routes . auth . passwordResetRequest ) ;
router . post ( '/api/v1/auth/password_reset' , json , routes . auth . passwordReset ) ;
router . post ( '/api/v1/auth/setup_account' , json , routes . auth . setupAccount ) ;
2023-08-21 15:01:43 +05:30
router . get ( '/api/v1/auth/branding' , routes . auth . getBranding ) ; // temp route until we server side render password_reset and setup_account
2020-02-04 14:35:25 +01:00
2023-08-12 21:47:24 +05:30
router . get ( '/api/v1/cloudron/status' , routes . cloudron . getStatus ) ; // healthcheck
router . get ( '/api/v1/cloudron/avatar' , routes . branding . getCloudronAvatar ) ; // public route for dashboard, email
2023-08-10 16:50:29 +05:30
2023-08-10 16:20:33 +05:30
router . get ( '/api/v1/cloudron/languages' , routes . cloudron . listLanguages ) ;
2023-08-04 10:10:08 +05:30
router . get ( '/api/v1/cloudron/language' , token , authorizeAdmin , routes . cloudron . getLanguage ) ;
router . post ( '/api/v1/cloudron/language' , json , token , authorizeAdmin , routes . cloudron . setLanguage ) ;
router . get ( '/api/v1/cloudron/time_zone' , token , authorizeAdmin , routes . cloudron . getTimeZone ) ;
router . post ( '/api/v1/cloudron/time_zone' , json , token , authorizeAdmin , routes . cloudron . setTimeZone ) ;
2023-08-12 21:47:24 +05:30
// config route for dashboard that any auth user (not just admin) can access
2023-08-13 10:29:24 +05:30
router . get ( '/api/v1/dashboard/config' , token , authorizeUser , routes . dashboard . getConfig ) ;
2023-08-14 09:40:31 +05:30
router . post ( '/api/v1/dashboard/prepare_location' , json , token , authorizeAdmin , routes . dashboard . startPrepareLocation ) ;
2023-08-17 13:02:36 +05:30
router . post ( '/api/v1/dashboard/location' , json , token , authorizeAdmin , routes . dashboard . changeLocation ) ;
2023-08-04 13:19:48 +05:30
2023-08-04 13:41:13 +05:30
// system (vm/server)
router . get ( '/api/v1/system/reboot' , token , authorizeAdmin , routes . system . isRebootRequired ) ;
router . post ( '/api/v1/system/reboot' , json , token , authorizeAdmin , routes . system . reboot ) ;
router . get ( '/api/v1/system/graphs' , token , authorizeAdmin , routes . system . getSystemGraphs ) ;
router . get ( '/api/v1/system/disks' , token , authorizeAdmin , routes . system . getDisks ) ;
2023-12-04 00:23:25 +01:00
router . get ( '/api/v1/system/cpus' , token , authorizeAdmin , routes . system . getCpus ) ;
2023-12-04 00:31:18 +01:00
router . get ( '/api/v1/system/dmi' , token , authorizeAdmin , routes . system . getDmi ) ;
2023-08-04 13:41:13 +05:30
router . get ( '/api/v1/system/disk_usage' , token , authorizeAdmin , routes . system . getDiskUsage ) ;
router . post ( '/api/v1/system/disk_usage' , token , authorizeAdmin , routes . system . updateDiskUsage ) ;
router . get ( '/api/v1/system/block_devices' , token , authorizeAdmin , routes . system . getBlockDevices ) ;
router . get ( '/api/v1/system/memory' , token , authorizeAdmin , routes . system . getMemory ) ;
router . get ( '/api/v1/system/logs/:unit' , token , authorizeAdmin , routes . system . getLogs ) ;
router . get ( '/api/v1/system/logstream/:unit' , token , authorizeAdmin , routes . system . getLogStream ) ;
2023-08-04 12:46:54 +05:30
// eventlog
router . get ( '/api/v1/eventlog' , token , authorizeAdmin , routes . eventlog . list ) ;
router . get ( '/api/v1/eventlog/:eventId' , token , authorizeAdmin , routes . eventlog . get ) ;
2020-07-10 14:10:52 +02:00
2023-08-03 14:26:41 +05:30
// updater
router . get ( '/api/v1/updater/updates' , token , authorizeAdmin , routes . updater . getUpdateInfo ) ;
router . post ( '/api/v1/updater/update' , json , token , authorizeAdmin , routes . updater . update ) ;
router . post ( '/api/v1/updater/check_for_updates' , json , token , authorizeAdmin , routes . updater . checkForUpdates ) ;
router . get ( '/api/v1/updater/autoupdate_pattern' , token , authorizeAdmin , routes . updater . getAutoupdatePattern ) ;
router . post ( '/api/v1/updater/autoupdate_pattern' , json , token , authorizeAdmin , routes . updater . setAutoupdatePattern ) ;
2020-07-10 14:10:52 +02:00
// task routes
router . get ( '/api/v1/tasks' , token , authorizeAdmin , routes . tasks . list ) ;
2023-05-15 09:50:39 +02:00
router . get ( '/api/v1/tasks/:taskId' , token , authorizeAdmin , routes . tasks . load , routes . tasks . get ) ;
router . get ( '/api/v1/tasks/:taskId/logs' , token , authorizeAdmin , routes . tasks . load , routes . tasks . getLogs ) ;
router . get ( '/api/v1/tasks/:taskId/logstream' , token , authorizeAdmin , routes . tasks . load , routes . tasks . getLogStream ) ;
router . post ( '/api/v1/tasks/:taskId/stop' , json , token , authorizeAdmin , routes . tasks . load , routes . tasks . stopTask ) ;
2020-07-10 14:10:52 +02:00
2021-04-21 12:00:07 -07:00
// notification routes (these are server level)
2021-05-28 14:34:18 -07:00
router . get ( '/api/v1/notifications' , token , authorizeAdmin , routes . notifications . list ) ;
router . get ( '/api/v1/notifications/:notificationId' , token , authorizeAdmin , routes . notifications . load , routes . notifications . get ) ;
router . post ( '/api/v1/notifications/:notificationId' , json , token , authorizeAdmin , routes . notifications . load , routes . notifications . update ) ;
2020-07-10 14:10:52 +02:00
// backup routes
2023-08-15 08:14:35 +05:30
router . get ( '/api/v1/backups' , token , authorizeAdmin , routes . backups . list ) ;
router . get ( '/api/v1/backups/mount_status' , token , authorizeAdmin , routes . backups . getMountStatus ) ;
router . post ( '/api/v1/backups/create' , token , authorizeAdmin , routes . backups . create ) ;
router . post ( '/api/v1/backups/cleanup' , json , token , authorizeAdmin , routes . backups . cleanup ) ;
router . post ( '/api/v1/backups/remount' , json , token , authorizeAdmin , routes . backups . remount ) ;
router . get ( '/api/v1/backups/config' , token , authorizeAdmin , routes . backups . getConfig ) ;
router . post ( '/api/v1/backups/config/storage' , json , token , authorizeOwner , routes . backups . setStorage ) ;
router . post ( '/api/v1/backups/config/limits' , json , token , authorizeOwner , routes . backups . setLimits ) ;
router . get ( '/api/v1/backups/policy' , token , authorizeAdmin , routes . backups . getPolicy ) ;
router . post ( '/api/v1/backups/policy' , json , token , authorizeOwner , routes . backups . setPolicy ) ;
router . post ( '/api/v1/backups/:backupId' , json , token , authorizeAdmin , routes . backups . update ) ;
2018-11-19 14:40:32 -08:00
2018-04-26 19:57:44 -07:00
// working off the user behind the provided token
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/profile' , token , authorizeUser , routes . profile . get ) ;
router . post ( '/api/v1/profile' , json , token , authorizeUser , routes . profile . authorize , routes . profile . update ) ;
router . get ( '/api/v1/profile/avatar/:identifier' , routes . profile . getAvatar ) ; // this is not scoped so it can used directly in img tag
router . post ( '/api/v1/profile/avatar' , json , token , authorizeUser , ( req , res , next ) => { return typeof req . body . avatar === 'string' ? next ( ) : multipart ( req , res , next ) ; } , routes . profile . setAvatar ) ; // avatar is not exposed in LDAP. so it's personal and not locked
2023-09-13 20:08:41 +05:30
router . get ( '/api/v1/profile/background_image' , token , authorizeUser , routes . profile . getBackgroundImage ) ;
router . post ( '/api/v1/profile/background_image' , token , authorizeUser , multipart , routes . profile . setBackgroundImage ) ; // backgroundImage is not exposed in LDAP. so it's personal and not locked
2022-09-24 21:27:43 +02:00
router . post ( '/api/v1/profile/password' , json , token , authorizeUser , routes . users . verifyPassword , routes . profile . setPassword ) ;
router . post ( '/api/v1/profile/twofactorauthentication_secret' , json , token , authorizeUser , routes . profile . setTwoFactorAuthenticationSecret ) ;
router . post ( '/api/v1/profile/twofactorauthentication_enable' , json , token , authorizeUser , routes . profile . enableTwoFactorAuthentication ) ;
router . post ( '/api/v1/profile/twofactorauthentication_disable' , json , token , authorizeUser , routes . users . verifyPassword , routes . profile . disableTwoFactorAuthentication ) ;
2020-07-10 14:10:52 +02:00
// app password routes
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/app_passwords' , token , authorizeUser , routes . appPasswords . list ) ;
router . post ( '/api/v1/app_passwords' , json , token , authorizeUser , routes . appPasswords . add ) ;
router . get ( '/api/v1/app_passwords/:id' , token , authorizeUser , routes . appPasswords . get ) ;
router . del ( '/api/v1/app_passwords/:id' , token , authorizeUser , routes . appPasswords . del ) ;
2020-01-31 15:28:42 -08:00
2022-09-24 20:56:43 +02:00
// access tokens
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/tokens' , token , authorizeUser , routes . tokens . list ) ;
router . post ( '/api/v1/tokens' , json , token , authorizeUser , routes . tokens . add ) ;
router . get ( '/api/v1/tokens/:id' , token , authorizeUser , routes . tokens . verifyOwnership , routes . tokens . get ) ;
router . del ( '/api/v1/tokens/:id' , token , authorizeUser , routes . tokens . verifyOwnership , routes . tokens . del ) ;
2020-02-07 16:20:05 +01:00
2016-06-02 00:20:33 -07:00
// user routes
2020-07-10 14:10:52 +02:00
router . get ( '/api/v1/users' , token , authorizeUserManager , routes . users . list ) ;
2021-07-15 09:50:11 -07:00
router . post ( '/api/v1/users' , json , token , authorizeUserManager , routes . users . add ) ;
2020-07-10 14:10:52 +02:00
router . get ( '/api/v1/users/:userId' , token , authorizeUserManager , routes . users . load , routes . users . get ) ; // this is manage scope because it returns non-restricted fields
2021-06-26 09:57:07 -07:00
router . del ( '/api/v1/users/:userId' , token , authorizeUserManager , routes . users . load , routes . users . del ) ;
2020-07-10 14:10:52 +02:00
router . post ( '/api/v1/users/:userId' , json , token , authorizeUserManager , routes . users . load , routes . users . update ) ;
2021-07-15 09:50:11 -07:00
router . post ( '/api/v1/users/:userId/password' , json , token , authorizeUserManager , routes . users . load , routes . users . setPassword ) ;
2021-09-17 12:52:41 +02:00
router . post ( '/api/v1/users/:userId/ghost' , json , token , authorizeAdmin , routes . users . load , routes . users . setGhost ) ;
2020-07-10 14:10:52 +02:00
router . put ( '/api/v1/users/:userId/groups' , json , token , authorizeUserManager , routes . users . load , routes . users . setGroups ) ;
2022-04-24 22:11:27 +02:00
router . post ( '/api/v1/users/:userId/make_local' , json , token , authorizeUserManager , routes . users . load , routes . users . makeLocal ) ;
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/users/:userId/password_reset_link' , json , token , authorizeUserManager , routes . users . load , routes . users . getPasswordResetLink ) ;
router . post ( '/api/v1/users/:userId/send_password_reset_email' , json , token , authorizeUserManager , routes . users . load , routes . users . sendPasswordResetEmail ) ;
router . get ( '/api/v1/users/:userId/invite_link' , json , token , authorizeUserManager , routes . users . load , routes . users . getInviteLink ) ;
router . post ( '/api/v1/users/:userId/send_invite_email' , json , token , authorizeUserManager , routes . users . load , routes . users . sendInviteEmail ) ;
router . post ( '/api/v1/users/:userId/twofactorauthentication_disable' , json , token , authorizeUserManager , routes . users . load , routes . users . disableTwoFactorAuthentication ) ;
2015-07-20 00:09:47 -07:00
2016-02-09 13:34:01 -08:00
// Group management
2020-07-10 14:10:52 +02:00
router . get ( '/api/v1/groups' , token , authorizeUserManager , routes . groups . list ) ;
2021-06-28 15:15:28 -07:00
router . post ( '/api/v1/groups' , json , token , authorizeUserManager , routes . groups . add ) ;
2020-07-10 14:10:52 +02:00
router . get ( '/api/v1/groups/:groupId' , token , authorizeUserManager , routes . groups . get ) ;
2022-06-22 17:36:19 -07:00
router . put ( '/api/v1/groups/:groupId/members' , json , token , authorizeUserManager , routes . groups . setMembers ) ;
2020-07-10 14:10:52 +02:00
router . post ( '/api/v1/groups/:groupId' , json , token , authorizeUserManager , routes . groups . update ) ;
router . del ( '/api/v1/groups/:groupId' , token , authorizeUserManager , routes . groups . remove ) ;
2016-02-09 13:34:01 -08:00
2023-08-03 08:11:42 +05:30
// User directory
router . get ( '/api/v1/user_directory/profile_config' , token , authorizeAdmin , routes . users . getProfileConfig ) ;
router . post ( '/api/v1/user_directory/profile_config' , json , token , authorizeAdmin , routes . users . setProfileConfig ) ;
2023-08-03 02:06:07 +05:30
// External LDAP
router . get ( '/api/v1/external_ldap/config' , token , authorizeAdmin , routes . externalLdap . getConfig ) ;
router . post ( '/api/v1/external_ldap/config' , json , token , authorizeAdmin , routes . externalLdap . setConfig ) ;
router . post ( '/api/v1/external_ldap/sync' , json , token , authorizeAdmin , routes . externalLdap . sync ) ;
2023-08-03 02:26:11 +05:30
// Directory Server
router . get ( '/api/v1/directory_server/config' , token , authorizeAdmin , routes . directoryServer . getConfig ) ;
router . post ( '/api/v1/directory_server/config' , json , token , authorizeAdmin , routes . directoryServer . setConfig ) ;
2019-05-05 13:00:45 -07:00
// appstore and subscription routes
2023-12-02 11:23:03 +01:00
router . post ( '/api/v1/appstore/register_cloudron' , json , token , authorizeOwner , routes . appstore . registerCloudronWithLogin ) ;
router . post ( '/api/v1/appstore/register_cloudron_with_setup_token' , json , token , authorizeOwner , routes . appstore . registerCloudronWithSetupToken ) ;
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/appstore/subscription' , token , authorizeUser , routes . appstore . getSubscription ) ; // for all users
2020-07-10 14:10:52 +02:00
router . get ( '/api/v1/appstore/apps' , token , authorizeAdmin , routes . appstore . getApps ) ;
router . get ( '/api/v1/appstore/apps/:appstoreId' , token , authorizeAdmin , routes . appstore . getApp ) ;
router . get ( '/api/v1/appstore/apps/:appstoreId/versions/:versionId' , token , authorizeAdmin , routes . appstore . getAppVersion ) ;
2019-05-04 11:45:03 -07:00
2015-07-20 00:09:47 -07:00
// app routes
2022-09-24 21:27:43 +02:00
router . post ( '/api/v1/apps/install' , json , token , authorizeAdmin , routes . apps . install ) ;
router . get ( '/api/v1/apps' , token , authorizeUser , routes . apps . listByUser ) ;
2021-09-21 17:28:58 -07:00
router . get ( '/api/v1/apps/:id' , token , routes . apps . load , authorizeOperator , routes . apps . getApp ) ;
2023-05-12 15:14:33 +02:00
router . get ( '/api/v1/apps/:id/icon' , routes . apps . load , routes . apps . getAppIcon ) ;
2022-09-24 21:27:43 +02:00
router . post ( '/api/v1/apps/:id/uninstall' , json , token , routes . apps . load , authorizeAdmin , routes . apps . uninstall ) ;
router . post ( '/api/v1/apps/:id/configure/access_restriction' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setAccessRestriction ) ;
router . post ( '/api/v1/apps/:id/configure/operators' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setOperators ) ;
2021-09-21 10:11:27 -07:00
router . post ( '/api/v1/apps/:id/configure/label' , json , token , routes . apps . load , authorizeOperator , routes . apps . setLabel ) ;
router . post ( '/api/v1/apps/:id/configure/tags' , json , token , routes . apps . load , authorizeOperator , routes . apps . setTags ) ;
router . post ( '/api/v1/apps/:id/configure/icon' , json , token , routes . apps . load , authorizeOperator , routes . apps . setIcon ) ;
router . post ( '/api/v1/apps/:id/configure/memory_limit' , json , token , routes . apps . load , authorizeOperator , routes . apps . setMemoryLimit ) ;
router . post ( '/api/v1/apps/:id/configure/cpu_shares' , json , token , routes . apps . load , authorizeOperator , routes . apps . setCpuShares ) ;
router . post ( '/api/v1/apps/:id/configure/automatic_backup' , json , token , routes . apps . load , authorizeOperator , routes . apps . setAutomaticBackup ) ;
router . post ( '/api/v1/apps/:id/configure/automatic_update' , json , token , routes . apps . load , authorizeOperator , routes . apps . setAutomaticUpdate ) ;
router . post ( '/api/v1/apps/:id/configure/reverse_proxy' , json , token , routes . apps . load , authorizeOperator , routes . apps . setReverseProxyConfig ) ;
router . post ( '/api/v1/apps/:id/configure/cert' , json , token , routes . apps . load , authorizeOperator , routes . apps . setCertificate ) ;
router . post ( '/api/v1/apps/:id/configure/debug_mode' , json , token , routes . apps . load , authorizeOperator , routes . apps . setDebugMode ) ;
2021-09-22 12:45:11 -07:00
router . post ( '/api/v1/apps/:id/configure/mailbox' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setMailbox ) ;
2021-10-01 12:09:13 -07:00
router . post ( '/api/v1/apps/:id/configure/inbox' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setInbox ) ;
2023-07-13 15:06:07 +05:30
router . post ( '/api/v1/apps/:id/configure/turn' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setTurn ) ;
2023-07-13 16:37:33 +05:30
router . post ( '/api/v1/apps/:id/configure/redis' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setRedis ) ;
2021-09-21 10:11:27 -07:00
router . post ( '/api/v1/apps/:id/configure/env' , json , token , routes . apps . load , authorizeOperator , routes . apps . setEnvironment ) ;
2022-06-01 22:44:52 -07:00
router . post ( '/api/v1/apps/:id/configure/storage' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setStorage ) ;
2021-09-21 10:11:27 -07:00
router . post ( '/api/v1/apps/:id/configure/location' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setLocation ) ;
router . post ( '/api/v1/apps/:id/configure/mounts' , json , token , routes . apps . load , authorizeAdmin , routes . apps . setMounts ) ;
2021-09-27 21:41:41 -07:00
router . post ( '/api/v1/apps/:id/configure/crontab' , json , token , routes . apps . load , authorizeOperator , routes . apps . setCrontab ) ;
2022-06-08 11:21:09 +02:00
router . post ( '/api/v1/apps/:id/configure/upstream_uri' , json , token , routes . apps . load , authorizeOperator , routes . apps . setUpstreamUri ) ;
2021-09-21 10:11:27 -07:00
router . post ( '/api/v1/apps/:id/repair' , json , token , routes . apps . load , authorizeOperator , routes . apps . repair ) ;
2021-09-21 19:53:05 -07:00
router . post ( '/api/v1/apps/:id/check_for_updates' , json , token , routes . apps . load , authorizeOperator , routes . apps . checkForUpdates ) ;
2021-09-21 10:11:27 -07:00
router . post ( '/api/v1/apps/:id/update' , json , token , routes . apps . load , authorizeOperator , routes . apps . update ) ;
router . post ( '/api/v1/apps/:id/restore' , json , token , routes . apps . load , authorizeOperator , routes . apps . restore ) ;
router . post ( '/api/v1/apps/:id/import' , json , token , routes . apps . load , authorizeOperator , routes . apps . importApp ) ;
router . post ( '/api/v1/apps/:id/export' , json , token , routes . apps . load , authorizeOperator , routes . apps . exportApp ) ;
router . post ( '/api/v1/apps/:id/backup' , json , token , routes . apps . load , authorizeOperator , routes . apps . backup ) ;
router . get ( '/api/v1/apps/:id/backups' , token , routes . apps . load , authorizeOperator , routes . apps . listBackups ) ;
2022-04-02 17:09:08 -07:00
router . post ( '/api/v1/apps/:id/backups/:backupId' , json , token , routes . apps . load , authorizeOperator , routes . apps . updateBackup ) ;
2022-11-03 22:13:57 +01:00
router . get ( '/api/v1/apps/:id/backups/:backupId/download' , token , routes . apps . load , authorizeOperator , routes . apps . downloadBackup ) ;
2021-09-21 10:11:27 -07:00
router . post ( '/api/v1/apps/:id/start' , json , token , routes . apps . load , authorizeOperator , routes . apps . start ) ;
router . post ( '/api/v1/apps/:id/stop' , json , token , routes . apps . load , authorizeOperator , routes . apps . stop ) ;
router . post ( '/api/v1/apps/:id/restart' , json , token , routes . apps . load , authorizeOperator , routes . apps . restart ) ;
router . get ( '/api/v1/apps/:id/logstream' , token , routes . apps . load , authorizeOperator , routes . apps . getLogStream ) ;
router . get ( '/api/v1/apps/:id/logs' , token , routes . apps . load , authorizeOperator , routes . apps . getLogs ) ;
2021-09-21 19:45:29 -07:00
router . get ( '/api/v1/apps/:id/eventlog' , token , routes . apps . load , authorizeOperator , routes . apps . listEventlog ) ;
2021-09-21 22:29:19 -07:00
router . get ( '/api/v1/apps/:id/limits' , token , routes . apps . load , authorizeOperator , routes . apps . getLimits ) ;
2021-09-21 22:19:20 -07:00
router . get ( '/api/v1/apps/:id/task' , token , routes . apps . load , authorizeOperator , routes . apps . getTask ) ;
2022-10-13 20:32:36 +02:00
router . get ( '/api/v1/apps/:id/graphs' , token , routes . apps . load , authorizeOperator , routes . apps . getGraphs ) ;
2021-09-21 10:11:27 -07:00
router . post ( '/api/v1/apps/:id/clone' , json , token , routes . apps . load , authorizeAdmin , routes . apps . clone ) ;
router . get ( '/api/v1/apps/:id/download' , token , routes . apps . load , authorizeOperator , routes . apps . downloadFile ) ;
router . post ( '/api/v1/apps/:id/upload' , json , token , multipart , routes . apps . load , authorizeOperator , routes . apps . uploadFile ) ;
2021-09-25 17:19:58 -07:00
router . use ( '/api/v1/apps/:id/files/*' , token , routes . apps . load , authorizeOperator , routes . filemanager . proxy ( 'app' ) ) ;
2022-05-16 10:26:30 -07:00
router . post ( '/api/v1/apps/:id/exec' , json , token , routes . apps . load , authorizeOperator , routes . apps . createExec ) ;
router . get ( '/api/v1/apps/:id/exec/:execId/start' , token , routes . apps . load , authorizeOperator , routes . apps . startExec ) ;
router . get ( '/api/v1/apps/:id/exec/:execId' , token , routes . apps . load , authorizeOperator , routes . apps . getExec ) ;
2020-12-22 17:19:26 -08:00
2017-08-18 17:56:01 -07:00
// websocket cannot do bearer authentication
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/apps/:id/exec/:execId/startws' , token , routes . apps . load , authorizeOperator , routes . apps . startExecWebSocket ) ;
2015-07-20 00:09:47 -07:00
2022-07-06 19:15:59 +02:00
// app links in dashboard
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/applinks' , token , authorizeUser , routes . applinks . listByUser ) ;
2022-07-07 13:01:23 +02:00
router . post ( '/api/v1/applinks' , json , token , authorizeAdmin , routes . applinks . add ) ;
router . get ( '/api/v1/applinks/:id' , token , authorizeAdmin , routes . applinks . get ) ;
router . post ( '/api/v1/applinks/:id' , json , token , authorizeAdmin , routes . applinks . update ) ;
router . del ( '/api/v1/applinks/:id' , token , authorizeAdmin , routes . applinks . remove ) ;
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/applinks/:id/icon' , token , authorizeUser , routes . applinks . getIcon ) ;
2022-07-06 19:15:59 +02:00
2020-07-10 14:10:52 +02:00
// branding routes
2023-10-30 18:37:02 +01:00
router . get ( '/api/v1/branding/cloudron_name' , token , authorizeAdmin , routes . branding . getCloudronName ) ;
router . post ( '/api/v1/branding/cloudron_name' , json , token , authorizeAdmin , routes . branding . setCloudronName ) ;
router . get ( '/api/v1/branding/cloudron_avatar' , token , authorizeAdmin , routes . branding . getCloudronAvatar ) ;
router . post ( '/api/v1/branding/cloudron_avatar' , json , token , authorizeAdmin , multipart , routes . branding . setCloudronAvatar ) ;
router . get ( '/api/v1/branding/footer' , token , authorizeAdmin , routes . branding . getFooter ) ;
router . post ( '/api/v1/branding/footer' , json , token , authorizeAdmin , routes . branding . setFooter ) ;
2020-03-15 11:32:18 -07:00
2023-08-04 13:19:48 +05:30
// reverseproxy routes
router . post ( '/api/v1/reverseproxy/renew_certs' , json , token , authorizeAdmin , routes . reverseProxy . renewCerts ) ;
router . get ( '/api/v1/reverseproxy/trusted_ips' , token , authorizeAdmin , routes . reverseProxy . getTrustedIps ) ;
router . post ( '/api/v1/reverseproxy/trusted_ips' , json , token , authorizeAdmin , routes . reverseProxy . setTrustedIps ) ;
2020-08-31 18:22:33 -07:00
// network routes
2023-10-30 18:37:02 +01:00
router . get ( '/api/v1/network/blocklist' , token , authorizeAdmin , routes . network . getBlocklist ) ;
router . post ( '/api/v1/network/blocklist' , json , token , authorizeAdmin , routes . network . setBlocklist ) ;
2023-08-03 06:05:29 +05:30
router . get ( '/api/v1/network/dynamic_dns' , token , authorizeAdmin , routes . network . getDynamicDns ) ;
router . post ( '/api/v1/network/dynamic_dns' , json , token , authorizeAdmin , routes . network . setDynamicDns ) ;
router . get ( '/api/v1/network/ipv4_config' , token , authorizeAdmin , routes . network . getIPv4Config ) ;
router . post ( '/api/v1/network/ipv4_config' , json , token , authorizeAdmin , routes . network . setIPv4Config ) ;
router . get ( '/api/v1/network/ipv6_config' , token , authorizeAdmin , routes . network . getIPv6Config ) ;
router . post ( '/api/v1/network/ipv6_config' , json , token , authorizeAdmin , routes . network . setIPv6Config ) ;
2023-08-03 13:38:42 +05:30
router . get ( '/api/v1/network/ipv4' , token , authorizeAdmin , routes . network . getIPv4 ) ;
router . get ( '/api/v1/network/ipv6' , token , authorizeAdmin , routes . network . getIPv6 ) ;
2020-08-31 18:22:33 -07:00
2023-08-04 14:02:50 +05:30
// docker
router . get ( '/api/v1/docker/registry_config' , token , authorizeAdmin , routes . docker . getRegistryConfig ) ;
router . post ( '/api/v1/docker/registry_config' , json , token , authorizeAdmin , routes . docker . setRegistryConfig ) ;
2018-10-12 17:04:04 -07:00
2017-06-28 17:06:12 -05:00
// email routes
2023-10-30 18:37:02 +01:00
router . get ( '/api/v1/mailserver/eventlog' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . post ( '/api/v1/mailserver/clear_eventlog' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . use ( '/api/v1/mailserver/files/*' , token , authorizeAdmin , routes . filemanager . proxy ( 'mail' ) ) ;
2020-08-20 23:05:52 -07:00
router . get ( '/api/v1/mailserver/location' , token , authorizeAdmin , routes . mailserver . getLocation ) ;
router . post ( '/api/v1/mailserver/location' , json , token , authorizeAdmin , routes . mailserver . setLocation ) ;
router . get ( '/api/v1/mailserver/max_email_size' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . post ( '/api/v1/mailserver/max_email_size' , token , authorizeAdmin , routes . mailserver . proxy ) ;
2020-08-22 10:22:57 -07:00
router . get ( '/api/v1/mailserver/spam_acl' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . post ( '/api/v1/mailserver/spam_acl' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . get ( '/api/v1/mailserver/spam_custom_config' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . post ( '/api/v1/mailserver/spam_custom_config' , token , authorizeAdmin , routes . mailserver . proxy ) ;
2021-10-13 14:01:07 -07:00
router . get ( '/api/v1/mailserver/dnsbl_config' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . post ( '/api/v1/mailserver/dnsbl_config' , token , authorizeAdmin , routes . mailserver . proxy ) ;
2020-11-19 17:10:45 -08:00
router . get ( '/api/v1/mailserver/solr_config' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . post ( '/api/v1/mailserver/solr_config' , token , authorizeAdmin , routes . mailserver . proxy , routes . mailserver . restart ) ;
2021-12-08 10:20:43 -08:00
router . get ( '/api/v1/mailserver/mailbox_sharing' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . post ( '/api/v1/mailserver/mailbox_sharing' , token , authorizeAdmin , routes . mailserver . proxy , routes . mailserver . restart ) ;
2023-09-20 21:55:24 +05:30
router . get ( '/api/v1/mailserver/virtual_all_mail' , token , authorizeAdmin , routes . mailserver . proxy ) ;
router . post ( '/api/v1/mailserver/virtual_all_mail' , token , authorizeAdmin , routes . mailserver . proxy , routes . mailserver . restart ) ;
2021-12-01 09:27:24 -08:00
router . get ( '/api/v1/mailserver/usage' , token , authorizeMailManager , routes . mailserver . proxy ) ;
2022-09-20 19:20:52 +02:00
2022-09-22 19:30:05 +02:00
router . use ( '/api/v1/mailserver/queue' , token , authorizeAdmin , routes . mailserver . queueProxy ) ;
2020-02-07 14:11:52 -08:00
2021-12-01 09:27:24 -08:00
router . get ( '/api/v1/mail/:domain' , token , authorizeMailManager , routes . mail . getDomain ) ;
router . post ( '/api/v1/mail/:domain/enable' , json , token , authorizeAdmin , routes . mail . setMailEnabled ) ;
router . get ( '/api/v1/mail/:domain/status' , token , authorizeMailManager , routes . mail . getStatus ) ;
2021-12-02 14:56:35 -08:00
router . post ( '/api/v1/mail/:domain/mail_from_validation' , json , token , authorizeMailManager , routes . mail . setMailFromValidation ) ;
2021-12-01 09:27:24 -08:00
router . post ( '/api/v1/mail/:domain/catch_all' , json , token , authorizeMailManager , routes . mail . setCatchAllAddress ) ;
2020-07-10 14:10:52 +02:00
router . post ( '/api/v1/mail/:domain/relay' , json , token , authorizeAdmin , routes . mail . setMailRelay ) ;
2021-12-01 09:27:24 -08:00
router . post ( '/api/v1/mail/:domain/banner' , json , token , authorizeMailManager , routes . mail . setBanner ) ;
router . post ( '/api/v1/mail/:domain/send_test_mail' , json , token , authorizeMailManager , routes . mail . sendTestMail ) ;
router . get ( '/api/v1/mail/:domain/mailbox_count' , token , authorizeMailManager , routes . mail . getMailboxCount ) ;
router . get ( '/api/v1/mail/:domain/mailboxes' , token , authorizeMailManager , routes . mail . listMailboxes ) ;
router . get ( '/api/v1/mail/:domain/mailboxes/:name' , token , authorizeMailManager , routes . mail . getMailbox ) ;
router . post ( '/api/v1/mail/:domain/mailboxes' , json , token , authorizeMailManager , routes . mail . addMailbox ) ;
router . post ( '/api/v1/mail/:domain/mailboxes/:name' , json , token , authorizeMailManager , routes . mail . updateMailbox ) ;
router . del ( '/api/v1/mail/:domain/mailboxes/:name' , json , token , authorizeMailManager , routes . mail . delMailbox ) ;
router . get ( '/api/v1/mail/:domain/mailboxes/:name/aliases' , token , authorizeMailManager , routes . mail . getAliases ) ;
router . put ( '/api/v1/mail/:domain/mailboxes/:name/aliases' , json , token , authorizeMailManager , routes . mail . setAliases ) ;
router . get ( '/api/v1/mail/:domain/lists' , token , authorizeMailManager , routes . mail . getLists ) ;
router . post ( '/api/v1/mail/:domain/lists' , json , token , authorizeMailManager , routes . mail . addList ) ;
router . get ( '/api/v1/mail/:domain/lists/:name' , token , authorizeMailManager , routes . mail . getList ) ;
router . post ( '/api/v1/mail/:domain/lists/:name' , json , token , authorizeMailManager , routes . mail . updateList ) ;
router . del ( '/api/v1/mail/:domain/lists/:name' , token , authorizeMailManager , routes . mail . delList ) ;
2020-07-10 14:10:52 +02:00
// support routes
2023-12-03 20:00:57 +01:00
router . post ( '/api/v1/support/ticket' , json , token , authorizeOwner , routes . support . createTicket ) ;
2022-10-04 10:23:46 +02:00
router . get ( '/api/v1/support/remote_support' , token , authorizeOwner , routes . support . getRemoteSupport ) ;
2023-12-03 20:00:57 +01:00
router . post ( '/api/v1/support/remote_support' , json , token , authorizeOwner , routes . support . enableRemoteSupport ) ;
2017-04-18 14:49:28 -07:00
2017-10-28 22:18:07 +02:00
// domain routes
2020-12-23 15:34:23 -08:00
router . post ( '/api/v1/domains' , json , token , authorizeAdmin , routes . domains . add ) ;
2023-08-04 12:53:11 +05:30
router . post ( '/api/v1/domains/sync_dns' , json , token , authorizeAdmin , routes . domains . syncDnsRecords ) ;
2022-09-24 21:27:43 +02:00
router . get ( '/api/v1/domains' , token , authorizeUser , routes . domains . list ) ;
2020-12-23 15:34:23 -08:00
router . get ( '/api/v1/domains/:domain' , token , authorizeAdmin , routes . domains . get ) ; // this is manage scope because it returns non-restricted fields
2022-09-24 21:27:43 +02:00
router . post ( '/api/v1/domains/:domain/config' , json , token , authorizeAdmin , routes . domains . setConfig ) ;
router . post ( '/api/v1/domains/:domain/wellknown' , json , token , authorizeAdmin , routes . domains . setWellKnown ) ;
2020-12-23 15:34:23 -08:00
router . del ( '/api/v1/domains/:domain' , token , authorizeAdmin , routes . domains . del ) ;
router . get ( '/api/v1/domains/:domain/dns_check' , token , authorizeAdmin , routes . domains . checkDnsRecords ) ;
2017-10-28 22:18:07 +02:00
2020-10-27 22:39:05 -07:00
// volume routes
2020-10-30 10:16:52 -07:00
router . post ( '/api/v1/volumes' , json , token , authorizeAdmin , routes . volumes . add ) ;
router . get ( '/api/v1/volumes' , token , authorizeAdmin , routes . volumes . list ) ;
router . get ( '/api/v1/volumes/:id' , token , authorizeAdmin , routes . volumes . load , routes . volumes . get ) ;
2023-09-20 16:27:39 +02:00
router . post ( '/api/v1/volumes/:id' , json , token , authorizeAdmin , routes . volumes . load , routes . volumes . update ) ;
2020-10-30 10:16:52 -07:00
router . del ( '/api/v1/volumes/:id' , token , authorizeAdmin , routes . volumes . load , routes . volumes . del ) ;
2021-05-13 15:33:16 -07:00
router . get ( '/api/v1/volumes/:id/status' , token , authorizeAdmin , routes . volumes . load , routes . volumes . getStatus ) ;
2021-10-11 15:51:16 +02:00
router . post ( '/api/v1/volumes/:id/remount' , token , authorizeAdmin , routes . volumes . load , routes . volumes . remount ) ;
2021-09-25 17:19:58 -07:00
router . use ( '/api/v1/volumes/:id/files/*' , token , authorizeAdmin , routes . filemanager . proxy ( 'volume' ) ) ;
2020-10-27 22:39:05 -07:00
2021-01-19 18:36:28 -08:00
// service routes
2021-09-20 09:15:28 -07:00
router . get ( '/api/v1/services' , token , authorizeAdmin , routes . services . list ) ;
2023-08-12 21:53:28 +05:30
router . get ( '/api/v1/services/platform_status' , token , authorizeUser , routes . services . getPlatformStatus ) ;
2020-07-10 14:10:52 +02:00
router . get ( '/api/v1/services/:service' , token , authorizeAdmin , routes . services . get ) ;
router . post ( '/api/v1/services/:service' , json , token , authorizeAdmin , routes . services . configure ) ;
2022-10-13 20:32:36 +02:00
router . get ( '/api/v1/services/:service/graphs' , token , authorizeAdmin , routes . services . getGraphs ) ;
2020-07-10 14:10:52 +02:00
router . get ( '/api/v1/services/:service/logs' , token , authorizeAdmin , routes . services . getLogs ) ;
router . get ( '/api/v1/services/:service/logstream' , token , authorizeAdmin , routes . services . getLogStream ) ;
router . post ( '/api/v1/services/:service/restart' , json , token , authorizeAdmin , routes . services . restart ) ;
2021-01-21 12:53:38 -08:00
router . post ( '/api/v1/services/:service/rebuild' , json , token , authorizeAdmin , routes . services . rebuild ) ;
2018-11-15 19:59:08 +01:00
2020-12-22 17:19:26 -08:00
// well known
router . get ( '/well-known-handler/*' , routes . wellknown . get ) ;
2023-03-21 14:39:58 +01:00
// OpenID connect clients
2023-03-24 20:08:17 +01:00
router . get ( '/api/v1/oidc/clients' , token , authorizeAdmin , routes . oidc . clients . list ) ;
router . post ( '/api/v1/oidc/clients' , json , token , authorizeAdmin , routes . oidc . clients . add ) ;
router . get ( '/api/v1/oidc/clients/:clientId' , token , authorizeAdmin , routes . oidc . clients . get ) ;
router . post ( '/api/v1/oidc/clients/:clientId' , json , token , authorizeAdmin , routes . oidc . clients . update ) ;
router . del ( '/api/v1/oidc/clients/:clientId' , token , authorizeAdmin , routes . oidc . clients . del ) ;
// OpenID connect sessions
router . del ( '/api/v1/oidc/sessions' , token , authorizeUser , routes . oidc . destroyUserSession ) ;
2023-03-21 13:54:40 +01:00
2015-07-20 00:09:47 -07:00
// upgrade handler
2017-08-17 09:32:38 +02:00
httpServer . on ( 'upgrade' , function ( req , socket , head ) {
2017-08-18 17:56:01 -07:00
// create a node response object for express
2022-04-14 17:41:41 -05:00
const res = new http . ServerResponse ( { } ) ;
2017-08-18 17:56:01 -07:00
res . assignSocket ( socket ) ;
2017-08-17 11:56:51 +02:00
if ( req . headers . upgrade === 'websocket' ) {
2017-08-18 17:56:01 -07:00
res . handleUpgrade = function ( callback ) {
wsServer . handleUpgrade ( req , socket , head , callback ) ;
} ;
2017-08-17 11:56:51 +02:00
} else {
res . sendUpgradeHandshake = function ( ) { // could extend express.response as well
socket . write ( 'HTTP/1.1 101 TCP Handshake\r\n' +
'Upgrade: tcp\r\n' +
'Connection: Upgrade\r\n' +
'\r\n' ) ;
} ;
}
2017-08-18 17:56:01 -07:00
// route through express middleware. if we provide no callback, express will provide a 'finalhandler'
// TODO: it's not clear if socket needs to be destroyed
app ( req , res ) ;
2017-08-17 09:32:38 +02:00
} ) ;
2015-07-20 00:09:47 -07:00
return httpServer ;
}
2021-09-07 09:57:49 -07:00
async function start ( ) {
2015-07-20 00:09:47 -07:00
assert . strictEqual ( gHttpServer , null , 'Server is already up and running.' ) ;
2020-08-04 09:34:03 -07:00
debug ( '==========================================' ) ;
debug ( ` Cloudron ${ constants . VERSION } ` ) ;
debug ( '==========================================' ) ;
2023-08-12 19:28:07 +05:30
await platform . initialize ( ) ;
2023-03-15 13:38:26 +01:00
gHttpServer = await initializeExpressSync ( ) ;
2021-09-07 09:57:49 -07:00
await util . promisify ( gHttpServer . listen . bind ( gHttpServer ) ) ( constants . PORT , '127.0.0.1' ) ;
2023-08-26 08:18:58 +05:30
await safe ( eventlog . add ( eventlog . ACTION _START , AuditSource . BOOT , { version : constants . VERSION } ) ) ; // can fail if db down
2015-07-20 00:09:47 -07:00
}
2021-09-07 09:57:49 -07:00
async function stop ( ) {
if ( ! gHttpServer ) return ;
2015-07-20 00:09:47 -07:00
2023-08-12 19:28:07 +05:30
await platform . uninitialize ( ) ;
2021-09-07 09:57:49 -07:00
await util . promisify ( gHttpServer . close . bind ( gHttpServer ) ) ( ) ;
2015-07-20 00:09:47 -07:00
2021-09-07 09:57:49 -07:00
gHttpServer = null ;
2015-07-20 00:09:47 -07:00
}