diff --git a/src/notifications.js b/src/notifications.js index eda5ae943..90334c2e0 100644 --- a/src/notifications.js +++ b/src/notifications.js @@ -17,7 +17,7 @@ exports = module.exports = { ALERT_REBOOT: 'reboot', ALERT_BOX_UPDATE: 'boxUpdate', - alert: alert, + alert, // exported for testing _add: add @@ -113,6 +113,22 @@ function forEachAdmin(options, iterator, callback) { }); } +function forEachSuperadmin(options, iterator, callback) { + assert(Array.isArray(options.skip)); + assert.strictEqual(typeof iterator, 'function'); + assert.strictEqual(typeof callback, 'function'); + + users.getSuperadmins(function (error, result) { + if (error && error.reason === BoxError.NOT_FOUND) return callback(); + if (error) return callback(error); + + // filter out users we want to skip (like the user who did the action or the user the action was performed on) + result = result.filter(function (r) { return options.skip.indexOf(r.id) === -1; }); + + async.each(result, iterator, callback); + }); +} + function oomEvent(eventId, app, addon, containerId, event, callback) { assert.strictEqual(typeof eventId, 'string'); assert.strictEqual(typeof app, 'object'); @@ -249,7 +265,7 @@ function backupFailed(eventId, taskId, errorMessage, callback) { assert.strictEqual(typeof errorMessage, 'string'); assert.strictEqual(typeof callback, 'function'); - forEachAdmin({ skip: [] }, function (admin, callback) { + forEachSuperadmin({ skip: [] }, function (admin, callback) { mailer.backupFailed(admin.email, errorMessage, `${settings.adminOrigin()}/logs.html?taskId=${taskId}`); add(admin.id, eventId, 'Backup failed', `Backup failed: ${errorMessage}. Logs are available [here](/logs.html?taskId=${taskId}).`, callback); }, callback); diff --git a/src/userdb.js b/src/userdb.js index ecaee238f..8d27c2e04 100644 --- a/src/userdb.js +++ b/src/userdb.js @@ -1,23 +1,23 @@ 'use strict'; exports = module.exports = { - get: get, - getByUsername: getByUsername, - getByEmail: getByEmail, - getByAccessToken: getByAccessToken, - getByResetToken: getByResetToken, - getAllWithGroupIds: getAllWithGroupIds, - getAllWithGroupIdsPaged: getAllWithGroupIdsPaged, - getByRole: getByRole, - add: add, - del: del, - update: update, - count: count, + get, + getByUsername, + getByEmail, + getByAccessToken, + getByResetToken, + getAllWithGroupIds, + getAllWithGroupIdsPaged, + getByRole, + add, + del, + update, + count, - addAppPassword: addAppPassword, - getAppPasswords: getAppPasswords, - getAppPassword: getAppPassword, - delAppPassword: delAppPassword, + addAppPassword, + getAppPasswords, + getAppPassword, + delAppPassword, _clear: clear }; diff --git a/src/users.js b/src/users.js index ee2384e7a..915e73255 100644 --- a/src/users.js +++ b/src/users.js @@ -16,6 +16,7 @@ exports = module.exports = { getByResetToken, getByUsername, getAdmins, + getSuperadmins, setPassword, update, createOwner, @@ -496,6 +497,16 @@ function getAdmins(callback) { }); } +function getSuperadmins(callback) { + assert.strictEqual(typeof callback, 'function'); + + userdb.getByRole(exports.ROLE_OWNER, function (error, owners) { + if (error) return callback(error); + + callback(null, owners); + }); +} + function sendPasswordResetByIdentifier(identifier, callback) { assert.strictEqual(typeof identifier, 'string'); assert.strictEqual(typeof callback, 'function');