SMTPClientSession: added support for XOAUTH2 authentication

This commit is contained in:
Guenter Obiltschnig 2015-12-14 22:29:11 +01:00
parent 48bb3b3679
commit 8022781800
2 changed files with 25 additions and 1 deletions

View File

@ -52,7 +52,8 @@ public:
AUTH_CRAM_MD5, AUTH_CRAM_MD5,
AUTH_CRAM_SHA1, AUTH_CRAM_SHA1,
AUTH_LOGIN, AUTH_LOGIN,
AUTH_PLAIN AUTH_PLAIN,
AUTH_XOAUTH2
}; };
explicit SMTPClientSession(const StreamSocket& socket); explicit SMTPClientSession(const StreamSocket& socket);
@ -184,6 +185,7 @@ protected:
void loginUsingCRAM(const std::string& username, const std::string& method, Poco::DigestEngine& hmac); void loginUsingCRAM(const std::string& username, const std::string& method, Poco::DigestEngine& hmac);
void loginUsingLogin(const std::string& username, const std::string& password); void loginUsingLogin(const std::string& username, const std::string& password);
void loginUsingPlain(const std::string& username, const std::string& password); void loginUsingPlain(const std::string& username, const std::string& password);
void loginUsingXOAUTH2(const std::string& username, const std::string& password);
DialogSocket& socket(); DialogSocket& socket();
private: private:

View File

@ -206,6 +206,7 @@ void SMTPClientSession::loginUsingLogin(const std::string& username, const std::
} }
} }
void SMTPClientSession::loginUsingPlain(const std::string& username, const std::string& password) void SMTPClientSession::loginUsingPlain(const std::string& username, const std::string& password)
{ {
std::ostringstream credentialsBase64; std::ostringstream credentialsBase64;
@ -219,6 +220,19 @@ void SMTPClientSession::loginUsingPlain(const std::string& username, const std::
} }
void SMTPClientSession::loginUsingXOAUTH2(const std::string& username, const std::string& password)
{
std::ostringstream credentialsBase64;
Base64Encoder credentialsEncoder(credentialsBase64);
credentialsEncoder << "user=" << username << "\001auth=Bearer " << password << "\001\001";
credentialsEncoder.close();
std::string response;
int status = sendCommand("AUTH XOAUTH2", credentialsBase64.str(), response);
if (!isPositiveCompletion(status)) throw SMTPException("Login using XOAUTH2 failed", response, status);
}
void SMTPClientSession::login(LoginMethod loginMethod, const std::string& username, const std::string& password) void SMTPClientSession::login(LoginMethod loginMethod, const std::string& username, const std::string& password)
{ {
login(Environment::nodeName(), loginMethod, username, password); login(Environment::nodeName(), loginMethod, username, password);
@ -262,6 +276,14 @@ void SMTPClientSession::login(const std::string& hostname, LoginMethod loginMeth
} }
else throw SMTPException("The mail service does not support PLAIN authentication", response); else throw SMTPException("The mail service does not support PLAIN authentication", response);
} }
else if (loginMethod == AUTH_XOAUTH2)
{
if (response.find("XOAUTH2", 0) != std::string::npos)
{
loginUsingXOAUTH2(username, password);
}
else throw SMTPException("The mail service does not support XOAUTH2 authentication", response);
}
else if (loginMethod != AUTH_NONE) else if (loginMethod != AUTH_NONE)
{ {
throw SMTPException("The autentication method is not supported"); throw SMTPException("The autentication method is not supported");