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