Files
AlarmServer/protocol.cpp
T
2017-04-28 18:45:26 +02:00

112 lines
3.2 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"))
{
::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");
}