diff --git a/BMAMail b/BMAMail index 66c910b..cb9baaa 100755 Binary files a/BMAMail and b/BMAMail differ diff --git a/IMAPCommand.cpp b/IMAPCommand.cpp new file mode 100644 index 0000000..4ea5c46 --- /dev/null +++ b/IMAPCommand.cpp @@ -0,0 +1,15 @@ +# include "Command.h" +# include "IMAPSession.h" +# include "IMAPServer.h" +# include "Log.h" + +namespace mail { + + int IMAPCommand::processCommand(std::string request, core::TCPSession *session, std::stringstream &data) { + coreutils::PString parser(request); + parser.split(" "); + return processCommand(parser, (IMAPSession &)*session, (IMAPServer &)session->server, data); + } + +} + diff --git a/IMAPCommand.h b/IMAPCommand.h index 9db46ea..1eb4aea 100644 --- a/IMAPCommand.h +++ b/IMAPCommand.h @@ -2,21 +2,18 @@ # define __IMAPCommand_h__ # include "Command.h" -# include "TCPSession.h" # include "IMAPSession.h" namespace mail { + + class IMAPServer; class IMAPCommand : public core::Command { public: - virtual int processCommand(std::string request, core::TCPSession *session, std::stringstream &data) override { - coreutils::PString parser(request); - return processCommand(parser, (IMAPSession &)*session, data); - } - - virtual int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) {} - + virtual int processCommand(std::string request, core::TCPSession *session, std::stringstream &data) override; + virtual int processCommand(coreutils::PString request, IMAPSession &session, IMAPServer &server, std::stringstream &data) {} + }; } diff --git a/IMAPService.h b/IMAPServer.h similarity index 64% rename from IMAPService.h rename to IMAPServer.h index 4ebd19f..91c3276 100644 --- a/IMAPService.h +++ b/IMAPServer.h @@ -1,38 +1,39 @@ -#ifndef __IMAPService_h__ -#define __IMAPService_h__ +#ifndef __IMAPServer_h__ +# define __IMAPServer_h__ -#include "TCPServer.h" -#include "Exception.h" -#include "__IMAP_APPEND.h" -#include "__IMAP_AUTHENTICATE.h" -#include "__IMAP_CHECK.h" -#include "__IMAP_CLOSE.h" -#include "__IMAP_COPY.h" -#include "__IMAP_CREATE.h" -#include "__IMAP_DELETE.h" -#include "__IMAP_EXAMINE.h" -#include "__IMAP_EXPUNGE.h" -#include "__IMAP_FETCH.h" -#include "__IMAP_LIST.h" -#include "__IMAP_LOGIN.h" -#include "__IMAP_LSUB.h" -#include "__IMAP_RENAME.h" -#include "__IMAP_SEARCH.h" -#include "__IMAP_SELECT.h" -#include "__IMAP_STARTTLS.h" -#include "__IMAP_STATUS.h" -#include "__IMAP_STORE.h" -#include "__IMAP_SUBSCRIBE.h" -#include "__IMAP_UID.h" -#include "__IMAP_UNSUBSCRIBE.h" +# include "TCPServer.h" +# include "Exception.h" +# include "MailFileSystem.h" +# include "__IMAP_APPEND.h" +# include "__IMAP_AUTHENTICATE.h" +# include "__IMAP_CHECK.h" +# include "__IMAP_CLOSE.h" +# include "__IMAP_COPY.h" +# include "__IMAP_CREATE.h" +# include "__IMAP_DELETE.h" +# include "__IMAP_EXAMINE.h" +# include "__IMAP_EXPUNGE.h" +# include "__IMAP_FETCH.h" +# include "__IMAP_LIST.h" +# include "__IMAP_LOGIN.h" +# include "__IMAP_LSUB.h" +# include "__IMAP_RENAME.h" +# include "__IMAP_SEARCH.h" +# include "__IMAP_SELECT.h" +# include "__IMAP_STARTTLS.h" +# include "__IMAP_STATUS.h" +# include "__IMAP_STORE.h" +# include "__IMAP_SUBSCRIBE.h" +# include "__IMAP_UID.h" +# include "__IMAP_UNSUBSCRIBE.h" namespace mail { - - class IMAPService : public core::TCPServer { + + class IMAPServer : public core::TCPServer { public: - IMAPService(core::EPoll &epoll, std::string hostName, std::string mailPath, core::IPAddress ipAddress) - : TCPServer(epoll, ipAddress), mailFileSystem(mailPath), hostName(hostName) { + IMAPServer(core::EPoll &epoll, std::string hostName, MailFileSystem &mailFileSystem, core::IPAddress ipAddress) + : TCPServer(epoll, ipAddress, "IMAP Server"), mailFileSystem(mailFileSystem), hostName(hostName) { commands.add(_imap_append, "APPEND"); commands.add(_imap_authenticate, "AUTHENTCATE"); commands.add(_imap_check, "CHECK"); @@ -57,7 +58,7 @@ namespace mail { commands.add(_imap_unsubscribe, "UNSUBSCRIBE"); } - MailFileSystem mailFileSystem; + MailFileSystem &mailFileSystem; std::string hostName; private: diff --git a/IMAPSession.h b/IMAPSession.h index 27dee61..e137125 100644 --- a/IMAPSession.h +++ b/IMAPSession.h @@ -1,18 +1,26 @@ #ifndef __IMAPSession_h__ -#define __IMAPSession_h__ +# define __IMAPSession_h__ + +# define CRLF "\r\n" namespace mail { - + class IMAPSession : public core::TCPSession { - public: - + public: + IMAPSession(core::EPoll &ePoll, core::TCPServer &server) + : TCPSession(ePoll, server, "IMAP Client Session") {} + + enum State { NOT_AUTHENTICATED, AUTHENTICATED, SELECTED }; + std::string clientDomainName; std::string userName; std::string password; - AuthState authstate = USER_UNKNOWN; - bool relay = false; - + State state = NOT_AUTHENTICATED; + + void onConnected() override { + out << "* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE STARTTLS AUTH=PLAIN AUTH=LOGIN] Dovecot (Ubuntu) ready." << CRLF; + } }; diff --git a/POP3Service.h b/POP3Server.h similarity index 78% rename from POP3Service.h rename to POP3Server.h index 45d5188..14d46b1 100644 --- a/POP3Service.h +++ b/POP3Server.h @@ -1,5 +1,5 @@ -#ifndef __POP3Service_h__ -#define __POP3Service_h__ +#ifndef __POP3Server_h__ +#define __POP3Server_h__ #include "TCPServer.h" #include "Exception.h" @@ -18,11 +18,11 @@ namespace mail { - class POP3Service : public core::TCPServer { + class POP3Server : public core::TCPServer { public: - POP3Service(core::EPoll &epoll, std::string hostName, std::string mailPath, core::IPAddress ipAddress) - : TCPServer(epoll, ipAddress), mailFileSystem(mailPath), hostName(hostName) { + POP3Server(core::EPoll &epoll, std::string hostName, MailFileSystem &mailFileSystem, core::IPAddress ipAddress) + : TCPServer(epoll, ipAddress, "POP3 Server"), mailFileSystem(mailFileSystem), hostName(hostName) { commands.add(_pop3_dele, "DELE"); commands.add(_pop3_last, "LAST"); commands.add(_pop3_list, "LIST"); @@ -37,7 +37,7 @@ namespace mail { commands.add(_pop3_user, "USER"); } - MailFileSystem mailFileSystem; + MailFileSystem &mailFileSystem; std::string hostName; private: diff --git a/SMTPServer.h b/SMTPServer.h index 9c2a5d9..e6d9f78 100644 --- a/SMTPServer.h +++ b/SMTPServer.h @@ -24,9 +24,8 @@ namespace mail { class SMTPServer : public core::TCPServer, public core::INotify { public: - SMTPServer(core::EPoll &ePoll, std::string hostName, std::string mailPath, core::IPAddress ipAddress) - : core::TCPServer(ePoll, ipAddress, "SMTP Server"), core::INotify(ePoll), hostName(hostName), mailFileSystem(mailPath) { - this->mailPath = mailPath; + SMTPServer(core::EPoll &ePoll, std::string hostName, MailFileSystem &mailFileSystem, core::IPAddress ipAddress) + : core::TCPServer(ePoll, ipAddress, "SMTP Server"), core::INotify(ePoll), hostName(hostName), mailFileSystem(mailFileSystem) { commands.add(_smtp_auth, "AUTH"); commands.add(_smtp_data, "DATA"); commands.add(_smtp_ehlo, "EHLO"); @@ -41,7 +40,7 @@ namespace mail { wd = addWatch(mailPath + "/.queue/"); } - MailFileSystem mailFileSystem; + MailFileSystem &mailFileSystem; std::string hostName; std::string mailPath; diff --git a/SMTPSession.h b/SMTPSession.h index 51ba56b..eb0d25b 100644 --- a/SMTPSession.h +++ b/SMTPSession.h @@ -18,8 +18,8 @@ namespace mail { SMTPSession(core::EPoll &ePoll, core::TCPServer &server) : TCPSession(ePoll, server, "SMTP Client Session") {} - void onConnected(std::stringstream &out) { - out << "220 localhost BMAMail" << CRLF; + void onConnected() override { + out << "220 localhost BMAMail" << CRLF; } std::string clientDomainName; diff --git a/__IMAP_APPEND.cpp b/__IMAP_APPEND.cpp new file mode 100644 index 0000000..3df9438 --- /dev/null +++ b/__IMAP_APPEND.cpp @@ -0,0 +1,9 @@ +#include "__IMAP_APPEND.h" + +namespace mail { + + int __IMAP_APPEND::processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) { + data << "250 OK" << CRLF; + } + +} diff --git a/__IMAP_APPEND.h b/__IMAP_APPEND.h index 74a3177..cb37beb 100644 --- a/__IMAP_APPEND.h +++ b/__IMAP_APPEND.h @@ -8,9 +8,7 @@ namespace mail { class __IMAP_APPEND : public IMAPCommand { - int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data) { - data << "250 OK" << CRLF; - } + int processCommand(coreutils::PString request, IMAPSession &session, std::stringstream &data); }; diff --git a/__IMAP_AUTHENTICATE.h b/__IMAP_AUTHENTICATE.h index bacf7a6..a83f3c5 100644 --- a/__IMAP_AUTHENTICATE.h +++ b/__IMAP_AUTHENTICATE.h @@ -3,6 +3,7 @@ # include "IMAPCommand.h" # include "IMAPSession.h" +# include "PString.h" namespace mail { diff --git a/main.cpp b/main.cpp index cac4113..d2efa61 100644 --- a/main.cpp +++ b/main.cpp @@ -5,9 +5,10 @@ #include "File.h" #include "Log.h" #include "IPAddress.h" +#include "MailFileSystem.h" #include "SMTPServer.h" -#include "POP3Service.h" -#include "IMAPService.h" +#include "POP3Server.h" +#include "IMAPServer.h" int main(int argc, char **argv) { @@ -19,14 +20,16 @@ int main(int argc, char **argv) { std::string hostName = "localhost"; std::string ipAddress = "0.0.0.0"; std::string mailPath = "/var/mail"; + + mail::MailFileSystem mailFileSystem(mailPath); core::EPoll ePoll; - mail::SMTPServer smtpServer(ePoll, hostName, mailPath, core::IPAddress(ipAddress, 25)); - mail::POP3Service pop3Service(ePoll, hostName, mailPath, core::IPAddress(ipAddress, 110)); - mail::IMAPService imapService(ePoll, hostName, mailPath, core::IPAddress(ipAddress, 143)); - core::ConsoleServer consoleService(ePoll, core::IPAddress(ipAddress, 1027)); - consoleService.commands.add(consoleService.commands, "help"); - ePoll.start(2, 1000); + mail::SMTPServer smtpServer(ePoll, hostName, mailFileSystem, core::IPAddress(ipAddress, 25)); + mail::POP3Server pop3Server(ePoll, hostName, mailFileSystem, core::IPAddress(ipAddress, 110)); + mail::IMAPServer imapServer(ePoll, hostName, mailFileSystem, core::IPAddress(ipAddress, 143)); + core::ConsoleServer consoleServer(ePoll, core::IPAddress(ipAddress, 1027)); + consoleServer.commands.add(consoleServer.commands, "help"); + ePoll.start(1, 1000); while(true) sleep(300); diff --git a/submitmailtest b/tests/submitmailtest similarity index 98% rename from submitmailtest rename to tests/submitmailtest index 4fa9613..020dc49 100755 --- a/submitmailtest +++ b/tests/submitmailtest @@ -13,4 +13,4 @@ rm -rf /var/mail/barant.com/barant/Inbox/* ./testsmtp & ./testsmtp & ./testsmtp & - +wait diff --git a/submitmailtestx10 b/tests/submitmailtestx10 similarity index 98% rename from submitmailtestx10 rename to tests/submitmailtestx10 index f17837b..2467e0a 100755 --- a/submitmailtestx10 +++ b/tests/submitmailtestx10 @@ -13,4 +13,4 @@ rm -rf /var/mail/barant.com/barant/Inbox/* ./submitmailtest & ./submitmailtest & ./submitmailtest & - +wait diff --git a/testsmtp b/tests/testsmtp similarity index 100% rename from testsmtp rename to tests/testsmtp