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