| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #include "Protocol.h"
- #include "MailServer/Message.h"
- #include <Logging.h>
- #include <StringAlgorithm.h>
- #include <sstream>
- namespace Protocol {
- Protocol::Protocol(const Util::Context& context) :
- m_internalState(InternalState::None),
- m_context(context)
- {
- }
- Protocol::Result Protocol::OpenConnection(const std::string& address)
- {
- m_address = address;
- m_internalState = InternalState::Connect;
- std::stringstream ss;
- ss << "Connection from " << address << std::endl;
- Logging::Log(Logging::Severity::Info, ss.str());
- return Answer(Protocol::State::Connected, "220 AlarmServer");
- }
- Protocol::Result Protocol::ProcessMessage(const std::string& message)
- {
- if (m_internalState == InternalState::Data)
- {
- AppendMessage(message);
- if (StringAlgorithm::iends_with(message, ".\r\n"))
- {
- MailServer::Message msg(m_address, m_context, m_message);
- m_internalState = InternalState::Helo;
- return Answer(Protocol::State::Connected, "250 Ok");
- }
- return Answer(Protocol::State::Connected, "");
- }
- if (m_internalState == InternalState::Auth_login_user)
- {
- m_internalState = InternalState::Auth_login_pass;
- return Answer(Protocol::State::Connected, "334 UGFzc3dvcmQ6");
- }
- if (m_internalState == InternalState::Auth_login_pass)
- {
- m_internalState = InternalState::Helo;
- return Answer(Protocol::State::Connected, "235 2.7.0 Authentication successful");
- }
- if (StringAlgorithm::iequals(message, "quit\r\n"))
- {
- m_internalState = InternalState::Disconnect;
- return Answer(Protocol::State::Disconnected, "221 Bye");
- }
- if (StringAlgorithm::istarts_with(message, "helo"))
- {
- m_internalState = InternalState::Helo;
- return Answer(Protocol::State::Connected, "250-AlarmServer\r\n250 AUTH LOGIN");
- }
- if (StringAlgorithm::istarts_with(message, "ehlo"))
- {
- m_internalState = InternalState::Helo;
- return Answer(Protocol::State::Connected, "250-AlarmServer\r\n250 AUTH LOGIN");
- }
- if (StringAlgorithm::istarts_with(message, "auth login"))
- {
- if (m_internalState != InternalState::Helo)
- return Answer(Protocol::State::Connected, "503 Bad sequence of commands");
- m_internalState = InternalState::Auth_login_user;
- return Answer(Protocol::State::Connected, "334 VXNlcm5hbWU6");
- }
- if (StringAlgorithm::istarts_with(message, "mail from:"))
- {
- if (m_internalState != InternalState::Helo)
- return Answer(Protocol::State::Connected, "503 Bad sequence of commands");
- m_internalState = InternalState::Mail_from;
- return Answer(Protocol::State::Connected, "250 Ok");
- }
- if (StringAlgorithm::istarts_with(message, "rcpt to:"))
- {
- if (m_internalState != InternalState::Mail_from)
- return Answer(Protocol::State::Connected, "503 Bad sequence of commands");
- m_internalState = InternalState::Rcpt_to;
- return Answer(Protocol::State::Connected, "250 Ok");
- }
- if (StringAlgorithm::iequals(message, "data\r\n"))
- {
- if (m_internalState != InternalState::Rcpt_to)
- return Answer(Protocol::State::Connected, "503 Bad sequence of commands");
- m_internalState = InternalState::Data;
- return Answer(Protocol::State::Connected, "354 Go ahead");
- }
- return Answer(Protocol::State::Connected, "502 Error");
- }
- Protocol::Result Protocol::Answer(Protocol::State::type state, std::string answer) const
- {
- return Result(state, answer);
- }
- void Protocol::AppendMessage(const std::string& message)
- {
- m_message.append(message);
- m_message.append("\n");
- }
- } // namespace Protocol
|