diff --git a/CHANGES b/CHANGES index 72668f99a..aba925381 100644 --- a/CHANGES +++ b/CHANGES @@ -2873,4 +2873,5 @@ * du: add exclude file to skip filesystem usage checks * mail: attachment search * oidc: use cloudron name as provider name +* groups: add eventlog diff --git a/dashboard/public/js/client.js b/dashboard/public/js/client.js index b00511c77..442d22e01 100644 --- a/dashboard/public/js/client.js +++ b/dashboard/public/js/client.js @@ -3689,6 +3689,11 @@ angular.module('Application').service('Client', ['$http', '$interval', '$timeout var ACTION_EXTERNAL_LDAP_CONFIGURE = 'externalldap.configure'; + var ACTION_GROUP_ADD = 'group.add'; + var ACTION_GROUP_UPDATE = 'group.update'; + var ACTION_GROUP_REMOVE = 'group.remove'; + var ACTION_GROUP_MEMBERSHIP = 'group.membership'; + var ACTION_INSTALL_FINISH = 'cloudron.install.finish'; var ACTION_START = 'cloudron.start'; @@ -3976,6 +3981,18 @@ angular.module('Application').service('Client', ['$http', '$interval', '$timeout return 'External Directory set to ' + data.config.url + ' (' + data.config.provider + ')'; } + case ACTION_GROUP_ADD: + return 'Group ' + data.name + ' was added'; + + case ACTION_GROUP_UPDATE: + return 'Group name changed from ' + data.oldName + ' to ' + data.group.name; + + case ACTION_GROUP_REMOVE: + return 'Group ' + data.group.name + ' was removed'; + + case ACTION_GROUP_MEMBERSHIP: + return 'Group membership of ' + data.group.name + ' changed. Now was ' + data.userIds.length + ' member(s).'; + case ACTION_INSTALL_FINISH: return 'Cloudron version ' + data.version + ' installed'; diff --git a/dashboard/public/views/eventlog.js b/dashboard/public/views/eventlog.js index e543c09a0..7425369d3 100644 --- a/dashboard/public/views/eventlog.js +++ b/dashboard/public/views/eventlog.js @@ -55,6 +55,9 @@ angular.module('Application').controller('EventLogController', ['$scope', '$loca { name: 'domain.update', value: 'domain.update' }, { name: 'domain.remove', value: 'domain.remove' }, { name: 'externalldap.configure', value: 'externalldap.configure' }, + { name: 'group.add', value: 'group.add' }, + { name: 'group.update', value: 'group.update' }, + { name: 'group.remove', value: 'group.remove' }, { name: 'mail.location', value: 'mail.location' }, { name: 'mail.enabled', value: 'mail.enabled' }, { name: 'mail.box.add', value: 'mail.box.add' }, diff --git a/src/eventlog.js b/src/eventlog.js index 543180571..a209e9beb 100644 --- a/src/eventlog.js +++ b/src/eventlog.js @@ -53,6 +53,11 @@ exports = module.exports = { ACTION_EXTERNAL_LDAP_CONFIGURE: 'externalldap.configure', + ACTION_GROUP_ADD: 'group.add', + ACTION_GROUP_REMOVE: 'group.remove', + ACTION_GROUP_UPDATE: 'group.update', + ACTION_GROUP_MEMBERSHIP: 'group.membership', + ACTION_INSTALL_FINISH: 'cloudron.install.finish', ACTION_MAIL_LOCATION: 'mail.location', diff --git a/src/externalldap.js b/src/externalldap.js index 02e8cce4e..a391cf82e 100644 --- a/src/externalldap.js +++ b/src/externalldap.js @@ -85,8 +85,8 @@ async function setConfig(newConfig, auditSource) { await settings.setJson(settings.EXTERNAL_LDAP_KEY, newConfig); if (newConfig.provider === 'noop') { - await users.resetSource(); // otherwise, the owner could be 'ldap' source and lock themselves out - await groups.resetSource(); + await users.resetSources(); // otherwise, the owner could be 'ldap' source and lock themselves out + await groups.resetSources(); } await eventlog.add(eventlog.ACTION_EXTERNAL_LDAP_CONFIGURE, auditSource, { oldConfig: removePrivateFields(currentConfig), config: removePrivateFields(newConfig) }); @@ -416,7 +416,7 @@ async function syncGroups(config, progressCallback) { if (!result) { debug(`syncGroups: [adding group] groupname=${groupName}`); - const [error] = await safe(groups.add({ name: groupName, source: 'ldap' })); + const [error] = await safe(groups.add({ name: groupName, source: 'ldap' }, AuditSource.EXTERNAL_LDAP)); if (error) debug('syncGroups: Failed to create group', groupName, error); } else { // convert local group to ldap group. 2 reasons: @@ -492,7 +492,7 @@ async function syncGroupMembers(config, progressCallback) { userIds.push(userObject.id); } - const [setError] = await safe(groups.setMembers(group, userIds, { skipSourceCheck: true })); + const [setError] = await safe(groups.setMembers(group, userIds, { skipSourceCheck: true }, AuditSource.EXTERNAL_LDAP)); if (setError) debug(`syncGroupMembers: Failed to set members of group ${group.name}. %o`, setError); } diff --git a/src/groups.js b/src/groups.js index d1a523589..e32c93bd3 100644 --- a/src/groups.js +++ b/src/groups.js @@ -13,13 +13,12 @@ exports = module.exports = { list, listWithMembers, - getMembers, + getMemberIds, setMembers, - removeMember, isMember, setLocalMembership, - resetSource, + resetSources, // exported for testing _getMembership: getMembership @@ -29,6 +28,7 @@ const assert = require('assert'), BoxError = require('./boxerror.js'), constants = require('./constants.js'), database = require('./database.js'), + eventlog = require('./eventlog.js'), safe = require('safetydance'), uuid = require('uuid'); @@ -57,8 +57,9 @@ function validateSource(source) { return null; } -async function add(group) { +async function add(group, auditSource) { assert.strictEqual(typeof group, 'object'); + assert(auditSource && typeof auditSource === 'object'); let { name, source } = group; @@ -77,19 +78,24 @@ async function add(group) { if (error && error.code === 'ER_DUP_ENTRY') throw new BoxError(BoxError.ALREADY_EXISTS, error); if (error) throw error; + await eventlog.add(eventlog.ACTION_GROUP_ADD, auditSource, { id, name, source }); + return { id, name, source }; } -async function del(id) { - assert.strictEqual(typeof id, 'string'); +async function del(group, auditSource) { + assert.strictEqual(typeof group, 'object'); + assert(auditSource && typeof auditSource === 'object'); - // also cleanup the groupMembers table - const queries = []; - queries.push({ query: 'DELETE FROM groupMembers WHERE groupId = ?', args: [ id ] }); - queries.push({ query: 'DELETE FROM userGroups WHERE id = ?', args: [ id ] }); + const queries = [ + { query: 'DELETE FROM groupMembers WHERE groupId = ?', args: [ group.id ] }, + { query: 'DELETE FROM userGroups WHERE id = ?', args: [ group.id ] } + ]; const result = await database.transaction(queries); if (result[1].affectedRows !== 1) throw new BoxError(BoxError.NOT_FOUND, 'Group not found'); + + await eventlog.add(eventlog.ACTION_GROUP_REMOVE, auditSource, { group }); } async function get(id) { @@ -140,7 +146,7 @@ async function listWithMembers() { return results; } -async function getMembers(groupId) { +async function getMemberIds(groupId) { assert.strictEqual(typeof groupId, 'string'); const result = await database.query('SELECT userId FROM groupMembers WHERE groupId=?', [ groupId ]); @@ -180,10 +186,11 @@ async function setLocalMembership(user, localGroupIds) { if (error) throw error; } -async function setMembers(group, userIds, options) { +async function setMembers(group, userIds, options, auditSource) { assert.strictEqual(typeof group, 'object'); assert(Array.isArray(userIds)); assert.strictEqual(typeof options, 'object'); + assert(auditSource && typeof auditSource === 'object'); if (!options.skipSourceCheck && group.source === 'ldap') throw new BoxError(BoxError.BAD_STATE, 'Cannot set members of external group'); @@ -197,14 +204,8 @@ async function setMembers(group, userIds, options) { if (error && error.code === 'ER_NO_REFERENCED_ROW_2') throw new BoxError(BoxError.NOT_FOUND, 'Group not found'); if (error && error.code === 'ER_DUP_ENTRY') throw new BoxError(BoxError.CONFLICT, 'Duplicate member in list'); if (error) throw error; -} -async function removeMember(groupId, userId) { - assert.strictEqual(typeof groupId, 'string'); - assert.strictEqual(typeof userId, 'string'); - - const result = await database.query('DELETE FROM groupMembers WHERE groupId = ? AND userId = ?', [ groupId, userId ]); - if (result.affectedRows !== 1) throw new BoxError(BoxError.NOT_FOUND, 'Group not found'); + await eventlog.add(eventlog.ACTION_GROUP_MEMBERSHIP, auditSource, { group, userIds }); } async function isMember(groupId, userId) { @@ -248,15 +249,18 @@ async function update(id, data) { if (result.affectedRows !== 1) throw new BoxError(BoxError.NOT_FOUND, 'Group not found'); } -async function setName(group, name) { +async function setName(group, name, auditSource) { assert.strictEqual(typeof group, 'object'); assert.strictEqual(typeof name, 'string'); + assert(auditSource && typeof auditSource === 'object'); if (group.source === 'ldap') throw new BoxError(BoxError.BAD_STATE, 'Cannot set name of external group'); await update(group.id, { name }); + + await eventlog.add(eventlog.ACTION_GROUP_UPDATE, auditSource, { oldName: group.name, group }); } -async function resetSource() { +async function resetSources() { await database.query('UPDATE userGroups SET source = ?', [ '' ]); } diff --git a/src/routes/groups.js b/src/routes/groups.js index 6c3531dcb..98404df00 100644 --- a/src/routes/groups.js +++ b/src/routes/groups.js @@ -12,6 +12,7 @@ exports = module.exports = { }; const assert = require('assert'), + AuditSource = require('../auditsource.js'), BoxError = require('../boxerror.js'), groups = require('../groups.js'), HttpError = require('connect-lastmile').HttpError, @@ -35,7 +36,7 @@ async function add(req, res, next) { if (typeof req.body.name !== 'string') return next(new HttpError(400, 'name must be string')); - const [error, group] = await safe(groups.add({ name: req.body.name, source : '' })); + const [error, group] = await safe(groups.add({ name: req.body.name, source : '' }, AuditSource.fromRequest(req))); if (error) return next(BoxError.toHttpError(error)); next(new HttpSuccess(201, { id: group.id, name: group.name })); @@ -52,7 +53,7 @@ async function setName(req, res, next) { assert.strictEqual(typeof req.body, 'object'); if (typeof req.body.name !== 'string') return next(new HttpError(400, 'name must be a string')); - const [error] = await safe(groups.setName(req.resource, req.body.name)); + const [error] = await safe(groups.setName(req.resource, req.body.name, AuditSource.fromRequest(req))); if (error) return next(BoxError.toHttpError(error)); next(new HttpSuccess(200, { })); @@ -65,7 +66,7 @@ async function setMembers(req, res, next) { if (!Array.isArray(req.body.userIds)) return next(new HttpError(404, 'userIds must be an array')); if (req.body.userIds.some((u) => typeof u !== 'string')) return next(new HttpError(400, 'userIds array must contain strings')); - const [error] = await safe(groups.setMembers(req.resource, req.body.userIds, { skipSourceCheck: false })); + const [error] = await safe(groups.setMembers(req.resource, req.body.userIds, { skipSourceCheck: false }, AuditSource.fromRequest(req))); if (error) return next(BoxError.toHttpError(error)); next(new HttpSuccess(200, { })); @@ -81,7 +82,7 @@ async function list(req, res, next) { async function del(req, res, next) { assert.strictEqual(typeof req.params.groupId, 'string'); - const [error] = await safe(groups.del(req.params.groupId)); + const [error] = await safe(groups.del(req.resource, AuditSource.fromRequest(req))); if (error) return next(BoxError.toHttpError(error)); next(new HttpSuccess(204)); diff --git a/src/routes/users.js b/src/routes/users.js index e9edc44cb..aaeb6e03f 100644 --- a/src/routes/users.js +++ b/src/routes/users.js @@ -193,7 +193,7 @@ async function setLocalGroups(req, res, next) { if (req.body.groupIds.some((gid) => typeof gid !== 'string')) return next(new HttpError(400, 'groupIds array must contain strings')); if (users.compareRoles(req.user.role, req.resource.role) < 0) return next(new HttpError(403, `role '${req.resource.role}' is required but user has only '${req.user.role}'`)); - const [error] = await safe(groups.setLocalMembership(req.resource, req.body.groupIds)); + const [error] = await safe(groups.setLocalMembership(req.resource, req.body.groupIds, AuditSource.fromRequest(req))); if (error) return next(BoxError.toHttpError(error)); next(new HttpSuccess(204)); diff --git a/src/test/directoryserver-test.js b/src/test/directoryserver-test.js index ef1d3056c..f2ce6b654 100644 --- a/src/test/directoryserver-test.js +++ b/src/test/directoryserver-test.js @@ -85,12 +85,12 @@ describe('Directory Server (LDAP)', function () { directoryServer.start.bind(null), directoryServer.setConfig.bind(null, { enabled: true, secret: auth.secret, allowlist: '127.0.0.1' }, auditSource), async () => { - group = await groups.add({ name: 'ldap-test-1' }); - await groups.setMembers(group, [ admin.id, user.id ], {}); + group = await groups.add({ name: 'ldap-test-1' }, auditSource); + await groups.setMembers(group, [ admin.id, user.id ], {}, auditSource); }, async () => { - group2 = await groups.add({ name: 'ldap-test-2' }); - await groups.setMembers(group2, [ admin.id ], {}); + group2 = await groups.add({ name: 'ldap-test-2' }, auditSource); + await groups.setMembers(group2, [ admin.id ], {}, auditSource); } ], done); }); diff --git a/src/test/externalldap-test.js b/src/test/externalldap-test.js index c96a45b90..377e5b572 100644 --- a/src/test/externalldap-test.js +++ b/src/test/externalldap-test.js @@ -500,7 +500,7 @@ describe('External LDAP', function () { it('can set groups of external user when group sync is disabled', async function () { const user = await users.getByUsername(ldapUsers[0].username); - await groups.setLocalMembership(user, []); + await groups.setLocalMembership(user, [], auditSource); }); it('enable with groupSync', async function () { @@ -544,7 +544,7 @@ describe('External LDAP', function () { groupname: 'INTERNALgroup' // also tests lowercasing }); - await groups.add({ name: 'internalgroup' }); + await groups.add({ name: 'internalgroup' }, auditSource); await externalLdap.sync(function progress() {}); const result = await groups.list(); @@ -564,7 +564,7 @@ describe('External LDAP', function () { const result = await groups.getByName('nonemptygroup'); expect(result).to.be.ok(); - const result2 = await groups.getMembers(result.id); + const result2 = await groups.getMemberIds(result.id); expect(result2.length).to.equal(2); }); @@ -578,7 +578,7 @@ describe('External LDAP', function () { const result = await groups.getByName('nonemptygroup'); expect(result).to.be.ok(); - const result2 = await groups.getMembers(result.id); + const result2 = await groups.getMemberIds(result.id); expect(result2.length).to.equal(2); }); @@ -591,7 +591,7 @@ describe('External LDAP', function () { await externalLdap.sync(function progress() {}); const result = await groups.getByName('onemembergroup'); - const result2 = await groups.getMembers(result.id); + const result2 = await groups.getMemberIds(result.id); expect(result2.length).to.equal(1); const u = await users.get(result2[0]); diff --git a/src/test/groups-test.js b/src/test/groups-test.js index 41720b726..ecbddfa9a 100644 --- a/src/test/groups-test.js +++ b/src/test/groups-test.js @@ -13,63 +13,65 @@ const BoxError = require('../boxerror.js'), safe = require('safetydance'); describe('Groups', function () { - const { setup, cleanup, admin, user } = common; + const { setup, cleanup, admin, user, auditSource } = common; before(setup); after(cleanup); - let group0Name = 'administrators', group0Object; - let group1Name = 'externs', group1Object; + const group0Name = 'administrators'; + let group0Object; + const group1Name = 'externs'; + let group1Object; describe('add', function () { it('cannot add group - too small', async function () { - const [error] = await safe(groups.add({ name: '' })); + const [error] = await safe(groups.add({ name: '' }, auditSource)); expect(error.reason).to.be(BoxError.BAD_FIELD); }); it('cannot add group - too big', async function () { - const [error] = await safe(groups.add({ name: new Array(256).join('a') })); + const [error] = await safe(groups.add({ name: new Array(256).join('a') }, auditSource)); expect(error.reason).to.be(BoxError.BAD_FIELD); }); it('cannot add group - bad name', async function () { - const [error] = await safe(groups.add({ name: 'bad:name' })); + const [error] = await safe(groups.add({ name: 'bad:name' }, auditSource)); expect(error.reason).to.be(BoxError.BAD_FIELD); }); it('cannot add group - reserved', async function () { - const [error] = await safe(groups.add({ name: 'users' })); + const [error] = await safe(groups.add({ name: 'users' }, auditSource)); expect(error.reason).to.be(BoxError.BAD_FIELD); }); it('cannot add group - invalid', async function () { - const [error] = await safe(groups.add({ name: 'cloudron+admin' })); + const [error] = await safe(groups.add({ name: 'cloudron+admin' }, auditSource)); expect(error.reason).to.be(BoxError.BAD_FIELD); }); it('cannot add group - invalid source', async function () { - const [error] = await safe(groups.add({ name: 'somegroup', source: 'unknownsource' })); + const [error] = await safe(groups.add({ name: 'somegroup', source: 'unknownsource' }, auditSource)); expect(error.reason).to.be(BoxError.BAD_FIELD); }); it('can add valid groups', async function () { - let [error, result] = await safe(groups.add({ name: group0Name })); + let [error, result] = await safe(groups.add({ name: group0Name }, auditSource)); expect(error).to.be(null); group0Object = result; - [error, result] = await safe(groups.add({ name: group1Name})); + [error, result] = await safe(groups.add({ name: group1Name}, auditSource)); expect(error).to.be(null); group1Object = result; }); it('cannot add existing group with mixed case', async function () { - const name = group0Name[0].toUpperCase() + group0Name.substr(1); - const [error] = await safe(groups.add({ name })); + const name = group0Name[0].toUpperCase() + group0Name.slice(1); + const [error] = await safe(groups.add({ name }, auditSource)); expect(error.reason).to.be(BoxError.ALREADY_EXISTS); }); it('cannot add existing group', async function () { - const [error] = await safe(groups.add({name: group0Name })); + const [error] = await safe(groups.add({name: group0Name }, auditSource)); expect(error.reason).to.be(BoxError.ALREADY_EXISTS); }); }); @@ -93,57 +95,43 @@ describe('Groups', function () { }); it('can set members', async function () { - await groups.setMembers(group0Object, [ admin.id, user.id ], {}); + await groups.setMembers(group0Object, [ admin.id, user.id ], {}, auditSource); }); it('cannot set duplicate members', async function () { - const [error] = await safe(groups.setMembers(group0Object, [ admin.id, user.id, admin.id ], {})); + const [error] = await safe(groups.setMembers(group0Object, [ admin.id, user.id, admin.id ], {}, auditSource)); expect(error.reason).to.be(BoxError.CONFLICT); }); it('can list users of group', async function () { - const result = await groups.getMembers(group0Object.id); + const result = await groups.getMemberIds(group0Object.id); expect(result.sort()).to.eql([ admin.id, user.id ].sort()); }); it('cannot list members of non-existent group', async function () { - const result = await groups.getMembers('randomgroup'); + const result = await groups.getMemberIds('randomgroup'); expect(result.length).to.be(0); // currently, we cannot differentiate invalid groups and empty groups }); - it('cannot delete non-existent member', async function () { - const [error] = await safe(groups.removeMember(group0Object.id, 'random')); - expect(error.reason).to.be(BoxError.NOT_FOUND); - }); - - it('cannot remove member from non-existent group', async function () { - const [error] = await safe(groups.removeMember('randomgroup', admin.id)); - expect(error.reason).to.be(BoxError.NOT_FOUND); - }); - - it('can remove existing member', async function () { - await groups.removeMember(group0Object.id, user.id); - }); - it('can getWithMembers', async function () { const result = await groups.getWithMembers(group0Object.id); expect(result.name).to.be(group0Name); - expect(result.userIds).to.eql([ admin.id ]); + expect(result.userIds).to.eql([ admin.id, user.id ]); }); it('can set group membership', async function () { - await groups.setLocalMembership(admin, [ group0Object.id ]); + await groups.setLocalMembership(admin, [ group0Object.id ], auditSource); const groupIds = await groups._getMembership(admin.id); expect(groupIds.length).to.be(1); }); it('cannot set user to same group twice', async function () { - const [error] = await safe(groups.setLocalMembership(admin, [ group0Object.id, group0Object.id ])); + const [error] = await safe(groups.setLocalMembership(admin, [ group0Object.id, group0Object.id ], auditSource)); expect(error.reason).to.be(BoxError.CONFLICT); }); it('can set user to multiple groups', async function () { - await groups.setLocalMembership(admin, [ group0Object.id, group1Object.id ]); + await groups.setLocalMembership(admin, [ group0Object.id, group1Object.id ], auditSource); }); it('can get groups membership', async function () { @@ -172,13 +160,13 @@ describe('Groups', function () { describe('delete', function () { it('cannot delete invalid group', async function () { - const [error] = await safe(groups.del('random')); + const [error] = await safe(groups.del({ id: 'random' }, auditSource)); expect(error.reason).to.be(BoxError.NOT_FOUND); }); it('can delete valid group', async function () { - await groups.setMembers(group0Object, [ admin.id, user.id ], {}); // ensure group has some members - await groups.del(group0Object.id); + await groups.setMembers(group0Object, [ admin.id, user.id ], {}, auditSource); // ensure group has some members + await groups.del(group0Object, auditSource); }); }); @@ -186,23 +174,23 @@ describe('Groups', function () { let groupObject; before(async function () { - let [error, result] = await safe(groups.add({ name: 'kootam' })); + const [error, result] = await safe(groups.add({ name: 'kootam' }, auditSource)); expect(error).to.be(null); groupObject = result; }); it('cannot set empty group name', async function () { - const [error] = await safe(groups.setName(groupObject, '')); + const [error] = await safe(groups.setName(groupObject, '', auditSource)); expect(error.reason).to.be(BoxError.BAD_FIELD); }); it('cannot set bad group name', async function () { - const [error] = await safe(groups.setName(groupObject, '!kootam')); + const [error] = await safe(groups.setName(groupObject, '!kootam', auditSource)); expect(error.reason).to.be(BoxError.BAD_FIELD); }); it('can set group name', async function () { - await groups.setName(groupObject, 'kootam2'); + await groups.setName(groupObject, 'kootam2', auditSource); groupObject = await groups.get(groupObject.id); expect(groupObject.name).to.be('kootam2'); }); @@ -212,27 +200,27 @@ describe('Groups', function () { let ldapGroup; before(async function () { - ldapGroup = await groups.add({ name: 'ldap-kootam', source: 'ldap' }); + ldapGroup = await groups.add({ name: 'ldap-kootam', source: 'ldap' }, auditSource); }); it('cannot change name', async function () { - const [error] = await safe(groups.setName(ldapGroup, 'ldap-kootam2')); + const [error] = await safe(groups.setName(ldapGroup, 'ldap-kootam2', auditSource)); expect(error.reason).to.be(BoxError.BAD_STATE); }); it('cannot set members', async function () { - const [error] = await safe(groups.setMembers(ldapGroup, [ admin.id ], { skipSourceSkip: false })); + const [error] = await safe(groups.setMembers(ldapGroup, [ admin.id ], { skipSourceSkip: false }, auditSource)); expect(error.reason).to.be(BoxError.BAD_STATE); }); it('cannot set membership', async function () { - const [error] = await safe(groups.setLocalMembership(admin, [ ldapGroup.id ])); + const [error] = await safe(groups.setLocalMembership(admin, [ ldapGroup.id ], auditSource)); expect(error.reason).to.be(BoxError.BAD_STATE); }); it('does not clear remote membership', async function () { - await groups.setMembers(ldapGroup, [ admin.id ], { skipSourceCheck: true }); // would be called by ldap syncer - await groups.setLocalMembership(admin, [ group1Object.id ]); + await groups.setMembers(ldapGroup, [ admin.id ], { skipSourceCheck: true }, auditSource); // would be called by ldap syncer + await groups.setLocalMembership(admin, [ group1Object.id ], auditSource); const groupIds = await groups._getMembership(admin.id); expect(groupIds.length).to.be(2); diff --git a/src/test/ldapserver-test.js b/src/test/ldapserver-test.js index 87179493b..7c22f3935 100644 --- a/src/test/ldapserver-test.js +++ b/src/test/ldapserver-test.js @@ -78,12 +78,12 @@ describe('Ldap Server', function () { async () => await mail.setAliases(mailboxName, domain.domain, [ { name: mailAliasName, domain: domain.domain}, { name: mailAliasWildcardName + '*', domain: domain.domain } ], auditSource), ldapServer.start.bind(null), async () => { - group = await groups.add({ name: 'ldap-test-1' }); - await groups.setMembers(group, [ admin.id, user.id ], {}); + group = await groups.add({ name: 'ldap-test-1' }, auditSource); + await groups.setMembers(group, [ admin.id, user.id ], {}, auditSource); }, async () => { - group2 = await groups.add({ name: 'ldap-test-2' }); - await groups.setMembers(group2, [ admin.id ], {}); + group2 = await groups.add({ name: 'ldap-test-2' }, auditSource); + await groups.setMembers(group2, [ admin.id ], {}, auditSource); } ], done); diff --git a/src/users.js b/src/users.js index 1eae65d0d..7309f4dce 100644 --- a/src/users.js +++ b/src/users.js @@ -51,7 +51,7 @@ exports = module.exports = { getBackgroundImage, setBackgroundImage, - resetSource, + resetSources, parseDisplayName, @@ -970,7 +970,7 @@ async function setBackgroundImage(id, backgroundImage) { if (result.length === 0) throw new BoxError(BoxError.NOT_FOUND, 'User not found'); } -async function resetSource() { +async function resetSources() { await database.query('UPDATE users SET source = ?', [ '' ]); }