#include "__IMAP_RENAME.h" #include "IMAPArgs.h" #include "IMAPServer.h" #include namespace mail { int __IMAP_RENAME::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 fromArg = IMAPArgs::nextArgument(request); coreutils::ZString toArg = IMAPArgs::nextArgument(request); std::string fromName = IMAPArgs::normalizeFolderName(IMAPArgs::unwrap(fromArg)); std::string toName = IMAPArgs::normalizeFolderName(IMAPArgs::unwrap(toArg)); coreutils::ZString userNameZ(session.userName); if (!IMAPArgs::isValidFolderName(fromName) || !IMAPArgs::isValidFolderName(toName)) { session.out << session.tag << " BAD Invalid mailbox name" << CRLF; return 1; } if (fromName == "Inbox") { session.out << session.tag << " NO INBOX cannot be renamed" << CRLF; return 1; } if (!server.mailFileSystem.ifFolderExists(userNameZ, fromName)) { session.out << session.tag << " NO Mailbox does not exist" << CRLF; return 1; } if (server.mailFileSystem.ifFolderExists(userNameZ, toName)) { session.out << session.tag << " NO Destination mailbox already exists" << CRLF; return 1; } std::error_code errorCode; std::filesystem::rename(server.mailFileSystem.getFolderPath(userNameZ, fromName).str(), server.mailFileSystem.getFolderPath(userNameZ, toName).str(), errorCode); if (errorCode) { session.out << session.tag << " NO RENAME failed" << CRLF; return 1; } if (session.state == IMAPSession::SELECTED && session.selectedFolderName == fromName) session.selectedFolderName = toName; session.out << session.tag << " OK RENAME completed" << CRLF; return 1; } }