protocol.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include <iostream>
  2. #include <boost/algorithm/string/predicate.hpp>
  3. #include "message.h"
  4. #include "protocol.h"
  5. protocol::protocol(const context& context) :
  6. m_internalState(internalState::none),
  7. m_context(context)
  8. {
  9. }
  10. protocol::result protocol::openConnection(const std::string& address)
  11. {
  12. m_address = address;
  13. m_internalState = internalState::connect;
  14. //std::cout << "Connection from " << address << std::endl;
  15. return answer(protocol::state::connected, "220 AlarmServer");
  16. }
  17. protocol::result protocol::processMessage(const std::string& message)
  18. {
  19. if (m_internalState == internalState::data)
  20. {
  21. appendMessage(message);
  22. if (boost::iends_with(message, ".\r\n"))
  23. {
  24. ::message msg(m_address, m_context, m_message);
  25. m_internalState = internalState::helo;
  26. return answer(protocol::state::connected, "250 Ok");
  27. }
  28. return answer(protocol::state::connected, "");
  29. }
  30. //std::cout << "-> " << message << std::endl;
  31. if (m_internalState == internalState::auth_login_user)
  32. {
  33. m_internalState = internalState::auth_login_pass;
  34. return answer(protocol::state::connected, "334 UGFzc3dvcmQ6");
  35. }
  36. if (m_internalState == internalState::auth_login_pass)
  37. {
  38. m_internalState = internalState::helo;
  39. return answer(protocol::state::connected, "235 2.7.0 Authentication successful");
  40. }
  41. if (boost::iequals(message, "quit\r\n"))
  42. {
  43. m_internalState = internalState::disconnect;
  44. return answer(protocol::state::disconnected, "221 Bye");
  45. }
  46. if (boost::istarts_with(message, "helo"))
  47. {
  48. m_internalState = internalState::helo;
  49. return answer(protocol::state::connected, "250-AlarmServer\r\n250 AUTH LOGIN");
  50. }
  51. if (boost::istarts_with(message, "ehlo"))
  52. {
  53. m_internalState = internalState::helo;
  54. return answer(protocol::state::connected, "250-AlarmServer\r\n250 AUTH LOGIN");
  55. }
  56. if (boost::istarts_with(message, "auth login"))
  57. {
  58. if (m_internalState != internalState::helo)
  59. return answer(protocol::state::connected, "503 Bad sequence of commands");
  60. m_internalState = internalState::auth_login_user;
  61. return answer(protocol::state::connected, "334 VXNlcm5hbWU6");
  62. }
  63. if (boost::istarts_with(message, "mail from:"))
  64. {
  65. if (m_internalState != internalState::helo)
  66. return answer(protocol::state::connected, "503 Bad sequence of commands");
  67. m_internalState = internalState::mail_from;
  68. return answer(protocol::state::connected, "250 Ok");
  69. }
  70. if (boost::istarts_with(message, "rcpt to:"))
  71. {
  72. if (m_internalState != internalState::mail_from)
  73. return answer(protocol::state::connected, "503 Bad sequence of commands");
  74. m_internalState = internalState::rcpt_to;
  75. return answer(protocol::state::connected, "250 Ok");
  76. }
  77. if (boost::iequals(message, "data\r\n"))
  78. {
  79. if (m_internalState != internalState::rcpt_to)
  80. return answer(protocol::state::connected, "503 Bad sequence of commands");
  81. m_internalState = internalState::data;
  82. return answer(protocol::state::connected, "354 Go ahead");
  83. }
  84. return answer(protocol::state::connected, "502 Error");
  85. }
  86. protocol::result protocol::answer(protocol::state::type state, std::string answer) const
  87. {
  88. /*
  89. if (answer.size() > 0)
  90. std::cout << "<- " << answer << std::endl;
  91. */
  92. return result(state, answer);
  93. }
  94. void protocol::appendMessage(const std::string& message)
  95. {
  96. m_message.append(message);
  97. m_message.append("\n");
  98. }