#include "__IMAP_SELECT.h" #include "IMAPArgs.h" #include "IMAPServer.h" namespace mail { int selectOrExamine(coreutils::ZString &request, IMAPSession &session, IMAPServer &server, bool readOnly) { 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)) { session.out << session.tag << " NO Mailbox does not exist" << CRLF; return 1; } if (!server.mailFileSystem.ifFolderExists(userNameZ, folderName)) { session.out << session.tag << " NO Mailbox does not exist" << CRLF; return 1; } MailFolder folder; folder.load(server.mailFileSystem.getFolderPath(userNameZ, folderName).str()); session.mailbox = folder; session.selectedFolderName = folderName; session.readOnly = readOnly; session.state = IMAPSession::SELECTED; session.out << "* " << (int)session.mailbox.size() << " EXISTS" << CRLF; session.out << "* " << (int)session.mailbox.recentCount() << " RECENT" << CRLF; uint32_t firstUnseen = session.mailbox.firstUnseenSeq(); if (firstUnseen != 0) session.out << "* OK [UNSEEN " << (int)firstUnseen << "] Message " << (int)firstUnseen << " is first unseen" << CRLF; session.out << "* FLAGS (\\Answered \\Flagged \\Deleted \\Seen \\Draft)" << CRLF; session.out << "* OK [PERMANENTFLAGS (\\Answered \\Flagged \\Deleted \\Seen \\Draft)] Limited" << CRLF; session.out << "* OK [UIDVALIDITY " << (int)session.mailbox.uidValidity() << "] UIDs valid" << CRLF; session.out << "* OK [UIDNEXT " << (int)session.mailbox.uidNext() << "] Predicted next UID" << CRLF; session.out << session.tag << " OK [" << (readOnly ? "READ-ONLY" : "READ-WRITE") << "] " << (readOnly ? "EXAMINE" : "SELECT") << " completed" << CRLF; return 1; } int __IMAP_SELECT::processCommand(coreutils::ZString &request, IMAPSession &session, IMAPServer &server) { return selectOrExamine(request, session, server, false); } }