/** * @file operator-rename.cc * @brief Implementation of the RENAME command. */ #include "convert.h" #include "depot.h" #include "mailbox.h" #include "operators.h" #include "recursivedescent.h" #include "session.h" #include #include #include #include #include using namespace Binc; using std::string; RenameOperator::RenameOperator() {} RenameOperator::~RenameOperator() {} const string RenameOperator::getName() const { return "RENAME"; } Session::State RenameOperator::getState() const { return Session::State(Session::AUTHENTICATED | Session::SELECTED); } Operator::ProcessResult RenameOperator::process(Depot &depot, Request &command) { Session &session = Session::getInstance(); const string &srcmailbox = command.getMailbox(); const string &canonmailbox = toCanonMailbox(srcmailbox); const string &canondestmailbox = toCanonMailbox(command.getNewMailbox()); // renaming INBOX should actually create the destination mailbox, // move over all the messages and then leave INBOX empty. if (canonmailbox == "INBOX") { session.setLastError("Sorry, renaming INBOX is not yet supported" " by this IMAP server. Try copying the messages" " instead"); return Operator::ProcessResult::NO; } if (canondestmailbox == "INBOX") { session.setLastError("It is not allowed to rename a mailbox to INBOX"); return Operator::ProcessResult::NO; } if (depot.renameMailbox(canonmailbox, canondestmailbox)) return Operator::ProcessResult::OK; else return Operator::ProcessResult::NO; } Parser::ParseResult RenameOperator::parse(Request &c_in, Parser &p) { constexpr auto ACCEPT = Parser::ParseResult::ACCEPT; Session &session = Session::getInstance(); if (c_in.getUidMode()) return Parser::ParseResult::REJECT; Parser::ParseResult res; if ((res = p.expectSPACE()) != ACCEPT) { session.setLastError("Expected SPACE after RENAME"); return res; } string mailbox; if ((res = p.expectMailbox(mailbox)) != ACCEPT) { session.setLastError("Expected mailbox after RENAME SPACE"); return res; } if ((res = p.expectSPACE()) != ACCEPT) { session.setLastError("Expected SPACE after RENAME SPACE mailbox"); return res; } string newmailbox; if ((res = p.expectMailbox(newmailbox)) != ACCEPT) { session.setLastError("Expected mailbox after RENAME SPACE" " mailbox SPACE"); return res; } if ((res = p.expectCRLF()) != ACCEPT) { session.setLastError("Expected CRLF after RENAME SPACE" " mailbox SPACE mailbox"); return res; } session.mailboxchanges = true; c_in.setName("RENAME"); c_in.setMailbox(mailbox); c_in.setNewMailbox(newmailbox); return ACCEPT; }