From 7f27559b18642bea9afe2a42a9b05ee52bdd6ccb Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Sat, 6 Jul 2013 16:23:35 -0700 Subject: Implemented SMTP OAuth 2.0 --- src/core/imap/MCIMAPSession.cc | 102 +++++++++++++------------- src/core/smtp/MCSMTPSession.cc | 158 +++++++++++++++++++++++------------------ src/core/smtp/MCSMTPSession.h | 6 ++ 3 files changed, 144 insertions(+), 122 deletions(-) (limited to 'src/core') diff --git a/src/core/imap/MCIMAPSession.cc b/src/core/imap/MCIMAPSession.cc index 8437cded..e013ac75 100644 --- a/src/core/imap/MCIMAPSession.cc +++ b/src/core/imap/MCIMAPSession.cc @@ -687,76 +687,76 @@ void IMAPSession::login(ErrorCode * pError) break; case AuthTypeSASLCRAMMD5: - r = mailimap_authenticate(mImap, "CRAM-MD5", - MCUTF8(mHostname), - NULL, - NULL, - utf8username, utf8username, - utf8password, NULL); - break; + r = mailimap_authenticate(mImap, "CRAM-MD5", + MCUTF8(mHostname), + NULL, + NULL, + utf8username, utf8username, + utf8password, NULL); + break; case AuthTypeSASLPlain: - r = mailimap_authenticate(mImap, "PLAIN", - MCUTF8(mHostname), - NULL, - NULL, - utf8username, utf8username, - utf8password, NULL); - break; + r = mailimap_authenticate(mImap, "PLAIN", + MCUTF8(mHostname), + NULL, + NULL, + utf8username, utf8username, + utf8password, NULL); + break; case AuthTypeSASLGSSAPI: // needs to be tested r = mailimap_authenticate(mImap, "GSSAPI", - MCUTF8(mHostname), - NULL, - NULL, - utf8username, utf8username, - utf8password, NULL /* realm */); + MCUTF8(mHostname), + NULL, + NULL, + utf8username, utf8username, + utf8password, NULL /* realm */); break; case AuthTypeSASLDIGESTMD5: r = mailimap_authenticate(mImap, "DIGEST-MD5", - MCUTF8(mHostname), - NULL, - NULL, - utf8username, utf8username, - utf8password, NULL); + MCUTF8(mHostname), + NULL, + NULL, + utf8username, utf8username, + utf8password, NULL); break; - - case AuthTypeSASLLogin: + + case AuthTypeSASLLogin: r = mailimap_authenticate(mImap, "LOGIN", - MCUTF8(mHostname), - NULL, - NULL, - utf8username, utf8username, - utf8password, NULL); + MCUTF8(mHostname), + NULL, + NULL, + utf8username, utf8username, + utf8password, NULL); break; - - case AuthTypeSASLSRP: + + case AuthTypeSASLSRP: r = mailimap_authenticate(mImap, "SRP", - MCUTF8(mHostname), - NULL, - NULL, - utf8username, utf8username, - utf8password, NULL); + MCUTF8(mHostname), + NULL, + NULL, + utf8username, utf8username, + utf8password, NULL); break; - case AuthTypeSASLNTLM: + case AuthTypeSASLNTLM: r = mailimap_authenticate(mImap, "NTLM", - MCUTF8(mHostname), - NULL, - NULL, - utf8username, utf8username, - utf8password, NULL/* realm */); + MCUTF8(mHostname), + NULL, + NULL, + utf8username, utf8username, + utf8password, NULL/* realm */); break; - case AuthTypeSASLKerberosV4: + case AuthTypeSASLKerberosV4: r = mailimap_authenticate(mImap, "KERBEROS_V4", - MCUTF8(mHostname), - NULL, - NULL, - utf8username, utf8username, - utf8password, NULL/* realm */); + MCUTF8(mHostname), + NULL, + NULL, + utf8username, utf8username, + utf8password, NULL/* realm */); break; case AuthTypeXOAuth2: @@ -773,7 +773,7 @@ void IMAPSession::login(ErrorCode * pError) } else if (hasError(r)) { String * response; - + response = MCSTR(""); if (mImap->imap_response != NULL) { response = String::stringWithUTF8Characters(mImap->imap_response); diff --git a/src/core/smtp/MCSMTPSession.cc b/src/core/smtp/MCSMTPSession.cc index dcbad71e..0febf66e 100644 --- a/src/core/smtp/MCSMTPSession.cc +++ b/src/core/smtp/MCSMTPSession.cc @@ -24,6 +24,7 @@ void SMTPSession::init() mPort = 0; mUsername = NULL; mPassword = NULL; + mOAuth2Token = NULL; mAuthType = AuthTypeSASLNone; mConnectionType = ConnectionTypeClear; mTimeout = 30; @@ -50,6 +51,7 @@ SMTPSession::~SMTPSession() MC_SAFE_RELEASE(mHostname); MC_SAFE_RELEASE(mUsername); MC_SAFE_RELEASE(mPassword); + MC_SAFE_RELEASE(mOAuth2Token); } void SMTPSession::setHostname(String * hostname) @@ -92,6 +94,16 @@ String * SMTPSession::password() return mPassword; } +void SMTPSession::setOAuth2Token(String * token) +{ + MC_SAFE_REPLACE_COPY(String, mOAuth2Token, token); +} + +String * SMTPSession::OAuth2Token() +{ + return mOAuth2Token; +} + void SMTPSession::setAuthType(AuthType authType) { mAuthType = authType; @@ -404,86 +416,90 @@ void SMTPSession::login(ErrorCode * pError) switch (authType()) { case 0: default: - r = mailesmtp_auth_sasl(mSmtp, "PLAIN", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL); - break; - + r = mailesmtp_auth_sasl(mSmtp, "PLAIN", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL); + break; + case AuthTypeSASLCRAMMD5: - r = mailesmtp_auth_sasl(mSmtp, "CRAM-MD5", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL); - break; - + r = mailesmtp_auth_sasl(mSmtp, "CRAM-MD5", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL); + break; + case AuthTypeSASLPlain: - r = mailesmtp_auth_sasl(mSmtp, "PLAIN", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL); - break; - + r = mailesmtp_auth_sasl(mSmtp, "PLAIN", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL); + break; + case AuthTypeSASLGSSAPI: // needs to be tested - r = mailesmtp_auth_sasl(mSmtp, "GSSAPI", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL); - break; - + r = mailesmtp_auth_sasl(mSmtp, "GSSAPI", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL); + break; + case AuthTypeSASLDIGESTMD5: - r = mailesmtp_auth_sasl(mSmtp, "DIGEST-MD5", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL); - break; - + r = mailesmtp_auth_sasl(mSmtp, "DIGEST-MD5", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL); + break; + case AuthTypeSASLLogin: - r = mailesmtp_auth_sasl(mSmtp, "LOGIN", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL); - break; - + r = mailesmtp_auth_sasl(mSmtp, "LOGIN", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL); + break; + case AuthTypeSASLSRP: - r = mailesmtp_auth_sasl(mSmtp, "SRP", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL); - break; - + r = mailesmtp_auth_sasl(mSmtp, "SRP", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL); + break; + case AuthTypeSASLNTLM: - r = mailesmtp_auth_sasl(mSmtp, "NTLM", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL /* realm */); - break; - + r = mailesmtp_auth_sasl(mSmtp, "NTLM", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL /* realm */); + break; + case AuthTypeSASLKerberosV4: - r = mailesmtp_auth_sasl(mSmtp, "KERBEROS_V4", - MCUTF8(mHostname), - NULL, - NULL, - MCUTF8(mUsername), MCUTF8(mUsername), - MCUTF8(mPassword), NULL /* realm */); - break; + r = mailesmtp_auth_sasl(mSmtp, "KERBEROS_V4", + MCUTF8(mHostname), + NULL, + NULL, + MCUTF8(mUsername), MCUTF8(mUsername), + MCUTF8(mPassword), NULL /* realm */); + break; + + case AuthTypeXOAuth2: + r = mailsmtp_oauth2_authenticate(mSmtp, MCUTF8(mUsername), MCUTF8(mOAuth2Token)); + break; } if (r == MAILSMTP_ERROR_STREAM) { * pError = ErrorConnection; diff --git a/src/core/smtp/MCSMTPSession.h b/src/core/smtp/MCSMTPSession.h index 491ecb07..3d066a6c 100644 --- a/src/core/smtp/MCSMTPSession.h +++ b/src/core/smtp/MCSMTPSession.h @@ -30,6 +30,11 @@ namespace mailcore { virtual void setPassword(String * password); virtual String * password(); + // To authenticate using OAuth2, username and oauth2token should be set. + // auth type to use is AuthTypeOAuth2. + virtual void setOAuth2Token(String * token); + virtual String * OAuth2Token(); + virtual void setAuthType(AuthType authType); virtual AuthType authType(); @@ -62,6 +67,7 @@ namespace mailcore { unsigned int mPort; String * mUsername; String * mPassword; + String * mOAuth2Token; AuthType mAuthType; ConnectionType mConnectionType; time_t mTimeout; -- cgit v1.2.3