#include "__ADMIN_ALIAS.h" namespace mail { __ADMIN_ALIAS::__ADMIN_ALIAS(MailFileSystem &mailFileSystem) : mailFileSystem(mailFileSystem) {} int __ADMIN_ALIAS::processCommand(coreutils::ZString &request, core::TCPSession &session) { if (request.getList().size() < 2) { session.out << "Usage: alias add alias@domain target@domain[,target2@domain] | remove alias@domain | list domain" << "\r\n"; return 1; } std::string verb = request[1].str(); std::string error; if (verb == "add") { if (request.getList().size() < 4) { session.out << "Usage: alias add alias@domain target@domain[,target2@domain]" << "\r\n"; return 1; } coreutils::ZString alias(request[2]); coreutils::ZString targets(request[3]); bool ok = mailFileSystem.createAlias(alias, targets, error); session.out << (ok ? "OK." : ("Failed: " + error)) << "\r\n"; } else if (verb == "remove") { if (request.getList().size() < 3) { session.out << "Usage: alias remove alias@domain" << "\r\n"; return 1; } coreutils::ZString alias(request[2]); bool ok = mailFileSystem.removeAlias(alias, error); session.out << (ok ? "OK." : ("Failed: " + error)) << "\r\n"; } else if (verb == "list") { if (request.getList().size() < 3) { session.out << "Usage: alias list domain" << "\r\n"; return 1; } coreutils::ZString domain(request[2]); for (auto &alias : mailFileSystem.listAliases(domain)) { // listAliases() only returns the local part (the filename // on disk) - getAliasMailboxes() needs the full "user@domain" // form since it calls getMailBoxPath() itself to find that // same file. coreutils::MString fullAddress; fullAddress << alias << "@" << domain; std::string fullAddressStr = fullAddress.str(); coreutils::ZString aliasAddress(fullAddressStr); session.out << alias << "@" << domain << " -> "; auto targets = mailFileSystem.getAliasMailboxes(aliasAddress); for (size_t i = 0; i < targets.size(); ++i) session.out << (i ? ", " : "") << targets[i]; session.out << "\r\n"; } } else { session.out << "Usage: alias add alias@domain target@domain[,target2@domain] | remove alias@domain | list domain" << "\r\n"; } return 1; } }