#include #include #include "message.h" #include "protocol.h" protocol::protocol(const 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::cout << "Connection from " << address << std::endl; return answer(protocol::state::connected, "220 AlarmServer"); } protocol::result protocol::processMessage(const std::string& message) { if (m_internalState == internalState::data) { appendMessage(message); if (boost::iends_with(message, ".\r\n")) { std::cout << "-> " << " . " << std::endl; ::message msg(m_address, m_context, m_message); std::cout << "-> " << " . " << std::endl; m_internalState = internalState::helo; std::cout << "-> " << " . " << std::endl; return answer(protocol::state::connected, "250 Ok"); } return answer(protocol::state::connected, ""); } std::cout << "-> " << message << std::endl; 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 (boost::iequals(message, "quit\r\n")) { m_internalState = internalState::disconnect; return answer(protocol::state::disconnected, "221 Bye"); } if (boost::istarts_with(message, "helo")) { m_internalState = internalState::helo; return answer(protocol::state::connected, "250-AlarmServer\r\n250 AUTH LOGIN"); } if (boost::istarts_with(message, "ehlo")) { m_internalState = internalState::helo; return answer(protocol::state::connected, "250-AlarmServer\r\n250 AUTH LOGIN"); } if (boost::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 (boost::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 (boost::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 (boost::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 { if (answer.size() > 0) std::cout << "<- " << answer << std::endl; return result(state, answer); } void protocol::appendMessage(const std::string& message) { m_message.append(message); m_message.append("\n"); }