#include "__IMAP_LSUB.h" #include "__IMAP_LIST.h" #include "__IMAP_SUBSCRIBE.h" #include "IMAPArgs.h" #include "IMAPServer.h" namespace mail { int __IMAP_LSUB::processCommand(coreutils::ZString &request, IMAPSession &session, IMAPServer &server) { if (session.state == IMAPSession::NOT_AUTHENTICATED) { session.out << session.tag << " NO Not authenticated" << CRLF; return 1; } IMAPArgs::nextArgument(request); // reference name - unused coreutils::ZString patArg = IMAPArgs::nextArgument(request); std::string pattern = IMAPArgs::unwrap(patArg); if (pattern.empty()) { session.out << "* LSUB (\\Noselect) \"/\" \"\"" << CRLF; session.out << session.tag << " OK LSUB completed" << CRLF; return 1; } coreutils::ZString userNameZ(session.userName); std::string mailboxPath = server.mailFileSystem.getMailBoxPath(userNameZ).str(); std::vector allFolders; for (coreutils::MString &folder : server.mailFileSystem.listFolders(userNameZ)) allFolders.push_back(folder.str()); std::vector subscriptions = readSubscriptions(mailboxPath, allFolders); for (const std::string &name : subscriptions) if (imapListPatternMatch(pattern, name)) session.out << "* LSUB (\\HasNoChildren) \"/\" \"" << name << "\"" << CRLF; session.out << session.tag << " OK LSUB completed" << CRLF; return 1; } }