113 lines
3.4 KiB
C++
113 lines
3.4 KiB
C++
#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"))
|
|
{
|
|
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");
|
|
}
|
|
|