diff --git a/src/ldap.js b/src/ldap.js index f448a84ee..8098a13a3 100644 --- a/src/ldap.js +++ b/src/ldap.js @@ -284,6 +284,40 @@ 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) { + + 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`); + + var obj = { + dn: dn.toString(), + attributes: { + objectclass: ['mailbox'], + objectcategory: 'mailbox', + cn: `${mailbox.name}@${domain}`, + uid: `${mailbox.name}@${domain}`, + mail: `${mailbox.name}@${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); + } + }); + + finalSend(results, req, res, next); + }); } else { mailboxdb.listAllMailboxes(1, 1000, function (error, mailboxes) { if (error) return next(new ldap.OperationsError(error.toString()));