#include "__IMAP_SUBSCRIBE.h" #include "IMAPArgs.h" #include "IMAPServer.h" #include #include namespace mail { std::vector readSubscriptions(const std::string &mailboxPath, const std::vector &allFolders) { std::ifstream in(mailboxPath + "/.subscriptions"); if (!in) return allFolders; std::vector result; std::string line; while (std::getline(in, line)) if (!line.empty()) result.push_back(line); return result; } void writeSubscriptions(const std::string &mailboxPath, const std::vector &subscriptions) { std::ofstream out(mailboxPath + "/.subscriptions", std::ios::trunc); for (const std::string &name : subscriptions) out << name << "\n"; } int __IMAP_SUBSCRIBE::processCommand(coreutils::ZString &request, IMAPSession &session, IMAPServer &server) { if (session.state == IMAPSession::NOT_AUTHENTICATED) { session.out << session.tag << " NO Not authenticated" << CRLF; return 1; } coreutils::ZString nameArg = IMAPArgs::nextArgument(request); std::string folderName = IMAPArgs::normalizeFolderName(IMAPArgs::unwrap(nameArg)); coreutils::ZString userNameZ(session.userName); if (!IMAPArgs::isValidFolderName(folderName) || !server.mailFileSystem.ifFolderExists(userNameZ, folderName)) { session.out << session.tag << " NO Mailbox does not exist" << CRLF; return 1; } 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); if (std::find(subscriptions.begin(), subscriptions.end(), folderName) == subscriptions.end()) subscriptions.push_back(folderName); writeSubscriptions(mailboxPath, subscriptions); session.out << session.tag << " OK SUBSCRIBE completed" << CRLF; return 1; } }