diff --git a/src/docker.js b/src/docker.js index ea512a9ba..f910e3491 100644 --- a/src/docker.js +++ b/src/docker.js @@ -331,7 +331,7 @@ function createSubcontainer(app, name, cmd, options, callback) { getMounts(app, async function (error, mounts) { if (error) return callback(error); - const [getEnvError, addonEnv] = await services.getEnvironment(app); + const [getEnvError, addonEnv] = await safe(services.getEnvironment(app)); if (getEnvError) return callback(getEnvError); let containerOptions = { diff --git a/src/services.js b/src/services.js index 02f5540b3..4f2da80e0 100644 --- a/src/services.js +++ b/src/services.js @@ -1084,13 +1084,13 @@ function setupSendMail(app, options, callback) { if (disabled) return setAddonConfig(app.id, 'sendmail', [], callback); getAddonConfigByName(app.id, 'sendmail', '%MAIL_SMTP_PASSWORD', function (error, existingPassword) { - if (error && error.reason !== BoxError.NOT_FOUND) return callback(error); + if (error) return callback(error); - var password = error ? hat(4 * 48) : existingPassword; // see box#565 for password length + const password = existingPassword || hat(4 * 48); // see box#565 for password length const envPrefix = app.manifest.manifestVersion <= 1 ? '' : 'CLOUDRON_'; - var env = [ + const env = [ { name: `${envPrefix}MAIL_SMTP_SERVER`, value: 'mail' }, { name: `${envPrefix}MAIL_SMTP_PORT`, value: '2525' }, { name: `${envPrefix}MAIL_SMTPS_PORT`, value: '2465' }, @@ -1123,13 +1123,13 @@ function setupRecvMail(app, options, callback) { debugApp(app, 'Setting up recvmail'); getAddonConfigByName(app.id, 'recvmail', '%MAIL_IMAP_PASSWORD', function (error, existingPassword) { - if (error && error.reason !== BoxError.NOT_FOUND) return callback(error); + if (error) return callback(error); - var password = error ? hat(4 * 48) : existingPassword; // see box#565 for password length + const password = existingPassword || hat(4 * 48); // see box#565 for password length const envPrefix = app.manifest.manifestVersion <= 1 ? '' : 'CLOUDRON_'; - var env = [ + const env = [ { name: `${envPrefix}MAIL_IMAP_SERVER`, value: 'mail' }, { name: `${envPrefix}MAIL_IMAP_PORT`, value: '9993' }, { name: `${envPrefix}MAIL_IMAP_USERNAME`, value: app.mailboxName + '@' + app.mailboxDomain }, @@ -1222,7 +1222,7 @@ function setupMySql(app, options, callback) { debugApp(app, 'Setting up mysql'); getAddonConfigByName(app.id, 'mysql', '%MYSQL_PASSWORD', function (error, existingPassword) { - if (error && error.reason !== BoxError.NOT_FOUND) return callback(error); + if (error) return callback(error); const tmp = mysqlDatabaseName(app.id); @@ -1230,7 +1230,7 @@ function setupMySql(app, options, callback) { database: tmp, prefix: tmp, username: tmp, - password: error ? hat(4 * 48) : existingPassword // see box#362 for password length + password: existingPassword || hat(4 * 48) // see box#362 for password length }; getContainerDetails('mysql', 'CLOUDRON_MYSQL_TOKEN', function (error, result) { @@ -1442,12 +1442,12 @@ function setupPostgreSql(app, options, callback) { const { database, username } = postgreSqlNames(app.id); getAddonConfigByName(app.id, 'postgresql', '%POSTGRESQL_PASSWORD', function (error, existingPassword) { - if (error && error.reason !== BoxError.NOT_FOUND) return callback(error); + if (error) return callback(error); const data = { database: database, username: username, - password: error ? hat(4 * 128) : existingPassword, + password: existingPassword || hat(4 * 128), locale: options.locale || 'C' }; @@ -1661,15 +1661,17 @@ function setupMongoDb(app, options, callback) { debugApp(app, 'Setting up mongodb'); getAddonConfigByName(app.id, 'mongodb', '%MONGODB_PASSWORD', function (error, existingPassword) { - if (error && error.reason !== BoxError.NOT_FOUND) return callback(error); + if (error) return callback(error); getAddonConfigByName(app.id, 'mongodb', '%MONGODB_DATABASE', function (error, database) { + if (error) return callback(error); + database = database || hat(8 * 8); // 16 bytes. keep this short, so as to not overflow the 127 byte index length in MongoDB < 4.4 const data = { - database: database, + database, username: app.id, - password: error ? hat(4 * 128) : existingPassword, + password: existingPassword || hat(4 * 128), oplog: !!options.oplog }; @@ -1713,6 +1715,7 @@ function clearMongodb(app, options, callback) { getAddonConfigByName(app.id, 'mongodb', '%MONGODB_DATABASE', function (error, database) { if (error) return callback(error); + if (!database) return callback(new BoxError(BoxError.NOT_FOUND, 'Error clearing mongodb. No database')); request.post(`https://${result.ip}:3000/databases/${database}/clear?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { if (error) return callback(new BoxError(BoxError.ADDONS_ERROR, `Network error clearing mongodb: ${error.message}`)); @@ -1733,8 +1736,8 @@ function teardownMongoDb(app, options, callback) { if (error) return callback(error); getAddonConfigByName(app.id, 'mongodb', '%MONGODB_DATABASE', function (error, database) { - if (error && error.reason === BoxError.NOT_FOUND) return callback(null); if (error) return callback(error); + if (!database) return callback(null); request.delete(`https://${result.ip}:3000/databases/${database}?access_token=${result.token}`, { json: true, rejectUnauthorized: false }, function (error, response) { if (error) return callback(new BoxError(BoxError.ADDONS_ERROR, `Error tearing down mongodb: ${error.message}`)); @@ -1758,6 +1761,7 @@ function backupMongoDb(app, options, callback) { getAddonConfigByName(app.id, 'mongodb', '%MONGODB_DATABASE', function (error, database) { if (error) return callback(error); + if (!database) return callback(new BoxError(BoxError.NOT_FOUND, 'Error backing up mongodb. No database')); const url = `https://${result.ip}:3000/databases/${database}/backup?access_token=${result.token}`; pipeRequestToFile(url, dumpPath('mongodb', app.id), callback); @@ -1779,6 +1783,7 @@ function restoreMongoDb(app, options, callback) { getAddonConfigByName(app.id, 'mongodb', '%MONGODB_DATABASE', function (error, database) { if (error) return callback(error); + if (!database) return callback(new BoxError(BoxError.NOT_FOUND, 'Error restoring mongodb. No database')); const readStream = fs.createReadStream(dumpPath('mongodb', app.id)); readStream.on('error', (error) => callback(new BoxError(BoxError.FS_ERROR, `Error reading input stream when restoring mongodb: ${error.message}`))); @@ -1909,9 +1914,9 @@ function setupRedis(app, options, callback) { const redisName = 'redis-' + app.id; getAddonConfigByName(app.id, 'redis', '%REDIS_PASSWORD', function (error, existingPassword) { - if (error && error.reason !== BoxError.NOT_FOUND) return callback(error); + if (error) return callback(error); - const redisPassword = options.noPassword ? '' : (error ? hat(4 * 48) : existingPassword); // see box#362 for password length + const redisPassword = options.noPassword ? '' : (existingPassword || hat(4 * 48)); // see box#362 for password length const redisServiceToken = hat(4 * 48); // Compute redis memory limit based on app's memory limit (this is arbitrary) @@ -1942,7 +1947,7 @@ function setupRedis(app, options, callback) { const envPrefix = app.manifest.manifestVersion <= 1 ? '' : 'CLOUDRON_'; - var env = [ + const env = [ { name: `${envPrefix}REDIS_URL`, value: 'redis://redisuser:' + redisPassword + '@redis-' + app.id }, { name: `${envPrefix}REDIS_PASSWORD`, value: redisPassword }, { name: `${envPrefix}REDIS_HOST`, value: redisName },