diff --git a/src/mailboxdb.js b/src/mailboxdb.js index 21bc87ee0..f236eb916 100644 --- a/src/mailboxdb.js +++ b/src/mailboxdb.js @@ -84,7 +84,7 @@ function getMailbox(name, callback) { assert.strictEqual(typeof name, 'string'); assert.strictEqual(typeof callback, 'function'); - database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE name = ? AND (ownerType = ? OR ownerType = ?)', [ name, exports.TYPE_APP, exports.TYPE_USER ], function (error, results) { + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE name = ? AND (ownerType = ? OR ownerType = ?) AND aliasTarget IS NULL', [ name, exports.TYPE_APP, exports.TYPE_USER ], function (error, results) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); if (results.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); @@ -95,7 +95,7 @@ function getMailbox(name, callback) { function listMailboxes(callback) { assert.strictEqual(typeof callback, 'function'); - database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE ownerType = ? OR ownerType = ? ORDER BY name', [ exports.TYPE_APP, exports.TYPE_USER ], function (error, results) { + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE (ownerType = ? OR ownerType = ?) AND aliasTarget IS NULL ORDER BY name', [ exports.TYPE_APP, exports.TYPE_USER ], function (error, results) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); callback(null, results); @@ -112,7 +112,7 @@ function getGroup(name, callback) { // INNER JOIN users ON groupMembers.userId = users.id // WHERE mailboxes.name = - database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE name = ? AND ownerType = ?', [ name, exports.TYPE_GROUP ], function (error, results) { + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE name = ? AND ownerType = ? AND aliasTarget IS NULL', [ name, exports.TYPE_GROUP ], function (error, results) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); if (results.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); diff --git a/src/test/ldap-test.js b/src/test/ldap-test.js index 33c14954d..7efb97adb 100644 --- a/src/test/ldap-test.js +++ b/src/test/ldap-test.js @@ -29,6 +29,8 @@ var USER_0 = { displayName: 'User 0' }; +var USER_0_ALIAS = 'Asterix'; + // normal user var USER_1 = { username: 'Username1', @@ -98,7 +100,7 @@ function setup(done) { }, function (callback) { async.series([ - user.setAliases.bind(null, USER_0.id, [ 'Asterix', 'obelix' ]), + user.setAliases.bind(null, USER_0.id, [ USER_0_ALIAS, 'obelix' ]), groups.create.bind(null, GROUP_ID), groups.addMember.bind(null, GROUP_ID, USER_0.id), groups.addMember.bind(null, GROUP_ID, USER_1.id) @@ -533,6 +535,13 @@ describe('Ldap', function () { }); }); + it('cannot get alias as a mailbox', function (done) { + ldapSearch('cn=' + USER_0_ALIAS + ',ou=mailboxes,dc=cloudron', 'objectclass=mailbox', function (error, entries) { + expect(error).to.be.a(ldap.NoSuchObjectError); + done(); + }); + }); + it('non-existent mailbox', function (done) { ldapSearch('cn=random,ou=mailboxes,dc=cloudron', 'objectclass=mailbox', function (error) { expect(error).to.be.a(ldap.NoSuchObjectError); @@ -543,7 +552,7 @@ describe('Ldap', function () { describe('search aliases', function () { it('get specific alias', function (done) { - ldapSearch('cn=asterix,ou=mailaliases,dc=cloudron', 'objectclass=nismailalias', function (error, entries) { + ldapSearch('cn=' + USER_0_ALIAS + ',ou=mailaliases,dc=cloudron', 'objectclass=nismailalias', function (error, entries) { if (error) return done(error); expect(entries.length).to.equal(1); expect(entries[0].cn).to.equal('asterix'); @@ -552,6 +561,13 @@ describe('Ldap', function () { }); }); + it('cannot get mailbox as alias', function (done) { + ldapSearch('cn=' + USER_0.username + ',ou=mailaliases,dc=cloudron', 'objectclass=nismailalias', function (error, entries) { + expect(error).to.be.a(ldap.NoSuchObjectError); + done(); + }); + }); + it('non-existent alias', function (done) { ldapSearch('cn=random,ou=mailaliases,dc=cloudron', 'objectclass=mailbox', function (error) { expect(error).to.be.a(ldap.NoSuchObjectError); @@ -562,7 +578,7 @@ describe('Ldap', function () { describe('search groups', function () { it('get specific alias', function (done) { - ldapSearch('cn=asterix,ou=mailaliases,dc=cloudron', 'objectclass=nismailalias', function (error, entries) { + ldapSearch('cn=' + USER_0_ALIAS + ',ou=mailaliases,dc=cloudron', 'objectclass=nismailalias', function (error, entries) { if (error) return done(error); expect(entries.length).to.equal(1); expect(entries[0].cn).to.equal('asterix');