| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- #include <iostream>
- #include <boost/algorithm/string/predicate.hpp>
- #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"))
- {
- ::message msg(m_address, m_context, m_message);
- m_internalState = internalState::helo;
- 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");
- }
|