#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<SMTPSession &>(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;      
   }
   
}
