#include "__IMAP_DELETE.h" #include "IMAPArgs.h" #include "IMAPServer.h" #include namespace mail { int __IMAP_DELETE::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; } // RFC 3501 6.3.4 permits refusing to delete INBOX outright rather // than implementing its special "move messages out, keep INBOX // itself" semantics. if (folderName == "Inbox") { session.out << session.tag << " NO INBOX cannot be deleted" << CRLF; return 1; } std::error_code errorCode; std::filesystem::remove_all(server.mailFileSystem.getFolderPath(userNameZ, folderName).str(), errorCode); if (errorCode) { session.out << session.tag << " NO DELETE failed" << CRLF; return 1; } if (session.state == IMAPSession::SELECTED && session.selectedFolderName == folderName) session.state = IMAPSession::AUTHENTICATED; session.out << session.tag << " OK DELETE completed" << CRLF; return 1; } }