diff --git a/src/ldap.js b/src/ldap.js index 4c6d74902..f448a84ee 100644 --- a/src/ldap.js +++ b/src/ldap.js @@ -284,42 +284,55 @@ function mailboxSearch(req, res, next) { res.end(); } }); - } else if (req.dn.rdns[0].attrs.domain) { - var domain = req.dn.rdns[0].attrs.domain.value.toLowerCase(); - - mailboxdb.listMailboxes(domain, 1, 1000, function (error, result) { + } else { + mailboxdb.listAllMailboxes(1, 1000, function (error, mailboxes) { if (error) return next(new ldap.OperationsError(error.toString())); var results = []; // send mailbox objects - result.forEach(function (mailbox) { - var dn = ldap.parseDN(`cn=${mailbox.name}@${domain},domain=${domain},ou=mailboxes,dc=cloudron`); + async.eachSeries(mailboxes, function (mailbox, callback) { + var dn = ldap.parseDN(`cn=${mailbox.name}@${mailbox.domain},ou=mailboxes,dc=cloudron`); - var obj = { - dn: dn.toString(), - attributes: { - objectclass: ['mailbox'], - objectcategory: 'mailbox', - cn: `${mailbox.name}@${domain}`, - uid: `${mailbox.name}@${domain}`, - mail: `${mailbox.name}@${domain}` - } - }; + users.get(mailbox.ownerId, function (error, userObject) { + if (error) return callback(); // skip mailboxes with unknown owner - // ensure all filter values are also lowercase - var lowerCaseFilter = safe(function () { return ldap.parseFilter(req.filter.toString().toLowerCase()); }, null); - if (!lowerCaseFilter) return next(new ldap.OperationsError(safe.error.toString())); + var obj = { + dn: dn.toString(), + attributes: { + objectclass: ['mailbox'], + objectcategory: 'mailbox', + displayname: userObject.displayName, + cn: `${mailbox.name}@${mailbox.domain}`, + uid: `${mailbox.name}@${mailbox.domain}`, + mail: `${mailbox.name}@${mailbox.domain}` + } + }; - if ((req.dn.equals(dn) || req.dn.parentOf(dn)) && lowerCaseFilter.matches(obj.attributes)) { - results.push(obj); - } + mailboxdb.getAliasesForName(mailbox.name, mailbox.domain, function (error, aliases) { + if (error) return callback(error); + + aliases.forEach(function (a, idx) { + obj.attributes['mail' + idx] = `${a}@${mailbox.domain}`; + }); + + // ensure all filter values are also lowercase + var lowerCaseFilter = safe(function () { return ldap.parseFilter(req.filter.toString().toLowerCase()); }, null); + if (!lowerCaseFilter) return next(new ldap.OperationsError(safe.error.toString())); + + if ((req.dn.equals(dn) || req.dn.parentOf(dn)) && lowerCaseFilter.matches(obj.attributes)) { + results.push(obj); + } + + callback(); + }); + }); + }, function (error) { + if (error) return next(new ldap.OperationsError(error.toString())); + + finalSend(results, req, res, next); }); - - finalSend(results, req, res, next); }); - } else { - return next(new ldap.NoSuchObjectError(req.dn.toString())); } } diff --git a/src/mailboxdb.js b/src/mailboxdb.js index 882653adc..e9af0aca6 100644 --- a/src/mailboxdb.js +++ b/src/mailboxdb.js @@ -12,6 +12,8 @@ exports = module.exports = { listMailboxes: listMailboxes, getLists: getLists, + listAllMailboxes: listAllMailboxes, + get: get, getMailbox: getMailbox, getList: getList, @@ -214,6 +216,21 @@ function listMailboxes(domain, page, perPage, callback) { }); } +function listAllMailboxes(page, perPage, callback) { + assert.strictEqual(typeof page, 'number'); + assert.strictEqual(typeof perPage, 'number'); + assert.strictEqual(typeof callback, 'function'); + + database.query(`SELECT ${MAILBOX_FIELDS} FROM mailboxes WHERE type = ? ORDER BY name LIMIT ${(page-1)*perPage},${perPage}`, + [ exports.TYPE_MAILBOX ], function (error, results) { + if (error) return callback(new BoxError(BoxError.DATABASE_ERROR, error)); + + results.forEach(function (result) { postProcess(result); }); + + callback(null, results); + }); +} + function getLists(domain, callback) { assert.strictEqual(typeof domain, 'string'); assert.strictEqual(typeof callback, 'function');