diff --git a/migrations/20160208164735-groups-add-admin.js b/migrations/20160208164735-groups-add-admin.js index 2eedc9836..0986f4c16 100644 --- a/migrations/20160208164735-groups-add-admin.js +++ b/migrations/20160208164735-groups-add-admin.js @@ -2,7 +2,7 @@ var async = require('async'); -var ADMIN_GROUP_ID = 'admin'; // see groups.js +var ADMIN_GROUP_ID = 'admin'; // see constants.js exports.up = function(db, callback) { async.series([ diff --git a/migrations/20171026212925-apps-add-domain.js b/migrations/20171026212925-apps-add-domain.js index 9b28d50fa..7c99426c8 100644 --- a/migrations/20171026212925-apps-add-domain.js +++ b/migrations/20171026212925-apps-add-domain.js @@ -39,6 +39,18 @@ exports.up = function(db, callback) { function addAppsLocationDomainUniqueConstraint(done) { db.runSql('ALTER TABLE apps ADD UNIQUE location_domain_unique_index (location, domain)', [], done); }, + function removePresetupAdminGroupIfNew(done) { + // do not delete on update, will update the record in setMailboxesDomain() + if (domain.fqdn) return done(); + + // this will be finally created once we have a domain when we create the owner in user.js + const ADMIN_GROUP_ID = 'admin'; // see constants.js + db.runSql('DELETE FROM groups WHERE id = ?', [ ADMIN_GROUP_ID ], function (error) { + if (error) return done(error); + + db.runSql('DELETE FROM mailboxes WHERE ownerId = ?', [ ADMIN_GROUP_ID ], done); + }); + }, function addMailboxesDomainColumn(done) { db.runSql('ALTER TABLE mailboxes ADD COLUMN domain VARCHAR(128)', [], done); }, @@ -59,19 +71,15 @@ exports.down = function(db, callback) { async.series([ db.runSql.bind(db, 'START TRANSACTION;'), function dropMailboxesDomainColumn(done) { - // done(); db.runSql('ALTER TABLE mailboxes DROP COLUMN domain', [], done); }, function dropLocationDomainUniqueConstraint(done) { - // done(); db.runSql('ALTER TABLE apps DROP INDEX location_domain_unique_index', [], done); }, function dropAppsDomainColumn(done) { - // done(); db.runSql('ALTER TABLE apps DROP COLUMN domain', [], done); }, function addAppsLocationUniqueConstraint(done) { - // done(); db.runSql('ALTER TABLE apps ADD UNIQUE location (location)', [], done); }, db.runSql.bind(db, 'COMMIT') diff --git a/src/constants.js b/src/constants.js index 793aba4a8..da8ca1bd5 100644 --- a/src/constants.js +++ b/src/constants.js @@ -19,8 +19,8 @@ exports = module.exports = { ADMIN_NAME: 'Settings', ADMIN_CLIENT_ID: 'webadmin', // oauth client id - ADMIN_APPID: 'admin', // admin appid (settingsdb) + ADMIN_GROUP_NAME: 'admin', ADMIN_GROUP_ID: 'admin', NGINX_ADMIN_CONFIG_FILE_NAME: 'admin.conf', diff --git a/src/user.js b/src/user.js index ff9fc1ac6..2d66f48ee 100644 --- a/src/user.js +++ b/src/user.js @@ -32,6 +32,7 @@ var assert = require('assert'), debug = require('debug')('box:user'), DatabaseError = require('./databaseerror.js'), eventlog = require('./eventlog.js'), + groupdb = require('./groupdb.js'), groups = require('./groups.js'), GroupError = groups.GroupError, hat = require('hat'), @@ -551,13 +552,19 @@ function createOwner(username, password, email, displayName, auditSource, callba if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error)); if (count !== 0) return callback(new UserError(UserError.ALREADY_EXISTS, 'Owner already exists')); - createUser(username, password, email, displayName, auditSource, { owner: true }, function (error, user) { - if (error) return callback(error); + // have to provide the group id explicitly so using db layer directly + groupdb.add(constants.ADMIN_GROUP_ID, constants.ADMIN_GROUP_NAME, function (error) { + // we proceed if it already exists so we can re-create the owner if need be + if (error && error.reason !== DatabaseError.ALREADY_EXISTS) return callback(new UserError(UserError.INTERNAL_ERROR, error)); - groups.addMember(constants.ADMIN_GROUP_ID, user.id, function (error) { - if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error)); + createUser(username, password, email, displayName, auditSource, { owner: true }, function (error, user) { + if (error) return callback(error); - callback(null, user); + groups.addMember(constants.ADMIN_GROUP_ID, user.id, function (error) { + if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error)); + + callback(null, user); + }); }); }); });