mail: resolve list members
This commit is contained in:
48
src/mail.js
48
src/mail.js
@@ -46,6 +46,7 @@ exports = module.exports = {
|
||||
addList: addList,
|
||||
updateList: updateList,
|
||||
removeList: removeList,
|
||||
resolveList: resolveList,
|
||||
|
||||
_readDkimPublicKeySync: readDkimPublicKeySync
|
||||
};
|
||||
@@ -1268,3 +1269,50 @@ function removeList(name, domain, auditSource, callback) {
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
function resolveList(listName, listDomain, callback) {
|
||||
assert.strictEqual(typeof listName, 'string');
|
||||
assert.strictEqual(typeof listDomain, 'string');
|
||||
assert.strictEqual(typeof callback, 'function');
|
||||
|
||||
getDomains(function (error, mailDomains) {
|
||||
if (error) return callback(error);
|
||||
|
||||
const mailInDomains = mailDomains.filter(function (d) { return d.enabled; }).map(function (d) { return d.domain; }).join(',');
|
||||
|
||||
mailboxdb.getList(listName, listDomain, function (error, list) {
|
||||
if (error) return callback(error);
|
||||
|
||||
let result = [], toResolve = list.members.slice(), visited = []; // slice creates a copy of array
|
||||
|
||||
async.whilst(() => toResolve.length != 0, function (iteratorCallback) {
|
||||
const toProcess = toResolve.shift();
|
||||
const parts = toProcess.split('@');
|
||||
const memberName = parts[0].split('+')[0], memberDomain = parts[1];
|
||||
|
||||
if (!mailInDomains.includes(memberDomain)) { result.push(toProcess); return iteratorCallback(); } // external domain
|
||||
|
||||
const member =`${memberName}@${memberDomain}`; // cleaned up without any '+' subaddress
|
||||
if (visited.includes(member)) {
|
||||
debug(`resolveList: list ${listName}@${listDomain} has a recursion at member ${member}`);
|
||||
return iteratorCallback();
|
||||
}
|
||||
visited.push(member);
|
||||
|
||||
mailboxdb.get(memberName, memberDomain, function (error, entry) {
|
||||
if (error && error.reason == BoxError.NOT_FOUND) { result.push(member); return iteratorCallback(); }
|
||||
if (error) return iteratorCallback(error);
|
||||
|
||||
if (entry.type === mailboxdb.TYPE_MAILBOX) { result.push(member); return iteratorCallback(); }
|
||||
// no need to resolve alias because we only allow one level and within same domain
|
||||
if (entry.type === mailboxdb.TYPE_ALIAS) { result.push(`${entry.aliasTarget}@${entry.domain}`); return iteratorCallback(); }
|
||||
|
||||
toResolve = toResolve.concat(entry.members);
|
||||
iteratorCallback();
|
||||
});
|
||||
}, function (error) {
|
||||
callback(error, result);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user