protocol.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. std::cout << "-> " << " . " << std::endl;
  25. ::message msg(m_address, m_context, m_message);
  26. std::cout << "-> " << " . " << std::endl;
  27. m_internalState = internalState::helo;
  28. std::cout << "-> " << " . " << std::endl;
  29. return answer(protocol::state::connected, "250 Ok");
  30. }
  31. return answer(protocol::state::connected, "");
  32. }
  33. std::cout << "-> " << message << std::endl;
  34. if (m_internalState == internalState::auth_login_user)
  35. {
  36. m_internalState = internalState::auth_login_pass;
  37. return answer(protocol::state::connected, "334 UGFzc3dvcmQ6");
  38. }
  39. if (m_internalState == internalState::auth_login_pass)
  40. {
  41. m_internalState = internalState::helo;
  42. return answer(protocol::state::connected, "235 2.7.0 Authentication successful");
  43. }
  44. if (boost::iequals(message, "quit\r\n"))
  45. {
  46. m_internalState = internalState::disconnect;
  47. return answer(protocol::state::disconnected, "221 Bye");
  48. }
  49. if (boost::istarts_with(message, "helo"))
  50. {
  51. m_internalState = internalState::helo;
  52. return answer(protocol::state::connected, "250-AlarmServer\r\n250 AUTH LOGIN");
  53. }
  54. if (boost::istarts_with(message, "ehlo"))
  55. {
  56. m_internalState = internalState::helo;
  57. return answer(protocol::state::connected, "250-AlarmServer\r\n250 AUTH LOGIN");
  58. }
  59. if (boost::istarts_with(message, "auth login"))
  60. {
  61. if (m_internalState != internalState::helo)
  62. return answer(protocol::state::connected, "503 Bad sequence of commands");
  63. m_internalState = internalState::auth_login_user;
  64. return answer(protocol::state::connected, "334 VXNlcm5hbWU6");
  65. }
  66. if (boost::istarts_with(message, "mail from:"))
  67. {
  68. if (m_internalState != internalState::helo)
  69. return answer(protocol::state::connected, "503 Bad sequence of commands");
  70. m_internalState = internalState::mail_from;
  71. return answer(protocol::state::connected, "250 Ok");
  72. }
  73. if (boost::istarts_with(message, "rcpt to:"))
  74. {
  75. if (m_internalState != internalState::mail_from)
  76. return answer(protocol::state::connected, "503 Bad sequence of commands");
  77. m_internalState = internalState::rcpt_to;
  78. return answer(protocol::state::connected, "250 Ok");
  79. }
  80. if (boost::iequals(message, "data\r\n"))
  81. {
  82. if (m_internalState != internalState::rcpt_to)
  83. return answer(protocol::state::connected, "503 Bad sequence of commands");
  84. m_internalState = internalState::data;
  85. return answer(protocol::state::connected, "354 Go ahead");
  86. }
  87. return answer(protocol::state::connected, "502 Error");
  88. }
  89. protocol::result protocol::answer(protocol::state::type state, std::string answer) const
  90. {
  91. if (answer.size() > 0)
  92. std::cout << "<- " << answer << std::endl;
  93. return result(state, answer);
  94. }
  95. void protocol::appendMessage(const std::string& message)
  96. {
  97. m_message.append(message);
  98. m_message.append("\n");
  99. }