diff --git a/src/mailer.js b/src/mailer.js index fdaf13445..cb9ebdff1 100644 --- a/src/mailer.js +++ b/src/mailer.js @@ -280,12 +280,13 @@ function userRemoved(username) { mailUserEventToAdmins({ username: username }, 'was removed'); } -function adminChanged(user) { +function adminChanged(user, admin) { assert.strictEqual(typeof user, 'object'); + assert.strictEqual(typeof admin, 'boolean'); debug('Sending mail for adminChanged'); - mailUserEventToAdmins(user, user.admin ? 'is now an admin' : 'is no more an admin'); + mailUserEventToAdmins(user, admin ? 'is now an admin' : 'is no more an admin'); } function passwordReset(user) { @@ -411,6 +412,8 @@ function _getMailQueue() { return gMailQueue; } -function _clearMailQueue() { +function _clearMailQueue(callback) { gMailQueue = []; + + if (callback) callback(); } diff --git a/src/test/user-test.js b/src/test/user-test.js index 6aceb5ae7..ede542d83 100644 --- a/src/test/user-test.js +++ b/src/test/user-test.js @@ -6,8 +6,11 @@ 'use strict'; -var database = require('../database.js'), +var async = require('async'), + database = require('../database.js'), expect = require('expect.js'), + groupdb = require('../groupdb.js'), + groups = require('../groups.js'), mailer = require('../mailer.js'), user = require('../user.js'), userdb = require('../userdb.js'), @@ -19,26 +22,28 @@ var EMAIL = 'nobody@no.body'; var EMAIL_NEW = 'nobodynew@no.body'; var PASSWORD = 'sTrOnG#$34134'; var NEW_PASSWORD = 'oTHER@#$235'; -var IS_ADMIN = true; var DISPLAY_NAME = 'Nobody cares'; var DISPLAY_NAME_NEW = 'Somone cares'; var userObject = null; function cleanupUsers(done) { - userdb._clear(function () { - mailer._clearMailQueue(); - done(); - }); + async.series([ + groupdb._clear, + userdb._clear, + mailer._clearMailQueue + ], done); } function createOwner(done) { - user.createOwner(USERNAME, PASSWORD, EMAIL, DISPLAY_NAME, function (error, result) { - expect(error).to.not.be.ok(); - expect(result).to.be.ok(); + groups.create('admin', function () { // ignore error since it might already exist + user.createOwner(USERNAME, PASSWORD, EMAIL, DISPLAY_NAME, function (error, result) { + expect(error).to.not.be.ok(); + expect(result).to.be.ok(); - userObject = result; + userObject = result; - done(); + done(); + }); }); } @@ -77,7 +82,7 @@ describe('User', function () { after(cleanupUsers); it('fails due to short password', function (done) { - user.create(USERNAME, 'Fo$%23', EMAIL, DISPLAY_NAME, IS_ADMIN, null, true, function (error, result) { + user.create(USERNAME, 'Fo$%23', EMAIL, DISPLAY_NAME, null, true, function (error, result) { expect(error).to.be.ok(); expect(result).to.not.be.ok(); expect(error.reason).to.equal(UserError.BAD_PASSWORD); @@ -87,7 +92,7 @@ describe('User', function () { }); it('fails due to missing upper case password', function (done) { - user.create(USERNAME, 'thisiseightch%$234arslong', EMAIL, DISPLAY_NAME, IS_ADMIN, null, true, function (error, result) { + user.create(USERNAME, 'thisiseightch%$234arslong', EMAIL, DISPLAY_NAME, null, true, function (error, result) { expect(error).to.be.ok(); expect(result).to.not.be.ok(); expect(error.reason).to.equal(UserError.BAD_PASSWORD); @@ -97,7 +102,7 @@ describe('User', function () { }); it('fails due to missing numerics in password', function (done) { - user.create(USERNAME, 'foobaRASDF%', EMAIL, DISPLAY_NAME, IS_ADMIN, null, true, function (error, result) { + user.create(USERNAME, 'foobaRASDF%', EMAIL, DISPLAY_NAME, null, true, function (error, result) { expect(error).to.be.ok(); expect(result).to.not.be.ok(); expect(error.reason).to.equal(UserError.BAD_PASSWORD); @@ -107,7 +112,7 @@ describe('User', function () { }); it('fails due to missing special chars in password', function (done) { - user.create(USERNAME, 'foobaRASDF23423', EMAIL, DISPLAY_NAME, IS_ADMIN, null, true, function (error, result) { + user.create(USERNAME, 'foobaRASDF23423', EMAIL, DISPLAY_NAME, null, true, function (error, result) { expect(error).to.be.ok(); expect(result).to.not.be.ok(); expect(error.reason).to.equal(UserError.BAD_PASSWORD); @@ -117,7 +122,7 @@ describe('User', function () { }); it('succeeds and attempts to send invite', function (done) { - user.create(USERNAME, PASSWORD, EMAIL, DISPLAY_NAME, IS_ADMIN, null /* invitor */, true, function (error, result) { + user.create(USERNAME, PASSWORD, EMAIL, DISPLAY_NAME, null /* invitor */, true, function (error, result) { expect(error).not.to.be.ok(); expect(result).to.be.ok(); expect(result.username).to.equal(USERNAME); @@ -152,7 +157,7 @@ describe('User', function () { }); it('fails because user exists', function (done) { - user.create(USERNAME, PASSWORD, EMAIL, DISPLAY_NAME, IS_ADMIN, null /* invitor */, false, function (error, result) { + user.create(USERNAME, PASSWORD, EMAIL, DISPLAY_NAME, null /* invitor */, false, function (error, result) { expect(error).to.be.ok(); expect(result).not.to.be.ok(); expect(error.reason).to.equal(UserError.ALREADY_EXISTS); @@ -162,7 +167,7 @@ describe('User', function () { }); it('fails because password is empty', function (done) { - user.create(USERNAME, '', EMAIL, DISPLAY_NAME, IS_ADMIN, null /* invitor */, false, function (error, result) { + user.create(USERNAME, '', EMAIL, DISPLAY_NAME, null /* invitor */, false, function (error, result) { expect(error).to.be.ok(); expect(result).not.to.be.ok(); expect(error.reason).to.equal(UserError.BAD_PASSWORD); @@ -392,7 +397,7 @@ describe('User', function () { email: 'some@thi.ng' }; - user.create(user1.username, user1.password, user1.email, DISPLAY_NAME, false, { username: USERNAME, email: EMAIL } /* invitor */, false, function (error, result) { + user.create(user1.username, user1.password, user1.email, DISPLAY_NAME, { username: USERNAME, email: EMAIL } /* invitor */, false, function (error, result) { expect(error).to.not.be.ok(); expect(result).to.be.ok(); @@ -434,7 +439,7 @@ describe('User', function () { email: 'some@thi.ng' }; - user.create(user1.username, user1.password, user1.email, DISPLAY_NAME, false, { username: USERNAME, email: EMAIL } /* invitor */, false, function (error, result) { + user.create(user1.username, user1.password, user1.email, DISPLAY_NAME, { username: USERNAME, email: EMAIL } /* invitor */, false, function (error, result) { expect(error).to.eql(null); expect(result).to.be.ok(); diff --git a/src/user.js b/src/user.js index c24fad775..5ac23c021 100644 --- a/src/user.js +++ b/src/user.js @@ -283,14 +283,14 @@ function changeAdmin(username, admin, callback) { // protect from a system where there is no admin left if (result.length <= 1 && !admin) return callback(new UserError(UserError.NOT_ALLOWED, 'Only admin')); - user.admin = admin; + var func = admin ? groups.addMember : groups.removeMember; - userdb.update(username, user, function (error) { + func(groups.ADMIN_GROUP_ID, user.id, function (error) { if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error)); callback(null); - mailer.adminChanged(user); + mailer.adminChanged(user, admin); }); }); }); @@ -393,13 +393,13 @@ function createOwner(username, password, email, displayName, callback) { if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error)); if (count !== 0) return callback(new UserError(UserError.ALREADY_EXISTS)); - createUser(username, password, email, displayName, null /* invitor */, false /* sendInvite */, function (error) { + createUser(username, password, email, displayName, null /* invitor */, false /* sendInvite */, function (error, user) { if (error) return callback(error); - groups.addMember(groups.ADMIN_GROUP_ID, username, function (error) { + groups.addMember(groups.ADMIN_GROUP_ID, user.id, function (error) { if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error)); - callback(); + callback(null, user); }); }); });