diff --git a/src/ldap.js b/src/ldap.js index 681fd7a17..e25e1d404 100644 --- a/src/ldap.js +++ b/src/ldap.js @@ -205,13 +205,14 @@ function mailingListSearch(req, res, next) { if (error && error.reason === DatabaseError.NOT_FOUND) return next(new ldap.NoSuchObjectError(req.dn.toString())); if (error) return next(new ldap.OperationsError(error.toString())); + // http://ldapwiki.willeke.com/wiki/Original%20Mailgroup%20Schema%20From%20Netscape var obj = { dn: req.dn.toString(), attributes: { objectclass: ['mailGroup'], objectcategory: 'mailGroup', cn: group.name, - mail: group.name, + mail: group.name + '@' + config.fqdn(), mgrpRFC822MailMember: group.members } }; diff --git a/src/mailboxdb.js b/src/mailboxdb.js index 94f98acda..21bc87ee0 100644 --- a/src/mailboxdb.js +++ b/src/mailboxdb.js @@ -106,11 +106,23 @@ function getGroup(name, callback) { assert.strictEqual(typeof name, 'string'); assert.strictEqual(typeof callback, 'function'); + // This can be merged into a single query but cannot get 'not found' information + // SELECT users.username FROM mailboxes + // INNER JOIN groupMembers ON mailboxes.ownerId = groupMembers.groupId + // 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) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); if (results.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); - callback(null, results[0]); + database.query('SELECT users.username FROM groupMembers INNER JOIN users ON groupMembers.userId = users.id WHERE groupMembers.groupId = ?', [ results[0].ownerId ], function (error, memberList) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + results[0].members = memberList.map(function (m) { return m.username; }); + + callback(null, results[0]); + }); }); } diff --git a/src/test/ldap-test.js b/src/test/ldap-test.js index 6f3af1e8e..33c14954d 100644 --- a/src/test/ldap-test.js +++ b/src/test/ldap-test.js @@ -579,6 +579,25 @@ describe('Ldap', function () { }); }); + describe('search mailing list', function () { + it('get specific list', function (done) { + ldapSearch('cn=developers,ou=mailinglists,dc=cloudron', 'objectclass=mailGroup', function (error, entries) { + if (error) return done(error); + expect(entries.length).to.equal(1); + expect(entries[0].cn).to.equal('developers'); + expect(entries[0].mgrpRFC822MailMember).to.eql([ USER_0.username.toLowerCase(), USER_1.username.toLowerCase() ]); + done(); + }); + }); + + it('non-existent list', function (done) { + ldapSearch('cn=random,ou=mailinglists,dc=cloudron', 'objectclass=mailGroup', function (error) { + expect(error).to.be.a(ldap.NoSuchObjectError); + done(); + }); + }); + }); + describe('bind mailbox', function () { it('does not allow with invalid password', function (done) { var client = ldap.createClient({ url: 'ldap://127.0.0.1:' + config.get('ldapPort') });