#include "__SMTP_AUTH.h" #include "SMTPServer.h" #include "Base64.h" namespace mail { int __SMTP_AUTH::processCommand(coreutils::ZString &request, core::TCPSession &session) { SMTPSession &s = dynamic_cast(session); SMTPServer &server = session.server; switch((SMTPSession &)session.authState) { case USER_UNKNOWN: if(request[1].equals("LOGIN") { data << "334 VXNlcm5hbWU6" << CRLF; // setTimer(10.0f); s.authState = USER_QUERY; server.commands.grabInput(&session, *this); } else { s.out << "504 AUTH method not supported." << CRLF; } return 1; case USER_QUERY: s.userName = request[0].str(); // setTimer(0.0f); s.out << "334 UGFzc3dvcmQ6" << CRLF; // setTimer(10.0f); s.authState = USER_SECRET_QUERY; return 1; case USER_SECRET_QUERY: s.password = request[0].str(); // setTimer(0.0f); coreutils::Base64 base64; if(authLogin(s.userName, s.password, server)) { s.out << "235 2.7.0 Authentication successful" << CRLF; s.relay = true; s.authState = USER_KNOWN; server.commands.clearGrab(&session); } else { s.out << "530 Login was unsuccessful." << CRLF; } return 1; } return 0; } bool __SMTP_AUTH::authLogin(coreutils::ZString userName, coreutils::ZString password, SMTPServer &server) { std::string secretPath = server.mailFileSystem.getMailBoxPath(userName) + "/.password"; coreutils::File secret(secretPath); secret.read(); return secret.asString() == password; } }