71 lines
1.6 KiB
C++
71 lines
1.6 KiB
C++
#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;
|
|
}
|
|
|
|
}
|