diff options
Diffstat (limited to 'src/Sockets/SmtpdSocket.cpp')
-rw-r--r-- | src/Sockets/SmtpdSocket.cpp | 234 |
1 files changed, 0 insertions, 234 deletions
diff --git a/src/Sockets/SmtpdSocket.cpp b/src/Sockets/SmtpdSocket.cpp deleted file mode 100644 index 0d62925..0000000 --- a/src/Sockets/SmtpdSocket.cpp +++ /dev/null @@ -1,234 +0,0 @@ -/** - ** \file SmtpdSocket.cpp - ** \date 2007-05-10 - ** \author grymse@alhem.net -**/ -/* -Copyright (C) 2007 Anders Hedstrom - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ -#include "SmtpdSocket.h" -#include "Parse.h" -#include "Utility.h" - -#ifdef SOCKETS_NAMESPACE -namespace SOCKETS_NAMESPACE { -#endif - -SmtpdSocket::SmtpdSocket(ISocketHandler& h) -:TcpSocket(h) -,m_hello(false) -,m_data(false) -,m_header(false) -{ - SetLineProtocol(); -} - - -void SmtpdSocket::OnAccept() -{ - Send("220 ESMTP; \r\n"); -} - - -void SmtpdSocket::OnLine(const std::string& line) -{ - if (m_data) - { - if (m_header) - { - if (!line.size()) - { - if (m_header_line.size()) - { - Parse pa(m_header_line, ":"); - std::string key = pa.getword(); - OnHeader(key, pa.getrest()); - } - m_header = false; - OnHeaderComplete(); - } - else - if (line[0] == ' ' || line[0] == '\t') - { - m_header_line += line; - } - else - { - if (m_header_line.size()) - { - Parse pa(m_header_line, ":"); - std::string key = pa.getword(); - OnHeader(key, pa.getrest()); - } - m_header_line = line; - } - } - else - if (line == ".") - { - m_data = false; - if (OnDataComplete()) - Send("250 OK\r\n"); - else - Send("550 Failed\r\n"); - } - else - if (line.size() && line[0] == '.') - { - OnData(line.substr(1)); - } - else - { - OnData(line); - } - return; - } - Parse pa(line); - std::string cmd = Utility::ToUpper(pa.getword()); - - if (cmd == "EHLO") - { - if (!OnHello(pa.getrest())) - { - Send("550 Failed\r\n"); - } - else - { - m_hello = true; - Send("250 mail.alhem.net\r\n"); - } - } - else - if (cmd == "HELO") - { - if (!OnHello(pa.getrest())) - { - Send("550 Failed\r\n"); - } - else - { - m_hello = true; - Send("250 mail.alhem.net\r\n"); - } - } - else - if (!m_hello) - { - OnAbort(SMTP_NO_HELLO); - SetCloseAndDelete(); - } - else - if (cmd == "MAIL") // mail from: - { - Parse pa(line, ":"); - pa.getword(); // 'mail' - pa.getword(); // 'from' - std::string email = Utility::ToLower(pa.getrest()); - - EmailAddress addr( email ); - if (addr.GetName().size() > 64) - { - OnAbort(SMTP_NAME_TOO_LONG); - Send("500 Name too long.\r\n"); - return; - } - if (addr.GetDomain().size() > 64) - { - OnAbort(SMTP_DOMAIN_TOO_LONG); - Send("500 Domain too long.\r\n"); - return; - } - - if (!OnMailFrom( addr )) - { - Send("550 Failed\r\n"); - } - else - { - Send("250 OK\r\n"); - } - } - else - if (cmd == "RCPT") // rcpt to: - { - Parse pa(line, ":"); - pa.getword(); // 'rcpt' - pa.getword(); // 'to' - std::string email = Utility::ToLower(pa.getrest()); - // %! reject based on user / domain? - EmailAddress addr( email ); - - if (addr.GetName().size() > 64) - { - OnAbort(SMTP_NAME_TOO_LONG); - Send("500 Name too long.\r\n"); - return; - } - if (addr.GetDomain().size() > 64) - { - OnAbort(SMTP_DOMAIN_TOO_LONG); - Send("500 Domain too long.\r\n"); - return; - } - - if (!OnRcptTo( addr )) - { - Send("553 Failed\r\n"); - } - else - { - Send("250 OK\r\n"); - } - } - else - if (cmd == "DATA") - { - Send("354 Enter mail, end with \".\" on a line by itself\r\n"); - m_data = true; - m_header = false; - } - else - if (cmd == "RSET") - { - m_data = false; - m_header = false; - OnRset(); - Send("250 OK\r\n"); // %! ??? - } - else - if (cmd == "QUIT") - { - OnAbort(SMTP_QUIT); - Send("221 Bye Bye\r\n"); - SetCloseAndDelete(); - } - else - if (cmd == "NOOP") - { - Send("250 OK\r\n"); - } - else - { - OnNotSupported(cmd, pa.getrest()); - } -} - - -#ifdef SOCKETS_NAMESPACE -} // namespace SOCKETS_NAMESPACE { -#endif - |