00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef _SOCKETS_SmtpdSocket_H
00034 #define _SOCKETS_SmtpdSocket_H
00035
00036 #include "sockets-config.h"
00037 #include <string>
00038 #include "TcpSocket.h"
00039
00040 #ifdef SOCKETS_NAMESPACE
00041 namespace SOCKETS_NAMESPACE {
00042 #endif
00043
00044
00046 class SmtpdSocket : public TcpSocket
00047 {
00048 protected:
00049 typedef enum {
00050 SMTP_NO_HELLO,
00051 SMTP_NAME_TOO_LONG,
00052 SMTP_DOMAIN_TOO_LONG,
00053 SMTP_QUIT
00054 } reason_t;
00055
00056 public:
00057 class EmailAddress {
00058 public:
00059 EmailAddress(const std::string& str_in)
00060 {
00061 std::string str = str_in;
00062 size_t i = str.find("<");
00063 if (i != std::string::npos)
00064 str = str.substr(i + 1);
00065 i = str.find("@");
00066 if (i != std::string::npos)
00067 {
00068 m_name = str.substr(0, i);
00069 str = str.substr(i + 1);
00070 i = str.find(">");
00071 if (i != std::string::npos)
00072 str = str.substr(0, i);
00073 m_domain = str;
00074 }
00075 while (m_name.size() && m_name[m_name.size() - 1] == ' ')
00076 m_name.resize(m_name.size() - 1);
00077 while (m_domain.size() && m_domain[m_domain.size() - 1] == ' ')
00078 m_domain.resize(m_domain.size() - 1);
00079 while (m_name.size() && m_name[0] == ' ')
00080 m_name = m_name.substr(1);
00081 while (m_domain.size() && m_domain[0] == ' ')
00082 m_domain = m_domain.substr(1);
00083 m_top = m_domain;
00084 {
00085 for (size_t i = 0; i < m_domain.size(); i++)
00086 {
00087 if (m_domain[i] == '.')
00088 {
00089 m_sub = m_top;
00090 m_top = m_domain.substr(i + 1);
00091 }
00092 }
00093 }
00094 }
00095
00096 const std::string& GetName() const { return m_name; }
00097 const std::string& GetDomain() const { return m_domain; }
00098 const std::string& GetTopDomain() const { return m_top; }
00099 const std::string& GetSubDomain() const { return m_sub; }
00100
00101 std::string ToString() const { return m_name + "@" + m_domain; }
00102
00103 private:
00104 std::string m_name;
00105 std::string m_domain;
00106 std::string m_top;
00107 std::string m_sub;
00108 };
00109
00110 public:
00111 SmtpdSocket(ISocketHandler&);
00112
00113 void OnAccept();
00114 void OnLine(const std::string&);
00115
00117 virtual bool OnHello(const std::string& domain) = 0;
00118
00120 virtual bool OnMailFrom(const EmailAddress& addr) = 0;
00121
00123 virtual bool OnRcptTo(const EmailAddress& addr) = 0;
00124
00125 virtual void OnHeader(const std::string& key, const std::string& value) = 0;
00126
00127 virtual void OnHeaderComplete() = 0;
00128
00129 virtual void OnData(const std::string& line) = 0;
00130
00132 virtual bool OnDataComplete() = 0;
00133
00134 virtual void OnRset() = 0;
00135
00136 virtual void OnAbort(reason_t) = 0;
00137
00138 virtual void OnNotSupported(const std::string& cmd, const std::string& arg) = 0;
00139
00140 private:
00141 bool m_hello;
00142 bool m_data;
00143 bool m_header;
00144 std::string m_header_line;
00145 };
00146
00147
00148 #ifdef SOCKETS_NAMESPACE
00149 }
00150 #endif
00151
00152 #endif // _SOCKETS_SmtpdSocket_H
00153