diff --git a/box.js b/box.js index 932368d30..079c2736e 100755 --- a/box.js +++ b/box.js @@ -2,14 +2,14 @@ import constants from './src/constants.js'; import fs from 'node:fs'; -import * as ldapServer from './src/ldapserver.js'; +import ldapServer from './src/ldapserver.js'; import net from 'node:net'; -import * as oidcServer from './src/oidcserver.js'; +import oidcServer from './src/oidcserver.js'; import paths from './src/paths.js'; -import * as proxyAuth from './src/proxyauth.js'; +import proxyAuth from './src/proxyauth.js'; import safe from 'safetydance'; -import * as server from './src/server.js'; -import * as directoryServer from './src/directoryserver.js'; +import server from './src/server.js'; +import directoryServer from './src/directoryserver.js'; import debugModule from 'debug'; const debug = debugModule('box:box'); diff --git a/eslint.config.js b/eslint.config.js index 1048f0afb..dec0798f9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -14,7 +14,8 @@ export default [ }, rules: { semi: "error", - "prefer-const": "error" + "prefer-const": "error", + "no-use-before-define": ["error", { "functions": false }] } } ]; diff --git a/migrations/20200512172301-settings-backup-encryption.js b/migrations/20200512172301-settings-backup-encryption.js index e25d2c6ad..8685d6d8a 100644 --- a/migrations/20200512172301-settings-backup-encryption.js +++ b/migrations/20200512172301-settings-backup-encryption.js @@ -1,7 +1,7 @@ 'use strict'; const fs = require('node:fs'), - hush = require('../src/hush.js'); + hush = require('../src/hush.js').default; exports.up = function(db, callback) { db.all('SELECT value FROM settings WHERE name="backup_config"', function (error, results) { diff --git a/migrations/20201120212726-apps-add-containerIp.js b/migrations/20201120212726-apps-add-containerIp.js index 6c51a494f..450c2dbd3 100644 --- a/migrations/20201120212726-apps-add-containerIp.js +++ b/migrations/20201120212726-apps-add-containerIp.js @@ -1,7 +1,7 @@ 'use strict'; const async = require('async'), - iputils = require('../src/iputils.js'); + iputils = require('../src/iputils.js').default; exports.up = function(db, callback) { db.runSql('ALTER TABLE apps ADD COLUMN containerIp VARCHAR(16) UNIQUE', function (error) { diff --git a/migrations/20211006200150-domains-ensure-fallbackCertificate.js b/migrations/20211006200150-domains-ensure-fallbackCertificate.js index 1e9d6113b..e14c29b04 100644 --- a/migrations/20211006200150-domains-ensure-fallbackCertificate.js +++ b/migrations/20211006200150-domains-ensure-fallbackCertificate.js @@ -1,7 +1,7 @@ 'use strict'; const async = require('async'), - openssl = require('../src/openssl.js'), + openssl = require('../src/openssl.js').default, safe = require('safetydance'); const NGINX_CERT_DIR = '/home/yellowtent/platformdata/nginx/cert'; diff --git a/migrations/20220219220751-mail-ensure-dkimKey.js b/migrations/20220219220751-mail-ensure-dkimKey.js index 3a91436ad..2f6e0cd8f 100644 --- a/migrations/20220219220751-mail-ensure-dkimKey.js +++ b/migrations/20220219220751-mail-ensure-dkimKey.js @@ -1,7 +1,7 @@ 'use strict'; const async = require('async'), - mail = require('../src/mail.js'), + mail = require('../src/mail.js').default, safe = require('safetydance'), util = require('node:util'); diff --git a/migrations/20220404211215-backups-rename-id-to-remotePath.js b/migrations/20220404211215-backups-rename-id-to-remotePath.js index 69f2ab74a..7452886e7 100644 --- a/migrations/20220404211215-backups-rename-id-to-remotePath.js +++ b/migrations/20220404211215-backups-rename-id-to-remotePath.js @@ -1,7 +1,7 @@ 'use strict'; const async = require('async'), - hat = require('../src/hat.js'); + hat = require('../src/hat.js').default; exports.up = function(db, callback) { db.all('SELECT * from backups', function (error, allBackups) { diff --git a/migrations/20230712042655-settings-split-backup-config-policy-limit.js b/migrations/20230712042655-settings-split-backup-config-policy-limit.js index 28a1779c2..fe0968fd0 100644 --- a/migrations/20230712042655-settings-split-backup-config-policy-limit.js +++ b/migrations/20230712042655-settings-split-backup-config-policy-limit.js @@ -1,6 +1,6 @@ 'use strict'; -const _ = require('../src/underscore.js'); +const _ = require('../src/underscore.js').default; exports.up = async function(db) { const result = await db.runSql('SELECT * FROM settings WHERE name=?', [ 'backup_config' ]); diff --git a/migrations/20250724102340-backupSites-create-table.js b/migrations/20250724102340-backupSites-create-table.js index e101a7209..0704ef702 100644 --- a/migrations/20250724102340-backupSites-create-table.js +++ b/migrations/20250724102340-backupSites-create-table.js @@ -4,7 +4,7 @@ const child_process = require('node:child_process'), crypto = require('node:crypto'), fs = require('node:fs'), path = require('node:path'), - paths = require('../src/paths.js'); + paths = require('../src/paths.js').default; async function deleteOldSettings(db) { await db.runSql('DELETE FROM settings WHERE name=? OR name=? OR name=?', [ 'backup_storage', 'backup_limits', 'backup_policy' ]); diff --git a/migrations/20250724141339-backups-add-siteId.js b/migrations/20250724141339-backups-add-siteId.js index 251721475..a8a118021 100644 --- a/migrations/20250724141339-backups-add-siteId.js +++ b/migrations/20250724141339-backups-add-siteId.js @@ -3,7 +3,7 @@ const crypto = require('node:crypto'), fs = require('node:fs'), path = require('node:path'), - paths = require('../src/paths.js'), + paths = require('../src/paths.js').default, safe = require('safetydance'); exports.up = async function(db) { diff --git a/scripts/release b/scripts/release index 49f2d9df0..eba15092f 100755 --- a/scripts/release +++ b/scripts/release @@ -14,7 +14,7 @@ import Table from 'easy-table'; import url from 'url'; import util from 'util'; import readline from 'readline'; -import * as _ from '../src/underscore.js'; +import _ from '../src/underscore.js'; // slightly simplified from https://github.com/tcql/node-yesno/blob/master/yesno.js async function yesno({ question, defaultValue, yesValues, noValues }) { diff --git a/src/acme2.js b/src/acme2.js index fce8ae619..9b9f5b901 100644 --- a/src/acme2.js +++ b/src/acme2.js @@ -3,26 +3,20 @@ import blobs from './blobs.js'; import BoxError from './boxerror.js'; import crypto from 'node:crypto'; import debugModule from 'debug'; -import * as dns from './dns.js'; -import * as openssl from './openssl.js'; +import dns from './dns.js'; +import openssl from './openssl.js'; import path from 'node:path'; import paths from './paths.js'; import promiseRetry from './promise-retry.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; -import * as users from './users.js'; +import users from './users.js'; const debug = debugModule('box:cert/acme2'); const _name = 'acme'; const _getChallengeSubdomain = getChallengeSubdomain; -export { - getCertificate, - getRenewalInfo, - _name, - _getChallengeSubdomain, -}; const CA_PROD_DIRECTORY_URL = 'https://acme-v02.api.letsencrypt.org/directory', CA_STAGING_DIRECTORY_URL = 'https://acme-staging-v02.api.letsencrypt.org/directory'; @@ -539,3 +533,10 @@ async function getCertificate(fqdn, domainObject, key) { return await acme.getCertificate(); }); } + +export default { + getCertificate, + getRenewalInfo, + _name, + _getChallengeSubdomain, +}; diff --git a/src/addonconfigs.js b/src/addonconfigs.js index 2515301d5..7e8ff0937 100644 --- a/src/addonconfigs.js +++ b/src/addonconfigs.js @@ -1,16 +1,6 @@ import assert from 'node:assert'; -import * as database from './database.js'; +import database from './database.js'; -export { - get, - set, - unset, - - getByAppId, - getByName, - unsetByAppId, - getAppIdByValue, -}; async function set(appId, addonId, env) { assert.strictEqual(typeof appId, 'string'); @@ -77,3 +67,14 @@ async function getByName(appId, addonId, namePattern) { if (results.length === 0) return null; return results[0].value; } + +export default { + get, + set, + unset, + + getByAppId, + getByName, + unsetByAppId, + getAppIdByValue, +}; diff --git a/src/apphealthmonitor.js b/src/apphealthmonitor.js index ecabdaccd..c3c770174 100644 --- a/src/apphealthmonitor.js +++ b/src/apphealthmonitor.js @@ -4,16 +4,13 @@ import AuditSource from './auditsource.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; import debugModule from 'debug'; -import * as docker from './docker.js'; +import docker from './docker.js'; import eventlog from './eventlog.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; const debug = debugModule('box:apphealthmonitor'); -export { - run -}; const UNHEALTHY_THRESHOLD = 20 * 60 * 1000; // 20 minutes @@ -188,3 +185,7 @@ async function run(intervalSecs) { await processApp({ timeout: (intervalSecs - 3) * 1000 }); await processDockerEvents({ intervalSecs, timeout: 3000 }); } + +export default { + run +}; diff --git a/src/applinks.js b/src/applinks.js index 36e095c17..3a2b81e76 100644 --- a/src/applinks.js +++ b/src/applinks.js @@ -2,7 +2,7 @@ import assert from 'node:assert'; import apps from './apps.js'; import BoxError from './boxerror.js'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; import jsdom from 'jsdom'; import safe from 'safetydance'; @@ -10,14 +10,6 @@ import superagent from '@cloudron/superagent'; const debug = debugModule('box:applinks'); -export { - list, - listByUser, - add, - get, - update, - del, -}; const APPLINKS_FIELDS= [ 'id', 'accessRestrictionJson', 'creationTime', 'updateTime', 'ts', 'label', 'tagsJson', 'icon', 'upstreamUri' ].join(','); @@ -260,3 +252,12 @@ async function del(applink) { const result = await database.query('DELETE FROM applinks WHERE id = ?', [ applink.id ]); if (result.affectedRows !== 1) throw new BoxError(BoxError.NOT_FOUND, 'Applink not found'); } + +export default { + list, + listByUser, + add, + get, + update, + del, +}; diff --git a/src/apppasswords.js b/src/apppasswords.js index adcaa95d4..d49ba29e3 100644 --- a/src/apppasswords.js +++ b/src/apppasswords.js @@ -1,19 +1,11 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import hat from './hat.js'; import safe from 'safetydance'; -import * as _ from './underscore.js'; +import _ from './underscore.js'; -export { - get, - add, - list, - del, - - removePrivateFields -}; const APP_PASSWORD_FIELDS = [ 'id', 'name', 'userId', 'identifier', 'hashedPassword', 'creationTime', 'expiresAt' ].join(','); @@ -85,3 +77,12 @@ async function del(id) { const result = await database.query('DELETE FROM appPasswords WHERE id = ?', [ id ]); if (result.affectedRows !== 1) throw new BoxError(BoxError.NOT_FOUND, 'password not found'); } + +export default { + get, + add, + list, + del, + + removePrivateFields +}; diff --git a/src/apps.js b/src/apps.js index 24230cd64..3d2dde994 100644 --- a/src/apps.js +++ b/src/apps.js @@ -1,43 +1,43 @@ -import * as appTaskManager from './apptaskmanager.js'; -import * as appstore from './appstore.js'; -import * as archives from './archives.js'; +import appTaskManager from './apptaskmanager.js'; +import appstore from './appstore.js'; +import archives from './archives.js'; import assert from 'node:assert'; import backups from './backups.js'; -import * as backupSites from './backupsites.js'; +import backupSites from './backupsites.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; import crypto from 'node:crypto'; import { CronTime } from 'cron'; -import * as dashboard from './dashboard.js'; -import * as database from './database.js'; +import dashboard from './dashboard.js'; +import database from './database.js'; import debugModule from 'debug'; -import * as dns from './dns.js'; -import * as docker from './docker.js'; -import * as domains from './domains.js'; +import dns from './dns.js'; +import docker from './docker.js'; +import domains from './domains.js'; import eventlog from './eventlog.js'; import fs from 'node:fs'; import Location from './location.js'; import locks from './locks.js'; -import * as logs from './logs.js'; -import * as mail from './mail.js'; +import logs from './logs.js'; +import mail from './mail.js'; import manifestFormat from '@cloudron/manifest-format'; import mysql from 'mysql2'; -import * as notifications from './notifications.js'; +import notifications from './notifications.js'; import once from './once.js'; import path from 'node:path'; import paths from './paths.js'; import { PassThrough } from 'node:stream'; -import * as reverseProxy from './reverseproxy.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; import semver from 'semver'; import services from './services.js'; import shellModule from './shell.js'; import tasks from './tasks.js'; import { Transform as TransformStream } from 'node:stream'; -import * as users from './users.js'; +import users from './users.js'; import util from 'node:util'; -import * as volumes from './volumes.js'; -import * as _ from './underscore.js'; +import volumes from './volumes.js'; +import _ from './underscore.js'; const debug = debugModule('box:apps'); const shell = shellModule('apps'); @@ -69,153 +69,6 @@ const ACCESS_LEVEL_OPERATOR = 'operator'; const ACCESS_LEVEL_USER = 'user'; const ACCESS_LEVEL_NONE = ''; -export default { - canAccess, - isOperator, - accessLevel, - pickFields, - - // database crud - add, - update, - setHealth, - del, - - get, - getByIpAddress, - getByFqdn, - list, - listByUser, - - // user actions - install, - unarchive, - uninstall, - archive, - - setAccessRestriction, - setOperators, - setCrontab, - setUpstreamUri, - setLabel, - setIcon, - setTags, - setNotes, - setChecklistItem, - setMemoryLimit, - setCpuQuota, - setMounts, - setDevices, - setAutomaticBackup, - setAutomaticUpdate, - setReverseProxyConfig, - setCertificate, - setDebugMode, - setEnvironment, - setMailbox, - setInbox, - setTurn, - setRedis, - setLocation, - setStorage, - repair, - - restore, - importApp, - exportApp, - clone, - - updateApp, - - backup, - listBackups, - updateBackup, - getBackupDownloadStream, - - getTask, - getLogPaths, - getLogs, - - appendLogLine, - - start, - stop, - restart, - - createExec, - startExec, - getExec, - - checkManifest, - - restoreApps, - configureApps, - schedulePendingTasks, - restartAppsUsingAddons, - - getStorageDir, - getIcon, - getMemoryLimit, - getSchedulerConfig, - - listEventlog, - - downloadFile, - uploadFile, - - writeConfig, - loadConfig, - - canBackupApp, - - PORT_TYPE_TCP, - PORT_TYPE_UDP, - - // task codes - the installation state is now a misnomer (keep in sync in UI) - ISTATE_PENDING_INSTALL, - ISTATE_PENDING_CLONE, - ISTATE_PENDING_CONFIGURE, - ISTATE_PENDING_RECREATE_CONTAINER, - ISTATE_PENDING_LOCATION_CHANGE, - ISTATE_PENDING_SERVICES_CHANGE, - ISTATE_PENDING_DATA_DIR_MIGRATION, - ISTATE_PENDING_RESIZE, - ISTATE_PENDING_DEBUG, - ISTATE_PENDING_UNINSTALL, - ISTATE_PENDING_RESTORE, - ISTATE_PENDING_IMPORT, - ISTATE_PENDING_UPDATE, - ISTATE_PENDING_START, - ISTATE_PENDING_STOP, - ISTATE_PENDING_RESTART, - ISTATE_ERROR, - ISTATE_INSTALLED, - - // run states - RSTATE_RUNNING, - RSTATE_STOPPED, - - // health states (keep in sync in UI) - HEALTH_HEALTHY: 'healthy', - HEALTH_UNHEALTHY: 'unhealthy', - HEALTH_ERROR: 'error', - HEALTH_DEAD: 'dead', - - // app access levels - ACCESS_LEVEL_ADMIN, - ACCESS_LEVEL_OPERATOR, - ACCESS_LEVEL_USER, - ACCESS_LEVEL_NONE, - - // exported for testing - _checkForPortBindingConflict: checkForPortBindingConflict, - _validatePorts: validatePorts, - _validateAccessRestriction: validateAccessRestriction, - _validateUpstreamUri: validateUpstreamUri, - _validateLocations: validateLocations, - _parseCrontab: parseCrontab, - _clear: clear -}; // NOTE: when adding fields here, update the clone and unarchive logic as well const APPS_FIELDS_PREFIXED = [ 'apps.id', 'apps.appStoreId', 'apps.versionsUrl', 'apps.installationState', 'apps.errorJson', 'apps.runState', @@ -3134,3 +2987,151 @@ async function loadConfig(app) { await update(app.id, data); } + +export default { + canAccess, + isOperator, + accessLevel, + pickFields, + + // database crud + add, + update, + setHealth, + del, + + get, + getByIpAddress, + getByFqdn, + list, + listByUser, + + // user actions + install, + unarchive, + uninstall, + archive, + + setAccessRestriction, + setOperators, + setCrontab, + setUpstreamUri, + setLabel, + setIcon, + setTags, + setNotes, + setChecklistItem, + setMemoryLimit, + setCpuQuota, + setMounts, + setDevices, + setAutomaticBackup, + setAutomaticUpdate, + setReverseProxyConfig, + setCertificate, + setDebugMode, + setEnvironment, + setMailbox, + setInbox, + setTurn, + setRedis, + setLocation, + setStorage, + repair, + + restore, + importApp, + exportApp, + clone, + + updateApp, + + backup, + listBackups, + updateBackup, + getBackupDownloadStream, + + getTask, + getLogPaths, + getLogs, + + appendLogLine, + + start, + stop, + restart, + + createExec, + startExec, + getExec, + + checkManifest, + + restoreApps, + configureApps, + schedulePendingTasks, + restartAppsUsingAddons, + + getStorageDir, + getIcon, + getMemoryLimit, + getSchedulerConfig, + + listEventlog, + + downloadFile, + uploadFile, + + writeConfig, + loadConfig, + + canBackupApp, + + PORT_TYPE_TCP, + PORT_TYPE_UDP, + + // task codes - the installation state is now a misnomer (keep in sync in UI) + ISTATE_PENDING_INSTALL, + ISTATE_PENDING_CLONE, + ISTATE_PENDING_CONFIGURE, + ISTATE_PENDING_RECREATE_CONTAINER, + ISTATE_PENDING_LOCATION_CHANGE, + ISTATE_PENDING_SERVICES_CHANGE, + ISTATE_PENDING_DATA_DIR_MIGRATION, + ISTATE_PENDING_RESIZE, + ISTATE_PENDING_DEBUG, + ISTATE_PENDING_UNINSTALL, + ISTATE_PENDING_RESTORE, + ISTATE_PENDING_IMPORT, + ISTATE_PENDING_UPDATE, + ISTATE_PENDING_START, + ISTATE_PENDING_STOP, + ISTATE_PENDING_RESTART, + ISTATE_ERROR, + ISTATE_INSTALLED, + + // run states + RSTATE_RUNNING, + RSTATE_STOPPED, + + // health states (keep in sync in UI) + HEALTH_HEALTHY: 'healthy', + HEALTH_UNHEALTHY: 'unhealthy', + HEALTH_ERROR: 'error', + HEALTH_DEAD: 'dead', + + // app access levels + ACCESS_LEVEL_ADMIN, + ACCESS_LEVEL_OPERATOR, + ACCESS_LEVEL_USER, + ACCESS_LEVEL_NONE, + + // exported for testing + _checkForPortBindingConflict: checkForPortBindingConflict, + _validatePorts: validatePorts, + _validateAccessRestriction: validateAccessRestriction, + _validateUpstreamUri: validateUpstreamUri, + _validateLocations: validateLocations, + _parseCrontab: parseCrontab, + _clear: clear +}; diff --git a/src/appstore.js b/src/appstore.js index 0ec6fad7c..27253bf0a 100644 --- a/src/appstore.js +++ b/src/appstore.js @@ -1,52 +1,31 @@ import apps from './apps.js'; import assert from 'node:assert'; -import * as backupSites from './backupsites.js'; +import backupSites from './backupsites.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; -import * as domains from './domains.js'; -import * as dockerRegistries from './dockerregistries.js'; -import * as externalLdap from './externalldap.js'; -import * as groups from './groups.js'; -import * as mail from './mail.js'; +import domains from './domains.js'; +import dockerRegistries from './dockerregistries.js'; +import externalLdap from './externalldap.js'; +import groups from './groups.js'; +import mail from './mail.js'; import manifestFormat from '@cloudron/manifest-format'; import paths from './paths.js'; import promiseRetry from './promise-retry.js'; import safe from 'safetydance'; import semver from 'semver'; -import * as settings from './settings.js'; +import settings from './settings.js'; import superagent from '@cloudron/superagent'; -import * as system from './system.js'; -import * as users from './users.js'; -import * as volumes from './volumes.js'; +import system from './system.js'; +import users from './users.js'; +import volumes from './volumes.js'; const debug = debugModule('box:appstore'); const _setApiServerOrigin = setApiServerOrigin; const _unregister = unregister; -export { - getFeatures, - getApiServerOrigin, - getWebServerOrigin, - getConsoleServerOrigin, - downloadManifest, - getApps, - getApp, - getAppVersion, - downloadIcon, - registerCloudron3, - updateCloudron, - unlinkAccount, - getSubscription, - checkSubscription, // cron hook, - isFreePlan, - getAppUpdate, - getBoxUpdate, - _setApiServerOrigin, - _unregister, -}; // These are the default options and will be adjusted once a subscription state is obtained // Keep in sync with appstore/routes/cloudrons.js @@ -418,3 +397,25 @@ async function downloadIcon(appStoreId, version) { return response.body; }); } + +export default { + getFeatures, + getApiServerOrigin, + getWebServerOrigin, + getConsoleServerOrigin, + downloadManifest, + getApps, + getApp, + getAppVersion, + downloadIcon, + registerCloudron3, + updateCloudron, + unlinkAccount, + getSubscription, + checkSubscription, // cron hook, + isFreePlan, + getAppUpdate, + getBoxUpdate, + _setApiServerOrigin, + _unregister, +}; diff --git a/src/apptask.js b/src/apptask.js index b4ecd80ab..18dbeae2d 100644 --- a/src/apptask.js +++ b/src/apptask.js @@ -1,32 +1,32 @@ #!/usr/bin/env node import apps from './apps.js'; -import * as appstore from './appstore.js'; +import appstore from './appstore.js'; import assert from 'node:assert'; import AuditSource from './auditsource.js'; -import * as backupSites from './backupsites.js'; -import * as backuptask from './backuptask.js'; +import backupSites from './backupsites.js'; +import backuptask from './backuptask.js'; import BoxError from './boxerror.js'; -import * as community from './community.js'; +import community from './community.js'; import constants from './constants.js'; import debugModule from 'debug'; -import * as df from './df.js'; -import * as dns from './dns.js'; -import * as docker from './docker.js'; +import df from './df.js'; +import dns from './dns.js'; +import docker from './docker.js'; import ejs from 'ejs'; import fs from 'node:fs'; import { promises as fsPromises } from 'node:fs'; -import * as iputils from './iputils.js'; +import iputils from './iputils.js'; import manifestFormat from '@cloudron/manifest-format'; import os from 'node:os'; import path from 'node:path'; import paths from './paths.js'; import promiseRetry from './promise-retry.js'; -import * as reverseProxy from './reverseproxy.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; import services from './services.js'; import shellModule from './shell.js'; -import * as _ from './underscore.js'; +import _ from './underscore.js'; const debug = debugModule('box:apptask'); const shell = shellModule('apptask'); @@ -35,12 +35,6 @@ const _createAppDir = createAppDir; const _deleteAppDir = deleteAppDir; const _verifyManifest = verifyManifest; -export { - run, - _createAppDir, - _deleteAppDir, - _verifyManifest, -}; const LOGROTATE_CONFIG_EJS = fs.readFileSync(import.meta.dirname + '/logrotate.ejs', { encoding: 'utf8' }), CONFIGURE_LOGROTATE_CMD = path.join(import.meta.dirname, 'scripts/configurelogrotate.sh'); @@ -872,3 +866,10 @@ async function run(appId, args, progressCallback) { return result || null; } + +export default { + run, + _createAppDir, + _deleteAppDir, + _verifyManifest, +}; diff --git a/src/apptaskmanager.js b/src/apptaskmanager.js index 285c8453c..f20d10162 100644 --- a/src/apptaskmanager.js +++ b/src/apptaskmanager.js @@ -6,15 +6,11 @@ import locks from './locks.js'; import path from 'node:path'; import paths from './paths.js'; import safe from 'safetydance'; -import * as scheduler from './scheduler.js'; +import scheduler from './scheduler.js'; import tasks from './tasks.js'; const debug = debugModule('box:apptaskmanager'); -export { - start, - scheduleTask -}; const gActiveTasks = {}; // indexed by app id const gPendingTasks = []; @@ -92,3 +88,8 @@ function scheduleTask(appId, taskId, options, onFinished) { if (gStarted && !gDrainTimerId) gDrainTimerId = setTimeout(drain, DRAIN_TIMER_SECS); } + +export default { + start, + scheduleTask +}; diff --git a/src/archives.js b/src/archives.js index b580a3059..8d1a21be2 100644 --- a/src/archives.js +++ b/src/archives.js @@ -1,19 +1,10 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import eventlog from './eventlog.js'; import safe from 'safetydance'; -export { - get, - getIcons, - getIcon, - add, - list, - listBackupIds, - del, -}; const ARCHIVE_FIELDS = [ 'archives.id', 'backupId', 'archives.creationTime', 'backups.remotePath', 'backups.siteId', 'backups.manifestJson', 'backups.appConfigJson', '(archives.icon IS NOT NULL) AS hasIcon', '(archives.packageIcon IS NOT NULL) AS hasPackageIcon' ]; @@ -105,3 +96,13 @@ async function del(archive, auditSource) { await eventlog.add(eventlog.ACTION_ARCHIVES_DEL, auditSource, { id: archive.id, backupId: archive.backupId }); } + +export default { + get, + getIcons, + getIcon, + add, + list, + listBackupIds, + del, +}; diff --git a/src/asynctask.js b/src/asynctask.js index 72ea344f7..e69fd9546 100644 --- a/src/asynctask.js +++ b/src/asynctask.js @@ -42,6 +42,6 @@ class AsyncTask extends EventEmitter { } } -export { +export default { AsyncTask }; diff --git a/src/backupcleaner.js b/src/backupcleaner.js index b2182bce9..5b05e706b 100644 --- a/src/backupcleaner.js +++ b/src/backupcleaner.js @@ -1,10 +1,10 @@ import BoxError from './boxerror.js'; import apps from './apps.js'; -import * as archives from './archives.js'; +import archives from './archives.js'; import assert from 'node:assert'; import backups from './backups.js'; -import * as backupFormats from './backupformats.js'; -import * as backupSites from './backupsites.js'; +import backupFormats from './backupformats.js'; +import backupSites from './backupsites.js'; import constants from './constants.js'; import debugModule from 'debug'; import moment from 'moment'; @@ -15,10 +15,6 @@ const debug = debugModule('box:backupcleaner'); const _applyBackupRetention = applyBackupRetention; -export { - run, - _applyBackupRetention, -}; function applyBackupRetention(allBackups, retention, referencedBackupIds) { assert(Array.isArray(allBackups)); @@ -311,3 +307,8 @@ async function run(siteId, progressCallback) { return { removedBoxBackupPaths, removedMailBackupPaths, removedAppBackupPaths, missingBackupPaths }; } + +export default { + run, + _applyBackupRetention, +}; diff --git a/src/backupformat/rsync.js b/src/backupformat/rsync.js index 1d0b5ecb8..0985f2028 100644 --- a/src/backupformat/rsync.js +++ b/src/backupformat/rsync.js @@ -1,14 +1,13 @@ import assert from 'node:assert'; import async from 'async'; -import * as backupSites from '../backupsites.js'; +import backupSites from '../backupsites.js'; import BoxError from '../boxerror.js'; import DataLayout from '../datalayout.js'; -import { DecryptStream } from '../hush.js'; import debugModule from 'debug'; -import { EncryptStream } from '../hush.js'; +import hush from '../hush.js'; +const { DecryptStream, EncryptStream } = hush; import fs from 'node:fs'; import HashStream from '../hash-stream.js'; -import * as hush from '../hush.js'; import path from 'node:path'; import paths from '../paths.js'; import ProgressStream from '../progress-stream.js'; @@ -16,7 +15,7 @@ import promiseRetry from '../promise-retry.js'; import safe from 'safetydance'; import shellModule from '../shell.js'; import stream from 'stream/promises'; -import * as syncer from '../syncer.js'; +import syncer from '../syncer.js'; import util from 'node:util'; const debug = debugModule('box:backupformat/rsync'); @@ -25,15 +24,6 @@ const shell = shellModule('backupformat/rsync'); const _saveFsMetadata = saveFsMetadata; const _restoreFsMetadata = restoreFsMetadata; -export { - download, - upload, - verify, - getFileExtension, - copy, - _saveFsMetadata, - _restoreFsMetadata, -}; async function addFile(sourceFile, encryption, uploader, progressCallback) { assert.strictEqual(typeof sourceFile, 'string'); @@ -382,3 +372,12 @@ async function verify(backupSite, remotePath, integrityMap, progressCallback) { }; } +export default { + download, + upload, + verify, + getFileExtension, + copy, + _saveFsMetadata, + _restoreFsMetadata, +}; diff --git a/src/backupformat/tgz.js b/src/backupformat/tgz.js index d8994a320..bb66052d2 100644 --- a/src/backupformat/tgz.js +++ b/src/backupformat/tgz.js @@ -1,9 +1,10 @@ import assert from 'node:assert'; -import * as backupSites from '../backupsites.js'; +import backupSites from '../backupsites.js'; import BoxError from '../boxerror.js'; import DataLayout from '../datalayout.js'; import debugModule from 'debug'; -import { DecryptStream, EncryptStream } from '../hush.js'; +import hush from '../hush.js'; +const { DecryptStream, EncryptStream } = hush; import fs from 'node:fs'; import HashStream from '../hash-stream.js'; import path from 'node:path'; @@ -347,7 +348,7 @@ function getFileExtension(encryption) { const _EnsureFileSizeStream = EnsureFileSizeStream; -export { +export default { download, upload, verify, diff --git a/src/backupformats.js b/src/backupformats.js index 194e267b8..e55b66790 100644 --- a/src/backupformats.js +++ b/src/backupformats.js @@ -1,12 +1,8 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as tgzFormat from './backupformat/tgz.js'; -import * as rsyncFormat from './backupformat/rsync.js'; +import tgzFormat from './backupformat/tgz.js'; +import rsyncFormat from './backupformat/rsync.js'; -export { - api, - validateFormat, -}; const FORMATS = { tgz: tgzFormat, rsync: rsyncFormat }; @@ -25,3 +21,8 @@ function validateFormat(format) { return new BoxError(BoxError.BAD_FIELD, 'Invalid backup format'); } + +export default { + api, + validateFormat, +}; diff --git a/src/backupintegrity.js b/src/backupintegrity.js index 90b40f7bb..efae99f09 100644 --- a/src/backupintegrity.js +++ b/src/backupintegrity.js @@ -1,7 +1,7 @@ import assert from 'assert'; import backups from './backups.js'; -import * as backupFormats from './backupformats.js'; -import * as backupSites from './backupsites.js'; +import backupFormats from './backupformats.js'; +import backupSites from './backupsites.js'; import BoxError from './boxerror.js'; import consumers from 'node:stream/consumers'; import crypto from 'node:crypto'; @@ -10,9 +10,6 @@ import safe from 'safetydance'; const debug = debugModule('box:backupintegrity'); -export { - check -}; async function downloadBackupInfo(backupSite, backup) { const stream = await backupSites.storageApi(backupSite).download(backupSite.config, `${backup.remotePath}.backupinfo`); @@ -73,3 +70,7 @@ async function check(backupId, progressCallback) { aggregatedMessages.push(...messages); await backups.setIntegrityResult(backup, aggregatedMessages.length === 0 ? 'passed' : 'failed', { messages: aggregatedMessages }); } + +export default { + check +}; diff --git a/src/backups.js b/src/backups.js index 1f1fe0618..d0652e2e8 100644 --- a/src/backups.js +++ b/src/backups.js @@ -1,6 +1,6 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; import hat from './hat.js'; @@ -12,33 +12,6 @@ const debug = debugModule('box:backups'); const BACKUP_TYPE_APP = 'app'; const BACKUP_STATE_NORMAL = 'normal'; -export default { - get, - getByIdentifierAndStatePaged, - getLatestInTargetByIdentifier, // brutal function name - add, - update, - listByTypePaged, - del, - - removePrivateFields, - - clearTasks, - startIntegrityCheck, - stopIntegrityCheck, - setIntegrityResult, - - BACKUP_IDENTIFIER_BOX: 'box', - BACKUP_IDENTIFIER_MAIL: 'mail', - - BACKUP_TYPE_APP, - BACKUP_TYPE_BOX: 'box', - BACKUP_TYPE_MAIL: 'mail', - - BACKUP_STATE_NORMAL, - BACKUP_STATE_CREATING: 'creating', - BACKUP_STATE_ERROR: 'error', -}; const BACKUPS_FIELDS = [ 'id', 'remotePath', 'label', 'identifier', 'creationTime', 'packageVersion', 'type', 'integrityJson', 'statsJson', 'dependsOnJson', 'state', 'manifestJson', 'preserveSecs', 'encryptionVersion', 'appConfigJson', 'siteId', @@ -254,3 +227,31 @@ async function stopIntegrityCheck(backup, auditSource) { async function clearTasks() { await database.query('UPDATE backups SET integrityCheckTaskId = NULL'); } + +export default { + get, + getByIdentifierAndStatePaged, + getLatestInTargetByIdentifier, // brutal function name + add, + update, + listByTypePaged, + del, + + removePrivateFields, + + clearTasks, + startIntegrityCheck, + stopIntegrityCheck, + setIntegrityResult, + + BACKUP_IDENTIFIER_BOX: 'box', + BACKUP_IDENTIFIER_MAIL: 'mail', + + BACKUP_TYPE_APP, + BACKUP_TYPE_BOX: 'box', + BACKUP_TYPE_MAIL: 'mail', + + BACKUP_STATE_NORMAL, + BACKUP_STATE_CREATING: 'creating', + BACKUP_STATE_ERROR: 'error', +}; diff --git a/src/backupsites.js b/src/backupsites.js index 1a4b00431..24e37636c 100644 --- a/src/backupsites.js +++ b/src/backupsites.js @@ -1,63 +1,25 @@ import assert from 'node:assert'; -import * as backupFormats from './backupformats.js'; +import backupFormats from './backupformats.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as cron from './cron.js'; +import cron from './cron.js'; import { CronTime } from 'cron'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; -import * as hush from './hush.js'; +import hush from './hush.js'; import locks from './locks.js'; import path from 'node:path'; import paths from './paths.js'; import safe from 'safetydance'; import tasks from './tasks.js'; -import * as storageFilesystem from './storage/filesystem.js'; -import * as storageS3 from './storage/s3.js'; -import * as storageGcs from './storage/gcs.js'; +import storageFilesystem from './storage/filesystem.js'; +import storageS3 from './storage/s3.js'; +import storageGcs from './storage/gcs.js'; const debug = debugModule('box:backups'); -export { - get, - list, - listByContentForUpdates, - add, - addDefault, - del, - - setConfig, - setLimits, - setSchedule, - setRetention, - setEncryption, - setEnabledForUpdates, - setName, - setContents, - - removePrivateFields, - - startBackupTask, - - startCleanupTask, - - getSnapshotInfo, - setSnapshotInfo, - - hasContent, - - remount, - getStatus, - ensureMounted, - - storageApi, - - createPseudo, - - reinitAll -}; // format: rsync or tgz // provider: used to determine the api provider @@ -588,3 +550,42 @@ async function reinitAll() { safe(remount(site), { debug }); // background } } + +export default { + get, + list, + listByContentForUpdates, + add, + addDefault, + del, + + setConfig, + setLimits, + setSchedule, + setRetention, + setEncryption, + setEnabledForUpdates, + setName, + setContents, + + removePrivateFields, + + startBackupTask, + + startCleanupTask, + + getSnapshotInfo, + setSnapshotInfo, + + hasContent, + + remount, + getStatus, + ensureMounted, + + storageApi, + + createPseudo, + + reinitAll +}; diff --git a/src/backuptask.js b/src/backuptask.js index a314bdb14..638861039 100644 --- a/src/backuptask.js +++ b/src/backuptask.js @@ -1,15 +1,15 @@ import apps from './apps.js'; import assert from 'node:assert'; -import * as backupFormats from './backupformats.js'; +import backupFormats from './backupformats.js'; import backups from './backups.js'; -import * as backupSites from './backupsites.js'; +import backupSites from './backupsites.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; import crypto from 'node:crypto'; import DataLayout from './datalayout.js'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; -import * as df from './df.js'; +import df from './df.js'; import locks from './locks.js'; import path from 'node:path'; import paths from './paths.js'; @@ -23,19 +23,6 @@ import util from 'util'; const debug = debugModule('box:backuptask'); const shell = shellModule('backuptask'); -export { - fullBackup, - appBackup, - - restore, - - downloadApp, - backupApp, - - downloadMail, - - upload, -}; const BACKUP_UPLOAD_CMD = path.join(import.meta.dirname, 'scripts/backupupload.js'); @@ -607,3 +594,17 @@ async function appBackup(appId, backupSiteId, options, progressCallback) { await progressCallback({ percent: 100, message: `app ${app.fqdn} backup finished. Took ${(new Date() - startTime)/1000} seconds` }); return backup.id; } + +export default { + fullBackup, + appBackup, + + restore, + + downloadApp, + backupApp, + + downloadMail, + + upload, +}; diff --git a/src/blobs.js b/src/blobs.js index eef3c841b..4c095a892 100644 --- a/src/blobs.js +++ b/src/blobs.js @@ -1,38 +1,11 @@ /* jslint node:true */ import assert from 'node:assert'; -import * as database from './database.js'; +import database from './database.js'; const CERT_PREFIX = 'cert'; const CERT_SUFFIX = 'cert'; -export default { - get, - getString, - set, - setString, - del, - - listCertIds, - - ACME_ACCOUNT_KEY: 'acme_account_key', - ADDON_TURN_SECRET: 'addon_turn_secret', - - // the code relies on sftp__* pattern - SFTP_RSA_PUBLIC_KEY: 'sftp_rsa_public_key', - SFTP_RSA_PRIVATE_KEY: 'sftp_rsa_private_key', - SFTP_ED25519_PUBLIC_KEY: 'sftp_ed25519_public_key', - SFTP_ED25519_PRIVATE_KEY: 'sftp_ed25519_private_key', - - PROXY_AUTH_TOKEN_SECRET: 'proxy_auth_token_secret', - - OIDC_KEY_EDDSA: 'oidc_key_eddsa', // this is only JWT private key, the public key will be derived - OIDC_KEY_RS256: 'oidc_key_rs256', - - CERT_PREFIX, - CERT_SUFFIX, - _clear: clear -}; const BLOBS_FIELDS = [ 'id', 'value' ].join(','); @@ -78,3 +51,31 @@ async function listCertIds() { const result = await database.query('SELECT id FROM blobs WHERE id LIKE ?', [ `${CERT_PREFIX}-%.${CERT_SUFFIX}` ]); return result.map(r => r.id); } + +export default { + get, + getString, + set, + setString, + del, + + listCertIds, + + ACME_ACCOUNT_KEY: 'acme_account_key', + ADDON_TURN_SECRET: 'addon_turn_secret', + + // the code relies on sftp__* pattern + SFTP_RSA_PUBLIC_KEY: 'sftp_rsa_public_key', + SFTP_RSA_PRIVATE_KEY: 'sftp_rsa_private_key', + SFTP_ED25519_PUBLIC_KEY: 'sftp_ed25519_public_key', + SFTP_ED25519_PRIVATE_KEY: 'sftp_ed25519_private_key', + + PROXY_AUTH_TOKEN_SECRET: 'proxy_auth_token_secret', + + OIDC_KEY_EDDSA: 'oidc_key_eddsa', // this is only JWT private key, the public key will be derived + OIDC_KEY_RS256: 'oidc_key_rs256', + + CERT_PREFIX, + CERT_SUFFIX, + _clear: clear +}; diff --git a/src/branding.js b/src/branding.js index 0d87092f6..dd6654d60 100644 --- a/src/branding.js +++ b/src/branding.js @@ -6,25 +6,10 @@ import debugModule from 'debug'; import eventlog from './eventlog.js'; import paths from './paths.js'; import safe from 'safetydance'; -import * as settings from './settings.js'; +import settings from './settings.js'; const debug = debugModule('box:branding'); -export { - getCloudronName, - setCloudronName, - - getCloudronAvatar, - setCloudronAvatar, - - getCloudronBackground, - setCloudronBackground, - - getFooter, - setFooter, - - renderFooter -}; async function getCloudronName() { const name = await settings.get(settings.CLOUDRON_NAME_KEY); @@ -100,3 +85,19 @@ async function setFooter(footer, auditSource) { await settings.set(settings.FOOTER_KEY, footer); await eventlog.add(eventlog.ACTION_BRANDING_FOOTER, auditSource, { footer }); } + +export default { + getCloudronName, + setCloudronName, + + getCloudronAvatar, + setCloudronAvatar, + + getCloudronBackground, + setCloudronBackground, + + getFooter, + setFooter, + + renderFooter +}; diff --git a/src/changelog.js b/src/changelog.js index 8d05c6f51..23f47f835 100644 --- a/src/changelog.js +++ b/src/changelog.js @@ -2,9 +2,6 @@ import assert from 'node:assert'; import fs from 'node:fs'; import path from 'node:path'; -export { - getChanges -}; function getChanges(version) { assert.strictEqual(typeof version, 'string'); @@ -34,3 +31,7 @@ function getChanges(version) { return changelog; } + +export default { + getChanges +}; diff --git a/src/cloudron.js b/src/cloudron.js index 2016d1181..71d4b9faf 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -1,20 +1,11 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as cron from './cron.js'; +import cron from './cron.js'; import moment from 'moment-timezone'; -import * as settings from './settings.js'; -import * as translations from './translations.js'; +import settings from './settings.js'; +import translations from './translations.js'; -export { - getStatus, - - getTimeZone, - setTimeZone, - - getLanguage, - setLanguage, -}; async function getStatus() { return { @@ -49,3 +40,13 @@ async function setLanguage(language) { await settings.set(settings.LANGUAGE_KEY, language); } + +export default { + getStatus, + + getTimeZone, + setTimeZone, + + getLanguage, + setLanguage, +}; diff --git a/src/community.js b/src/community.js index 8f1a68c5b..99ae754f6 100644 --- a/src/community.js +++ b/src/community.js @@ -8,12 +8,6 @@ import superagent from '@cloudron/superagent'; const debug = debugModule('box:community'); -export { - getAppVersion, - downloadManifest, - getAppUpdate, - downloadIcon -}; async function getAppVersion(url, version) { assert.strictEqual(typeof url, 'string'); @@ -120,3 +114,10 @@ async function downloadIcon(manifest) { return response.body; }); } + +export default { + getAppVersion, + downloadManifest, + getAppUpdate, + downloadIcon +}; diff --git a/src/cron.js b/src/cron.js index 952b015fd..b4a974e87 100644 --- a/src/cron.js +++ b/src/cron.js @@ -1,27 +1,27 @@ -import * as appHealthMonitor from './apphealthmonitor.js'; +import appHealthMonitor from './apphealthmonitor.js'; import assert from 'node:assert'; -import * as appstore from './appstore.js'; +import appstore from './appstore.js'; import AuditSource from './auditsource.js'; -import * as backupSites from './backupsites.js'; -import * as cloudron from './cloudron.js'; +import backupSites from './backupsites.js'; +import cloudron from './cloudron.js'; import constants from './constants.js'; import { CronJob } from 'cron'; import debugModule from 'debug'; -import * as domains from './domains.js'; -import * as dyndns from './dyndns.js'; -import * as externalLdap from './externalldap.js'; +import domains from './domains.js'; +import dyndns from './dyndns.js'; +import externalLdap from './externalldap.js'; import eventlog from './eventlog.js'; -import * as janitor from './janitor.js'; -import * as mail from './mail.js'; -import * as metrics from './metrics.js'; -import * as network from './network.js'; -import * as oidcServer from './oidcserver.js'; +import janitor from './janitor.js'; +import mail from './mail.js'; +import metrics from './metrics.js'; +import network from './network.js'; +import oidcServer from './oidcserver.js'; import paths from './paths.js'; -import * as reverseProxy from './reverseproxy.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; -import * as scheduler from './scheduler.js'; -import * as system from './system.js'; -import * as updater from './updater.js'; +import scheduler from './scheduler.js'; +import system from './system.js'; +import updater from './updater.js'; import util from 'node:util'; const debug = debugModule('box:cron'); @@ -32,19 +32,6 @@ const debug = debugModule('box:cron'); const DEFAULT_CLEANUP_BACKUPS_PATTERN = '00 30 1,3,5,23 * * *', DEFAULT_AUTOUPDATE_PATTERN = '00 00 1,3,5,23 * * *'; -export { - startJobs, - - stopJobs, - - handleBackupScheduleChanged, - handleTimeZoneChanged, - handleAutoupdatePatternChanged, - handleDynamicDnsChanged, - handleExternalLdapChanged, - - DEFAULT_AUTOUPDATE_PATTERN, -}; const gJobs = { autoUpdater: null, @@ -307,3 +294,17 @@ async function stopJobs() { } } } + +export default { + startJobs, + + stopJobs, + + handleBackupScheduleChanged, + handleTimeZoneChanged, + handleAutoupdatePatternChanged, + handleDynamicDnsChanged, + handleExternalLdapChanged, + + DEFAULT_AUTOUPDATE_PATTERN, +}; diff --git a/src/dashboard.js b/src/dashboard.js index 84db4e894..711c83924 100644 --- a/src/dashboard.js +++ b/src/dashboard.js @@ -1,37 +1,27 @@ import apps from './apps.js'; -import * as appstore from './appstore.js'; +import appstore from './appstore.js'; import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as branding from './branding.js'; +import branding from './branding.js'; import constants from './constants.js'; import debugModule from 'debug'; -import * as dns from './dns.js'; -import * as externalLdap from './externalldap.js'; +import dns from './dns.js'; +import externalLdap from './externalldap.js'; import eventlog from './eventlog.js'; import Location from './location.js'; -import * as mailServer from './mailserver.js'; -import * as platform from './platform.js'; -import * as reverseProxy from './reverseproxy.js'; +import mailServer from './mailserver.js'; +import platform from './platform.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; -import * as settings from './settings.js'; -import * as system from './system.js'; +import settings from './settings.js'; +import system from './system.js'; import tasks from './tasks.js'; -import * as userDirectory from './user-directory.js'; +import userDirectory from './user-directory.js'; const debug = debugModule('box:dashboard'); const _setLocation = setLocation; -export { - getLocation, - clearLocation, - startPrepareLocation, // starts the task, - prepareLocation, // the task to setup dns and cert, - setupLocation, // initial setup from setup/restore, - changeLocation, // only on dashboard change (post setup/restore), - getConfig, - _setLocation, -}; async function getLocation() { const domain = await settings.get(settings.DASHBOARD_DOMAIN_KEY); @@ -150,3 +140,14 @@ async function changeLocation(subdomain, domain, auditSource) { await safe(reverseProxy.removeDashboardConfig(oldLocation.subdomain, oldLocation.domain), { debug }); } + +export default { + getLocation, + clearLocation, + startPrepareLocation, // starts the task, + prepareLocation, // the task to setup dns and cert, + setupLocation, // initial setup from setup/restore, + changeLocation, // only on dashboard change (post setup/restore), + getConfig, + _setLocation, +}; diff --git a/src/database.js b/src/database.js index 82c7abe06..25a129f80 100644 --- a/src/database.js +++ b/src/database.js @@ -12,16 +12,6 @@ const shell = shellModule('database'); const _clear = clear; -export { - initialize, - uninitialize, - query, - transaction, - runInTransaction, - importFromFile, - exportToFile, - _clear, -}; let gConnectionPool = null; @@ -170,3 +160,14 @@ async function exportToFile(file) { const [error] = await safe(shell.bash(cmd, {})); if (error) throw new BoxError(BoxError.DATABASE_ERROR, error); } + +export default { + initialize, + uninitialize, + query, + transaction, + runInTransaction, + importFromFile, + exportToFile, + _clear, +}; diff --git a/src/df.js b/src/df.js index ccfccdb43..490574554 100644 --- a/src/df.js +++ b/src/df.js @@ -7,11 +7,6 @@ import shellModule from './shell.js'; const debug = debugModule('box:df'); const shell = shellModule('df'); -export { - filesystems, - file, - prettyBytes -}; // binary units (non SI) 1024 based function prettyBytes(bytes) { @@ -66,3 +61,9 @@ async function file(filename) { const lines = output.trim().split('\n').slice(1); // discard header return parseLine(lines[0]); } + +export default { + filesystems, + file, + prettyBytes +}; diff --git a/src/dig.js b/src/dig.js index 31c1403e8..16725de60 100644 --- a/src/dig.js +++ b/src/dig.js @@ -13,10 +13,6 @@ function resolveWrapper(hostname, rrtype, options) { return resolve(hostname, rrtype, options); } -export { - resolveWrapper as resolve, - _setMockResolve, -}; // a note on TXT records. It doesn't have quotes ("") at the DNS level. Those quotes // are added for DNS server software to enclose spaces. Such quotes may also be returned @@ -36,3 +32,8 @@ async function resolve(hostname, rrtype, options) { // we sometimes get empty array and sometimes ENODATA. for TXT records, result is 2d array of strings return result; } + +export default { + resolve: resolveWrapper, + _setMockResolve, +}; diff --git a/src/directoryserver.js b/src/directoryserver.js index 53257ac33..dd1fd546c 100644 --- a/src/directoryserver.js +++ b/src/directoryserver.js @@ -4,30 +4,21 @@ import BoxError from './boxerror.js'; import constants from './constants.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; -import * as ipaddr from './ipaddr.js'; -import * as groups from './groups.js'; +import ipaddr from './ipaddr.js'; +import groups from './groups.js'; import ldap from 'ldapjs'; import path from 'node:path'; import paths from './paths.js'; -import * as reverseProxy from './reverseproxy.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; -import * as settings from './settings.js'; +import settings from './settings.js'; import shellModule from './shell.js'; -import * as users from './users.js'; +import users from './users.js'; import util from 'node:util'; const debug = debugModule('box:directoryserver'); const shell = shellModule('directoryserver'); -export { - getConfig, - setConfig, - - start, - stop, - - checkCertificate, -}; let gServer = null, gCertificate = null; @@ -414,3 +405,13 @@ async function checkCertificate() { await stop(); await start(); } + +export default { + getConfig, + setConfig, + + start, + stop, + + checkCertificate, +}; diff --git a/src/dns.js b/src/dns.js index 195a91279..213fa9bd7 100644 --- a/src/dns.js +++ b/src/dns.js @@ -2,64 +2,42 @@ import apps from './apps.js'; import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; -import * as domains from './domains.js'; -import * as ipaddr from './ipaddr.js'; -import * as mail from './mail.js'; -import * as mailServer from './mailserver.js'; -import * as network from './network.js'; +import domains from './domains.js'; +import ipaddr from './ipaddr.js'; +import mail from './mail.js'; +import mailServer from './mailserver.js'; +import network from './network.js'; import promiseRetry from './promise-retry.js'; import safe from 'safetydance'; import tasks from './tasks.js'; import tld from 'tldjs'; -import * as dnsBunny from './dns/bunny.js'; -import * as dnsCloudflare from './dns/cloudflare.js'; -import * as dnsDesec from './dns/desec.js'; -import * as dnsDnsimple from './dns/dnsimple.js'; -import * as dnsRoute53 from './dns/route53.js'; -import * as dnsGcdns from './dns/gcdns.js'; -import * as dnsDigitalocean from './dns/digitalocean.js'; -import * as dnsGandi from './dns/gandi.js'; -import * as dnsGodaddy from './dns/godaddy.js'; -import * as dnsInwx from './dns/inwx.js'; -import * as dnsLinode from './dns/linode.js'; -import * as dnsVultr from './dns/vultr.js'; -import * as dnsNamecom from './dns/namecom.js'; -import * as dnsNamecheap from './dns/namecheap.js'; -import * as dnsNetcup from './dns/netcup.js'; -import * as dnsHetzner from './dns/hetzner.js'; -import * as dnsHetznercloud from './dns/hetznercloud.js'; -import * as dnsNoop from './dns/noop.js'; -import * as dnsManual from './dns/manual.js'; -import * as dnsOvh from './dns/ovh.js'; -import * as dnsPorkbun from './dns/porkbun.js'; -import * as dnsWildcard from './dns/wildcard.js'; +import dnsBunny from './dns/bunny.js'; +import dnsCloudflare from './dns/cloudflare.js'; +import dnsDesec from './dns/desec.js'; +import dnsDnsimple from './dns/dnsimple.js'; +import dnsRoute53 from './dns/route53.js'; +import dnsGcdns from './dns/gcdns.js'; +import dnsDigitalocean from './dns/digitalocean.js'; +import dnsGandi from './dns/gandi.js'; +import dnsGodaddy from './dns/godaddy.js'; +import dnsInwx from './dns/inwx.js'; +import dnsLinode from './dns/linode.js'; +import dnsVultr from './dns/vultr.js'; +import dnsNamecom from './dns/namecom.js'; +import dnsNamecheap from './dns/namecheap.js'; +import dnsNetcup from './dns/netcup.js'; +import dnsHetzner from './dns/hetzner.js'; +import dnsHetznercloud from './dns/hetznercloud.js'; +import dnsNoop from './dns/noop.js'; +import dnsManual from './dns/manual.js'; +import dnsOvh from './dns/ovh.js'; +import dnsPorkbun from './dns/porkbun.js'; +import dnsWildcard from './dns/wildcard.js'; const debug = debugModule('box:dns'); -export { - fqdn, - getName, - - getDnsRecords, - upsertDnsRecords, - removeDnsRecords, - - waitForDnsRecord, - waitForLocations, - - validateHostname, - - makeWildcard, - - registerLocations, - unregisterLocations, - - checkDnsRecords, - syncDnsRecords, - startSyncDnsRecords -}; const DNS_PROVIDERS = { bunny: dnsBunny, cloudflare: dnsCloudflare, desec: dnsDesec, dnsimple: dnsDnsimple, @@ -387,3 +365,26 @@ async function startSyncDnsRecords(options) { safe(tasks.startTask(taskId, {}), { debug }); // background return taskId; } + +export default { + fqdn, + getName, + + getDnsRecords, + upsertDnsRecords, + removeDnsRecords, + + waitForDnsRecord, + waitForLocations, + + validateHostname, + + makeWildcard, + + registerLocations, + unregisterLocations, + + checkDnsRecords, + syncDnsRecords, + startSyncDnsRecords +}; diff --git a/src/dns/bunny.js b/src/dns/bunny.js index e62b41cea..a06009c1e 100644 --- a/src/dns/bunny.js +++ b/src/dns/bunny.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/bunny'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const BUNNY_API = 'https://api.bunny.net'; const RECORD_TYPES = [ 'A', 'AAAA', 'CNAME', 'TXT', 'MX', 'RDR', '???', 'PZ', 'SRV', 'CAA', 'PTR', 'SCR', 'NS' ]; @@ -256,3 +247,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/cloudflare.js b/src/dns/cloudflare.js index 3bc53a506..10548509c 100644 --- a/src/dns/cloudflare.js +++ b/src/dns/cloudflare.js @@ -2,24 +2,15 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; const debug = debugModule('box:dns/cloudflare'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; // we are using latest v4 stable API https://api.cloudflare.com/#getting-started-endpoints const CLOUDFLARE_ENDPOINT = 'https://api.cloudflare.com/client/v4'; @@ -292,3 +283,12 @@ async function verifyDomainConfig(domainObject) { return sanitizedConfig; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/desec.js b/src/dns/desec.js index 260dc801b..8c16c48e0 100644 --- a/src/dns/desec.js +++ b/src/dns/desec.js @@ -2,8 +2,8 @@ import assert from 'node:assert'; import constants from '../constants.js'; import BoxError from '../boxerror.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import timers from 'timers/promises'; import superagent from '@cloudron/superagent'; @@ -11,15 +11,6 @@ import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/desec'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const DESEC_ENDPOINT = 'https://desec.io/api/v1'; @@ -167,3 +158,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/digitalocean.js b/src/dns/digitalocean.js index f5522e34c..099e18207 100644 --- a/src/dns/digitalocean.js +++ b/src/dns/digitalocean.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/digitalocean'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const DIGITALOCEAN_ENDPOINT = 'https://api.digitalocean.com'; @@ -253,3 +244,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/dnsimple.js b/src/dns/dnsimple.js index 63f94f049..c70552566 100644 --- a/src/dns/dnsimple.js +++ b/src/dns/dnsimple.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/dnsimple'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const DNSIMPLE_API = 'https://api.dnsimple.com/v2'; @@ -265,3 +256,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/gandi.js b/src/dns/gandi.js index fa966d205..ed5edab20 100644 --- a/src/dns/gandi.js +++ b/src/dns/gandi.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/gandi'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const GANDI_API = 'https://dns.api.gandi.net/api/v5'; @@ -172,3 +163,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/gcdns.js b/src/dns/gcdns.js index 04d32c12c..709a55d91 100644 --- a/src/dns/gcdns.js +++ b/src/dns/gcdns.js @@ -2,24 +2,15 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import { DNS as GCDNS } from '@google-cloud/dns'; import safe from 'safetydance'; import waitForDns from './waitfordns.js'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; const debug = debugModule('box:dns/gcdns'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; function removePrivateFields(domainObject) { delete domainObject.config.credentials.private_key; @@ -193,3 +184,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/godaddy.js b/src/dns/godaddy.js index 2939943f4..9c1adbcf7 100644 --- a/src/dns/godaddy.js +++ b/src/dns/godaddy.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/godaddy'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; // const GODADDY_API_OTE = 'https://api.ote-godaddy.com/v1/domains'; const GODADDY_API = 'https://api.godaddy.com/v1/domains'; @@ -195,3 +186,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/hetzner.js b/src/dns/hetzner.js index e1b1c3421..fab02d380 100644 --- a/src/dns/hetzner.js +++ b/src/dns/hetzner.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/hetzner'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const ENDPOINT = 'https://dns.hetzner.com/api/v1'; @@ -259,3 +250,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/hetznercloud.js b/src/dns/hetznercloud.js index 03a0f3795..263c7789b 100644 --- a/src/dns/hetznercloud.js +++ b/src/dns/hetznercloud.js @@ -2,8 +2,8 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import promiseRetry from '../promise-retry.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; @@ -11,15 +11,6 @@ import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/hetznercloud'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; // https://docs.hetzner.cloud/reference/cloud @@ -236,3 +227,13 @@ async function verifyDomainConfig(domainObject) { return credentials; } + +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/interface.js b/src/dns/interface.js index 35b29f29f..988a5dcdf 100644 --- a/src/dns/interface.js +++ b/src/dns/interface.js @@ -7,15 +7,6 @@ import BoxError from '../boxerror.js'; // New backends can start from here // ------------------------------------------- -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; function removePrivateFields(domainObject) { // in-place removal of tokens and api keys @@ -77,3 +68,13 @@ async function verifyDomainConfig(domainObject) { throw new BoxError(BoxError.NOT_IMPLEMENTED, 'verifyDomainConfig is not implemented'); } + +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/inwx.js b/src/dns/inwx.js index 66beeb5c6..07ba8b2ba 100644 --- a/src/dns/inwx.js +++ b/src/dns/inwx.js @@ -3,22 +3,13 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/inwx'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; function formatError(response) { return `INWX Api error error [Code: [${response.code}] Message: ${response.msg}`; @@ -218,3 +209,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/linode.js b/src/dns/linode.js index 39d5f853b..83853b046 100644 --- a/src/dns/linode.js +++ b/src/dns/linode.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import constants from '../constants.js'; import BoxError from '../boxerror.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/linode'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const LINODE_ENDPOINT = 'https://api.linode.com/v4'; @@ -268,3 +259,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/manual.js b/src/dns/manual.js index 7008c2d3c..b94e58af9 100644 --- a/src/dns/manual.js +++ b/src/dns/manual.js @@ -1,22 +1,13 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/manual'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; function removePrivateFields(domainObject) { return domainObject; @@ -79,3 +70,13 @@ async function verifyDomainConfig(domainObject) { return {}; } + +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/namecheap.js b/src/dns/namecheap.js index 0697de588..12a0b8900 100644 --- a/src/dns/namecheap.js +++ b/src/dns/namecheap.js @@ -2,9 +2,9 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; -import * as network from '../network.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; +import network from '../network.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import timers from 'timers/promises'; @@ -14,15 +14,6 @@ import xml2js from 'xml2js'; const debug = debugModule('box:dns/namecheap'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - verifyDomainConfig, - wait -}; const ENDPOINT = 'https://api.namecheap.com/xml.response'; @@ -285,3 +276,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + verifyDomainConfig, + wait +}; diff --git a/src/dns/namecom.js b/src/dns/namecom.js index 366ea22ca..86afe7397 100644 --- a/src/dns/namecom.js +++ b/src/dns/namecom.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/namecom'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const NAMECOM_API = 'https://api.name.com/v4'; @@ -251,3 +242,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/netcup.js b/src/dns/netcup.js index 6b6c38aca..79814a982 100644 --- a/src/dns/netcup.js +++ b/src/dns/netcup.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/netcup'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const API_ENDPOINT = 'https://ccp.netcup.net/run/webservice/servers/endpoint.php?JSON'; @@ -263,3 +254,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/noop.js b/src/dns/noop.js index 5c13fda90..eb8234889 100644 --- a/src/dns/noop.js +++ b/src/dns/noop.js @@ -3,15 +3,6 @@ import debugModule from 'debug'; const debug = debugModule('box:dns/noop'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; function removePrivateFields(domainObject) { return domainObject; @@ -64,3 +55,13 @@ async function verifyDomainConfig(domainObject) { return {}; } + +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/ovh.js b/src/dns/ovh.js index ddf9a9126..99ce8105e 100644 --- a/src/dns/ovh.js +++ b/src/dns/ovh.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import ovhClient from 'ovh'; import safe from 'safetydance'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/ovh'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; function formatError(error) { return `OVH DNS error ${error.error} ${error.message}`; // error.error is the status @@ -235,3 +226,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/porkbun.js b/src/dns/porkbun.js index 9550c089b..8d1786ded 100644 --- a/src/dns/porkbun.js +++ b/src/dns/porkbun.js @@ -2,8 +2,8 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import timers from 'timers/promises'; @@ -11,15 +11,6 @@ import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/porkbun'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; // Rate limit note: Porkbun return 503 when it hits rate limits. It's as low as 1 req/second // https://github.com/cullenmcdermott/terraform-provider-porkbun/issues/23#issuecomment-1366859999 @@ -227,3 +218,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/route53.js b/src/dns/route53.js index ca3b5665b..dcac9b0e2 100644 --- a/src/dns/route53.js +++ b/src/dns/route53.js @@ -3,24 +3,15 @@ import BoxError from '../boxerror.js'; import { ConfiguredRetryStrategy } from '@smithy/util-retry'; import constants from '../constants.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import { Route53 } from '@aws-sdk/client-route-53'; import safe from 'safetydance'; import waitForDns from './waitfordns.js'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; const debug = debugModule('box:dns/route53'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig, -}; function removePrivateFields(domainObject) { delete domainObject.config.secretAccessKey; @@ -271,3 +262,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig, +}; diff --git a/src/dns/vultr.js b/src/dns/vultr.js index 21b352665..60b47f667 100644 --- a/src/dns/vultr.js +++ b/src/dns/vultr.js @@ -2,23 +2,14 @@ import assert from 'node:assert'; import constants from '../constants.js'; import BoxError from '../boxerror.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/vultr'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; const VULTR_ENDPOINT = 'https://api.vultr.com/v2'; @@ -238,3 +229,12 @@ async function verifyDomainConfig(domainObject) { return credentials; } +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/dns/waitfordns.js b/src/dns/waitfordns.js index 1b964895f..9d2e00ae1 100644 --- a/src/dns/waitfordns.js +++ b/src/dns/waitfordns.js @@ -1,11 +1,11 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; +import dig from '../dig.js'; import dns from 'node:dns'; import promiseRetry from '../promise-retry.js'; import safe from 'safetydance'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; const debug = debugModule('box:dns/waitfordns'); diff --git a/src/dns/wildcard.js b/src/dns/wildcard.js index 0653a5778..a6c7c5bdc 100644 --- a/src/dns/wildcard.js +++ b/src/dns/wildcard.js @@ -1,23 +1,14 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import debugModule from 'debug'; -import * as dig from '../dig.js'; -import * as dns from '../dns.js'; -import * as network from '../network.js'; +import dig from '../dig.js'; +import dns from '../dns.js'; +import network from '../network.js'; import safe from 'safetydance'; import waitForDns from './waitfordns.js'; const debug = debugModule('box:dns/manual'); -export { - removePrivateFields, - injectPrivateFields, - upsert, - get, - del, - wait, - verifyDomainConfig -}; function removePrivateFields(domainObject) { return domainObject; @@ -101,3 +92,13 @@ async function verifyDomainConfig(domainObject) { return {}; } + +export default { + removePrivateFields, + injectPrivateFields, + upsert, + get, + del, + wait, + verifyDomainConfig +}; diff --git a/src/docker.js b/src/docker.js index c1ecca9d9..f1461e3fe 100644 --- a/src/docker.js +++ b/src/docker.js @@ -2,12 +2,12 @@ import apps from './apps.js'; import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; import Docker from 'dockerode'; -import * as dockerRegistries from './dockerregistries.js'; +import dockerRegistries from './dockerregistries.js'; import fs from 'node:fs'; -import * as mailServer from './mailserver.js'; +import mailServer from './mailserver.js'; import os from 'node:os'; import paths from './paths.js'; import promiseRetry from './promise-retry.js'; @@ -15,41 +15,11 @@ import services from './services.js'; import shellModule from './shell.js'; import safe from 'safetydance'; import timers from 'timers/promises'; -import * as volumes from './volumes.js'; +import volumes from './volumes.js'; const debug = debugModule('box:docker'); const shell = shellModule('docker'); -export { - ping, - - info, - df, - buildImage, - downloadImage, - createContainer, - startContainer, - restartContainer, - stopContainer, - stopContainers, - deleteContainer, - deleteImage, - deleteContainers, - createSubcontainer, - inspect, - getContainerIp, - getEvents, - getStats, - - update, - - parseImageRef, - - createExec, - startExec, - getExec, - resizeExec -}; const gConnection = new Docker({ socketPath: paths.DOCKER_SOCKET_PATH }); @@ -748,3 +718,34 @@ async function update(name, memory) { throw new BoxError(BoxError.DOCKER_ERROR, 'Unable to update container'); } + +export default { + ping, + + info, + df, + buildImage, + downloadImage, + createContainer, + startContainer, + restartContainer, + stopContainer, + stopContainers, + deleteContainer, + deleteImage, + deleteContainers, + createSubcontainer, + inspect, + getContainerIp, + getEvents, + getStats, + + update, + + parseImageRef, + + createExec, + startExec, + getExec, + resizeExec +}; diff --git a/src/dockerproxy.js b/src/dockerproxy.js index 4d7361caa..f466f72c4 100644 --- a/src/dockerproxy.js +++ b/src/dockerproxy.js @@ -5,20 +5,16 @@ import express from 'express'; import debugModule from 'debug'; import http from 'node:http'; import { HttpError } from '@cloudron/connect-lastmile'; -import * as middleware from './middleware/index.js'; +import middleware from './middleware/index.js'; import net from 'node:net'; import path from 'node:path'; import paths from './paths.js'; import safe from 'safetydance'; import util from 'node:util'; -import * as volumes from './volumes.js'; +import volumes from './volumes.js'; const debug = debugModule('box:dockerproxy'); -export { - start, - stop -}; let gHttpServer = null; @@ -191,3 +187,8 @@ async function stop() { await util.promisify(gHttpServer.close.bind(gHttpServer))(); gHttpServer = null; } + +export default { + start, + stop +}; diff --git a/src/dockerregistries.js b/src/dockerregistries.js index 71f5e8443..a28c20bc0 100644 --- a/src/dockerregistries.js +++ b/src/dockerregistries.js @@ -2,22 +2,13 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import Docker from 'dockerode'; import eventlog from './eventlog.js'; import paths from './paths.js'; import safe from 'safetydance'; import tld from 'tldjs'; -export { - removePrivateFields, - - list, - add, - get, - del, - update, -}; const REGISTRY_FIELDS = [ 'id', 'provider', 'serverAddress', 'username', 'email', 'password' ].join(','); @@ -119,3 +110,12 @@ async function del(registry, auditSource) { await eventlog.add(eventlog.ACTION_REGISTRY_DEL, auditSource, { registry: removePrivateFields(registry) }); } +export default { + removePrivateFields, + + list, + add, + get, + del, + update, +}; diff --git a/src/domains.js b/src/domains.js index 2508dfd66..f8eed085e 100644 --- a/src/domains.js +++ b/src/domains.js @@ -2,58 +2,42 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; import crypto from 'node:crypto'; -import * as dashboard from './dashboard.js'; -import * as database from './database.js'; +import dashboard from './dashboard.js'; +import database from './database.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; -import * as mailServer from './mailserver.js'; -import * as notifications from './notifications.js'; -import * as openssl from './openssl.js'; -import * as reverseProxy from './reverseproxy.js'; +import mailServer from './mailserver.js'; +import notifications from './notifications.js'; +import openssl from './openssl.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; import tld from 'tldjs'; -import * as _ from './underscore.js'; -import * as dnsBunny from './dns/bunny.js'; -import * as dnsCloudflare from './dns/cloudflare.js'; -import * as dnsDesec from './dns/desec.js'; -import * as dnsDnsimple from './dns/dnsimple.js'; -import * as dnsRoute53 from './dns/route53.js'; -import * as dnsGcdns from './dns/gcdns.js'; -import * as dnsDigitalocean from './dns/digitalocean.js'; -import * as dnsGandi from './dns/gandi.js'; -import * as dnsGodaddy from './dns/godaddy.js'; -import * as dnsHetzner from './dns/hetzner.js'; -import * as dnsHetznercloud from './dns/hetznercloud.js'; -import * as dnsInwx from './dns/inwx.js'; -import * as dnsLinode from './dns/linode.js'; -import * as dnsVultr from './dns/vultr.js'; -import * as dnsNamecom from './dns/namecom.js'; -import * as dnsNamecheap from './dns/namecheap.js'; -import * as dnsNetcup from './dns/netcup.js'; -import * as dnsNoop from './dns/noop.js'; -import * as dnsOvh from './dns/ovh.js'; -import * as dnsManual from './dns/manual.js'; -import * as dnsPorkbun from './dns/porkbun.js'; -import * as dnsWildcard from './dns/wildcard.js'; +import _ from './underscore.js'; +import dnsBunny from './dns/bunny.js'; +import dnsCloudflare from './dns/cloudflare.js'; +import dnsDesec from './dns/desec.js'; +import dnsDnsimple from './dns/dnsimple.js'; +import dnsRoute53 from './dns/route53.js'; +import dnsGcdns from './dns/gcdns.js'; +import dnsDigitalocean from './dns/digitalocean.js'; +import dnsGandi from './dns/gandi.js'; +import dnsGodaddy from './dns/godaddy.js'; +import dnsHetzner from './dns/hetzner.js'; +import dnsHetznercloud from './dns/hetznercloud.js'; +import dnsInwx from './dns/inwx.js'; +import dnsLinode from './dns/linode.js'; +import dnsVultr from './dns/vultr.js'; +import dnsNamecom from './dns/namecom.js'; +import dnsNamecheap from './dns/namecheap.js'; +import dnsNetcup from './dns/netcup.js'; +import dnsNoop from './dns/noop.js'; +import dnsOvh from './dns/ovh.js'; +import dnsManual from './dns/manual.js'; +import dnsPorkbun from './dns/porkbun.js'; +import dnsWildcard from './dns/wildcard.js'; const debug = debugModule('box:domains'); -export { - add, - get, - list, - setConfig, - setWellKnown, - del, - clear, - - getDomainObjectMap, - - removePrivateFields, - removeRestrictedFields, - - checkConfigs -}; const DOMAINS_FIELDS = [ 'domain', 'zoneName', 'provider', 'configJson', 'tlsConfigJson', 'wellKnownJson', 'fallbackCertificateJson' ].join(','); @@ -380,3 +364,20 @@ async function checkConfigs(auditSource) { errorMessage, { context: domainObject.domain }); } } + +export default { + add, + get, + list, + setConfig, + setWellKnown, + del, + clear, + + getDomainObjectMap, + + removePrivateFields, + removeRestrictedFields, + + checkConfigs +}; diff --git a/src/dyndns.js b/src/dyndns.js index 4a2c8f2a5..d414c58b4 100644 --- a/src/dyndns.js +++ b/src/dyndns.js @@ -1,22 +1,18 @@ import apps from './apps.js'; import assert from 'node:assert'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; -import * as dns from './dns.js'; +import dns from './dns.js'; import eventlog from './eventlog.js'; import fs from 'node:fs'; -import * as mailServer from './mailserver.js'; -import * as network from './network.js'; +import mailServer from './mailserver.js'; +import network from './network.js'; import paths from './paths.js'; import safe from 'safetydance'; import tasks from './tasks.js'; const debug = debugModule('box:dyndns'); -export { - refreshDns, - sync -}; // FIXME: this races with apptask. can result in a conflict if apptask is doing some dns operation and this code changes entries async function refreshDns(auditSource) { @@ -90,3 +86,8 @@ async function sync(ipv4, ipv6, auditSource, progressCallback) { progressCallback({ percent: 100, message: 'refreshDNS: updated apps' }); } + +export default { + refreshDns, + sync +}; diff --git a/src/eventlog.js b/src/eventlog.js index 9b21436be..3982c00b2 100644 --- a/src/eventlog.js +++ b/src/eventlog.js @@ -1,9 +1,9 @@ import assert from 'node:assert'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; import mysql from 'mysql2'; -import * as notifications from './notifications.js'; +import notifications from './notifications.js'; import safe from 'safetydance'; const debug = debugModule('box:eventlog'); @@ -13,123 +13,6 @@ const ACTION_USER_LOGIN = 'user.login'; const ACTION_USER_LOGIN_GHOST = 'user.login.ghost'; const ACTION_USER_LOGOUT = 'user.logout'; -export default { - add, - upsertLoginEvent, - get, - getActivationEvent, - listPaged, - cleanup, - _clear: clear, - - // keep in sync with webadmin index.js filter - ACTION_ACTIVATE, - ACTION_APP_CLONE: 'app.clone', - ACTION_APP_CONFIGURE: 'app.configure', - ACTION_APP_REPAIR: 'app.repair', - ACTION_APP_INSTALL: 'app.install', - ACTION_APP_RESTORE: 'app.restore', - ACTION_APP_IMPORT: 'app.import', - ACTION_APP_UNINSTALL: 'app.uninstall', - ACTION_APP_UPDATE: 'app.update', - ACTION_APP_UPDATE_FINISH: 'app.update.finish', - ACTION_APP_BACKUP: 'app.backup', - ACTION_APP_BACKUP_FINISH: 'app.backup.finish', - ACTION_APP_LOGIN: 'app.login', - ACTION_APP_OOM: 'app.oom', - ACTION_APP_UP: 'app.up', - ACTION_APP_DOWN: 'app.down', - ACTION_APP_START: 'app.start', - ACTION_APP_STOP: 'app.stop', - ACTION_APP_RESTART: 'app.restart', - - ACTION_ARCHIVES_ADD: 'archives.add', - ACTION_ARCHIVES_DEL: 'archives.del', - - ACTION_BACKUP_FINISH: 'backup.finish', - ACTION_BACKUP_START: 'backup.start', - ACTION_BACKUP_CLEANUP_START: 'backup.cleanup.start', // obsolete - ACTION_BACKUP_CLEANUP_FINISH: 'backup.cleanup.finish', - - ACTION_BACKUP_INTEGRITY_START: 'backup.integrity.start', - ACTION_BACKUP_INTEGRITY_FINISH: 'backup.integrity.finish', - - ACTION_BACKUP_SITE_ADD: 'backupsite.add', - ACTION_BACKUP_SITE_REMOVE: 'backupsite.remove', - ACTION_BACKUP_SITE_UPDATE: 'backupsite.update', - - ACTION_BRANDING_NAME: 'branding.name', - ACTION_BRANDING_FOOTER: 'branding.footer', - ACTION_BRANDING_AVATAR: 'branding.avatar', - - ACTION_CERTIFICATE_NEW: 'certificate.new', - ACTION_CERTIFICATE_RENEWAL: 'certificate.renew', // obsolete - ACTION_CERTIFICATE_CLEANUP: 'certificate.cleanup', - - ACTION_DASHBOARD_DOMAIN_UPDATE: 'dashboard.domain.update', - - ACTION_DIRECTORY_SERVER_CONFIGURE: 'directoryserver.configure', - - ACTION_DOMAIN_ADD: 'domain.add', - ACTION_DOMAIN_UPDATE: 'domain.update', - ACTION_DOMAIN_REMOVE: 'domain.remove', - - ACTION_EXTERNAL_LDAP_CONFIGURE: 'externalldap.configure', - - ACTION_GROUP_ADD: 'group.add', - ACTION_GROUP_REMOVE: 'group.remove', - ACTION_GROUP_UPDATE: 'group.update', - ACTION_GROUP_MEMBERSHIP: 'group.membership', - - ACTION_INSTALL_FINISH: 'cloudron.install.finish', - - ACTION_MAIL_LOCATION: 'mail.location', - ACTION_MAIL_ENABLED: 'mail.enabled', - ACTION_MAIL_DISABLED: 'mail.disabled', - ACTION_MAIL_MAILBOX_ADD: 'mail.box.add', - ACTION_MAIL_MAILBOX_REMOVE: 'mail.box.remove', - ACTION_MAIL_MAILBOX_UPDATE: 'mail.box.update', - ACTION_MAIL_LIST_ADD: 'mail.list.add', - ACTION_MAIL_LIST_REMOVE: 'mail.list.remove', - ACTION_MAIL_LIST_UPDATE: 'mail.list.update', - - ACTION_PROVISION: 'cloudron.provision', - ACTION_RESTORE: 'cloudron.restore', // unused - ACTION_START: 'cloudron.start', - - ACTION_REGISTRY_ADD: 'registry.add', - ACTION_REGISTRY_UPDATE: 'registry.update', - ACTION_REGISTRY_DEL: 'registry.del', - - ACTION_SERVICE_CONFIGURE: 'service.configure', - ACTION_SERVICE_REBUILD: 'service.rebuild', - ACTION_SERVICE_RESTART: 'service.restart', - - ACTION_UPDATE: 'cloudron.update', - ACTION_UPDATE_FINISH: 'cloudron.update.finish', - - ACTION_USER_ADD: 'user.add', - ACTION_USER_LOGIN, - ACTION_USER_LOGIN_GHOST, - ACTION_USER_LOGOUT, - ACTION_USER_REMOVE: 'user.remove', - ACTION_USER_UPDATE: 'user.update', - ACTION_USER_TRANSFER: 'user.transfer', - - ACTION_USER_DIRECTORY_PROFILE_CONFIG_UPDATE: 'userdirectory.profileconfig.update', - - ACTION_VOLUME_ADD: 'volume.add', - ACTION_VOLUME_UPDATE: 'volume.update', - ACTION_VOLUME_REMOUNT: 'volume.remount', - ACTION_VOLUME_REMOVE: 'volume.remove', - - ACTION_DYNDNS_UPDATE: 'dyndns.update', - - ACTION_SUPPORT_TICKET: 'support.ticket', - ACTION_SUPPORT_SSH: 'support.ssh', - - ACTION_PROCESS_CRASH: 'system.crash' // obsolete -}; const EVENTLOG_FIELDS = [ 'id', 'action', 'sourceJson', 'dataJson', 'creationTime' ].join(','); @@ -255,3 +138,121 @@ async function cleanup(options) { async function clear() { await database.query('DELETE FROM eventlog'); } + +export default { + add, + upsertLoginEvent, + get, + getActivationEvent, + listPaged, + cleanup, + _clear: clear, + + // keep in sync with webadmin index.js filter + ACTION_ACTIVATE, + ACTION_APP_CLONE: 'app.clone', + ACTION_APP_CONFIGURE: 'app.configure', + ACTION_APP_REPAIR: 'app.repair', + ACTION_APP_INSTALL: 'app.install', + ACTION_APP_RESTORE: 'app.restore', + ACTION_APP_IMPORT: 'app.import', + ACTION_APP_UNINSTALL: 'app.uninstall', + ACTION_APP_UPDATE: 'app.update', + ACTION_APP_UPDATE_FINISH: 'app.update.finish', + ACTION_APP_BACKUP: 'app.backup', + ACTION_APP_BACKUP_FINISH: 'app.backup.finish', + ACTION_APP_LOGIN: 'app.login', + ACTION_APP_OOM: 'app.oom', + ACTION_APP_UP: 'app.up', + ACTION_APP_DOWN: 'app.down', + ACTION_APP_START: 'app.start', + ACTION_APP_STOP: 'app.stop', + ACTION_APP_RESTART: 'app.restart', + + ACTION_ARCHIVES_ADD: 'archives.add', + ACTION_ARCHIVES_DEL: 'archives.del', + + ACTION_BACKUP_FINISH: 'backup.finish', + ACTION_BACKUP_START: 'backup.start', + ACTION_BACKUP_CLEANUP_START: 'backup.cleanup.start', // obsolete + ACTION_BACKUP_CLEANUP_FINISH: 'backup.cleanup.finish', + + ACTION_BACKUP_INTEGRITY_START: 'backup.integrity.start', + ACTION_BACKUP_INTEGRITY_FINISH: 'backup.integrity.finish', + + ACTION_BACKUP_SITE_ADD: 'backupsite.add', + ACTION_BACKUP_SITE_REMOVE: 'backupsite.remove', + ACTION_BACKUP_SITE_UPDATE: 'backupsite.update', + + ACTION_BRANDING_NAME: 'branding.name', + ACTION_BRANDING_FOOTER: 'branding.footer', + ACTION_BRANDING_AVATAR: 'branding.avatar', + + ACTION_CERTIFICATE_NEW: 'certificate.new', + ACTION_CERTIFICATE_RENEWAL: 'certificate.renew', // obsolete + ACTION_CERTIFICATE_CLEANUP: 'certificate.cleanup', + + ACTION_DASHBOARD_DOMAIN_UPDATE: 'dashboard.domain.update', + + ACTION_DIRECTORY_SERVER_CONFIGURE: 'directoryserver.configure', + + ACTION_DOMAIN_ADD: 'domain.add', + ACTION_DOMAIN_UPDATE: 'domain.update', + ACTION_DOMAIN_REMOVE: 'domain.remove', + + ACTION_EXTERNAL_LDAP_CONFIGURE: 'externalldap.configure', + + ACTION_GROUP_ADD: 'group.add', + ACTION_GROUP_REMOVE: 'group.remove', + ACTION_GROUP_UPDATE: 'group.update', + ACTION_GROUP_MEMBERSHIP: 'group.membership', + + ACTION_INSTALL_FINISH: 'cloudron.install.finish', + + ACTION_MAIL_LOCATION: 'mail.location', + ACTION_MAIL_ENABLED: 'mail.enabled', + ACTION_MAIL_DISABLED: 'mail.disabled', + ACTION_MAIL_MAILBOX_ADD: 'mail.box.add', + ACTION_MAIL_MAILBOX_REMOVE: 'mail.box.remove', + ACTION_MAIL_MAILBOX_UPDATE: 'mail.box.update', + ACTION_MAIL_LIST_ADD: 'mail.list.add', + ACTION_MAIL_LIST_REMOVE: 'mail.list.remove', + ACTION_MAIL_LIST_UPDATE: 'mail.list.update', + + ACTION_PROVISION: 'cloudron.provision', + ACTION_RESTORE: 'cloudron.restore', // unused + ACTION_START: 'cloudron.start', + + ACTION_REGISTRY_ADD: 'registry.add', + ACTION_REGISTRY_UPDATE: 'registry.update', + ACTION_REGISTRY_DEL: 'registry.del', + + ACTION_SERVICE_CONFIGURE: 'service.configure', + ACTION_SERVICE_REBUILD: 'service.rebuild', + ACTION_SERVICE_RESTART: 'service.restart', + + ACTION_UPDATE: 'cloudron.update', + ACTION_UPDATE_FINISH: 'cloudron.update.finish', + + ACTION_USER_ADD: 'user.add', + ACTION_USER_LOGIN, + ACTION_USER_LOGIN_GHOST, + ACTION_USER_LOGOUT, + ACTION_USER_REMOVE: 'user.remove', + ACTION_USER_UPDATE: 'user.update', + ACTION_USER_TRANSFER: 'user.transfer', + + ACTION_USER_DIRECTORY_PROFILE_CONFIG_UPDATE: 'userdirectory.profileconfig.update', + + ACTION_VOLUME_ADD: 'volume.add', + ACTION_VOLUME_UPDATE: 'volume.update', + ACTION_VOLUME_REMOUNT: 'volume.remount', + ACTION_VOLUME_REMOVE: 'volume.remove', + + ACTION_DYNDNS_UPDATE: 'dyndns.update', + + ACTION_SUPPORT_TICKET: 'support.ticket', + ACTION_SUPPORT_SSH: 'support.ssh', + + ACTION_PROCESS_CRASH: 'system.crash' // obsolete +}; diff --git a/src/externalldap.js b/src/externalldap.js index 5ebbc2fca..5adb50ab7 100644 --- a/src/externalldap.js +++ b/src/externalldap.js @@ -2,34 +2,19 @@ import assert from 'node:assert'; import AuditSource from './auditsource.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as cron from './cron.js'; +import cron from './cron.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; -import * as groups from './groups.js'; +import groups from './groups.js'; import ldap from 'ldapjs'; import safe from 'safetydance'; -import * as settings from './settings.js'; +import settings from './settings.js'; import tasks from './tasks.js'; -import * as users from './users.js'; +import users from './users.js'; import util from 'node:util'; const debug = debugModule('box:externalldap'); -export { - getConfig, - setConfig, - - verifyPassword, - maybeCreateUser, - - supports2FA, - - startSyncer, - - removePrivateFields, - - sync -}; function removePrivateFields(ldapConfig) { assert.strictEqual(typeof ldapConfig, 'object'); @@ -545,3 +530,18 @@ async function sync(progressCallback) { debug('sync: done'); } +export default { + getConfig, + setConfig, + + verifyPassword, + maybeCreateUser, + + supports2FA, + + startSyncer, + + removePrivateFields, + + sync +}; diff --git a/src/groups.js b/src/groups.js index 3ff359fde..340a55747 100644 --- a/src/groups.js +++ b/src/groups.js @@ -3,30 +3,12 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import eventlog from './eventlog.js'; import safe from 'safetydance'; const _getMembership = getMembership; -export { - add, - del, - get, - getByName, - update, - setName, - getWithMembers, - list, - listWithMembers, - getMemberIds, - setMembers, - isMember, - setLocalMembership, - resetSources, - setAllowedApps, - _getMembership, -}; const GROUPS_FIELDS = [ 'id', 'name', 'source' ].join(','); @@ -307,3 +289,22 @@ async function setAllowedApps(group, appIds, auditSource) { await apps.update(app.id, { accessRestriction }); } } + +export default { + add, + del, + get, + getByName, + update, + setName, + getWithMembers, + list, + listWithMembers, + getMemberIds, + setMembers, + isMember, + setLocalMembership, + resetSources, + setAllowedApps, + _getMembership, +}; diff --git a/src/hush.js b/src/hush.js index ff4990d74..5372dd841 100644 --- a/src/hush.js +++ b/src/hush.js @@ -165,7 +165,7 @@ function generateEncryptionKeysSync(password) { }; } -export { +export default { EncryptStream, DecryptStream, diff --git a/src/ipaddr.js b/src/ipaddr.js index 402d94744..998e196dd 100644 --- a/src/ipaddr.js +++ b/src/ipaddr.js @@ -1,12 +1,6 @@ import assert from 'node:assert'; import net from 'node:net'; -export { - isValid, - isValidCIDR, - isEqual, - includes, -}; function isValid(ip) { assert.strictEqual(typeof ip, 'string'); @@ -58,3 +52,10 @@ function includes(cidr, ip) { blockList.addSubnet(subnet, parseInt(prefix, 10), `ipv${subnetType}`); return blockList.check(ip, `ipv${type}`); } + +export default { + isValid, + isValidCIDR, + isEqual, + includes, +}; diff --git a/src/iputils.js b/src/iputils.js index d3be348ec..b35f3f78d 100644 --- a/src/iputils.js +++ b/src/iputils.js @@ -1,9 +1,5 @@ import assert from 'node:assert'; -export { - ipFromInt, - intFromIp -}; // this code is used in migrations - 20201120212726-apps-add-containerIp.js function intFromIp(address) { @@ -33,3 +29,7 @@ function ipFromInt(input) { return output.join('.'); } +export default { + ipFromInt, + intFromIp +}; diff --git a/src/janitor.js b/src/janitor.js index da2d8789c..ecb587ea9 100644 --- a/src/janitor.js +++ b/src/janitor.js @@ -3,14 +3,10 @@ import BoxError from './boxerror.js'; import debugModule from 'debug'; import Docker from 'dockerode'; import safe from 'safetydance'; -import * as tokens from './tokens.js'; +import tokens from './tokens.js'; const debug = debugModule('box:janitor'); -export { - cleanupTokens, - cleanupDockerVolumes -}; const gConnection = new Docker({ socketPath: '/var/run/docker.sock' }); @@ -56,3 +52,8 @@ async function cleanupDockerVolumes() { debug('Cleaned up docker volumes'); } + +export default { + cleanupTokens, + cleanupDockerVolumes +}; diff --git a/src/ldapserver.js b/src/ldapserver.js index 0c30c63d0..c81cd521b 100644 --- a/src/ldapserver.js +++ b/src/ldapserver.js @@ -1,4 +1,4 @@ -import * as addonConfigs from './addonconfigs.js'; +import addonConfigs from './addonconfigs.js'; import assert from 'node:assert'; import apps from './apps.js'; import AuditSource from './auditsource.js'; @@ -6,11 +6,11 @@ import BoxError from './boxerror.js'; import constants from './constants.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; -import * as groups from './groups.js'; +import groups from './groups.js'; import ldap from 'ldapjs'; -import * as mail from './mail.js'; +import mail from './mail.js'; import safe from 'safetydance'; -import * as users from './users.js'; +import users from './users.js'; import util from 'node:util'; const debug = debugModule('box:ldapserver'); @@ -21,12 +21,6 @@ function _setMockApp(app) { _MOCK_APP = app; } -export { - start, - stop, - _MOCK_APP, - _setMockApp, -}; let gServer = null; @@ -711,3 +705,10 @@ async function stop() { await util.promisify(gServer.close.bind(gServer))(); gServer = null; } + +export default { + start, + stop, + _MOCK_APP, + _setMockApp, +}; diff --git a/src/locks.js b/src/locks.js index 7acfe434a..5a3898a38 100644 --- a/src/locks.js +++ b/src/locks.js @@ -1,6 +1,6 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; import promiseRetry from './promise-retry.js'; @@ -12,24 +12,6 @@ const TYPE_BOX_UPDATE = 'box_update'; const TYPE_BOX_UPDATE_TASK = 'box_update_task'; const TYPE_FULL_BACKUP_TASK_PREFIX = 'full_backup_task_'; -export default { - setTaskId, - - acquire, - wait, - - release, - releaseAll, - releaseByTaskId, - - TYPE_APP_TASK_PREFIX, - TYPE_APP_BACKUP_PREFIX, - TYPE_BOX_UPDATE, - TYPE_BOX_UPDATE_TASK, - TYPE_FULL_BACKUP_TASK_PREFIX, - - TYPE_MAIL_SERVER_RESTART: 'mail_restart', -}; let gTaskId = null; @@ -131,3 +113,22 @@ async function releaseByTaskId(taskId) { debug(`releaseByTaskId: ${taskId}`); }); } + +export default { + setTaskId, + + acquire, + wait, + + release, + releaseAll, + releaseByTaskId, + + TYPE_APP_TASK_PREFIX, + TYPE_APP_BACKUP_PREFIX, + TYPE_BOX_UPDATE, + TYPE_BOX_UPDATE_TASK, + TYPE_FULL_BACKUP_TASK_PREFIX, + + TYPE_MAIL_SERVER_RESTART: 'mail_restart', +}; diff --git a/src/logs.js b/src/logs.js index 793c2b50b..d6ad664a0 100644 --- a/src/logs.js +++ b/src/logs.js @@ -99,7 +99,7 @@ function journalctl(unit, options) { return cp; } -export { +export default { tail, journalctl, LogStream diff --git a/src/mail.js b/src/mail.js index d660a1cb2..df58dd61a 100644 --- a/src/mail.js +++ b/src/mail.js @@ -1,25 +1,25 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; -import * as dig from './dig.js'; -import * as dns from './dns.js'; +import dig from './dig.js'; +import dns from './dns.js'; import eventlog from './eventlog.js'; -import * as mailer from './mailer.js'; -import * as mailServer from './mailserver.js'; +import mailer from './mailer.js'; +import mailServer from './mailserver.js'; import net from 'node:net'; -import * as network from './network.js'; +import network from './network.js'; import nodemailer from 'nodemailer'; -import * as notifications from './notifications.js'; +import notifications from './notifications.js'; import path from 'node:path'; -import * as platform from './platform.js'; +import platform from './platform.js'; import safe from 'safetydance'; import services from './services.js'; import shellModule from './shell.js'; import superagent from '@cloudron/superagent'; -import * as validator from './validator.js'; -import * as _ from './underscore.js'; +import validator from './validator.js'; +import _ from './underscore.js'; const debug = debugModule('box:mail'); const shell = shellModule('mail'); @@ -33,50 +33,6 @@ const TYPE_ALIAS = 'alias'; const _delByDomain = delByDomain; const _updateDomain = updateDomain; -export { - getStatus, - checkConfiguration, - listDomains, - getDomain, - clearDomains, - removePrivateFields, - setDnsRecords, - upsertDnsRecords, - validateName, - validateDisplayName, - setMailFromValidation, - setCatchAllAddress, - setMailRelay, - setMailEnabled, - setBanner, - sendTestMail, - listMailboxesByDomain, - listMailboxes, - getMailbox, - addMailbox, - updateMailbox, - delMailbox, - getAlias, - getAliases, - setAliases, - searchAlias, - listMailingListsByDomain, - getMailingList, - addMailingList, - updateMailingList, - delMailingList, - resolveMailingList, - getStats, - checkStatus, - OWNERTYPE_USER, - OWNERTYPE_GROUP, - OWNERTYPE_APP, - TYPE_MAILBOX, - TYPE_LIST, - TYPE_ALIAS, - _delByDomain, - _updateDomain, -}; const DNS_OPTIONS = { timeout: 20000, tries: 4 }; const REMOVE_MAILBOX_CMD = path.join(import.meta.dirname, 'scripts/rmmailbox.sh'); @@ -1239,3 +1195,47 @@ async function checkStatus() { } } +export default { + getStatus, + checkConfiguration, + listDomains, + getDomain, + clearDomains, + removePrivateFields, + setDnsRecords, + upsertDnsRecords, + validateName, + validateDisplayName, + setMailFromValidation, + setCatchAllAddress, + setMailRelay, + setMailEnabled, + setBanner, + sendTestMail, + listMailboxesByDomain, + listMailboxes, + getMailbox, + addMailbox, + updateMailbox, + delMailbox, + getAlias, + getAliases, + setAliases, + searchAlias, + listMailingListsByDomain, + getMailingList, + addMailingList, + updateMailingList, + delMailingList, + resolveMailingList, + getStats, + checkStatus, + OWNERTYPE_USER, + OWNERTYPE_GROUP, + OWNERTYPE_APP, + TYPE_MAILBOX, + TYPE_LIST, + TYPE_ALIAS, + _delByDomain, + _updateDomain, +}; diff --git a/src/mailer.js b/src/mailer.js index 976558da7..eaca0220e 100644 --- a/src/mailer.js +++ b/src/mailer.js @@ -1,15 +1,15 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as branding from './branding.js'; +import branding from './branding.js'; import constants from './constants.js'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; import ejs from 'ejs'; -import * as mailServer from './mailserver.js'; +import mailServer from './mailserver.js'; import nodemailer from 'nodemailer'; import path from 'node:path'; import safe from 'safetydance'; -import * as translations from './translations.js'; +import translations from './translations.js'; const debug = debugModule('box:mailer'); @@ -19,22 +19,6 @@ function clearMailQueue() { _mailQueue.length = 0; } -export { - passwordReset, - sendInvite, - sendNewLoginLocation, - backupFailed, - certificateRenewalError, - appDown, - appUp, - oomEvent, - rebootRequired, - boxUpdateError, - lowDiskSpace, - sendTestMail, - _mailQueue, - clearMailQueue, -}; const MAIL_TEMPLATES_DIR = path.join(import.meta.dirname, 'mail_templates'); @@ -352,3 +336,20 @@ async function sendTestMail(domain, email) { await sendMail(mailOptions); } + +export default { + passwordReset, + sendInvite, + sendNewLoginLocation, + backupFailed, + certificateRenewalError, + appDown, + appUp, + oomEvent, + rebootRequired, + boxUpdateError, + lowDiskSpace, + sendTestMail, + _mailQueue, + clearMailQueue, +}; diff --git a/src/mailserver.js b/src/mailserver.js index 282e95cee..386a44242 100644 --- a/src/mailserver.js +++ b/src/mailserver.js @@ -2,44 +2,31 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; import debugModule from 'debug'; -import * as dns from './dns.js'; -import * as docker from './docker.js'; -import * as domains from './domains.js'; +import dns from './dns.js'; +import docker from './docker.js'; +import domains from './domains.js'; import eventlog from './eventlog.js'; import fs from 'node:fs'; import hat from './hat.js'; import infra from './infra_version.js'; import Location from './location.js'; import locks from './locks.js'; -import * as mail from './mail.js'; +import mail from './mail.js'; import paths from './paths.js'; -import * as platform from './platform.js'; -import * as reverseProxy from './reverseproxy.js'; +import platform from './platform.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; import services from './services.js'; -import * as settings from './settings.js'; +import settings from './settings.js'; import shellModule from './shell.js'; import tasks from './tasks.js'; -import * as users from './users.js'; +import users from './users.js'; const debug = debugModule('box:mailserver'); const shell = shellModule('mailserver'); const DEFAULT_MEMORY_LIMIT = 512 * 1024 * 1024; -export { - restart, - start, - onDomainAdded, - onDomainRemoved, - checkCertificate, - getMailAuth, - getLocation, - startChangeLocation, - changeLocation, - setLocation, - DEFAULT_MEMORY_LIMIT, -}; async function createMailConfig(mailFqdn) { assert.strictEqual(typeof mailFqdn, 'string'); @@ -325,3 +312,16 @@ async function getMailAuth() { }; } +export default { + restart, + start, + onDomainAdded, + onDomainRemoved, + checkCertificate, + getMailAuth, + getLocation, + startChangeLocation, + changeLocation, + setLocation, + DEFAULT_MEMORY_LIMIT, +}; diff --git a/src/metrics.js b/src/metrics.js index 8cc9f670a..c8b2c9025 100644 --- a/src/metrics.js +++ b/src/metrics.js @@ -3,25 +3,20 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; import debugModule from 'debug'; -import * as docker from './docker.js'; +import docker from './docker.js'; import fs from 'node:fs'; import net from 'node:net'; -import * as network from './network.js'; +import network from './network.js'; import os from 'node:os'; import { Readable } from 'node:stream'; import safe from 'safetydance'; import shellModule from './shell.js'; import superagent from '@cloudron/superagent'; -import * as _ from './underscore.js'; +import _ from './underscore.js'; const debug = debugModule('box:metrics'); const shell = shellModule('metrics'); -export { - get, - getStream, - sendToGraphite -}; function translateContainerStatsSync(stats) { assert.strictEqual(typeof stats, 'object'); @@ -500,3 +495,9 @@ async function getStream(options) { return metricsStream; } + +export default { + get, + getStream, + sendToGraphite +}; diff --git a/src/middleware/index.js b/src/middleware/index.js index 79ad36c27..8ad033ff0 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -5,7 +5,7 @@ import lastMile from '@cloudron/connect-lastmile'; import multipart from './multipart.js'; import timeout from 'connect-timeout'; -export { +export default { cookieParser, cors, json, diff --git a/src/mounts.js b/src/mounts.js index 8827fb613..f6c8d69e6 100644 --- a/src/mounts.js +++ b/src/mounts.js @@ -21,22 +21,6 @@ const MOUNT_TYPE_EXT4 = 'ext4'; // raw disk path const MOUNT_TYPE_XFS = 'xfs'; // raw disk path const MOUNT_TYPE_DISK = 'disk'; // this provides a selector of block devices -export default { - isManagedProvider, - tryAddMount, - removeMount, - validateMountOptions, - getStatus, - remount, - MOUNT_TYPE_FILESYSTEM, - MOUNT_TYPE_MOUNTPOINT, - MOUNT_TYPE_CIFS, - MOUNT_TYPE_NFS, - MOUNT_TYPE_SSHFS, - MOUNT_TYPE_EXT4, - MOUNT_TYPE_XFS, - MOUNT_TYPE_DISK, -}; const ADD_MOUNT_CMD = path.join(import.meta.dirname, 'scripts/addmount.sh'); const RM_MOUNT_CMD = path.join(import.meta.dirname, 'scripts/rmmount.sh'); @@ -264,3 +248,20 @@ async function remount(hostPath) { const [error] = await safe(shell.sudo([ REMOUNT_MOUNT_CMD, hostPath ], {})); if (error && error.code === 2) throw new BoxError(BoxError.MOUNT_ERROR, 'Failed to remount existing mount'); // at this point, the old mount config is still there } + +export default { + isManagedProvider, + tryAddMount, + removeMount, + validateMountOptions, + getStatus, + remount, + MOUNT_TYPE_FILESYSTEM, + MOUNT_TYPE_MOUNTPOINT, + MOUNT_TYPE_CIFS, + MOUNT_TYPE_NFS, + MOUNT_TYPE_SSHFS, + MOUNT_TYPE_EXT4, + MOUNT_TYPE_XFS, + MOUNT_TYPE_DISK, +}; diff --git a/src/network.js b/src/network.js index dab518370..9741d2737 100644 --- a/src/network.js +++ b/src/network.js @@ -1,44 +1,21 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as cron from './cron.js'; +import cron from './cron.js'; import fs from 'node:fs'; -import * as ipaddr from './ipaddr.js'; +import ipaddr from './ipaddr.js'; import path from 'node:path'; import paths from './paths.js'; import safe from 'safetydance'; -import * as settings from './settings.js'; +import settings from './settings.js'; import shellModule from './shell.js'; -import * as noopProvider from './network/noop.js'; -import * as fixedProvider from './network/fixed.js'; -import * as networkInterfaceProvider from './network/network-interface.js'; -import * as genericProvider from './network/generic.js'; +import noopProvider from './network/noop.js'; +import fixedProvider from './network/fixed.js'; +import networkInterfaceProvider from './network/network-interface.js'; +import genericProvider from './network/generic.js'; const shell = shellModule('network'); -export { - testIPv4Config, - testIPv6Config, - - getBlocklist, - setBlocklist, - - getDynamicDns, - setDynamicDns, - - getIPv4Config, - setIPv4Config, - - getIPv6Config, - setIPv6Config, - - getIPv4, - hasIPv6, - getIPv6, - detectIP, - - getDefaultInterface -}; const SET_BLOCKLIST_CMD = path.join(import.meta.dirname, 'scripts/setblocklist.sh'); @@ -207,3 +184,27 @@ async function getDefaultInterface() { throw new BoxError(BoxError.EXTERNAL_ERROR, 'Could not detect default interface'); } + +export default { + testIPv4Config, + testIPv6Config, + + getBlocklist, + setBlocklist, + + getDynamicDns, + setDynamicDns, + + getIPv4Config, + setIPv4Config, + + getIPv6Config, + setIPv6Config, + + getIPv4, + hasIPv6, + getIPv6, + detectIP, + + getDefaultInterface +}; diff --git a/src/network/fixed.js b/src/network/fixed.js index 42610f726..0bdf2e3c9 100644 --- a/src/network/fixed.js +++ b/src/network/fixed.js @@ -2,12 +2,6 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import net from 'node:net'; -export { - getIPv4, - getIPv6, - testIPv4Config, - testIPv6Config -}; async function getIPv4(config) { assert.strictEqual(typeof config, 'object'); @@ -42,3 +36,10 @@ async function testIPv6Config(config) { return null; } + +export default { + getIPv4, + getIPv6, + testIPv4Config, + testIPv6Config +}; diff --git a/src/network/generic.js b/src/network/generic.js index 7038e2085..3b83d9552 100644 --- a/src/network/generic.js +++ b/src/network/generic.js @@ -7,12 +7,6 @@ import superagent from '@cloudron/superagent'; const debug = debugModule('box:network/generic'); -export { - getIPv4, - getIPv6, - testIPv4Config, - testIPv6Config -}; const gCache = { ipv4: {}, ipv6: {} }; // each has { timestamp, value, request } @@ -87,3 +81,10 @@ async function testIPv6Config(config) { return null; } + +export default { + getIPv4, + getIPv6, + testIPv4Config, + testIPv6Config +}; diff --git a/src/network/interface.js b/src/network/interface.js index 6e0900a94..5a9d1371c 100644 --- a/src/network/interface.js +++ b/src/network/interface.js @@ -7,12 +7,6 @@ import BoxError from '../boxerror.js'; // New backends can start from here // ------------------------------------------- -export { - getIPv4, - getIPv6, - testIPv4Config, - testIPv6Config -}; async function getIPv4(config) { assert.strictEqual(typeof config, 'object'); @@ -37,3 +31,10 @@ async function testIPv6Config(config) { return null; } + +export default { + getIPv4, + getIPv6, + testIPv4Config, + testIPv6Config +}; diff --git a/src/network/network-interface.js b/src/network/network-interface.js index aaf253584..0164228f9 100644 --- a/src/network/network-interface.js +++ b/src/network/network-interface.js @@ -6,12 +6,6 @@ import safe from 'safetydance'; const debug = debugModule('box:network/network-interface'); -export { - getIPv4, - getIPv6, - testIPv4Config, - testIPv6Config -}; async function getIPv4(config) { assert.strictEqual(typeof config, 'object'); @@ -58,3 +52,10 @@ async function testIPv6Config(config) { const [error] = await safe(getIPv6(config)); return error || null; } + +export default { + getIPv4, + getIPv6, + testIPv4Config, + testIPv6Config +}; diff --git a/src/network/noop.js b/src/network/noop.js index a5c7f6531..09b0a99d5 100644 --- a/src/network/noop.js +++ b/src/network/noop.js @@ -1,11 +1,5 @@ import assert from 'node:assert'; -export { - getIPv4, - getIPv6, - testIPv4Config, - testIPv6Config -}; async function getIPv4(config) { assert.strictEqual(typeof config, 'object'); @@ -30,3 +24,10 @@ async function testIPv6Config(config) { return null; } + +export default { + getIPv4, + getIPv6, + testIPv4Config, + testIPv6Config +}; diff --git a/src/notifications.js b/src/notifications.js index 7e97f53ae..7c1ccce0c 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -1,15 +1,15 @@ import assert from 'node:assert'; import AuditSource from './auditsource.js'; import BoxError from './boxerror.js'; -import * as changelog from './changelog.js'; +import changelog from './changelog.js'; import constants from './constants.js'; -import * as dashboard from './dashboard.js'; -import * as database from './database.js'; +import dashboard from './dashboard.js'; +import database from './database.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; -import * as mailer from './mailer.js'; +import mailer from './mailer.js'; import safe from 'safetydance'; -import * as users from './users.js'; +import users from './users.js'; const debug = debugModule('box:notifications'); @@ -32,33 +32,6 @@ const TYPE_MANUAL_APP_UPDATE_NEEDED = 'manualAppUpdate'; const TYPE_DOMAIN_CONFIG_CHECK_FAILED = 'domainConfigCheckFailed'; const _add = add; -export { - get, - update, - list, - del, - onEvent, - TYPE_CLOUDRON_INSTALLED, - TYPE_CLOUDRON_UPDATED, - TYPE_CLOUDRON_UPDATE_FAILED, - TYPE_CERTIFICATE_RENEWAL_FAILED, - TYPE_BACKUP_CONFIG, - TYPE_APP_OOM, - TYPE_APP_UPDATED, - TYPE_BACKUP_FAILED, - TYPE_APP_DOWN, - TYPE_APP_UP, - TYPE_DISK_SPACE, - TYPE_MAIL_STATUS, - TYPE_REBOOT, - TYPE_UPDATE_UBUNTU, - TYPE_BOX_UPDATE, - TYPE_MANUAL_APP_UPDATE_NEEDED, - TYPE_DOMAIN_CONFIG_CHECK_FAILED, - pin, - unpin, - _add, -}; const NOTIFICATION_FIELDS = [ 'id', 'eventId', 'type', 'title', 'message', 'creationTime', 'acknowledged', 'context' ]; @@ -397,3 +370,31 @@ async function onEvent(eventId, action, source, data) { return; } } + +export default { + get, + update, + list, + del, + onEvent, + TYPE_CLOUDRON_INSTALLED, + TYPE_CLOUDRON_UPDATED, + TYPE_CLOUDRON_UPDATE_FAILED, + TYPE_CERTIFICATE_RENEWAL_FAILED, + TYPE_BACKUP_CONFIG, + TYPE_APP_OOM, + TYPE_APP_UPDATED, + TYPE_BACKUP_FAILED, + TYPE_APP_DOWN, + TYPE_APP_UP, + TYPE_DISK_SPACE, + TYPE_MAIL_STATUS, + TYPE_REBOOT, + TYPE_UPDATE_UBUNTU, + TYPE_BOX_UPDATE, + TYPE_MANUAL_APP_UPDATE_NEEDED, + TYPE_DOMAIN_CONFIG_CHECK_FAILED, + pin, + unpin, + _add, +}; diff --git a/src/oidcclients.js b/src/oidcclients.js index 0ab0e5bb5..0b06ff067 100644 --- a/src/oidcclients.js +++ b/src/oidcclients.js @@ -1,7 +1,7 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as dashboard from './dashboard.js'; -import * as database from './database.js'; +import dashboard from './dashboard.js'; +import database from './database.js'; import hat from './hat.js'; import safe from 'safetydance'; @@ -10,21 +10,6 @@ const ID_DEVELOPMENT = 'cid-development'; const ID_CLI = 'cid-cli'; const ID_SDK = 'cid-sdk'; -export default { - add, - get, - del, - update, - list, - - validateId, - - // token client ids. we categorize them so we can have different restrictions based on the client - ID_WEBADMIN, - ID_DEVELOPMENT, - ID_CLI, - ID_SDK, -}; const OIDC_CLIENTS_TABLE_NAME = 'oidcClients'; const OIDC_CLIENTS_FIELDS = [ 'id', 'secret', 'name', 'appId', 'loginRedirectUri', 'tokenSignatureAlgorithm' ]; @@ -121,3 +106,19 @@ async function list() { return results; } + +export default { + add, + get, + del, + update, + list, + + validateId, + + // token client ids. we categorize them so we can have different restrictions based on the client + ID_WEBADMIN, + ID_DEVELOPMENT, + ID_CLI, + ID_SDK, +}; diff --git a/src/oidcserver.js b/src/oidcserver.js index a9307c0d5..2e407a4c3 100644 --- a/src/oidcserver.js +++ b/src/oidcserver.js @@ -3,44 +3,36 @@ import apps from './apps.js'; import AuditSource from './auditsource.js'; import BoxError from './boxerror.js'; import blobs from './blobs.js'; -import * as branding from './branding.js'; +import branding from './branding.js'; import constants from './constants.js'; import crypto from 'node:crypto'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; -import * as dns from './dns.js'; +import dns from './dns.js'; import ejs from 'ejs'; import express from 'express'; import eventlog from './eventlog.js'; import fs from 'node:fs'; import * as marked from 'marked'; -import * as middleware from './middleware/index.js'; +import middleware from './middleware/index.js'; import oidcClients from './oidcclients.js'; -import * as passkeys from './passkeys.js'; +import passkeys from './passkeys.js'; import path from 'node:path'; import paths from './paths.js'; import http from 'node:http'; import { HttpError } from '@cloudron/connect-lastmile'; import * as jose from 'jose'; import safe from 'safetydance'; -import * as settings from './settings.js'; +import settings from './settings.js'; import superagent from '@cloudron/superagent'; -import * as tokens from './tokens.js'; +import tokens from './tokens.js'; import url from 'node:url'; -import * as users from './users.js'; -import * as groups from './groups.js'; +import users from './users.js'; +import groups from './groups.js'; import util from 'node:util'; const debug = debugModule('box:oidcserver'); -export { - start, - stop, - revokeByUsername, - consumeAuthCode, - - cleanupExpired, -}; // 1. Index.vue starts the OIDC flow by navigating to /openid/auth. Webadmin sets callback url to authcallback.html + implicit flow // 2. oidcserver starts an interaction and redirects to oidc_login.html @@ -722,3 +714,12 @@ async function stop() { gHttpServer = null; gOidcProvider = null; } + +export default { + start, + stop, + revokeByUsername, + consumeAuthCode, + + cleanupExpired, +}; diff --git a/src/openssl.js b/src/openssl.js index efad96fd2..6a81cf58f 100644 --- a/src/openssl.js +++ b/src/openssl.js @@ -11,23 +11,6 @@ import shellModule from './shell.js'; const debug = debugModule('box:openssl'); const shell = shellModule('openssl'); -export { - createCsr, - generateKey, - getModulus, - pemToDer, - getCertificateDates, - getSubjectAndIssuer, - generateCertificate, - hasExpired, - getPublicKey, - checkHost, - generateDkimKey, - generateDhparam, - validateCertificate, - getSerial, - getAuthorityKeyId -}; async function generateKey(type) { debug(`generateKey: generating new key for${type}`); @@ -241,3 +224,21 @@ async function getAuthorityKeyId(pem) { if (!akiMatch) throw new BoxError(BoxError.OPENSSL_ERROR, 'AKI not found'); return Buffer.from(akiMatch[1].replace(/:/g, ''), 'hex'); } + +export default { + createCsr, + generateKey, + getModulus, + pemToDer, + getCertificateDates, + getSubjectAndIssuer, + generateCertificate, + hasExpired, + getPublicKey, + checkHost, + generateDkimKey, + generateDhparam, + validateCertificate, + getSerial, + getAuthorityKeyId +}; diff --git a/src/passkeys.js b/src/passkeys.js index ea8aed85e..3bd68fc17 100644 --- a/src/passkeys.js +++ b/src/passkeys.js @@ -1,8 +1,8 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import crypto from 'node:crypto'; -import * as dashboard from './dashboard.js'; -import * as database from './database.js'; +import dashboard from './dashboard.js'; +import database from './database.js'; import debugModule from 'debug'; import safe from 'safetydance'; import { @@ -11,25 +11,10 @@ import { generateAuthenticationOptions as generateWebAuthnAuthenticationOptions, verifyAuthenticationResponse } from '@simplewebauthn/server'; -import * as _ from './underscore.js'; +import _ from './underscore.js'; const debug = debugModule('box:passkeys'); -export { - list, - get, - getByCredentialId, - add, - del, - updateCounter, - - generateRegistrationOptions, - verifyRegistration, - generateAuthenticationOptions, - verifyAuthentication, - - removePrivateFields -}; const PASSKEY_FIELDS = [ 'id', 'userId', 'credentialId', 'publicKey', 'counter', 'transports', 'name', 'creationTime', 'lastUsedTime' ].join(','); @@ -314,3 +299,19 @@ async function verifyAuthentication(user, response) { return { verified: true, passkeyId: passkey.id }; } + +export default { + list, + get, + getByCredentialId, + add, + del, + updateCounter, + + generateRegistrationOptions, + verifyRegistration, + generateAuthenticationOptions, + verifyAuthentication, + + removePrivateFields +}; diff --git a/src/platform.js b/src/platform.js index 11096cc48..9ab8127a4 100644 --- a/src/platform.js +++ b/src/platform.js @@ -1,46 +1,34 @@ import apps from './apps.js'; -import * as appTaskManager from './apptaskmanager.js'; +import appTaskManager from './apptaskmanager.js'; import assert from 'node:assert'; import AuditSource from './auditsource.js'; import backups from './backups.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as cron from './cron.js'; -import * as dashboard from './dashboard.js'; -import * as database from './database.js'; +import cron from './cron.js'; +import dashboard from './dashboard.js'; +import database from './database.js'; import debugModule from 'debug'; -import * as dockerProxy from './dockerproxy.js'; +import dockerProxy from './dockerproxy.js'; import fs from 'node:fs'; import infra from './infra_version.js'; import locks from './locks.js'; -import * as oidcServer from './oidcserver.js'; +import oidcServer from './oidcserver.js'; import paths from './paths.js'; -import * as reverseProxy from './reverseproxy.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; import services from './services.js'; import shellModule from './shell.js'; import tasks from './tasks.js'; import timers from 'timers/promises'; -import * as updater from './updater.js'; -import * as users from './users.js'; -import * as volumes from './volumes.js'; -import * as _ from './underscore.js'; +import updater from './updater.js'; +import users from './users.js'; +import volumes from './volumes.js'; +import _ from './underscore.js'; const debug = debugModule('box:platform'); const shell = shellModule('platform'); -export { - initialize, - uninitialize, - - onActivated, - onDashboardLocationSet, - onDashboardLocationChanged, - onMailServerLocationChanged, - onMailServerIncomingDomainsChanged, - - getStatus -}; const gStatus = { message: 'Initializing', state: 'starting' }; // starting, failed, ready are the states @@ -267,3 +255,16 @@ async function onMailServerIncomingDomainsChanged(auditSource) { const appsUsingEmail = installedApps.filter((a) => !!a.manifest.addons?.email); await safe(apps.configureApps(appsUsingEmail, { scheduleNow: true }, auditSource), { debug }); } + +export default { + initialize, + uninitialize, + + onActivated, + onDashboardLocationSet, + onDashboardLocationChanged, + onMailServerLocationChanged, + onMailServerIncomingDomainsChanged, + + getStatus +}; diff --git a/src/provision.js b/src/provision.js index e02c5a23d..4a8a80d43 100644 --- a/src/provision.js +++ b/src/provision.js @@ -1,40 +1,34 @@ -import * as appstore from './appstore.js'; +import appstore from './appstore.js'; import assert from 'node:assert'; -import * as backupSites from './backupsites.js'; +import backupSites from './backupsites.js'; import backups from './backups.js'; -import * as backuptask from './backuptask.js'; +import backuptask from './backuptask.js'; import BoxError from './boxerror.js'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import constants from './constants.js'; import debugModule from 'debug'; -import * as dns from './dns.js'; -import * as domains from './domains.js'; +import dns from './dns.js'; +import domains from './domains.js'; import eventlog from './eventlog.js'; import fs from 'node:fs'; -import * as mail from './mail.js'; -import * as mailServer from './mailserver.js'; -import * as network from './network.js'; +import mail from './mail.js'; +import mailServer from './mailserver.js'; +import network from './network.js'; import oidcClients from './oidcclients.js'; -import * as openssl from './openssl.js'; -import * as platform from './platform.js'; -import * as reverseProxy from './reverseproxy.js'; +import openssl from './openssl.js'; +import platform from './platform.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; import semver from 'semver'; import paths from './paths.js'; -import * as system from './system.js'; +import system from './system.js'; import tasks from './tasks.js'; -import * as users from './users.js'; +import users from './users.js'; import tld from 'tldjs'; -import * as tokens from './tokens.js'; +import tokens from './tokens.js'; const debug = debugModule('box:provision'); -export { - setup, - restore, - activate, - getStatus, -}; // we cannot use tasks since the tasks table gets overwritten when db is imported const gStatus = { @@ -281,3 +275,10 @@ async function getStatus() { gStatus.provider = await system.getProvider(); // preselect dns provider and ami token return gStatus; } + +export default { + setup, + restore, + activate, + getStatus, +}; diff --git a/src/proxyauth.js b/src/proxyauth.js index 215dff4b6..d75f7b250 100644 --- a/src/proxyauth.js +++ b/src/proxyauth.js @@ -2,7 +2,7 @@ import apps from './apps.js'; import assert from 'node:assert'; import blobs from './blobs.js'; import constants from './constants.js'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; import ejs from 'ejs'; import express from 'express'; @@ -14,21 +14,17 @@ import http from 'node:http'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import jwt from 'jsonwebtoken'; -import * as middleware from './middleware/index.js'; -import * as oidcServer from './oidcserver.js'; +import middleware from './middleware/index.js'; +import oidcServer from './oidcserver.js'; import safe from 'safetydance'; -import * as settings from './settings.js'; -import * as users from './users.js'; +import settings from './settings.js'; +import users from './users.js'; import util from 'node:util'; const debug = debugModule('box:proxyAuth'); // heavily inspired from https://gock.net/blog/2020/nginx-subrequest-authentication-server/ and https://github.com/andygock/auth-server -export { - start, - stop -}; let gHttpServer = null; let gTokenSecret = null; @@ -257,3 +253,8 @@ async function stop() { await util.promisify(gHttpServer.close.bind(gHttpServer))(); gHttpServer = null; } + +export default { + start, + stop +}; diff --git a/src/reverseproxy.js b/src/reverseproxy.js index 2e48f8c0b..ede4ee306 100644 --- a/src/reverseproxy.js +++ b/src/reverseproxy.js @@ -1,62 +1,32 @@ -import * as acme2 from './acme2.js'; +import acme2 from './acme2.js'; import apps from './apps.js'; import assert from 'node:assert'; import blobs from './blobs.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; -import * as dns from './dns.js'; -import * as docker from './docker.js'; -import * as domains from './domains.js'; +import dns from './dns.js'; +import docker from './docker.js'; +import domains from './domains.js'; import ejs from 'ejs'; import eventlog from './eventlog.js'; -import * as ipaddr from './ipaddr.js'; +import ipaddr from './ipaddr.js'; import fs from 'node:fs'; import Location from './location.js'; -import * as mailServer from './mailserver.js'; -import * as network from './network.js'; -import * as openssl from './openssl.js'; +import mailServer from './mailserver.js'; +import network from './network.js'; +import openssl from './openssl.js'; import path from 'node:path'; import paths from './paths.js'; import safe from 'safetydance'; -import * as settings from './settings.js'; +import settings from './settings.js'; import shellModule from './shell.js'; import tasks from './tasks.js'; const debug = debugModule('box:reverseproxy'); const shell = shellModule('reverseproxy'); -export { - setUserCertificate, // per location certificate - setFallbackCertificate, // per domain certificate - - getMailCertificate, - getDirectoryServerCertificate, - - ensureCertificate, - - startRenewCerts, - checkCerts, - - // the 'configure' functions ensure a certificate and generate nginx config - configureApp, - unconfigureApp, - - // these only generate nginx config - writeDefaultConfig, - writeDashboardConfig, - writeAppConfigs, - - removeDashboardConfig, - removeAppConfigs, - restoreFallbackCertificates, - - handleCertificateProviderChanged, - - getTrustedIps, - setTrustedIps -}; const NGINX_APPCONFIG_EJS = fs.readFileSync(import.meta.dirname + '/nginxconfig.ejs', { encoding: 'utf8' }); const RESTART_SERVICE_CMD = path.join(import.meta.dirname, 'scripts/restartservice.sh'); @@ -742,3 +712,34 @@ async function setTrustedIps(trustedIps) { if (!safe.fs.writeFileSync(paths.NGINX_TRUSTED_IPS_FILE, trustedIpsConfig, 'utf8')) throw new BoxError(BoxError.FS_ERROR, safe.error.message); await reload(); } + +export default { + setUserCertificate, // per location certificate + setFallbackCertificate, // per domain certificate + + getMailCertificate, + getDirectoryServerCertificate, + + ensureCertificate, + + startRenewCerts, + checkCerts, + + // the 'configure' functions ensure a certificate and generate nginx config + configureApp, + unconfigureApp, + + // these only generate nginx config + writeDefaultConfig, + writeDashboardConfig, + writeAppConfigs, + + removeDashboardConfig, + removeAppConfigs, + restoreFallbackCertificates, + + handleCertificateProviderChanged, + + getTrustedIps, + setTrustedIps +}; diff --git a/src/routes/accesscontrol.js b/src/routes/accesscontrol.js index a95c65a30..a6ad9a9d3 100644 --- a/src/routes/accesscontrol.js +++ b/src/routes/accesscontrol.js @@ -4,18 +4,11 @@ import BoxError from '../boxerror.js'; import debugModule from 'debug'; import { HttpError } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -import * as tokens from '../tokens.js'; -import * as users from '../users.js'; +import tokens from '../tokens.js'; +import users from '../users.js'; const debug = debugModule('box:routes/accesscontrol'); -export { - passwordAuth, - tokenAuth, - - authorize, - authorizeOperator, -}; async function passwordAuth(req, res, next) { assert.strictEqual(typeof req.body, 'object'); @@ -102,3 +95,11 @@ async function authorizeOperator(req, res, next) { return next(new HttpError(403, 'user is not an operator')); } + +export default { + passwordAuth, + tokenAuth, + + authorize, + authorizeOperator, +}; diff --git a/src/routes/applinks.js b/src/routes/applinks.js index a5752003f..bbd65130a 100644 --- a/src/routes/applinks.js +++ b/src/routes/applinks.js @@ -1,20 +1,10 @@ import assert from 'node:assert'; -import * as applinks from '../applinks.js'; +import applinks from '../applinks.js'; import BoxError from '../boxerror.js'; import safe from 'safetydance'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -export { - listByUser, - add, - get, - update, - del, - getIcon, - - load -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.id, 'string'); @@ -96,3 +86,14 @@ async function getIcon(req, res) { res.send(req.resources.applink.icon); } + +export default { + listByUser, + add, + get, + update, + del, + getIcon, + + load +}; diff --git a/src/routes/apppasswords.js b/src/routes/apppasswords.js index 7ca64132b..d3367b5d7 100644 --- a/src/routes/apppasswords.js +++ b/src/routes/apppasswords.js @@ -1,16 +1,10 @@ -import * as appPasswords from '../apppasswords.js'; +import appPasswords from '../apppasswords.js'; import assert from 'node:assert'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - list, - get, - del, - add -}; async function get(req, res, next) { assert.strictEqual(typeof req.user, 'object'); @@ -56,3 +50,10 @@ async function del(req, res, next) { next(new HttpSuccess(204, {})); } + +export default { + list, + get, + del, + add +}; diff --git a/src/routes/apps.js b/src/routes/apps.js index fde660db2..e3478546b 100644 --- a/src/routes/apps.js +++ b/src/routes/apps.js @@ -1,93 +1,22 @@ import apps from '../apps.js'; -import * as appstore from '../appstore.js'; +import appstore from '../appstore.js'; import assert from 'node:assert'; import AuditSource from '../auditsource.js'; -import * as backupSites from '../backupsites.js'; +import backupSites from '../backupsites.js'; import BoxError from '../boxerror.js'; -import * as community from '../community.js'; +import community from '../community.js'; import constants from '../constants.js'; import debugModule from 'debug'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as metrics from '../metrics.js'; +import metrics from '../metrics.js'; import safe from 'safetydance'; -import * as updater from '../updater.js'; -import * as users from '../users.js'; +import updater from '../updater.js'; +import users from '../users.js'; import WebSocket from 'ws'; const debug = debugModule('box:routes/apps'); -export { - getApp, - listByUser, - getAppIcon, - install, - uninstall, - archive, - restore, - importApp, - exportApp, - backup, - update, - getTask, - getLogs, - getLogStream, - listEventlog, - listBackups, - listBackupSites, - repair, - - setAccessRestriction, - setOperators, - setCrontab, - setLabel, - setTags, - setNotes, - setIcon, - setTurn, - setRedis, - setMemoryLimit, - setCpuQuota, - setAutomaticBackup, - setAutomaticUpdate, - setReverseProxyConfig, - setCertificate, - setDebugMode, - setEnvironment, - setMailbox, - setInbox, - setLocation, - setStorage, - setMounts, - setDevices, - setUpstreamUri, - - setChecklistItem, - - stop, - start, - restart, - - createExec, - startExec, - startExecWebSocket, - getExec, - - checkUpdate, - - clone, - - downloadFile, - uploadFile, - - updateBackup, - downloadBackup, - - getMetrics, - getMetricStream, - - load -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.id, 'string'); @@ -1140,3 +1069,75 @@ async function getMetricStream(req, res, next) { metricStream.on('end', res.end.bind(res)); metricStream.on('error', res.end.bind(res, null)); } + +export default { + getApp, + listByUser, + getAppIcon, + install, + uninstall, + archive, + restore, + importApp, + exportApp, + backup, + update, + getTask, + getLogs, + getLogStream, + listEventlog, + listBackups, + listBackupSites, + repair, + + setAccessRestriction, + setOperators, + setCrontab, + setLabel, + setTags, + setNotes, + setIcon, + setTurn, + setRedis, + setMemoryLimit, + setCpuQuota, + setAutomaticBackup, + setAutomaticUpdate, + setReverseProxyConfig, + setCertificate, + setDebugMode, + setEnvironment, + setMailbox, + setInbox, + setLocation, + setStorage, + setMounts, + setDevices, + setUpstreamUri, + + setChecklistItem, + + stop, + start, + restart, + + createExec, + startExec, + startExecWebSocket, + getExec, + + checkUpdate, + + clone, + + downloadFile, + uploadFile, + + updateBackup, + downloadBackup, + + getMetrics, + getMetricStream, + + load +}; diff --git a/src/routes/appstore.js b/src/routes/appstore.js index a8db86b5e..9a5e1edc0 100644 --- a/src/routes/appstore.js +++ b/src/routes/appstore.js @@ -1,19 +1,11 @@ -import * as appstore from '../appstore.js'; +import appstore from '../appstore.js'; import assert from 'node:assert'; import BoxError from '../boxerror.js'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -import * as users from '../users.js'; -import * as _ from '../underscore.js'; +import users from '../users.js'; +import _ from '../underscore.js'; -export { - getApps, - getApp, - getAppVersion, - - unlinkAccount, - getSubscription -}; async function getApps(req, res, next) { const [error, apps] = await safe(appstore.getApps()); @@ -58,3 +50,12 @@ async function getSubscription(req, res, next) { if (users.compareRoles(req.user.role, users.ROLE_OWNER) < 0) next(new HttpSuccess(200, _.pick(result, ['plan', 'status']))); else next(new HttpSuccess(200, result)); // { email, cloudronId, cloudronCreatedAt, plan, current_period_end, canceled_at, cancel_at, status, features } } + +export default { + getApps, + getApp, + getAppVersion, + + unlinkAccount, + getSubscription +}; diff --git a/src/routes/archives.js b/src/routes/archives.js index 40933ecb1..747547936 100644 --- a/src/routes/archives.js +++ b/src/routes/archives.js @@ -1,21 +1,12 @@ import apps from '../apps.js'; import assert from 'node:assert'; -import * as archives from '../archives.js'; +import archives from '../archives.js'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - load, - - list, - get, - getIcon, - del, - unarchive -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.id, 'string'); @@ -94,3 +85,13 @@ async function unarchive(req, res, next) { next(new HttpSuccess(202, { id: result.id, taskId: result.taskId })); } + +export default { + load, + + list, + get, + getIcon, + del, + unarchive +}; diff --git a/src/routes/auth.js b/src/routes/auth.js index ef674eea4..56cd2839c 100644 --- a/src/routes/auth.js +++ b/src/routes/auth.js @@ -9,18 +9,11 @@ import { HttpSuccess } from '@cloudron/connect-lastmile'; import oidcClients from '../oidcclients.js'; import safe from 'safetydance'; import speakeasy from 'speakeasy'; -import * as tokens from '../tokens.js'; -import * as users from '../users.js'; +import tokens from '../tokens.js'; +import users from '../users.js'; const debug = debugModule('box:routes/cloudron'); -export { - login, - logout, - passwordResetRequest, - passwordReset, - setupAccount, -}; async function login(req, res, next) { assert.strictEqual(typeof req.user, 'object'); @@ -113,3 +106,11 @@ async function setupAccount(req, res, next) { next(new HttpSuccess(201, { accessToken })); } + +export default { + login, + logout, + passwordResetRequest, + passwordReset, + setupAccount, +}; diff --git a/src/routes/backups.js b/src/routes/backups.js index e89835e48..a9f46c451 100644 --- a/src/routes/backups.js +++ b/src/routes/backups.js @@ -6,16 +6,6 @@ import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - load, - - list, - get, - update, - - startIntegrityCheck, - stopIntegrityCheck -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.id, 'string'); @@ -78,3 +68,14 @@ async function stopIntegrityCheck(req, res, next) { next(new HttpSuccess(204, {})); } + +export default { + load, + + list, + get, + update, + + startIntegrityCheck, + stopIntegrityCheck +}; diff --git a/src/routes/backupsites.js b/src/routes/backupsites.js index 86cc5508c..85241147e 100644 --- a/src/routes/backupsites.js +++ b/src/routes/backupsites.js @@ -1,36 +1,12 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import backups from '../backups.js'; -import * as backupSites from '../backupsites.js'; +import backupSites from '../backupsites.js'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - load, - - list, - get, - add, - del, - - // separate update routes to skip (slow) storage validation - setConfig, - setLimits, - setSchedule, - setRetention, - setEnabledForUpdates, - setName, - setContents, - setEncryption, - - listBackups, - createBackup, - cleanup, - remount, - getStatus, -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.id, 'string'); @@ -268,3 +244,28 @@ async function listBackups(req, res, next) { if (error) return next(BoxError.toHttpError(error)); next(new HttpSuccess(200, { backups: results })); } + +export default { + load, + + list, + get, + add, + del, + + // separate update routes to skip (slow) storage validation + setConfig, + setLimits, + setSchedule, + setRetention, + setEnabledForUpdates, + setName, + setContents, + setEncryption, + + listBackups, + createBackup, + cleanup, + remount, + getStatus, +}; diff --git a/src/routes/branding.js b/src/routes/branding.js index a1132ffc1..8f744ace3 100644 --- a/src/routes/branding.js +++ b/src/routes/branding.js @@ -1,22 +1,11 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as branding from '../branding.js'; +import branding from '../branding.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - getCloudronName, - setCloudronName, - getCloudronAvatar, - setCloudronAvatar, - getCloudronBackground, - setCloudronBackground, - unsetCloudronBackground, - getFooter, - setFooter, -}; async function getFooter(req, res, next) { const [error, footer] = await safe(branding.getFooter()); @@ -112,3 +101,15 @@ async function getCloudronBackground(req, res, next) { res.set('Content-Type', 'image/webp'); res.status(200).send(background); } + +export default { + getCloudronName, + setCloudronName, + getCloudronAvatar, + setCloudronAvatar, + getCloudronBackground, + setCloudronBackground, + unsetCloudronBackground, + getFooter, + setFooter, +}; diff --git a/src/routes/cloudron.js b/src/routes/cloudron.js index 4288c006b..fddee3278 100644 --- a/src/routes/cloudron.js +++ b/src/routes/cloudron.js @@ -1,21 +1,11 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; -import * as cloudron from '../cloudron.js'; +import cloudron from '../cloudron.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -import * as translations from '../translations.js'; +import translations from '../translations.js'; -export { - getStatus, - - listLanguages, - getLanguage, - setLanguage, - - getTimeZone, - setTimeZone -}; async function getStatus(req, res, next) { const [error, status] = await safe(cloudron.getStatus()); @@ -66,3 +56,14 @@ async function setLanguage(req, res, next) { next(new HttpSuccess(200, {})); } + +export default { + getStatus, + + listLanguages, + getLanguage, + setLanguage, + + getTimeZone, + setTimeZone +}; diff --git a/src/routes/community.js b/src/routes/community.js index b126f1465..437922eb1 100644 --- a/src/routes/community.js +++ b/src/routes/community.js @@ -1,12 +1,9 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; -import * as community from '../community.js'; +import community from '../community.js'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - getAppVersion -}; async function getAppVersion(req, res, next) { assert.strictEqual(typeof req.query.url, 'string'); @@ -17,3 +14,7 @@ async function getAppVersion(req, res, next) { next(new HttpSuccess(200, result)); // { manifest, publishState, creationDate, ts } } + +export default { + getAppVersion +}; diff --git a/src/routes/dashboard.js b/src/routes/dashboard.js index 3712ff560..9069e644c 100644 --- a/src/routes/dashboard.js +++ b/src/routes/dashboard.js @@ -1,8 +1,8 @@ import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as branding from '../branding.js'; +import branding from '../branding.js'; import constants from '../constants.js'; -import * as dashboard from '../dashboard.js'; +import dashboard from '../dashboard.js'; import ejs from 'ejs'; import fs from 'node:fs'; import { HttpError } from '@cloudron/connect-lastmile'; @@ -10,24 +10,8 @@ import { HttpSuccess } from '@cloudron/connect-lastmile'; import path from 'node:path'; import paths from '../paths.js'; import safe from 'safetydance'; -import * as settings from '../settings.js'; +import settings from '../settings.js'; -export { - getConfig, - - startPrepareLocation, - changeLocation, - - renderIndex, - renderFilemanager, - renderLogs, - renderTerminal, - renderPasswordreset, - renderSetupaccount, - renderSetup, - renderRestore, - renderActivation, -}; async function getConfig(req, res, next) { const [error, cloudronConfig] = await safe(dashboard.getConfig()); @@ -115,3 +99,20 @@ async function renderRestore(req, res) { async function renderActivation(req, res) { res.send(ejs.render(TEMPLATE_ACTIVATION, {})); } + +export default { + getConfig, + + startPrepareLocation, + changeLocation, + + renderIndex, + renderFilemanager, + renderLogs, + renderTerminal, + renderPasswordreset, + renderSetupaccount, + renderSetup, + renderRestore, + renderActivation, +}; diff --git a/src/routes/directoryserver.js b/src/routes/directoryserver.js index 3ab9386ff..9cc0e36ee 100644 --- a/src/routes/directoryserver.js +++ b/src/routes/directoryserver.js @@ -1,15 +1,11 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as directoryServer from '../directoryserver.js'; +import directoryServer from '../directoryserver.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - getConfig, - setConfig, -}; async function getConfig(req, res, next) { const [error, config] = await safe(directoryServer.getConfig()); @@ -32,3 +28,8 @@ async function setConfig(req, res, next) { next(new HttpSuccess(200, {})); } + +export default { + getConfig, + setConfig, +}; diff --git a/src/routes/dockerregistries.js b/src/routes/dockerregistries.js index 02bd7e072..49f7412dc 100644 --- a/src/routes/dockerregistries.js +++ b/src/routes/dockerregistries.js @@ -1,19 +1,11 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as dockerRegistries from '../dockerregistries.js'; +import dockerRegistries from '../dockerregistries.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - list, - add, - get, - del, - update, - load -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.id, 'string'); @@ -82,3 +74,12 @@ async function del(req, res, next) { next(new HttpSuccess(204)); } + +export default { + list, + add, + get, + del, + update, + load +}; diff --git a/src/routes/domains.js b/src/routes/domains.js index 0599ed2a5..4a32d0cb2 100644 --- a/src/routes/domains.js +++ b/src/routes/domains.js @@ -1,23 +1,12 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as dns from '../dns.js'; -import * as domains from '../domains.js'; +import dns from '../dns.js'; +import domains from '../domains.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - add, - get, - list, - setConfig, - setWellKnown, - del, - - checkDnsRecords, - syncDnsRecords, -}; async function add(req, res, next) { assert.strictEqual(typeof req.body, 'object'); @@ -171,3 +160,15 @@ async function syncDnsRecords(req, res, next) { next(new HttpSuccess(201, { taskId })); } + +export default { + add, + get, + list, + setConfig, + setWellKnown, + del, + + checkDnsRecords, + syncDnsRecords, +}; diff --git a/src/routes/eventlog.js b/src/routes/eventlog.js index 1801f805f..e326c61a5 100644 --- a/src/routes/eventlog.js +++ b/src/routes/eventlog.js @@ -4,10 +4,6 @@ import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - get, - list -}; async function get(req, res, next) { const [error, event] = await safe(eventlog.get(req.params.eventId)); @@ -36,3 +32,8 @@ async function list(req, res, next) { next(new HttpSuccess(200, { eventlogs })); } + +export default { + get, + list +}; diff --git a/src/routes/externalldap.js b/src/routes/externalldap.js index 35f0ecc10..4b5858c9b 100644 --- a/src/routes/externalldap.js +++ b/src/routes/externalldap.js @@ -1,16 +1,11 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as externalLdap from '../externalldap.js'; +import externalLdap from '../externalldap.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - getConfig, - setConfig, - sync -}; async function sync(req, res, next) { const [error, taskId] = await safe(externalLdap.startSyncer()); @@ -45,3 +40,9 @@ async function setConfig(req, res, next) { next(new HttpSuccess(200, {})); } + +export default { + getConfig, + setConfig, + sync +}; diff --git a/src/routes/filemanager.js b/src/routes/filemanager.js index 2634208dc..faf1548e5 100644 --- a/src/routes/filemanager.js +++ b/src/routes/filemanager.js @@ -5,9 +5,6 @@ import { HttpError } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; import services from '../services.js'; -export { - proxy, -}; function proxy(kind) { assert(kind === 'mail' || kind === 'volume' || kind === 'app'); @@ -53,3 +50,7 @@ function proxy(kind) { } }; } + +export default { + proxy, +}; diff --git a/src/routes/groups.js b/src/routes/groups.js index b9f66e5e9..980dac3bf 100644 --- a/src/routes/groups.js +++ b/src/routes/groups.js @@ -1,22 +1,11 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as groups from '../groups.js'; +import groups from '../groups.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - load, - - get, - list, - add, - setName, - del, - setMembers, - setAllowedApps -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.groupId, 'string'); @@ -99,3 +88,15 @@ async function del(req, res, next) { next(new HttpSuccess(204)); } + +export default { + load, + + get, + list, + add, + setName, + del, + setMembers, + setAllowedApps +}; diff --git a/src/routes/index.js b/src/routes/index.js index 71724e82c..74c978f30 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,42 +1,42 @@ -import * as accesscontrol from './accesscontrol.js'; -import * as appPasswords from './apppasswords.js'; -import * as apps from './apps.js'; -import * as applinks from './applinks.js'; -import * as appstore from './appstore.js'; -import * as archives from './archives.js'; -import * as auth from './auth.js'; -import * as backups from './backups.js'; -import * as backupSites from './backupsites.js'; -import * as branding from './branding.js'; -import * as cloudron from './cloudron.js'; -import * as community from './community.js'; -import * as dashboard from './dashboard.js'; -import * as directoryServer from './directoryserver.js'; -import * as dockerRegistries from './dockerregistries.js'; -import * as domains from './domains.js'; -import * as eventlog from './eventlog.js'; -import * as externalLdap from './externalldap.js'; -import * as filemanager from './filemanager.js'; -import * as groups from './groups.js'; -import * as mail from './mail.js'; -import * as mailserver from './mailserver.js'; -import * as network from './network.js'; -import * as notifications from './notifications.js'; -import * as oidcClients from './oidcclients.js'; -import * as profile from './profile.js'; -import * as provision from './provision.js'; -import * as reverseProxy from './reverseproxy.js'; -import * as services from './services.js'; -import * as system from './system.js'; -import * as tasks from './tasks.js'; -import * as tokens from './tokens.js'; -import * as updater from './updater.js'; -import * as userDirectory from './user-directory.js'; -import * as users from './users.js'; -import * as volumes from './volumes.js'; -import * as wellknown from './wellknown.js'; +import accesscontrol from './accesscontrol.js'; +import appPasswords from './apppasswords.js'; +import apps from './apps.js'; +import applinks from './applinks.js'; +import appstore from './appstore.js'; +import archives from './archives.js'; +import auth from './auth.js'; +import backups from './backups.js'; +import backupSites from './backupsites.js'; +import branding from './branding.js'; +import cloudron from './cloudron.js'; +import community from './community.js'; +import dashboard from './dashboard.js'; +import directoryServer from './directoryserver.js'; +import dockerRegistries from './dockerregistries.js'; +import domains from './domains.js'; +import eventlog from './eventlog.js'; +import externalLdap from './externalldap.js'; +import filemanager from './filemanager.js'; +import groups from './groups.js'; +import mail from './mail.js'; +import mailserver from './mailserver.js'; +import network from './network.js'; +import notifications from './notifications.js'; +import oidcClients from './oidcclients.js'; +import profile from './profile.js'; +import provision from './provision.js'; +import reverseProxy from './reverseproxy.js'; +import services from './services.js'; +import system from './system.js'; +import tasks from './tasks.js'; +import tokens from './tokens.js'; +import updater from './updater.js'; +import userDirectory from './user-directory.js'; +import users from './users.js'; +import volumes from './volumes.js'; +import wellknown from './wellknown.js'; -export { +export default { accesscontrol, appPasswords, apps, diff --git a/src/routes/mail.js b/src/routes/mail.js index 649d53cc1..572e6866e 100644 --- a/src/routes/mail.js +++ b/src/routes/mail.js @@ -1,42 +1,11 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as mail from '../mail.js'; +import mail from '../mail.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - getDomain, - listDomains, - - getStatus, - - setMailFromValidation, - setCatchAllAddress, - setMailRelay, - setMailEnabled, - setBanner, - - sendTestMail, - - listMailboxesByDomain, - getMailbox, - addMailbox, - updateMailbox, - delMailbox, - - getAliases, - setAliases, - - listMailingListsByDomain, - getMailingList, - addMailingList, - updateMailingList, - delMailingList, - - getStats -}; async function getDomain(req, res, next) { assert.strictEqual(typeof req.params.domain, 'string'); @@ -344,3 +313,35 @@ async function delMailingList(req, res, next) { next(new HttpSuccess(204)); } + +export default { + getDomain, + listDomains, + + getStatus, + + setMailFromValidation, + setCatchAllAddress, + setMailRelay, + setMailEnabled, + setBanner, + + sendTestMail, + + listMailboxesByDomain, + getMailbox, + addMailbox, + updateMailbox, + delMailbox, + + getAliases, + setAliases, + + listMailingListsByDomain, + getMailingList, + addMailingList, + updateMailingList, + delMailingList, + + getStats +}; diff --git a/src/routes/mailserver.js b/src/routes/mailserver.js index 12bc7c0cd..24eaa9ade 100644 --- a/src/routes/mailserver.js +++ b/src/routes/mailserver.js @@ -5,20 +5,12 @@ import debugModule from 'debug'; import http from 'node:http'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as mailServer from '../mailserver.js'; +import mailServer from '../mailserver.js'; import safe from 'safetydance'; import services from '../services.js'; const debug = debugModule('box:routes/mailserver'); -export { - proxy, - proxyAndRestart, - queueProxy, - - setLocation, - getLocation -}; async function proxyToMailContainer(port, pathname, req, res, next) { req.clearTimeout(); @@ -95,3 +87,12 @@ async function setLocation(req, res, next) { next(new HttpSuccess(202, { taskId })); } + +export default { + proxy, + proxyAndRestart, + queueProxy, + + setLocation, + getLocation +}; diff --git a/src/routes/network.js b/src/routes/network.js index fd29e1eb5..90a684ae7 100644 --- a/src/routes/network.js +++ b/src/routes/network.js @@ -3,25 +3,9 @@ import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as network from '../network.js'; +import network from '../network.js'; import safe from 'safetydance'; -export { - getBlocklist, - setBlocklist, - - getDynamicDns, - setDynamicDns, - - getIPv4Config, - setIPv4Config, - - getIPv6Config, - setIPv6Config, - - getIPv4, - getIPv6, -}; async function getBlocklist(req, res, next) { const [error, blocklist] = await safe(network.getBlocklist()); @@ -111,3 +95,20 @@ async function getIPv6(req, res, next) { next(new HttpSuccess(200, { ip })); } + +export default { + getBlocklist, + setBlocklist, + + getDynamicDns, + setDynamicDns, + + getIPv4Config, + setIPv4Config, + + getIPv6Config, + setIPv6Config, + + getIPv4, + getIPv6, +}; diff --git a/src/routes/notifications.js b/src/routes/notifications.js index 26eec0f10..0e7f7d7cc 100644 --- a/src/routes/notifications.js +++ b/src/routes/notifications.js @@ -2,15 +2,9 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as notifications from '../notifications.js'; +import notifications from '../notifications.js'; import safe from 'safetydance'; -export { - load, - get, - list, - update -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.notificationId, 'string'); @@ -57,3 +51,10 @@ async function update(req, res, next) { if (error) return next(BoxError.toHttpError(error)); next(new HttpSuccess(204, {})); } + +export default { + load, + get, + list, + update +}; diff --git a/src/routes/oidcclients.js b/src/routes/oidcclients.js index c8076512d..5378ce2c5 100644 --- a/src/routes/oidcclients.js +++ b/src/routes/oidcclients.js @@ -5,14 +5,6 @@ import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - load, - add, - list, - get, - update, - del, -}; async function add(req, res, next) { assert.strictEqual(typeof req.body, 'object'); @@ -97,3 +89,12 @@ async function del(req, res, next) { next(new HttpSuccess(204)); } + +export default { + load, + add, + list, + get, + update, + del, +}; diff --git a/src/routes/profile.js b/src/routes/profile.js index a5af7c800..c61e661d7 100644 --- a/src/routes/profile.js +++ b/src/routes/profile.js @@ -3,38 +3,14 @@ import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as oidcServer from '../oidcserver.js'; -import * as passkeys from '../passkeys.js'; +import oidcServer from '../oidcserver.js'; +import passkeys from '../passkeys.js'; import safe from 'safetydance'; -import * as tokens from '../tokens.js'; -import * as userDirectory from '../user-directory.js'; -import * as users from '../users.js'; -import * as settings from '../settings.js'; +import tokens from '../tokens.js'; +import userDirectory from '../user-directory.js'; +import users from '../users.js'; +import settings from '../settings.js'; -export { - canEditProfile, - get, - setDisplayName, - setEmail, - setFallbackEmail, - getAvatarById, - setAvatar, - unsetAvatar, - setLanguage, - getBackgroundImage, - setBackgroundImage, - unsetBackgroundImage, - setPassword, - setTwoFactorAuthenticationSecret, - enableTwoFactorAuthentication, - disableTwoFactorAuthentication, - setNotificationConfig, - destroyUserSession, - getPasskey, - getPasskeyRegistrationOptions, - registerPasskey, - deletePasskey -}; async function canEditProfile(req, res, next) { assert.strictEqual(typeof req.user, 'object'); @@ -305,3 +281,28 @@ async function deletePasskey(req, res, next) { next(new HttpSuccess(204)); } + +export default { + canEditProfile, + get, + setDisplayName, + setEmail, + setFallbackEmail, + getAvatarById, + setAvatar, + unsetAvatar, + setLanguage, + getBackgroundImage, + setBackgroundImage, + unsetBackgroundImage, + setPassword, + setTwoFactorAuthenticationSecret, + enableTwoFactorAuthentication, + disableTwoFactorAuthentication, + setNotificationConfig, + destroyUserSession, + getPasskey, + getPasskeyRegistrationOptions, + registerPasskey, + deletePasskey +}; diff --git a/src/routes/provision.js b/src/routes/provision.js index 4fa6e5e64..29c4c2dba 100644 --- a/src/routes/provision.js +++ b/src/routes/provision.js @@ -3,23 +3,13 @@ import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as network from '../network.js'; -import * as provision from '../provision.js'; +import network from '../network.js'; +import provision from '../provision.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; -import * as system from '../system.js'; -import * as users from '../users.js'; +import system from '../system.js'; +import users from '../users.js'; -export { - providerTokenAuth, - verifyUnprovisioned, - setup, - activate, - restore, - getStatus, - getBlockDevices, - detectIP -}; async function verifyUnprovisioned(req, res, next) { const activated = await users.isActivated(); @@ -151,3 +141,14 @@ async function detectIP(req, res, next) { const result = await network.detectIP(); next(new HttpSuccess(200, { ipv4: result.ipv4, ipv6: result.ipv6 })); } + +export default { + providerTokenAuth, + verifyUnprovisioned, + setup, + activate, + restore, + getStatus, + getBlockDevices, + detectIP +}; diff --git a/src/routes/reverseproxy.js b/src/routes/reverseproxy.js index acef8feb1..3fc686d8a 100644 --- a/src/routes/reverseproxy.js +++ b/src/routes/reverseproxy.js @@ -3,15 +3,9 @@ import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as reverseProxy from '../reverseproxy.js'; +import reverseProxy from '../reverseproxy.js'; import safe from 'safetydance'; -export { - getTrustedIps, - setTrustedIps, - - renewCerts, -}; async function getTrustedIps(req, res, next) { const [error, trustedIps] = await safe(reverseProxy.getTrustedIps()); @@ -40,3 +34,10 @@ async function renewCerts(req, res, next) { next(new HttpSuccess(202, { taskId })); } + +export default { + getTrustedIps, + setTrustedIps, + + renewCerts, +}; diff --git a/src/routes/services.js b/src/routes/services.js index e81d21377..ccdb9d486 100644 --- a/src/routes/services.js +++ b/src/routes/services.js @@ -3,22 +3,11 @@ import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as metrics from '../metrics.js'; -import * as platform from '../platform.js'; +import metrics from '../metrics.js'; +import platform from '../platform.js'; import safe from 'safetydance'; import services from '../services.js'; -export { - list, - get, - configure, - getLogs, - getLogStream, - restart, - rebuild, - getMetrics, - getPlatformStatus -}; async function list(req, res, next) { const [error, result] = await safe(services.listServices()); @@ -153,3 +142,15 @@ async function getMetrics(req, res, next) { async function getPlatformStatus(req, res, next) { next(new HttpSuccess(200, platform.getStatus())); } + +export default { + list, + get, + configure, + getLogs, + getLogStream, + restart, + rebuild, + getMetrics, + getPlatformStatus +}; diff --git a/src/routes/system.js b/src/routes/system.js index aa02920f9..5a61634aa 100644 --- a/src/routes/system.js +++ b/src/routes/system.js @@ -2,23 +2,10 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; -import * as metrics from '../metrics.js'; +import metrics from '../metrics.js'; import safe from 'safetydance'; -import * as system from '../system.js'; +import system from '../system.js'; -export { - reboot, - getInfo, - getMemory, - getLogs, - getLogStream, - getMetrics, - getMetricStream, - getBlockDevices, - getFilesystems, - getFilesystemUsage, - getCpus, -}; async function reboot(req, res, next) { // Finish the request, to let the appstore know we triggered the reboot @@ -197,3 +184,17 @@ async function getFilesystemUsage(req, res, next) { task.start(); // background } + +export default { + reboot, + getInfo, + getMemory, + getLogs, + getLogStream, + getMetrics, + getMetricStream, + getBlockDevices, + getFilesystems, + getFilesystemUsage, + getCpus, +}; diff --git a/src/routes/tasks.js b/src/routes/tasks.js index 2be50e5d3..3e05950dd 100644 --- a/src/routes/tasks.js +++ b/src/routes/tasks.js @@ -5,16 +5,6 @@ import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; import tasks from '../tasks.js'; -export { - load, - get, - list, - - stopTask, - - getLogs, - getLogStream -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.taskId, 'string'); @@ -119,3 +109,14 @@ async function getLogStream(req, res, next) { logStream.on('end', res.end.bind(res)); logStream.on('error', res.end.bind(res, null)); } + +export default { + load, + get, + list, + + stopTask, + + getLogs, + getLogStream +}; diff --git a/src/routes/test/api-test.js b/src/routes/test/api-test.js index 3c1c67427..eb04c48c2 100644 --- a/src/routes/test/api-test.js +++ b/src/routes/test/api-test.js @@ -4,7 +4,7 @@ import common from './common.js'; import expect from 'expect.js'; import superagent from '@cloudron/superagent'; import timers from 'timers/promises'; -import * as tokens from '../../tokens.js'; +import tokens from '../../tokens.js'; /* global it:false */ /* global describe:false */ diff --git a/src/routes/test/applinks-test.js b/src/routes/test/applinks-test.js index 74c61585b..8a8a86c59 100644 --- a/src/routes/test/applinks-test.js +++ b/src/routes/test/applinks-test.js @@ -1,6 +1,6 @@ /* global it:false */ -import * as applinks from '../../applinks.js'; +import applinks from '../../applinks.js'; import common from './common.js'; import expect from 'expect.js'; import superagent from '@cloudron/superagent'; diff --git a/src/routes/test/apps-test.js b/src/routes/test/apps-test.js index 00d3c5354..72b49cb32 100644 --- a/src/routes/test/apps-test.js +++ b/src/routes/test/apps-test.js @@ -5,23 +5,23 @@ import async from 'async'; import child_process from 'node:child_process'; import constants from '../../constants.js'; import crypto from 'node:crypto'; -import * as database from '../../database.js'; +import database from '../../database.js'; import Docker from 'dockerode'; import expect from 'expect.js'; import fs from 'node:fs'; import hat from '../../hat.js'; import http from 'node:http'; -import * as ldapServer from '../../ldapserver.js'; +import ldapServer from '../../ldapserver.js'; import net from 'node:net'; import nock from 'nock'; import path from 'node:path'; import paths from '../../paths.js'; -import * as platform from '../../platform.js'; +import platform from '../../platform.js'; import safe from 'safetydance'; -import * as server from '../../server.js'; -import * as settings from '../../settings.js'; +import server from '../../server.js'; +import settings from '../../settings.js'; import superagent from '@cloudron/superagent'; -import * as tokens from '../../tokens.js'; +import tokens from '../../tokens.js'; import url from 'node:url'; /* global describe:false */ diff --git a/src/routes/test/appstore-test.js b/src/routes/test/appstore-test.js index 93584c1ec..58de7bb8a 100644 --- a/src/routes/test/appstore-test.js +++ b/src/routes/test/appstore-test.js @@ -1,11 +1,11 @@ /* global it:false */ -import * as appstore from '../../appstore.js'; +import appstore from '../../appstore.js'; import common from './common.js'; import constants from '../../constants.js'; import expect from 'expect.js'; import nock from 'nock'; -import * as settings from '../../settings.js'; +import settings from '../../settings.js'; import superagent from '@cloudron/superagent'; /* global describe:false */ diff --git a/src/routes/test/archives-test.js b/src/routes/test/archives-test.js index 4f1566dc4..d8dd4a893 100644 --- a/src/routes/test/archives-test.js +++ b/src/routes/test/archives-test.js @@ -1,6 +1,6 @@ /* global it:false */ -import * as archives from '../../archives.js'; +import archives from '../../archives.js'; import backups from '../../backups.js'; import common from './common.js'; import expect from 'expect.js'; diff --git a/src/routes/test/backupsites-test.js b/src/routes/test/backupsites-test.js index 5b90e1246..22cc448ca 100644 --- a/src/routes/test/backupsites-test.js +++ b/src/routes/test/backupsites-test.js @@ -1,6 +1,6 @@ /* global it, describe, before, after */ -import * as backupSites from '../../backupsites.js'; +import backupSites from '../../backupsites.js'; import common from './common.js'; import expect from 'expect.js'; import superagent from '@cloudron/superagent'; diff --git a/src/routes/test/common.js b/src/routes/test/common.js index 52c47a3c7..11e7aeec8 100644 --- a/src/routes/test/common.js +++ b/src/routes/test/common.js @@ -1,20 +1,20 @@ import apps from '../../apps.js'; -import * as appstore from '../../appstore.js'; -import * as backupSites from '../../backupsites.js'; +import appstore from '../../appstore.js'; +import backupSites from '../../backupsites.js'; import debugModule from 'debug'; import constants from '../../constants.js'; -import * as database from '../../database.js'; +import database from '../../database.js'; import expect from 'expect.js'; -import * as mailer from '../../mailer.js'; +import mailer from '../../mailer.js'; import nock from 'nock'; import oidcClients from '../../oidcclients.js'; -import * as oidcServer from '../../oidcserver.js'; -import * as server from '../../server.js'; -import * as settings from '../../settings.js'; +import oidcServer from '../../oidcserver.js'; +import server from '../../server.js'; +import settings from '../../settings.js'; import superagent from '@cloudron/superagent'; import tasks from '../../tasks.js'; import timers from 'timers/promises'; -import * as tokens from '../../tokens.js'; +import tokens from '../../tokens.js'; const debug = debugModule('box:test/common'); @@ -96,27 +96,6 @@ const app = { const serverUrl = `http://localhost:${constants.PORT}`; -export default { - setup, - setupServer, - cleanup, - clearMailQueue, - checkMails, - waitForTask, - waitForAsyncTask, - owner, - admin, - user, - app, - getDefaultBackupSite, - mockApiServerOrigin, - dashboardDomain, - dashboardFqdn: 'my.test.example.com', - appstoreToken, - mailFqdn: 'my.test.example.com', - serverUrl, - auditSource: { ip: '5.6.7.8' } -}; async function setupServer() { debug('Setting up server'); @@ -249,3 +228,25 @@ async function getDefaultBackupSite() { const result = await backupSites.list(); return result.find(r => r.name === 'Default'); } + +export default { + setup, + setupServer, + cleanup, + clearMailQueue, + checkMails, + waitForTask, + waitForAsyncTask, + owner, + admin, + user, + app, + getDefaultBackupSite, + mockApiServerOrigin, + dashboardDomain, + dashboardFqdn: 'my.test.example.com', + appstoreToken, + mailFqdn: 'my.test.example.com', + serverUrl, + auditSource: { ip: '5.6.7.8' } +}; diff --git a/src/routes/test/mail-test.js b/src/routes/test/mail-test.js index 445a2e9bf..bb42be8e0 100644 --- a/src/routes/test/mail-test.js +++ b/src/routes/test/mail-test.js @@ -2,10 +2,10 @@ import common from './common.js'; import expect from 'expect.js'; -import * as mail from '../../mail.js'; +import mail from '../../mail.js'; import superagent from '@cloudron/superagent'; -import * as _ from '../../underscore.js'; -import * as dig from '../../dig.js'; +import _ from '../../underscore.js'; +import dig from '../../dig.js'; /* global describe:false */ /* global before:false */ diff --git a/src/routes/test/notifications-test.js b/src/routes/test/notifications-test.js index 05209dbc2..92d63b42d 100644 --- a/src/routes/test/notifications-test.js +++ b/src/routes/test/notifications-test.js @@ -2,7 +2,7 @@ import common from './common.js'; import expect from 'expect.js'; -import * as notifications from '../../notifications.js'; +import notifications from '../../notifications.js'; import superagent from '@cloudron/superagent'; /* global describe:false */ diff --git a/src/routes/test/profile-test.js b/src/routes/test/profile-test.js index 4fa723bce..845f50508 100644 --- a/src/routes/test/profile-test.js +++ b/src/routes/test/profile-test.js @@ -5,7 +5,7 @@ import expect from 'expect.js'; import fs from 'node:fs'; import speakeasy from 'speakeasy'; import superagent from '@cloudron/superagent'; -import * as tokens from '../../tokens.js'; +import tokens from '../../tokens.js'; const customAvatarSize = fs.readFileSync('./logo.png').length; diff --git a/src/routes/test/provision-test.js b/src/routes/test/provision-test.js index 92d44c43a..fdb101359 100644 --- a/src/routes/test/provision-test.js +++ b/src/routes/test/provision-test.js @@ -1,7 +1,7 @@ /* global it:false */ import common from './common.js'; -import * as appstore from '../../appstore.js'; +import appstore from '../../appstore.js'; import expect from 'expect.js'; import nock from 'nock'; import superagent from '@cloudron/superagent'; diff --git a/src/routes/test/users-test.js b/src/routes/test/users-test.js index 9eecda346..89d5d03e3 100644 --- a/src/routes/test/users-test.js +++ b/src/routes/test/users-test.js @@ -4,7 +4,7 @@ import common from './common.js'; import expect from 'expect.js'; import fs from 'node:fs'; import superagent from '@cloudron/superagent'; -import * as users from '../../users.js'; +import users from '../../users.js'; /* global describe:false */ /* global before:false */ diff --git a/src/routes/tokens.js b/src/routes/tokens.js index 5ba09a185..c48e52a4b 100644 --- a/src/routes/tokens.js +++ b/src/routes/tokens.js @@ -4,15 +4,8 @@ import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import oidcClients from '../oidcclients.js'; import safe from 'safetydance'; -import * as tokens from '../tokens.js'; +import tokens from '../tokens.js'; -export { - verifyOwnership, - list, - get, - add, - del -}; async function verifyOwnership(req, res, next) { assert.strictEqual(typeof req.user, 'object'); @@ -73,3 +66,11 @@ async function del(req, res, next) { next(new HttpSuccess(204, {})); } + +export default { + verifyOwnership, + list, + get, + add, + del +}; diff --git a/src/routes/updater.js b/src/routes/updater.js index 61098b7db..126a781b8 100644 --- a/src/routes/updater.js +++ b/src/routes/updater.js @@ -4,17 +4,8 @@ import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -import * as updater from '../updater.js'; +import updater from '../updater.js'; -export { - getAutoupdatePattern, - setAutoupdatePattern, - - getBoxUpdate, - checkBoxUpdate, - - updateBox, -}; async function getAutoupdatePattern(req, res, next) { const [error, pattern] = await safe(updater.getAutoupdatePattern()); @@ -61,3 +52,13 @@ async function checkBoxUpdate(req, res, next) { next(new HttpSuccess(200, { update: result })); } + +export default { + getAutoupdatePattern, + setAutoupdatePattern, + + getBoxUpdate, + checkBoxUpdate, + + updateBox, +}; diff --git a/src/routes/user-directory.js b/src/routes/user-directory.js index a85813614..635c0c43c 100644 --- a/src/routes/user-directory.js +++ b/src/routes/user-directory.js @@ -4,12 +4,8 @@ import BoxError from '../boxerror.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -import * as userDirectory from '../user-directory.js'; +import userDirectory from '../user-directory.js'; -export { - getProfileConfig, - setProfileConfig -}; async function getProfileConfig(req, res, next) { const [error, directoryConfig] = await safe(userDirectory.getProfileConfig()); @@ -29,3 +25,8 @@ async function setProfileConfig(req, res, next) { next(new HttpSuccess(200, {})); } + +export default { + getProfileConfig, + setProfileConfig +}; diff --git a/src/routes/users.js b/src/routes/users.js index 057158c9b..36943f80f 100644 --- a/src/routes/users.js +++ b/src/routes/users.js @@ -1,41 +1,13 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as groups from '../groups.js'; +import groups from '../groups.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -import * as users from '../users.js'; -import * as _ from '../underscore.js'; +import users from '../users.js'; +import _ from '../underscore.js'; -export { - get, - list, - add, - del, - - setRole, - setActive, - getAvatar, - setAvatar, - unsetAvatar, - updateProfile, - - setPassword, - verifyPassword, - setLocalGroups, - setGhost, - - getPasswordResetLink, - sendPasswordResetEmail, - - getInviteLink, - sendInviteEmail, - - disableTwoFactorAuthentication, - - load -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.userId, 'string'); @@ -311,3 +283,32 @@ async function sendInviteEmail(req, res, next) { next(new HttpSuccess(202, {})); } + +export default { + get, + list, + add, + del, + + setRole, + setActive, + getAvatar, + setAvatar, + unsetAvatar, + updateProfile, + + setPassword, + verifyPassword, + setLocalGroups, + setGhost, + + getPasswordResetLink, + sendPasswordResetEmail, + + getInviteLink, + sendInviteEmail, + + disableTwoFactorAuthentication, + + load +}; diff --git a/src/routes/volumes.js b/src/routes/volumes.js index 94dad6e00..60434d9a5 100644 --- a/src/routes/volumes.js +++ b/src/routes/volumes.js @@ -1,21 +1,11 @@ import assert from 'node:assert'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as volumes from '../volumes.js'; +import volumes from '../volumes.js'; import { HttpError } from '@cloudron/connect-lastmile'; import { HttpSuccess } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -export { - add, - get, - update, - del, - list, - load, - remount, - getStatus -}; async function load(req, res, next) { assert.strictEqual(typeof req.params.id, 'string'); @@ -93,3 +83,13 @@ async function getStatus(req, res, next) { next(new HttpSuccess(200, status)); } +export default { + add, + get, + update, + del, + list, + load, + remount, + getStatus +}; diff --git a/src/routes/wellknown.js b/src/routes/wellknown.js index 780d39ffe..466d74046 100644 --- a/src/routes/wellknown.js +++ b/src/routes/wellknown.js @@ -1,10 +1,7 @@ import { HttpError } from '@cloudron/connect-lastmile'; import safe from 'safetydance'; -import * as wellknown from '../wellknown.js'; +import wellknown from '../wellknown.js'; -export { - get -}; async function get(req, res, next) { const host = req.headers['host']; @@ -15,3 +12,7 @@ async function get(req, res, next) { res.status(200).set('content-type', result.type).send(result.body); } + +export default { + get +}; diff --git a/src/scheduler.js b/src/scheduler.js index cf0dd18a9..57a6c7db2 100644 --- a/src/scheduler.js +++ b/src/scheduler.js @@ -1,23 +1,16 @@ import apps from './apps.js'; import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as cloudron from './cloudron.js'; +import cloudron from './cloudron.js'; import constants from './constants.js'; import { CronJob } from 'cron'; import debugModule from 'debug'; -import * as docker from './docker.js'; +import docker from './docker.js'; import safe from 'safetydance'; -import * as _ from './underscore.js'; +import _ from './underscore.js'; const debug = debugModule('box:scheduler'); -export { - sync, - deleteJobs, - - suspendAppJobs, - resumeAppJobs -}; const gState = {}; // appId -> { containerId, schedulerConfig (manifest+crontab), cronjobs } const gSuspendedAppIds = new Set(); // suspended because some apptask is running @@ -166,3 +159,11 @@ async function sync() { gState[app.id] = { containerId: app.containerId, schedulerConfig, cronJobs }; } } + +export default { + sync, + deleteJobs, + + suspendAppJobs, + resumeAppJobs +}; diff --git a/src/scripts/backupupload.js b/src/scripts/backupupload.js index 0a23f4dba..425222fad 100755 --- a/src/scripts/backupupload.js +++ b/src/scripts/backupupload.js @@ -7,8 +7,8 @@ if (process.argv[2] === '--check') { process.exit(0); } -const backuptask = await import('../backuptask.js'); -const database = await import('../database.js'); +const { default: backuptask } = await import('../backuptask.js'); +const { default: database } = await import('../database.js'); const { default: debugModule } = await import('debug'); const { default: safe } = await import('safetydance'); diff --git a/src/server.js b/src/server.js index 2118f46b7..829e102e9 100644 --- a/src/server.js +++ b/src/server.js @@ -6,20 +6,16 @@ import eventlog from './eventlog.js'; import express from 'express'; import http from 'node:http'; import { HttpError } from '@cloudron/connect-lastmile'; -import * as middleware from './middleware/index.js'; -import * as platform from './platform.js'; -import * as routes from './routes/index.js'; +import middleware from './middleware/index.js'; +import platform from './platform.js'; +import routes from './routes/index.js'; import safe from 'safetydance'; -import * as users from './users.js'; +import users from './users.js'; import util from 'node:util'; import ws from 'ws'; const debug = debugModule('box:server'); -export { - start, - stop -}; let gHttpServer = null; @@ -534,3 +530,8 @@ async function stop() { gHttpServer = null; } + +export default { + start, + stop +}; diff --git a/src/services.js b/src/services.js index b2fc160ec..0717605a1 100644 --- a/src/services.js +++ b/src/services.js @@ -1,23 +1,23 @@ -import * as addonConfigs from './addonconfigs.js'; +import addonConfigs from './addonconfigs.js'; import apps from './apps.js'; import assert from 'node:assert'; import blobs from './blobs.js'; import BoxError from './boxerror.js'; -import * as branding from './branding.js'; +import branding from './branding.js'; import constants from './constants.js'; import crypto from 'node:crypto'; -import * as dashboard from './dashboard.js'; +import dashboard from './dashboard.js'; import debugModule from 'debug'; -import * as dig from './dig.js'; -import * as docker from './docker.js'; +import dig from './dig.js'; +import docker from './docker.js'; import eventlog from './eventlog.js'; import fs from 'node:fs'; import hat from './hat.js'; import http from 'http'; import infra from './infra_version.js'; -import * as logs from './logs.js'; -import * as mail from './mail.js'; -import * as mailServer from './mailserver.js'; +import logs from './logs.js'; +import mail from './mail.js'; +import mailServer from './mailserver.js'; import oidcClients from './oidcclients.js'; import os from 'node:os'; import path from 'node:path'; @@ -26,8 +26,8 @@ import { pipeFileToRequest, pipeRequestToFile } from '@cloudron/pipework'; import promiseRetry from './promise-retry.js'; import safe from 'safetydance'; import semver from 'semver'; -import * as settings from './settings.js'; -import * as sftp from './sftp.js'; +import settings from './settings.js'; +import sftp from './sftp.js'; import shellModule from './shell.js'; import superagent from '@cloudron/superagent'; @@ -39,44 +39,6 @@ const SERVICE_STATUS_ACTIVE = 'active'; const SERVICE_STATUS_STOPPED = 'stopped'; const SERVICE_STATUS_DISABLED = 'disabled'; -export default { - getServiceConfig, - - listServices, - getServiceStatus, - getServiceLogs, - - configureService, - restartService, - rebuildService, - - startAppServices, - stopAppServices, - - startServices, - - moveDataDir, // localstorage specific command - - setupAddons, - teardownAddons, - backupAddons, - restoreAddons, - clearAddons, - checkAddonsSupport, - - getEnvironment, - getContainerNamesSync, - - getContainerDetails, - - // exported only for apptask.js to update immich pgvectors extension - can be removed later - _postgreSqlNames: postgreSqlNames, - - SERVICE_STATUS_STARTING, - SERVICE_STATUS_ACTIVE, - SERVICE_STATUS_STOPPED, - SERVICE_STATUS_DISABLED, -}; const NOOP = async function (/*app, options*/) {}; const RMADDONDIR_CMD = path.join(import.meta.dirname, 'scripts/rmaddondir.sh'); @@ -2185,3 +2147,42 @@ async function moveDataDir(app, targetVolumeId, targetVolumePrefix) { if (error) throw new BoxError(BoxError.EXTERNAL_ERROR, `Error migrating data directory: ${error.message}`); } } + +export default { + getServiceConfig, + + listServices, + getServiceStatus, + getServiceLogs, + + configureService, + restartService, + rebuildService, + + startAppServices, + stopAppServices, + + startServices, + + moveDataDir, // localstorage specific command + + setupAddons, + teardownAddons, + backupAddons, + restoreAddons, + clearAddons, + checkAddonsSupport, + + getEnvironment, + getContainerNamesSync, + + getContainerDetails, + + // exported only for apptask.js to update immich pgvectors extension - can be removed later + _postgreSqlNames: postgreSqlNames, + + SERVICE_STATUS_STARTING, + SERVICE_STATUS_ACTIVE, + SERVICE_STATUS_STOPPED, + SERVICE_STATUS_DISABLED, +}; diff --git a/src/settings.js b/src/settings.js index de7fcf405..f0b45d79f 100644 --- a/src/settings.js +++ b/src/settings.js @@ -1,5 +1,5 @@ import assert from 'node:assert'; -import * as database from './database.js'; +import database from './database.js'; import safe from 'safetydance'; const APPSTORE_API_TOKEN_KEY = 'appstore_api_token'; @@ -33,44 +33,6 @@ const WEB_SERVER_ORIGIN_KEY = 'web_server_origin'; const _clear = clear; const _set = set; -export { - get, - set, - getJson, - setJson, - getBlob, - setBlob, - APPSTORE_API_TOKEN_KEY, - API_SERVER_ORIGIN_KEY, - AUTOUPDATE_PATTERN_KEY, - CLOUDRON_AVATAR_KEY, - CLOUDRON_BACKGROUND_KEY, - CLOUDRON_ID_KEY, - CLOUDRON_NAME_KEY, - CONSOLE_SERVER_ORIGIN_KEY, - DASHBOARD_DOMAIN_KEY, - DASHBOARD_SUBDOMAIN_KEY, - DIRECTORY_SERVER_KEY, - DYNAMIC_DNS_KEY, - EXTERNAL_LDAP_KEY, - FOOTER_KEY, - FIREWALL_BLOCKLIST_KEY, - GHOSTS_CONFIG_KEY, - IPV4_CONFIG_KEY, - IPV6_CONFIG_KEY, - LANGUAGE_KEY, - MAIL_DOMAIN_KEY, - MAIL_SUBDOMAIN_KEY, - OIDC_COOKIE_SECRET_KEY, - PROFILE_CONFIG_KEY, - REVERSE_PROXY_CONFIG_KEY, - SERVICES_CONFIG_KEY, - TIME_ZONE_KEY, - TRUSTED_IPS_KEY, - WEB_SERVER_ORIGIN_KEY, - _clear, - _set, -}; const SETTINGS_FIELDS = [ 'name', 'value' ].join(','); const SETTINGS_BLOB_FIELDS = [ 'name', 'valueBlob' ].join(','); @@ -123,3 +85,42 @@ async function setBlob(key, value) { async function clear() { await database.query('DELETE FROM settings'); } + +export default { + get, + set, + getJson, + setJson, + getBlob, + setBlob, + APPSTORE_API_TOKEN_KEY, + API_SERVER_ORIGIN_KEY, + AUTOUPDATE_PATTERN_KEY, + CLOUDRON_AVATAR_KEY, + CLOUDRON_BACKGROUND_KEY, + CLOUDRON_ID_KEY, + CLOUDRON_NAME_KEY, + CONSOLE_SERVER_ORIGIN_KEY, + DASHBOARD_DOMAIN_KEY, + DASHBOARD_SUBDOMAIN_KEY, + DIRECTORY_SERVER_KEY, + DYNAMIC_DNS_KEY, + EXTERNAL_LDAP_KEY, + FOOTER_KEY, + FIREWALL_BLOCKLIST_KEY, + GHOSTS_CONFIG_KEY, + IPV4_CONFIG_KEY, + IPV6_CONFIG_KEY, + LANGUAGE_KEY, + MAIL_DOMAIN_KEY, + MAIL_SUBDOMAIN_KEY, + OIDC_COOKIE_SECRET_KEY, + PROFILE_CONFIG_KEY, + REVERSE_PROXY_CONFIG_KEY, + SERVICES_CONFIG_KEY, + TIME_ZONE_KEY, + TRUSTED_IPS_KEY, + WEB_SERVER_ORIGIN_KEY, + _clear, + _set, +}; diff --git a/src/sftp.js b/src/sftp.js index 7e630393f..83806fee7 100644 --- a/src/sftp.js +++ b/src/sftp.js @@ -4,7 +4,7 @@ import blobs from './blobs.js'; import BoxError from './boxerror.js'; import constants from './constants.js'; import debugModule from 'debug'; -import * as docker from './docker.js'; +import docker from './docker.js'; import hat from './hat.js'; import infra from './infra_version.js'; import mounts from './mounts.js'; @@ -13,17 +13,13 @@ import paths from './paths.js'; import safe from 'safetydance'; import services from './services.js'; import shellModule from './shell.js'; -import * as volumes from './volumes.js'; +import volumes from './volumes.js'; const debug = debugModule('box:sftp'); const shell = shellModule('sftp'); const DEFAULT_MEMORY_LIMIT = 256 * 1024 * 1024; -export { - start, - DEFAULT_MEMORY_LIMIT, -}; async function ensureKeys() { for (const keyType of [ 'rsa', 'ed25519' ]) { @@ -131,3 +127,8 @@ async function start(existingInfra) { if (existingInfra.version !== 'none' && existingInfra.images.sftp !== image) await docker.deleteImage(existingInfra.images.sftp); } + +export default { + start, + DEFAULT_MEMORY_LIMIT, +}; diff --git a/src/shell.js b/src/shell.js index 3111fc276..9dc8a9c42 100644 --- a/src/shell.js +++ b/src/shell.js @@ -4,7 +4,7 @@ import child_process from 'node:child_process'; import debugModule from 'debug'; import path from 'node:path'; import safe from 'safetydance'; -import * as _ from './underscore.js'; +import _ from './underscore.js'; const debug = debugModule('box:shell'); diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index c49639366..74ef60451 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -2,42 +2,18 @@ import assert from 'node:assert'; import BoxError from '../boxerror.js'; import crypto from 'crypto'; import debugModule from 'debug'; -import * as df from '../df.js'; +import df from '../df.js'; import fs from 'node:fs'; import mounts from '../mounts.js'; import path from 'node:path'; import paths from '../paths.js'; import safe from 'safetydance'; import shellModule from '../shell.js'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; const debug = debugModule('box:storage/filesystem'); const shell = shellModule('filesystem'); -export { - setup, - teardown, - cleanup, - - verifyConfig, - removePrivateFields, - injectPrivateFields, - - getAvailableSize, - getStatus, - - upload, - download, - - copy, - copyDir, - - exists, - listDir, - - remove, - removeDir, -}; function getRootPath(config) { assert.strictEqual(typeof config, 'object'); @@ -442,3 +418,27 @@ function injectPrivateFields(newConfig, currentConfig) { if (currentConfig._managedMountPath) newConfig._managedMountPath = currentConfig._managedMountPath; } +export default { + setup, + teardown, + cleanup, + + verifyConfig, + removePrivateFields, + injectPrivateFields, + + getAvailableSize, + getStatus, + + upload, + download, + + copy, + copyDir, + + exists, + listDir, + + remove, + removeDir, +}; diff --git a/src/storage/gcs.js b/src/storage/gcs.js index a9c11f454..4dfaba327 100644 --- a/src/storage/gcs.js +++ b/src/storage/gcs.js @@ -6,34 +6,10 @@ import debugModule from 'debug'; import { Storage as GCS } from '@google-cloud/storage'; import path from 'node:path'; import safe from 'safetydance'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; const debug = debugModule('box:storage/gcs'); -export { - getAvailableSize, - getStatus, - - upload, - exists, - download, - - copy, - copyDir, - - listDir, - - remove, - removeDir, - - setup, - teardown, - cleanup, - - verifyConfig, - removePrivateFields, - injectPrivateFields, -}; function getBucket(config) { assert.strictEqual(typeof config, 'object'); @@ -284,3 +260,27 @@ function injectPrivateFields(newConfig, currentConfig) { if (!Object.hasOwn(newConfig.credentials, 'private_key') && currentConfig.credentials) newConfig.credentials.private_key = currentConfig.credentials.private_key; } +export default { + getAvailableSize, + getStatus, + + upload, + exists, + download, + + copy, + copyDir, + + listDir, + + remove, + removeDir, + + setup, + teardown, + cleanup, + + verifyConfig, + removePrivateFields, + injectPrivateFields, +}; diff --git a/src/storage/interface.js b/src/storage/interface.js index 60d9ff920..bb466f782 100644 --- a/src/storage/interface.js +++ b/src/storage/interface.js @@ -11,31 +11,6 @@ import BoxError from '../boxerror.js'; // retry logic for upload() comes from the syncer since it is stream based // for the other API calls we leave it to the backend to retry. this allows // them to tune the concurrency based on failures/rate limits accordingly -export { - getAvailableSize, - getStatus, - - upload, - - exists, - - download, - copy, - copyDir, - - listDir, - - remove, - removeDir, - - setup, - teardown, - cleanup, - - verifyConfig, - removePrivateFields, - injectPrivateFields -}; function removePrivateFields(config) { // in-place removal of tokens and api keys @@ -166,3 +141,29 @@ async function teardown(config) { throw new BoxError(BoxError.NOT_IMPLEMENTED, 'teardown is not implemented'); } + +export default { + getAvailableSize, + getStatus, + + upload, + + exists, + + download, + copy, + copyDir, + + listDir, + + remove, + removeDir, + + setup, + teardown, + cleanup, + + verifyConfig, + removePrivateFields, + injectPrivateFields +}; diff --git a/src/storage/s3.js b/src/storage/s3.js index 2ef407c0e..91b5a8f16 100644 --- a/src/storage/s3.js +++ b/src/storage/s3.js @@ -15,31 +15,12 @@ import { Readable } from 'node:stream'; import { S3, NoSuchKey, NoSuchBucket } from '@aws-sdk/client-s3'; import safe from 'safetydance'; import { Upload } from '@aws-sdk/lib-storage'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; const debug = debugModule('box:storage/s3'); const _chunk = chunk; -export { - setup, - teardown, - cleanup, - verifyConfig, - removePrivateFields, - injectPrivateFields, - getAvailableSize, - getStatus, - upload, - exists, - download, - copy, - copyDir, - listDir, - remove, - removeDir, - _chunk, -}; function S3_NOT_FOUND(error) { return error instanceof NoSuchKey || error instanceof NoSuchBucket; @@ -691,3 +672,22 @@ function injectPrivateFields(newConfig, currentConfig) { newConfig._provider = currentConfig._provider; } +export default { + setup, + teardown, + cleanup, + verifyConfig, + removePrivateFields, + injectPrivateFields, + getAvailableSize, + getStatus, + upload, + exists, + download, + copy, + copyDir, + listDir, + remove, + removeDir, + _chunk, +}; diff --git a/src/syncer.js b/src/syncer.js index 8ec42ec73..d8987d4dd 100644 --- a/src/syncer.js +++ b/src/syncer.js @@ -10,10 +10,6 @@ import util from 'node:util'; const debug = debugModule('box:syncer'); -export { - sync, - finalize -}; function readCache(cacheFile) { assert.strictEqual(typeof cacheFile, 'string'); @@ -197,3 +193,8 @@ async function finalize(integrityMap, cacheFile) { safe.fs.unlinkSync(newCacheFile); if (!safe.fs.renameSync(tempCacheFile, cacheFile)) debug('Unable to save new cache file'); } + +export default { + sync, + finalize +}; diff --git a/src/system.js b/src/system.js index 85b43b09c..8f0f19500 100644 --- a/src/system.js +++ b/src/system.js @@ -1,41 +1,26 @@ import apps from './apps.js'; import assert from 'node:assert'; -import { AsyncTask } from './asynctask.js'; -import * as backupSites from './backupsites.js'; +import asynctask from './asynctask.js'; +const { AsyncTask } = asynctask; +import backupSites from './backupsites.js'; import BoxError from './boxerror.js'; import debugModule from 'debug'; -import * as df from './df.js'; -import * as docker from './docker.js'; +import df from './df.js'; +import docker from './docker.js'; import eventlog from './eventlog.js'; import fs from 'node:fs'; -import * as logs from './logs.js'; -import * as notifications from './notifications.js'; +import logs from './logs.js'; +import notifications from './notifications.js'; import os from 'node:os'; import path from 'node:path'; import paths from './paths.js'; import safe from 'safetydance'; import shellModule from './shell.js'; -import * as volumes from './volumes.js'; +import volumes from './volumes.js'; const debug = debugModule('box:system'); const shell = shellModule('system'); -export { - reboot, - getInfo, - getUbuntuVersion, - getKernelVersion, - getSwaps, - checkDiskSpace, - getMemory, - getLogs, - getBlockDevices, - runSystemChecks, - getProvider, - getCpus, - getFilesystems, - getFilesystemUsage -}; const DU_CMD = path.join(import.meta.dirname, 'scripts/du.sh'); const HDPARM_CMD = path.join(import.meta.dirname, 'scripts/hdparm.sh'); @@ -402,3 +387,20 @@ function getProvider() { async function getCpus() { return os.cpus(); } + +export default { + reboot, + getInfo, + getUbuntuVersion, + getKernelVersion, + getSwaps, + checkDiskSpace, + getMemory, + getLogs, + getBlockDevices, + runSystemChecks, + getProvider, + getCpus, + getFilesystems, + getFilesystemUsage +}; diff --git a/src/tasks.js b/src/tasks.js index 1dfa7fcdc..327b9ca79 100644 --- a/src/tasks.js +++ b/src/tasks.js @@ -1,14 +1,14 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; -import * as logs from './logs.js'; +import logs from './logs.js'; import mysql from 'mysql2'; import path from 'node:path'; import paths from './paths.js'; import safe from 'safetydance'; import shellModule from './shell.js'; -import * as _ from './underscore.js'; +import _ from './underscore.js'; const debug = debugModule('box:tasks'); const shell = shellModule('tasks'); @@ -17,53 +17,6 @@ const ESTOPPED = 'stopped'; const ECRASHED = 'crashed'; const ETIMEOUT = 'timeout'; -export default { - get, - add, - update, - setCompleted, - setCompletedByType, - list, - - getLogs, - - startTask, - stopTask, - stopAllTasks, - - removePrivateFields, - - _del: del, - - // task types. if you add a task here, fill up the function table in taskworker and dashboard constants.js - // '_' prefix is removed for lookup - TASK_APP: 'app', - - // "prefix" allows us to locate the tasks of a specific app or backup site - TASK_APP_BACKUP_PREFIX: 'appBackup_', - TASK_FULL_BACKUP_PREFIX: 'backup_', // full backup - TASK_CLEAN_BACKUPS_PREFIX: 'cleanBackups_', - - TASK_BOX_UPDATE: 'boxUpdate', - TASK_CHECK_CERTS: 'checkCerts', - TASK_SYNC_DYNDNS: 'syncDyndns', - TASK_PREPARE_DASHBOARD_LOCATION: 'prepareDashboardLocation', - TASK_SYNC_EXTERNAL_LDAP: 'syncExternalLdap', - TASK_CHANGE_MAIL_LOCATION: 'changeMailLocation', - TASK_SYNC_DNS_RECORDS: 'syncDnsRecords', - - TASK_CHECK_BACKUP_INTEGRITY: 'checkBackupIntegrity', - - // error codes - ESTOPPED, - ECRASHED, - ETIMEOUT, - // testing - _TASK_IDENTITY: 'identity', - _TASK_CRASH: 'crash', - _TASK_ERROR: 'error', - _TASK_SLEEP: 'sleep' -}; let gTasks = {}; // holds AbortControllers indexed by task id @@ -295,3 +248,51 @@ async function del(id) { const result = await database.query('DELETE FROM tasks WHERE id = ?', [ id ]); if (result.affectedRows !== 1) throw new BoxError(BoxError.NOT_FOUND, 'Task not found'); } + +export default { + get, + add, + update, + setCompleted, + setCompletedByType, + list, + + getLogs, + + startTask, + stopTask, + stopAllTasks, + + removePrivateFields, + + _del: del, + + // task types. if you add a task here, fill up the function table in taskworker and dashboard constants.js + // '_' prefix is removed for lookup + TASK_APP: 'app', + + // "prefix" allows us to locate the tasks of a specific app or backup site + TASK_APP_BACKUP_PREFIX: 'appBackup_', + TASK_FULL_BACKUP_PREFIX: 'backup_', // full backup + TASK_CLEAN_BACKUPS_PREFIX: 'cleanBackups_', + + TASK_BOX_UPDATE: 'boxUpdate', + TASK_CHECK_CERTS: 'checkCerts', + TASK_SYNC_DYNDNS: 'syncDyndns', + TASK_PREPARE_DASHBOARD_LOCATION: 'prepareDashboardLocation', + TASK_SYNC_EXTERNAL_LDAP: 'syncExternalLdap', + TASK_CHANGE_MAIL_LOCATION: 'changeMailLocation', + TASK_SYNC_DNS_RECORDS: 'syncDnsRecords', + + TASK_CHECK_BACKUP_INTEGRITY: 'checkBackupIntegrity', + + // error codes + ESTOPPED, + ECRASHED, + ETIMEOUT, + // testing + _TASK_IDENTITY: 'identity', + _TASK_CRASH: 'crash', + _TASK_ERROR: 'error', + _TASK_SLEEP: 'sleep' +}; diff --git a/src/taskworker.js b/src/taskworker.js index 08b7e5381..9905abdd2 100755 --- a/src/taskworker.js +++ b/src/taskworker.js @@ -1,24 +1,24 @@ #!/usr/bin/env -S node --unhandled-rejections=strict -import * as apptask from './apptask.js'; -import * as backupCleaner from './backupcleaner.js'; -import * as backupIntegrity from './backupintegrity.js'; -import * as backuptask from './backuptask.js'; +import apptask from './apptask.js'; +import backupCleaner from './backupcleaner.js'; +import backupIntegrity from './backupintegrity.js'; +import backuptask from './backuptask.js'; import BoxError from './boxerror.js'; -import * as dashboard from './dashboard.js'; -import * as database from './database.js'; -import * as dns from './dns.js'; -import * as dyndns from './dyndns.js'; -import * as externalLdap from './externalldap.js'; +import dashboard from './dashboard.js'; +import database from './database.js'; +import dns from './dns.js'; +import dyndns from './dyndns.js'; +import externalLdap from './externalldap.js'; import fs from 'node:fs'; import locks from './locks.js'; -import * as mailServer from './mailserver.js'; +import mailServer from './mailserver.js'; import net from 'node:net'; -import * as reverseProxy from './reverseproxy.js'; +import reverseProxy from './reverseproxy.js'; import safe from 'safetydance'; import tasks from './tasks.js'; import timers from 'timers/promises'; -import * as updater from './updater.js'; +import updater from './updater.js'; import debugModule from 'debug'; const TASKS = { // indexed by task type diff --git a/src/test/acme2-test.js b/src/test/acme2-test.js index 70b063027..b37656835 100644 --- a/src/test/acme2-test.js +++ b/src/test/acme2-test.js @@ -1,7 +1,7 @@ /* global it:false */ -import * as acme2 from '../acme2.js'; -import * as common from './common.js'; +import acme2 from '../acme2.js'; +import common from './common.js'; import expect from 'expect.js'; /* global describe:false */ diff --git a/src/test/addonconfigs-test.js b/src/test/addonconfigs-test.js index 09085650c..996d51676 100644 --- a/src/test/addonconfigs-test.js +++ b/src/test/addonconfigs-test.js @@ -1,7 +1,7 @@ /* global it:false */ -import * as addonConfigs from '../addonconfigs.js'; -import * as common from './common.js'; +import addonConfigs from '../addonconfigs.js'; +import common from './common.js'; import expect from 'expect.js'; /* global describe:false */ diff --git a/src/test/applinks-test.js b/src/test/applinks-test.js index b20e20060..92ec52b01 100644 --- a/src/test/applinks-test.js +++ b/src/test/applinks-test.js @@ -1,8 +1,8 @@ /* global it:false */ -import * as applinks from '../applinks.js'; +import applinks from '../applinks.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/apppasswords-test.js b/src/test/apppasswords-test.js index eae624cd4..312aad44c 100644 --- a/src/test/apppasswords-test.js +++ b/src/test/apppasswords-test.js @@ -1,11 +1,11 @@ /* jslint node:true */ -import * as appPasswords from '../apppasswords.js'; +import appPasswords from '../apppasswords.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import safe from 'safetydance'; -import * as users from '../users.js'; +import users from '../users.js'; /* global it:false */ /* global describe:false */ diff --git a/src/test/apps-test.js b/src/test/apps-test.js index c5ceee122..367f619f7 100644 --- a/src/test/apps-test.js +++ b/src/test/apps-test.js @@ -3,11 +3,11 @@ import apps from '../apps.js'; import AuditSource from '../auditsource.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import Location from '../location.js'; import safe from 'safetydance'; -import * as users from '../users.js'; +import users from '../users.js'; const { proxyApp } = common; diff --git a/src/test/apptask-test.js b/src/test/apptask-test.js index dd6433214..82c91c699 100644 --- a/src/test/apptask-test.js +++ b/src/test/apptask-test.js @@ -1,7 +1,7 @@ /* global it:false */ -import * as apptask from '../apptask.js'; -import * as common from './common.js'; +import apptask from '../apptask.js'; +import common from './common.js'; import expect from 'expect.js'; import fs from 'node:fs'; import paths from '../paths.js'; diff --git a/src/test/archives-test.js b/src/test/archives-test.js index 9bf4543ff..1d1cc9110 100644 --- a/src/test/archives-test.js +++ b/src/test/archives-test.js @@ -1,9 +1,9 @@ /* global it:false */ -import * as archives from '../archives.js'; +import archives from '../archives.js'; import backups from '../backups.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/backupcleaner-test.js b/src/test/backupcleaner-test.js index aed6a6a61..e0281d15f 100644 --- a/src/test/backupcleaner-test.js +++ b/src/test/backupcleaner-test.js @@ -1,10 +1,10 @@ /* jslint node:true */ -import * as archives from '../archives.js'; -import * as backupCleaner from '../backupcleaner.js'; +import archives from '../archives.js'; +import backupCleaner from '../backupcleaner.js'; import backups from '../backups.js'; -import * as backupSites from '../backupsites.js'; -import * as common from './common.js'; +import backupSites from '../backupsites.js'; +import common from './common.js'; import expect from 'expect.js'; import moment from 'moment'; import tasks from '../tasks.js'; diff --git a/src/test/backupformat-test.js b/src/test/backupformat-test.js index d62656ddb..747b55843 100644 --- a/src/test/backupformat-test.js +++ b/src/test/backupformat-test.js @@ -1,14 +1,14 @@ /* jslint node:true */ -import * as common from './common.js'; +import common from './common.js'; import DataLayout from '../datalayout.js'; -import * as tgz from '../backupformat/tgz.js'; +import tgz from '../backupformat/tgz.js'; const EnsureFileSizeStream = tgz._EnsureFileSizeStream; import expect from 'expect.js'; import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; -import * as rsync from '../backupformat/rsync.js'; +import rsync from '../backupformat/rsync.js'; import safe from 'safetydance'; import stream from 'node:stream/promises'; diff --git a/src/test/backups-test.js b/src/test/backups-test.js index 44c5d413d..9e4df8f44 100644 --- a/src/test/backups-test.js +++ b/src/test/backups-test.js @@ -2,7 +2,7 @@ import backups from '../backups.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/backupsites-test.js b/src/test/backupsites-test.js index d4d53186f..5719e0332 100644 --- a/src/test/backupsites-test.js +++ b/src/test/backupsites-test.js @@ -1,10 +1,10 @@ /* jslint node:true */ -import * as archives from '../archives.js'; +import archives from '../archives.js'; import backups from '../backups.js'; -import * as backupSites from '../backupsites.js'; +import backupSites from '../backupsites.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import constants from '../constants.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/backuptask-test.js b/src/test/backuptask-test.js index 89446b1ea..520b1f4d4 100644 --- a/src/test/backuptask-test.js +++ b/src/test/backuptask-test.js @@ -1,9 +1,9 @@ /* jslint node:true */ import backups from '../backups.js'; -import * as backupSites from '../backupsites.js'; +import backupSites from '../backupsites.js'; import child_process from 'node:child_process'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import fs from 'node:fs'; import os from 'node:os'; diff --git a/src/test/blobs-test.js b/src/test/blobs-test.js index 8a5540502..a6ffc5e4c 100644 --- a/src/test/blobs-test.js +++ b/src/test/blobs-test.js @@ -1,7 +1,7 @@ /* global it:false */ import blobs from '../blobs.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; /* global describe:false */ diff --git a/src/test/branding-test.js b/src/test/branding-test.js index be56a9fd9..b8b4ab793 100644 --- a/src/test/branding-test.js +++ b/src/test/branding-test.js @@ -1,8 +1,8 @@ /* global it:false */ import BoxError from '../boxerror.js'; -import * as branding from '../branding.js'; -import * as common from './common.js'; +import branding from '../branding.js'; +import common from './common.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/cloudron-test.js b/src/test/cloudron-test.js index 648ffa6fa..5325fb093 100644 --- a/src/test/cloudron-test.js +++ b/src/test/cloudron-test.js @@ -1,8 +1,8 @@ /* global it:false */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; -import * as cloudron from '../cloudron.js'; +import common from './common.js'; +import cloudron from '../cloudron.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/common.js b/src/test/common.js index 351f32651..b98898194 100644 --- a/src/test/common.js +++ b/src/test/common.js @@ -1,22 +1,22 @@ import apps from '../apps.js'; -import * as appstore from '../appstore.js'; -import * as backupSites from '../backupsites.js'; +import appstore from '../appstore.js'; +import backupSites from '../backupsites.js'; import constants from '../constants.js'; -import * as cron from '../cron.js'; -import * as dashboard from '../dashboard.js'; -import * as database from '../database.js'; -import * as domains from '../domains.js'; +import cron from '../cron.js'; +import dashboard from '../dashboard.js'; +import database from '../database.js'; +import domains from '../domains.js'; import expect from 'expect.js'; import fs from 'node:fs'; import locks from '../locks.js'; -import * as mailer from '../mailer.js'; -import * as mailServer from '../mailserver.js'; +import mailer from '../mailer.js'; +import mailServer from '../mailserver.js'; import nock from 'nock'; import path from 'node:path'; -import * as settings from '../settings.js'; +import settings from '../settings.js'; import tasks from '../tasks.js'; import timers from 'timers/promises'; -import * as users from '../users.js'; +import users from '../users.js'; const manifest = { 'id': 'io.cloudron.test', @@ -168,28 +168,6 @@ const dashboardFqdn = `my.${domain.domain}`; const appstoreToken = 'atoken'; const serverUrl = `http://localhost:${constants.PORT}`; -export { - createTree, - domainSetup, - databaseSetup, - setup, - cleanup, - checkMails, - clearMailQueue, - getDefaultBackupSite, - mockApiServerOrigin, - dashboardDomain, - dashboardFqdn, - app, - proxyApp, - admin, - auditSource, - domain, // the domain object, - manifest, - user, - appstoreToken, - serverUrl, -}; function createTree(root, obj) { fs.rmSync(root, { recursive: true, force: true }); @@ -272,3 +250,26 @@ async function getDefaultBackupSite() { const result = await backupSites.list(); return result[0]; } + +export default { + createTree, + domainSetup, + databaseSetup, + setup, + cleanup, + checkMails, + clearMailQueue, + getDefaultBackupSite, + mockApiServerOrigin, + dashboardDomain, + dashboardFqdn, + app, + proxyApp, + admin, + auditSource, + domain, // the domain object, + manifest, + user, + appstoreToken, + serverUrl, +}; diff --git a/src/test/database-test.js b/src/test/database-test.js index de42fdf63..d7318d63f 100644 --- a/src/test/database-test.js +++ b/src/test/database-test.js @@ -1,7 +1,7 @@ /* global it, describe, before, after */ import BoxError from '../boxerror.js'; -import * as database from '../database.js'; +import database from '../database.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/df-test.js b/src/test/df-test.js index 807523bb1..d72847d7c 100644 --- a/src/test/df-test.js +++ b/src/test/df-test.js @@ -1,8 +1,8 @@ /* jslint node:true */ import child_process from 'node:child_process'; -import * as common from './common.js'; -import * as df from '../df.js'; +import common from './common.js'; +import df from '../df.js'; import expect from 'expect.js'; /* global it:false */ diff --git a/src/test/directoryserver-test.js b/src/test/directoryserver-test.js index e64995243..b304f3258 100644 --- a/src/test/directoryserver-test.js +++ b/src/test/directoryserver-test.js @@ -1,15 +1,15 @@ /* jslint node:true */ import async from 'async'; -import * as common from './common.js'; +import common from './common.js'; import constants from '../constants.js'; -import * as directoryServer from '../directoryserver.js'; +import directoryServer from '../directoryserver.js'; import expect from 'expect.js'; -import * as groups from '../groups.js'; +import groups from '../groups.js'; import ldap from 'ldapjs'; import safe from 'safetydance'; import speakeasy from 'speakeasy'; -import * as users from '../users.js'; +import users from '../users.js'; /* global it:false */ /* global describe:false */ diff --git a/src/test/dns-providers-test.js b/src/test/dns-providers-test.js index 51d2f6a33..dd3a92b47 100644 --- a/src/test/dns-providers-test.js +++ b/src/test/dns-providers-test.js @@ -1,12 +1,12 @@ /* jslint node:true */ -import * as common from './common.js'; -import * as dns from '../dns.js'; -import * as domains from '../domains.js'; +import common from './common.js'; +import dns from '../dns.js'; +import domains from '../domains.js'; import expect from 'expect.js'; import { DNS as GCDNS } from '@google-cloud/dns'; import nock from 'nock'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; /* global it:false */ /* global describe:false */ diff --git a/src/test/dns-test.js b/src/test/dns-test.js index 72eaca225..8c9af9cd4 100644 --- a/src/test/dns-test.js +++ b/src/test/dns-test.js @@ -1,7 +1,7 @@ /* global it:false */ -import * as common from './common.js'; -import * as dns from '../dns.js'; +import common from './common.js'; +import dns from '../dns.js'; import expect from 'expect.js'; /* global describe:false */ diff --git a/src/test/docker-test.js b/src/test/docker-test.js index 3ab18b0bd..906d91b27 100644 --- a/src/test/docker-test.js +++ b/src/test/docker-test.js @@ -1,7 +1,7 @@ /* jslint node:true */ -import * as common from './common.js'; -import * as docker from '../docker.js'; +import common from './common.js'; +import docker from '../docker.js'; import expect from 'expect.js'; import nock from 'nock'; diff --git a/src/test/dockerproxy-test.js b/src/test/dockerproxy-test.js index 9ded2e973..e9e3e2e64 100644 --- a/src/test/dockerproxy-test.js +++ b/src/test/dockerproxy-test.js @@ -1,12 +1,12 @@ /* jslint node:true */ import child_process from 'node:child_process'; -import * as common from './common.js'; +import common from './common.js'; import constants from '../constants.js'; -import * as dockerProxy from '../dockerproxy.js'; +import dockerProxy from '../dockerproxy.js'; import expect from 'expect.js'; import nock from 'nock'; -import * as syslogServer from '../../syslog.js'; +import syslogServer from '../../syslog.js'; /* global it:false */ /* global xit:false */ diff --git a/src/test/dockerregistries-test.js b/src/test/dockerregistries-test.js index 519766d4b..3bc6a193f 100644 --- a/src/test/dockerregistries-test.js +++ b/src/test/dockerregistries-test.js @@ -1,8 +1,8 @@ /* jslint node:true */ -import * as dockerRegistries from '../dockerregistries.js'; +import dockerRegistries from '../dockerregistries.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/domains-test.js b/src/test/domains-test.js index b5227969f..ad0c20c14 100644 --- a/src/test/domains-test.js +++ b/src/test/domains-test.js @@ -2,8 +2,8 @@ import apps from '../apps.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; -import * as domains from '../domains.js'; +import common from './common.js'; +import domains from '../domains.js'; import expect from 'expect.js'; import safe from 'safetydance'; diff --git a/src/test/eventlog-test.js b/src/test/eventlog-test.js index 7863ecf5b..3486bd788 100644 --- a/src/test/eventlog-test.js +++ b/src/test/eventlog-test.js @@ -1,10 +1,10 @@ /* jslint node:true */ -import * as common from './common.js'; -import * as database from '../database.js'; +import common from './common.js'; +import database from '../database.js'; import eventlog from '../eventlog.js'; import expect from 'expect.js'; -import * as notifications from '../notifications.js'; +import notifications from '../notifications.js'; import timers from 'timers/promises'; /* global it:false */ diff --git a/src/test/externalldap-test.js b/src/test/externalldap-test.js index a4f8c368e..8fc15cefc 100644 --- a/src/test/externalldap-test.js +++ b/src/test/externalldap-test.js @@ -2,13 +2,13 @@ import async from 'async'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; -import * as externalLdap from '../externalldap.js'; -import * as groups from '../groups.js'; +import externalLdap from '../externalldap.js'; +import groups from '../groups.js'; import ldap from 'ldapjs'; import safe from 'safetydance'; -import * as users from '../users.js'; +import users from '../users.js'; /* global describe:false */ /* global before:false */ diff --git a/src/test/groups-test.js b/src/test/groups-test.js index 2ad6c7d77..c1a8453e4 100644 --- a/src/test/groups-test.js +++ b/src/test/groups-test.js @@ -1,9 +1,9 @@ /* jslint node:true */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; -import * as groups from '../groups.js'; +import groups from '../groups.js'; import safe from 'safetydance'; /* global it:false */ diff --git a/src/test/ipaddr-test.js b/src/test/ipaddr-test.js index bb293166f..297270da1 100644 --- a/src/test/ipaddr-test.js +++ b/src/test/ipaddr-test.js @@ -1,7 +1,7 @@ /* global it, describe */ import expect from 'expect.js'; -import * as ipaddr from '../ipaddr.js'; +import ipaddr from '../ipaddr.js'; describe('ipaddr', function () { describe('IPv4', function () { diff --git a/src/test/janitor-test.js b/src/test/janitor-test.js index 6d94f0126..e6b3c26f4 100644 --- a/src/test/janitor-test.js +++ b/src/test/janitor-test.js @@ -1,9 +1,9 @@ /* jslint node:true */ -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; -import * as janitor from '../janitor.js'; -import * as tokens from '../tokens.js'; +import janitor from '../janitor.js'; +import tokens from '../tokens.js'; /* global it:false */ /* global describe:false */ diff --git a/src/test/ldapserver-test.js b/src/test/ldapserver-test.js index 6fdc0abec..13fd8185c 100644 --- a/src/test/ldapserver-test.js +++ b/src/test/ldapserver-test.js @@ -1,14 +1,14 @@ /* jslint node:true */ -import * as addonConfigs from '../addonconfigs.js'; +import addonConfigs from '../addonconfigs.js'; import async from 'async'; -import * as common from './common.js'; +import common from './common.js'; import constants from '../constants.js'; import expect from 'expect.js'; -import * as groups from '../groups.js'; +import groups from '../groups.js'; import ldap from 'ldapjs'; -import * as ldapServer from '../ldapserver.js'; -import * as mail from '../mail.js'; +import ldapServer from '../ldapserver.js'; +import mail from '../mail.js'; import safe from 'safetydance'; /* global it:false */ diff --git a/src/test/locks-test.js b/src/test/locks-test.js index 45ee5b5f7..eb1a758c6 100644 --- a/src/test/locks-test.js +++ b/src/test/locks-test.js @@ -1,7 +1,7 @@ /* global it, describe, before, after */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import safe from 'safetydance'; import locks from '../locks.js'; diff --git a/src/test/logs-test.js b/src/test/logs-test.js index 56899aaed..3b7280ddd 100644 --- a/src/test/logs-test.js +++ b/src/test/logs-test.js @@ -2,7 +2,7 @@ import expect from 'expect.js'; import fs from 'node:fs'; -import * as logs from '../logs.js'; +import logs from '../logs.js'; import stream from 'node:stream'; /* global describe:false */ diff --git a/src/test/mail-test.js b/src/test/mail-test.js index de73ff1a6..506bcd287 100644 --- a/src/test/mail-test.js +++ b/src/test/mail-test.js @@ -1,9 +1,9 @@ /* global it:false */ -import * as common from './common.js'; +import common from './common.js'; import BoxError from '../boxerror.js'; import expect from 'expect.js'; -import * as mail from '../mail.js'; +import mail from '../mail.js'; import safe from 'safetydance'; /* global describe:false */ diff --git a/src/test/network-test.js b/src/test/network-test.js index dcf58d7a8..642b88973 100644 --- a/src/test/network-test.js +++ b/src/test/network-test.js @@ -1,10 +1,10 @@ /* global it:false */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import fs from 'node:fs'; -import * as network from '../network.js'; +import network from '../network.js'; import paths from '../paths.js'; import safe from 'safetydance'; diff --git a/src/test/notifications-test.js b/src/test/notifications-test.js index f03e08b2b..b3dfdada8 100644 --- a/src/test/notifications-test.js +++ b/src/test/notifications-test.js @@ -1,9 +1,9 @@ /* jslint node:true */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; -import * as notifications from '../notifications.js'; +import notifications from '../notifications.js'; import safe from 'safetydance'; import timers from 'timers/promises'; diff --git a/src/test/oidcclients-test.js b/src/test/oidcclients-test.js index d722050c6..2c58a49f3 100644 --- a/src/test/oidcclients-test.js +++ b/src/test/oidcclients-test.js @@ -1,7 +1,7 @@ /* global describe, before, it, after */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import oidcClients from '../oidcclients.js'; import safe from 'safetydance'; diff --git a/src/test/openssl-test.js b/src/test/openssl-test.js index eba097b27..6615e3f88 100644 --- a/src/test/openssl-test.js +++ b/src/test/openssl-test.js @@ -2,7 +2,7 @@ import BoxError from '../boxerror.js'; import expect from 'expect.js'; -import * as openssl from '../openssl.js'; +import openssl from '../openssl.js'; import safe from 'safetydance'; /* global describe:false */ diff --git a/src/test/provision-test.js b/src/test/provision-test.js index aa885be20..8ff3b0674 100644 --- a/src/test/provision-test.js +++ b/src/test/provision-test.js @@ -1,11 +1,11 @@ /* global it:false */ -import * as appstore from '../appstore.js'; +import appstore from '../appstore.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import nock from 'nock'; -import * as provision from '../provision.js'; +import provision from '../provision.js'; import safe from 'safetydance'; /* global describe:false */ diff --git a/src/test/reverseproxy-test.js b/src/test/reverseproxy-test.js index b90b2a0b6..e9eae1f13 100644 --- a/src/test/reverseproxy-test.js +++ b/src/test/reverseproxy-test.js @@ -1,11 +1,11 @@ /* global it:false */ -import * as common from './common.js'; -import * as domains from '../domains.js'; +import common from './common.js'; +import domains from '../domains.js'; import expect from 'expect.js'; import fs from 'node:fs'; import paths from '../paths.js'; -import * as reverseProxy from '../reverseproxy.js'; +import reverseProxy from '../reverseproxy.js'; /* global describe:false */ /* global before:false */ diff --git a/src/test/server-test.js b/src/test/server-test.js index aa9433531..414715883 100644 --- a/src/test/server-test.js +++ b/src/test/server-test.js @@ -3,7 +3,7 @@ import constants from '../constants.js'; import expect from 'expect.js'; import safe from 'safetydance'; -import * as server from '../server.js'; +import server from '../server.js'; import superagent from '@cloudron/superagent'; /* global it:false */ diff --git a/src/test/storage-provider-test.js b/src/test/storage-provider-test.js index bc275ddca..c8d42d8b2 100644 --- a/src/test/storage-provider-test.js +++ b/src/test/storage-provider-test.js @@ -1,17 +1,17 @@ /* global it:false */ -import * as backupSites from '../backupsites.js'; +import backupSites from '../backupsites.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import consumers from 'node:stream/consumers'; import { execSync } from 'node:child_process'; import expect from 'expect.js'; -import * as filesystem from '../storage/filesystem.js'; +import filesystem from '../storage/filesystem.js'; import fs from 'node:fs'; -import * as gcs from '../storage/gcs.js'; +import gcs from '../storage/gcs.js'; import os from 'node:os'; import path from 'node:path'; -import * as s3 from '../storage/s3.js'; +import s3 from '../storage/s3.js'; import safe from 'safetydance'; import stream from 'stream/promises'; diff --git a/src/test/syncer-test.js b/src/test/syncer-test.js index ba73442d0..5d174a713 100644 --- a/src/test/syncer-test.js +++ b/src/test/syncer-test.js @@ -1,6 +1,6 @@ /* global it:false */ -import * as common from './common.js'; +import common from './common.js'; const { createTree } = common; import DataLayout from '../datalayout.js'; import { execSync } from 'node:child_process'; @@ -10,7 +10,7 @@ import os from 'node:os'; import path from 'node:path'; import paths from '../paths.js'; import safe from 'safetydance'; -import * as syncer from '../syncer.js'; +import syncer from '../syncer.js'; /* global describe:false */ /* global before:false */ diff --git a/src/test/syslog-test.js b/src/test/syslog-test.js index b03383c05..d9e37a176 100644 --- a/src/test/syslog-test.js +++ b/src/test/syslog-test.js @@ -7,7 +7,7 @@ import net from 'node:net'; import path from 'node:path'; import paths from '../paths.js'; import safe from 'safetydance'; -import * as syslogServer from '../../syslog.js'; +import syslogServer from '../../syslog.js'; import timers from 'timers/promises'; /* global describe:false */ diff --git a/src/test/system-test.js b/src/test/system-test.js index b9a638965..c2b3eb87d 100644 --- a/src/test/system-test.js +++ b/src/test/system-test.js @@ -1,10 +1,10 @@ /* jslint node:true */ import child_process from 'node:child_process'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import nock from 'nock'; -import * as system from '../system.js'; +import system from '../system.js'; /* global it:false */ /* global describe:false */ diff --git a/src/test/tasks-test.js b/src/test/tasks-test.js index c6bac080c..06ea99385 100644 --- a/src/test/tasks-test.js +++ b/src/test/tasks-test.js @@ -1,13 +1,13 @@ /* jslint node:true */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import fs from 'node:fs'; import paths from '../paths.js'; import safe from 'safetydance'; import tasks from '../tasks.js'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; /* global it:false */ /* global before:false */ diff --git a/src/test/tokens-test.js b/src/test/tokens-test.js index d6517593e..6ae303378 100644 --- a/src/test/tokens-test.js +++ b/src/test/tokens-test.js @@ -1,11 +1,11 @@ /* jslint node:true */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import oidcClients from '../oidcclients.js'; import safe from 'safetydance'; -import * as tokens from '../tokens.js'; +import tokens from '../tokens.js'; /* global it:false */ /* global describe:false */ diff --git a/src/test/translations-test.js b/src/test/translations-test.js index f87750302..28639066b 100644 --- a/src/test/translations-test.js +++ b/src/test/translations-test.js @@ -1,7 +1,7 @@ /* jslint node:true */ import expect from 'expect.js'; -import * as translations from '../translations.js'; +import translations from '../translations.js'; /* global it:false */ /* global describe:false */ diff --git a/src/test/underscore-test.js b/src/test/underscore-test.js index aa9f4035e..37e540fc7 100644 --- a/src/test/underscore-test.js +++ b/src/test/underscore-test.js @@ -1,7 +1,7 @@ /* global it, describe, before, after */ import expect from 'expect.js'; -import * as _ from '../underscore.js'; +import _ from '../underscore.js'; describe('Underscore', function () { it('pick', function () { diff --git a/src/test/updater-test.js b/src/test/updater-test.js index 964740600..9235f9afe 100644 --- a/src/test/updater-test.js +++ b/src/test/updater-test.js @@ -2,14 +2,14 @@ import apps from '../apps.js'; import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import constants from '../constants.js'; import expect from 'expect.js'; import nock from 'nock'; import paths from '../paths.js'; import safe from 'safetydance'; import semver from 'semver'; -import * as updater from '../updater.js'; +import updater from '../updater.js'; /* global describe:false */ /* global before:false */ diff --git a/src/test/user-directory-test.js b/src/test/user-directory-test.js index efd2c911f..794e7e5a8 100644 --- a/src/test/user-directory-test.js +++ b/src/test/user-directory-test.js @@ -1,10 +1,10 @@ /* global it:false */ -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import oidcClients from '../oidcclients.js'; -import * as tokens from '../tokens.js'; -import * as userDirectory from '../user-directory.js'; +import tokens from '../tokens.js'; +import userDirectory from '../user-directory.js'; /* global describe:false */ /* global before:false */ diff --git a/src/test/users-test.js b/src/test/users-test.js index 3a6f97bfd..6d68d3dba 100644 --- a/src/test/users-test.js +++ b/src/test/users-test.js @@ -1,12 +1,12 @@ /* global it:false */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import safe from 'safetydance'; import speakeasy from 'speakeasy'; -import * as users from '../users.js'; -import * as _ from '../underscore.js'; +import users from '../users.js'; +import _ from '../underscore.js'; /* global describe:false */ /* global before:false */ diff --git a/src/test/validator-test.js b/src/test/validator-test.js index 410b22a7b..0a2e54a55 100644 --- a/src/test/validator-test.js +++ b/src/test/validator-test.js @@ -1,7 +1,7 @@ /* global it, describe, before, after */ import expect from 'expect.js'; -import * as validator from '../validator.js'; +import validator from '../validator.js'; describe('Validator', function () { const goodEmails = [ diff --git a/src/test/volumes-test.js b/src/test/volumes-test.js index a4135546d..db315e027 100644 --- a/src/test/volumes-test.js +++ b/src/test/volumes-test.js @@ -1,11 +1,11 @@ /* jslint node:true */ import BoxError from '../boxerror.js'; -import * as common from './common.js'; +import common from './common.js'; import expect from 'expect.js'; import paths from '../paths.js'; import safe from 'safetydance'; -import * as volumes from '../volumes.js'; +import volumes from '../volumes.js'; /* global it:false */ /* global describe:false */ diff --git a/src/tokens.js b/src/tokens.js index b0094a0c7..eb2261e5a 100644 --- a/src/tokens.js +++ b/src/tokens.js @@ -1,27 +1,13 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import hat from './hat.js'; -import * as ipaddr from './ipaddr.js'; +import ipaddr from './ipaddr.js'; import safe from 'safetydance'; const SCOPES = ['*'];//, 'apps', 'domains']; -export { - add, - get, - update, - del, - delByAccessToken, - delExpired, - delByUserIdAndType, - listByUserId, - getByAccessToken, - hasScope, - isIpAllowedSync, - SCOPES, -}; const TOKENS_FIELDS = [ 'id', 'accessToken', 'identifier', 'clientId', 'scopeJson', 'expires', 'name', 'lastUsedTime', 'allowedIpRanges' ].join(','); @@ -202,3 +188,18 @@ function isIpAllowedSync(token, ip) { return false; } + +export default { + add, + get, + update, + del, + delByAccessToken, + delExpired, + delByUserIdAndType, + listByUserId, + getByAccessToken, + hasScope, + isIpAllowedSync, + SCOPES, +}; diff --git a/src/translations.js b/src/translations.js index fd08913b0..db4c0ed70 100644 --- a/src/translations.js +++ b/src/translations.js @@ -1,5 +1,5 @@ import assert from 'node:assert'; -import * as cloudron from './cloudron.js'; +import cloudron from './cloudron.js'; import debugModule from 'debug'; import fs from 'node:fs'; import path from 'node:path'; @@ -8,11 +8,6 @@ import safe from 'safetydance'; const debug = debugModule('box:translation'); -export { - translate, - getTranslations, - listLanguages -}; // to be used together with getTranslations() => { translations, fallback } function translate(input, assets) { @@ -73,3 +68,9 @@ async function listLanguages() { const languages = jsonFiles.map(function (file) { return path.basename(file, '.json'); }); return languages; } + +export default { + translate, + getTranslations, + listLanguages +}; diff --git a/src/underscore.js b/src/underscore.js index 5457098eb..6b2ae88d3 100644 --- a/src/underscore.js +++ b/src/underscore.js @@ -1,12 +1,5 @@ import assert from 'node:assert'; -export { - pick, - omit, - intersection, - isEqual, - difference -}; // IMPORTANT: this file is required from the migration logic. avoid requires @@ -54,3 +47,11 @@ function difference(array, values) { const valueSet = new Set(values); return array.filter(item => !valueSet.has(item)); } + +export default { + pick, + omit, + intersection, + isEqual, + difference +}; diff --git a/src/updater.js b/src/updater.js index 15626b26c..3a58ba7d3 100644 --- a/src/updater.js +++ b/src/updater.js @@ -1,51 +1,34 @@ import apps from './apps.js'; -import * as appstore from './appstore.js'; +import appstore from './appstore.js'; import assert from 'node:assert'; import AuditSource from './auditsource.js'; import BoxError from './boxerror.js'; -import * as backupSites from './backupsites.js'; -import * as backuptask from './backuptask.js'; -import * as community from './community.js'; +import backupSites from './backupsites.js'; +import backuptask from './backuptask.js'; +import community from './community.js'; import constants from './constants.js'; -import * as cron from './cron.js'; +import cron from './cron.js'; import { CronTime } from 'cron'; import crypto from 'node:crypto'; import debugModule from 'debug'; -import * as df from './df.js'; +import df from './df.js'; import eventlog from './eventlog.js'; import fs from 'node:fs'; import locks from './locks.js'; -import * as notifications from './notifications.js'; +import notifications from './notifications.js'; import os from 'node:os'; import path from 'node:path'; import paths from './paths.js'; import promiseRetry from './promise-retry.js'; import safe from 'safetydance'; import semver from 'semver'; -import * as settings from './settings.js'; +import settings from './settings.js'; import shellModule from './shell.js'; import tasks from './tasks.js'; const debug = debugModule('box:updater'); const shell = shellModule('updater'); -export { - setAutoupdatePattern, - getAutoupdatePattern, - - startBoxUpdateTask, - updateBox, - - autoUpdate, - - notifyBoxUpdate, - - checkForUpdates, - checkAppUpdate, - checkBoxUpdate, - - getBoxUpdate, -}; const RELEASES_PUBLIC_KEY = path.join(import.meta.dirname, 'releases.gpg'); const UPDATE_CMD = path.join(import.meta.dirname, 'scripts/update.sh'); @@ -380,3 +363,21 @@ async function checkForUpdates(options) { // raise notifications here because the updatechecker runs regardless of auto-updater cron job await raiseNotifications(); } + +export default { + setAutoupdatePattern, + getAutoupdatePattern, + + startBoxUpdateTask, + updateBox, + + autoUpdate, + + notifyBoxUpdate, + + checkForUpdates, + checkAppUpdate, + checkBoxUpdate, + + getBoxUpdate, +}; diff --git a/src/user-directory.js b/src/user-directory.js index 35a0772f4..3b07249f1 100644 --- a/src/user-directory.js +++ b/src/user-directory.js @@ -4,17 +4,13 @@ import constants from './constants.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; import oidcClients from './oidcclients.js'; -import * as oidcServer from './oidcserver.js'; -import * as settings from './settings.js'; -import * as tokens from './tokens.js'; -import * as users from './users.js'; +import oidcServer from './oidcserver.js'; +import settings from './settings.js'; +import tokens from './tokens.js'; +import users from './users.js'; const debug = debugModule('box:user-directory'); -export { - getProfileConfig, - setProfileConfig -}; async function getProfileConfig() { const value = await settings.getJson(settings.PROFILE_CONFIG_KEY); @@ -48,3 +44,8 @@ async function setProfileConfig(profileConfig, options, auditSource) { } } } + +export default { + getProfileConfig, + setProfileConfig +}; diff --git a/src/users.js b/src/users.js index 3da12906c..18a436d2b 100644 --- a/src/users.js +++ b/src/users.js @@ -1,32 +1,32 @@ -import * as appPasswords from './apppasswords.js'; +import appPasswords from './apppasswords.js'; import assert from 'node:assert'; import BoxError from './boxerror.js'; import crypto from 'node:crypto'; import constants from './constants.js'; -import * as dashboard from './dashboard.js'; -import * as database from './database.js'; +import dashboard from './dashboard.js'; +import database from './database.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; -import * as externalLdap from './externalldap.js'; +import externalLdap from './externalldap.js'; import hat from './hat.js'; -import * as mail from './mail.js'; -import * as mailer from './mailer.js'; +import mail from './mail.js'; +import mailer from './mailer.js'; import mysql from 'mysql2'; -import * as notifications from './notifications.js'; +import notifications from './notifications.js'; import oidcClients from './oidcclients.js'; -import * as passkeys from './passkeys.js'; +import passkeys from './passkeys.js'; import qrcode from 'qrcode'; import safe from 'safetydance'; -import * as settings from './settings.js'; +import settings from './settings.js'; import speakeasy from 'speakeasy'; -import * as tokens from './tokens.js'; -import * as translations from './translations.js'; +import tokens from './tokens.js'; +import translations from './translations.js'; import { UAParser as uaParser } from 'ua-parser-js'; -import * as userDirectory from './user-directory.js'; +import userDirectory from './user-directory.js'; import superagent from '@cloudron/superagent'; import util from 'node:util'; -import * as validator from './validator.js'; -import * as _ from './underscore.js'; +import validator from './validator.js'; +import _ from './underscore.js'; const debug = debugModule('box:user'); @@ -38,55 +38,6 @@ const ROLE_USER_MANAGER = 'usermanager'; const ROLE_MAIL_MANAGER = 'mailmanager'; const ROLE_OWNER = 'owner'; -export { - removePrivateFields, - add, - createOwner, - isActivated, - list, - listPaged, - get, - getByInviteToken, - getByResetToken, - getByUsername, - getByEmail, - getOwner, - getAdmins, - getSuperadmins, - verifyWithId, - verifyWithUsername, - verifyWithEmail, - setPassword, - setGhost, - updateProfile, - update, - del, - setTwoFactorAuthenticationSecret, - enableTwoFactorAuthentication, - disableTwoFactorAuthentication, - sendPasswordResetByIdentifier, - getPasswordResetLink, - sendPasswordResetEmail, - getInviteLink, - sendInviteEmail, - notifyLoginLocation, - setupAccount, - setAvatar, - getAvatar, - getBackgroundImage, - setBackgroundImage, - setNotificationConfig, - resetSources, - parseDisplayName, - AP_MAIL, - AP_WEBADMIN, - ROLE_ADMIN, - ROLE_USER, - ROLE_USER_MANAGER, - ROLE_MAIL_MANAGER, - ROLE_OWNER, - compareRoles, -}; // the avatar and backgroundImage fields are special and not added here to reduce response sizes const USERS_FIELDS = [ 'id', 'username', 'email', 'fallbackEmail', 'password', 'salt', 'creationTime', 'inviteToken', 'resetToken', 'displayName', 'language', @@ -1046,3 +997,52 @@ function parseDisplayName(displayName) { return { firstName, lastName, middleName }; } +export default { + removePrivateFields, + add, + createOwner, + isActivated, + list, + listPaged, + get, + getByInviteToken, + getByResetToken, + getByUsername, + getByEmail, + getOwner, + getAdmins, + getSuperadmins, + verifyWithId, + verifyWithUsername, + verifyWithEmail, + setPassword, + setGhost, + updateProfile, + update, + del, + setTwoFactorAuthenticationSecret, + enableTwoFactorAuthentication, + disableTwoFactorAuthentication, + sendPasswordResetByIdentifier, + getPasswordResetLink, + sendPasswordResetEmail, + getInviteLink, + sendInviteEmail, + notifyLoginLocation, + setupAccount, + setAvatar, + getAvatar, + getBackgroundImage, + setBackgroundImage, + setNotificationConfig, + resetSources, + parseDisplayName, + AP_MAIL, + AP_WEBADMIN, + ROLE_ADMIN, + ROLE_USER, + ROLE_USER_MANAGER, + ROLE_MAIL_MANAGER, + ROLE_OWNER, + compareRoles, +}; diff --git a/src/validator.js b/src/validator.js index 0db0c70a0..cd9946796 100644 --- a/src/validator.js +++ b/src/validator.js @@ -1,8 +1,5 @@ import assert from 'node:assert'; -export { - isEmail -}; // this currently does not match: "john.doe"@example.com, user@[192.168.1.1], john.doe(comment)@example.com or 用户@例子.世界 function isEmail(email) { @@ -13,3 +10,6 @@ function isEmail(email) { return emailRegex.test(email); } +export default { + isEmail +}; diff --git a/src/volumes.js b/src/volumes.js index d78e4464c..86c9a4e78 100644 --- a/src/volumes.js +++ b/src/volumes.js @@ -1,7 +1,7 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; import crypto from 'node:crypto'; -import * as database from './database.js'; +import database from './database.js'; import debugModule from 'debug'; import eventlog from './eventlog.js'; import mounts from './mounts.js'; @@ -14,18 +14,6 @@ const debug = debugModule('box:volumes'); const _validateHostPath = validateHostPath; -export { - add, - get, - update, - del, - list, - remount, - getStatus, - removePrivateFields, - mountAll, - _validateHostPath, -}; const VOLUMES_FIELDS = [ 'id', 'name', 'hostPath', 'creationTime', 'mountType', 'mountOptionsJson' ].join(','); @@ -217,3 +205,16 @@ async function mountAll() { await mounts.tryAddMount(mount, { timeout: 10, skipCleanup: true }); // have to wait to avoid race with apptask } } + +export default { + add, + get, + update, + del, + list, + remount, + getStatus, + removePrivateFields, + mountAll, + _validateHostPath, +}; diff --git a/src/wellknown.js b/src/wellknown.js index d9f4ab47d..aef38a5dc 100644 --- a/src/wellknown.js +++ b/src/wellknown.js @@ -1,17 +1,14 @@ import assert from 'node:assert'; import BoxError from './boxerror.js'; -import * as dashboard from './dashboard.js'; -import * as domains from './domains.js'; +import dashboard from './dashboard.js'; +import domains from './domains.js'; import ejs from 'ejs'; import fs from 'node:fs'; -import * as mail from './mail.js'; -import * as mailServer from './mailserver.js'; +import mail from './mail.js'; +import mailServer from './mailserver.js'; import safe from 'safetydance'; import superagent from '@cloudron/superagent'; -export { - get -}; const MAIL_AUTOCONFIG_EJS = fs.readFileSync(import.meta.dirname + '/autoconfig.xml.ejs', { encoding: 'utf8' }); @@ -49,3 +46,7 @@ async function get(domain, location) { throw new BoxError(BoxError.NOT_FOUND, 'No custom well-known config'); } } + +export default { + get +}; diff --git a/syslog.js b/syslog.js index f6ea6acff..b1f452fc7 100755 --- a/syslog.js +++ b/syslog.js @@ -9,10 +9,6 @@ import util from 'node:util'; const debug = debugModule('syslog:server'); -export { - start, - stop -}; let gServer = null; @@ -100,3 +96,8 @@ async function main() { if (process.argv[1] === import.meta.filename) { main(); } + +export default { + start, + stop +};