#include "__SMTP_AUTH.h"
#include "SMTPServer.h"
#include "Base64.h"

namespace mail {
   
   int __SMTP_AUTH::processCommand(coreutils::PString request, SMTPSession &session, SMTPServer &server, std::stringstream &data) {
     
      switch(session.authState) {	 

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