diff --git a/package-lock.json b/package-lock.json index c6a7b82d8..55501282b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@google-cloud/dns": "^3.0.2", "@google-cloud/storage": "^6.10.1", "async": "^3.2.4", - "aws-sdk": "^2.1343.0", + "aws-sdk": "^2.1377.0", "basic-auth": "^2.0.1", "body-parser": "^1.20.2", "cloudron-manifestformat": "^5.20.0", @@ -38,13 +38,13 @@ "morgan": "^1.10.0", "multiparty": "^4.2.3", "mysql": "^2.18.1", - "nodemailer": "^6.9.1", + "nodemailer": "^6.9.2", "nsyslog-parser": "^0.10.1", "oidc-provider": "^8.2.1", "qrcode": "^1.5.3", "readdirp": "^3.6.0", "safetydance": "^2.2.0", - "semver": "^7.5.0", + "semver": "^7.5.1", "speakeasy": "^2.0.0", "superagent": "^8.0.9", "tar-fs": "github:cloudron-io/tar-fs#ignore_stat_error", @@ -70,7 +70,7 @@ "mocha": "^10.2.0", "mock-aws-s3": "git+https://github.com/cloudron-io/mock-aws-s3.git", "nock": "^13.3.1", - "ssh2": "^1.12.0", + "ssh2": "^1.13.0", "yesno": "^0.4.0" } }, @@ -583,8 +583,9 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/asn1": { - "version": "0.2.4", - "license": "MIT", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { "safer-buffer": "~2.1.0" } @@ -622,9 +623,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1343.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1343.0.tgz", - "integrity": "sha512-p9+bgEeD2HxFMLAl5IyqvxfmFzuzSwyvoKfEaGL3+0Vndztv7TvCbHfKNH6olY9DjyLrq9f34fJ98owGD8sHnQ==", + "version": "2.1377.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1377.0.tgz", + "integrity": "sha512-59T3v/o40fk2I2zpgh2E0Z/BBK5awBQUva7VLjLHo9rsMvTM58mgya667hYTua00rHC1A3GJSCNORUhXvhomYQ==", "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -635,7 +636,7 @@ "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", - "xml2js": "0.4.19" + "xml2js": "0.5.0" }, "engines": { "node": ">= 10.0.0" @@ -648,14 +649,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/aws-sdk/node_modules/xml2js": { - "version": "0.4.19", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, "node_modules/backoff": { "version": "2.5.0", "license": "MIT", @@ -4115,9 +4108,9 @@ } }, "node_modules/nodemailer": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", - "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.2.tgz", + "integrity": "sha512-4+TYaa/e1nIxQfyw/WzNPYTEZ5OvHIDEnmjs4LPmIfccPQN+2CYKmGHjWixn/chzD3bmUTu5FMfpltizMxqzdg==", "engines": { "node": ">=6.0.0" } @@ -4837,9 +4830,9 @@ } }, "node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5022,20 +5015,20 @@ } }, "node_modules/ssh2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.12.0.tgz", - "integrity": "sha512-7mcLu8biO6/BjQQ1iCjCmuBiF0hXxo+JlHpJBPDTVsxU7evscWWiRUgYF5XIs4gLKmiPRHA0maund11QLWyDJg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.13.0.tgz", + "integrity": "sha512-CIZBFRRY1y9mAZSqBGFE4EB4dNJad2ysT2PqO8OpkiI3UTB/gUZwE5EaN16qVyQ6s/M7EgC/iaV/MnjdlvnuzA==", "dev": true, "hasInstallScript": true, "dependencies": { - "asn1": "^0.2.4", + "asn1": "^0.2.6", "bcrypt-pbkdf": "^1.0.2" }, "engines": { "node": ">=10.16.0" }, "optionalDependencies": { - "cpu-features": "~0.0.6", + "cpu-features": "~0.0.7", "nan": "^2.17.0" } }, @@ -5818,13 +5811,6 @@ "node": ">=4.0" } }, - "node_modules/xmlbuilder": { - "version": "9.0.7", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlchars": { "version": "2.2.0", "license": "MIT" diff --git a/src/cloudron.js b/src/cloudron.js index a72684c6c..fbca3479b 100644 --- a/src/cloudron.js +++ b/src/cloudron.js @@ -35,7 +35,6 @@ const apps = require('./apps.js'), constants = require('./constants.js'), cron = require('./cron.js'), debug = require('debug')('box:cloudron'), - delay = require('./delay.js'), dns = require('./dns.js'), dockerProxy = require('./dockerproxy.js'), eventlog = require('./eventlog.js'), @@ -54,6 +53,7 @@ const apps = require('./apps.js'), shell = require('./shell.js'), sysinfo = require('./sysinfo.js'), tasks = require('./tasks.js'), + timers = require('timers/promises'), users = require('./users.js'); const REBOOT_CMD = path.join(__dirname, 'scripts/reboot.sh'); @@ -85,7 +85,7 @@ async function onActivated(options) { // disable responding to api calls via IP to not leak domain info. this is carefully placed as the last item, so it buys // the UI some time to query the dashboard domain in the restore code path - await delay(30000); + await timers.setTimeout(30000); await reverseProxy.writeDefaultConfig({ activated :true }); } diff --git a/src/delay.js b/src/delay.js deleted file mode 100644 index b013440ee..000000000 --- a/src/delay.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -exports = module.exports = delay; - -const assert = require('assert'); - -function delay(msecs) { - assert.strictEqual(typeof msecs, 'number'); - - return new Promise(function (resolve) { - setTimeout(resolve, msecs); - }); -} diff --git a/src/docker.js b/src/docker.js index 8c9d7db11..38bc98630 100644 --- a/src/docker.js +++ b/src/docker.js @@ -37,7 +37,6 @@ const apps = require('./apps.js'), BoxError = require('./boxerror.js'), constants = require('./constants.js'), debug = require('debug')('box:docker'), - delay = require('./delay.js'), Docker = require('dockerode'), paths = require('./paths.js'), promiseRetry = require('./promise-retry.js'), @@ -46,6 +45,7 @@ const apps = require('./apps.js'), shell = require('./shell.js'), safe = require('safetydance'), system = require('./system.js'), + timers = require('timers/promises'), volumes = require('./volumes.js'), _ = require('underscore'); @@ -648,7 +648,7 @@ async function update(name, memory, memorySwap) { for (let times = 0; times < 10; times++) { const [error] = await safe(shell.promises.spawn(`update(${name})`, '/usr/bin/docker', args, { })); if (!error) return; - await delay(60 * 1000); + await timers.setTimeout(60 * 1000); } throw new BoxError(BoxError.DOCKER_ERROR, 'Unable to update container'); diff --git a/src/platform.js b/src/platform.js index 87fa1d2a7..be8ff5721 100644 --- a/src/platform.js +++ b/src/platform.js @@ -13,7 +13,6 @@ const apps = require('./apps.js'), BoxError = require('./boxerror.js'), constants = require('./constants.js'), debug = require('debug')('box:platform'), - delay = require('./delay.js'), fs = require('fs'), infra = require('./infra_version.js'), locker = require('./locker.js'), @@ -23,6 +22,7 @@ const apps = require('./apps.js'), services = require('./services.js'), shell = require('./shell.js'), tasks = require('./tasks.js'), + timers = require('timers/promises'), volumes = require('./volumes.js'), _ = require('underscore'); @@ -74,7 +74,7 @@ async function start(options) { const retry = error.reason === BoxError.DATABASE_ERROR && (error.code === 'PROTOCOL_CONNECTION_LOST' || error.code === 'ECONNREFUSED'); debug(`Failed to start services. retry=${retry} (attempt ${attempt}): ${error.message}`); if (!retry) throw error; // refuse to start - await delay(10000); + await timers.setTimeout(10000); } } diff --git a/src/promise-retry.js b/src/promise-retry.js index a32b53a1d..c55f039c2 100644 --- a/src/promise-retry.js +++ b/src/promise-retry.js @@ -3,7 +3,7 @@ exports = module.exports = promiseRetry; const assert = require('assert'), - delay = require('./delay.js'), + timers = require('timers/promises'), util = require('util'); async function promiseRetry(options, asyncFunction) { @@ -19,7 +19,7 @@ async function promiseRetry(options, asyncFunction) { if (i === times - 1) throw error; if (options.retry && !options.retry(error)) throw error; // no more retry if (options.debug) options.debug(`Attempt ${i+1} failed. Will retry: ${error.message}`); - await delay(interval); + await timers.setTimeout(interval); } } } diff --git a/src/routes/test/api-test.js b/src/routes/test/api-test.js index 0653299a6..8fed018c1 100644 --- a/src/routes/test/api-test.js +++ b/src/routes/test/api-test.js @@ -7,9 +7,9 @@ 'use strict'; const common = require('./common.js'), - delay = require('../../delay.js'), expect = require('expect.js'), superagent = require('superagent'), + timers = require('timers/promises'), tokens = require('../../tokens.js'); describe('REST API', function () { @@ -93,7 +93,7 @@ describe('REST API', function () { .set('Authorization', 'Bearer ' + token2.accessToken); expect(response.statusCode).to.be(200); - await delay(3000); // wait for token to expire + await timers.setTimeout(3000); // wait for token to expire const response2 = await superagent.get(`${serverUrl}/api/v1/users/${user.id}`) .set('Authorization', 'Bearer ' + token2.accessToken) diff --git a/src/routes/test/common.js b/src/routes/test/common.js index 040851c25..c9a466f0b 100644 --- a/src/routes/test/common.js +++ b/src/routes/test/common.js @@ -2,7 +2,6 @@ const constants = require('../../constants.js'), database = require('../../database.js'), - delay = require('../../delay.js'), expect = require('expect.js'), fs = require('fs'), mailer = require('../../mailer.js'), @@ -13,6 +12,7 @@ const constants = require('../../constants.js'), support = require('../../support.js'), superagent = require('superagent'), tasks = require('../../tasks.js'), + timers = require('timers/promises'), tokens = require('../../tokens.js'); exports = module.exports = { @@ -75,7 +75,7 @@ async function setup() { .send({ domainConfig: { provider: 'noop', domain: exports.dashboardDomain, config: {}, tlsConfig: { provider: 'fallback' } } }); expect(response.status).to.eql(200); - await delay(2000); + await timers.setTimeout(2000); // create admin response = await superagent.post(`${serverUrl}/api/v1/cloudron/activate`) @@ -119,7 +119,7 @@ function clearMailQueue() { } async function checkMails(number) { - await delay(1000); + await timers.setTimeout(1000); expect(mailer._mailQueue.length).to.equal(number); clearMailQueue(); } @@ -133,7 +133,7 @@ async function waitForTask(taskId) { if (result.success) return result; throw new Error(`Task ${taskId} failed: ${result.error.message} - ${result.error.stack}`); } - await delay(2000); + await timers.setTimeout(2000); console.log(`Waiting for task to ${taskId} finish`); } throw new Error(`Task ${taskId} never finished`); diff --git a/src/routes/test/provision-test.js b/src/routes/test/provision-test.js index f5e09fb29..7dc437333 100644 --- a/src/routes/test/provision-test.js +++ b/src/routes/test/provision-test.js @@ -7,9 +7,9 @@ const common = require('./common.js'); -const delay = require('../../delay.js'), - expect = require('expect.js'), - superagent = require('superagent'); +const expect = require('expect.js'), + superagent = require('superagent'), + timers = require('timers/promises'); const DOMAIN = 'example-server-test.com'; @@ -27,7 +27,7 @@ describe('Provision', function () { if (response.status === 200 && !response.body.setup.active && response.body.setup.errorMessage === '' && response.body.adminFqdn) return; - await delay(4000); + await timers.setTimeout(4000); } throw new Error(`Setup did not complete. status: ${response.status} body: ${JSON.stringify(response.body)}`); diff --git a/src/test/backupcleaner-test.js b/src/test/backupcleaner-test.js index 37dc41967..2557f598a 100644 --- a/src/test/backupcleaner-test.js +++ b/src/test/backupcleaner-test.js @@ -9,11 +9,11 @@ const backupCleaner = require('../backupcleaner.js'), backups = require('../backups.js'), common = require('./common.js'), - delay = require('../delay.js'), expect = require('expect.js'), moment = require('moment'), settings = require('../settings.js'), - tasks = require('../tasks.js'); + tasks = require('../tasks.js'), + timers = require('timers/promises'); describe('backup cleaner', function () { const { setup, cleanup, app } = common; @@ -226,7 +226,7 @@ describe('backup cleaner', function () { // eslint-disable-next-line no-constant-condition while (true) { - await delay(1000); + await timers.setTimeout(1000); const p = await tasks.get(taskId); @@ -247,7 +247,7 @@ describe('backup cleaner', function () { BACKUP_0_BOX.dependsOn = [ BACKUP_0_APP_0.id, BACKUP_0_APP_1.id ]; BACKUP_0_BOX.id = await backups.add(BACKUP_0_BOX); - await delay(2000); // space out backups + await timers.setTimeout(2000); // space out backups BACKUP_1_APP_0.id = await backups.add(BACKUP_1_APP_0); BACKUP_1_APP_1.id = await backups.add(BACKUP_1_APP_1); @@ -284,7 +284,7 @@ describe('backup cleaner', function () { backup.id = await backups.add(backup); } - await delay(2000); // wait for expiration + await timers.setTimeout(2000); // wait for expiration await cleanupBackups(); diff --git a/src/test/backuptask-test.js b/src/test/backuptask-test.js index ca921cc4e..efa81979f 100644 --- a/src/test/backuptask-test.js +++ b/src/test/backuptask-test.js @@ -8,13 +8,13 @@ const backups = require('../backups.js'), common = require('./common.js'), - delay = require('../delay.js'), expect = require('expect.js'), fs = require('fs'), os = require('os'), path = require('path'), settings = require('../settings.js'), - tasks = require('../tasks.js'); + tasks = require('../tasks.js'), + timers = require('timers/promises'); describe('backuptask', function () { const { setup, cleanup } = common; @@ -48,7 +48,7 @@ describe('backuptask', function () { // eslint-disable-next-line no-constant-condition while (true) { - await delay(1000); + await timers.setTimeout(1000); const p = await tasks.get(taskId); @@ -61,7 +61,7 @@ describe('backuptask', function () { if (result.length !== 1) throw new Error('result is not of length 1'); // the task progress and the db entry is set in the worker. wait for 2 seconds for backup lock to get released in parent process - await delay(2000); + await timers.setTimeout(2000); return result[0]; } diff --git a/src/test/common.js b/src/test/common.js index 7594a61d8..c330c8742 100644 --- a/src/test/common.js +++ b/src/test/common.js @@ -3,7 +3,6 @@ const apps = require('../apps.js'), constants = require('../constants.js'), database = require('../database.js'), - delay = require('../delay.js'), domains = require('../domains.js'), expect = require('expect.js'), fs = require('fs'), @@ -13,6 +12,7 @@ const apps = require('../apps.js'), paths = require('../paths.js'), settings = require('../settings.js'), tasks = require('../tasks.js'), + timers = require('timers/promises'), users = require('../users.js'); const manifest = { @@ -45,30 +45,30 @@ const manifest = { // copied from the proxy app CloudronManifest.json const proxyAppManifest = { - "id": "io.cloudron.builtin.appproxy", - "title": "App Proxy", - "author": "Cloudron Team", - "version": "1.0.0", - "upstreamVersion": "1.0.0", - "description": "file://DESCRIPTION.md", - "tagline": "Proxy an app through Cloudron", - "tags": [ "proxy", "external" ], - "healthCheckPath": "/", - "httpPort": 3000, - "minBoxVersion": "7.3.0", - "dockerImage": "istobeignored", - "manifestVersion": 2, - "multiDomain": true, - "website": "https://cloudron.io", - "documentationUrl": "https://docs.cloudron.io/dashboard/#app-proxy", - "forumUrl": "https://forum.cloudron.io", - "contactEmail": "support@cloudron.io", - "icon": "file://logo.png", - "addons": {}, - "mediaLinks": [ - "https://screenshots.cloudron.io/io.cloudron.builtin.appproxy/diagram.png" - ], - "changelog": "file://CHANGELOG.md" + 'id': 'io.cloudron.builtin.appproxy', + 'title': 'App Proxy', + 'author': 'Cloudron Team', + 'version': '1.0.0', + 'upstreamVersion': '1.0.0', + 'description': 'file://DESCRIPTION.md', + 'tagline': 'Proxy an app through Cloudron', + 'tags': [ 'proxy', 'external' ], + 'healthCheckPath': '/', + 'httpPort': 3000, + 'minBoxVersion': '7.3.0', + 'dockerImage': 'istobeignored', + 'manifestVersion': 2, + 'multiDomain': true, + 'website': 'https://cloudron.io', + 'documentationUrl': 'https://docs.cloudron.io/dashboard/#app-proxy', + 'forumUrl': 'https://forum.cloudron.io', + 'contactEmail': 'support@cloudron.io', + 'icon': 'file://logo.png', + 'addons': {}, + 'mediaLinks': [ + 'https://screenshots.cloudron.io/io.cloudron.builtin.appproxy/diagram.png' + ], + 'changelog': 'file://CHANGELOG.md' }; const domain = { @@ -249,7 +249,7 @@ function clearMailQueue() { } async function checkMails(number) { - await delay(1000); + await timers.setTimeout(1000); expect(mailer._mailQueue.length).to.equal(number); const emails = mailer._mailQueue; clearMailQueue(); diff --git a/src/test/eventlog-test.js b/src/test/eventlog-test.js index 6bd5a4223..28db75067 100644 --- a/src/test/eventlog-test.js +++ b/src/test/eventlog-test.js @@ -8,10 +8,10 @@ const common = require('./common.js'), database = require('../database.js'), - delay = require('../delay.js'), eventlog = require('../eventlog.js'), expect = require('expect.js'), - notifications = require('../notifications.js'); + notifications = require('../notifications.js'), + timers = require('timers/promises'); describe('Eventlog', function () { const { setup, cleanup } = common; @@ -89,7 +89,7 @@ describe('Eventlog', function () { let result = await eventlog.get(loginEventId); const oldCreationTime = result.creationTime; - await delay(2000); + await timers.setTimeout(2000); result = await eventlog.upsertLoginEvent('user.login', { ip: '1.2.3.4' }, { appId: 'thatapp' }); expect(result).to.equal(loginEventId); @@ -117,7 +117,7 @@ describe('Eventlog', function () { await notifications._add('title', 'some message', { eventId }); } - await delay(3000); + await timers.setTimeout(3000); const id = await eventlog.add(eventlog.ACTION_USER_LOGIN, { ip: '1.2.3.4' }, { appId: 'thatapp' }); diff --git a/src/test/notifications-test.js b/src/test/notifications-test.js index 1d60c5372..c79061c82 100644 --- a/src/test/notifications-test.js +++ b/src/test/notifications-test.js @@ -8,10 +8,10 @@ const BoxError = require('../boxerror.js'), common = require('./common.js'), - delay = require('../delay.js'), expect = require('expect.js'), notifications = require('../notifications.js'), - safe = require('safetydance'); + safe = require('safetydance'), + timers = require('timers/promises'); const EVENT_0 = { id: 'event_0', @@ -34,7 +34,7 @@ describe('Notifications', function () { expect(error).to.equal(null); expect(id).to.be.a('string'); notificationIds.push(id); - await delay(1000); + await timers.setTimeout(1000); } });