aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-07-06 16:23:35 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2013-07-06 16:23:35 -0700
commit7f27559b18642bea9afe2a42a9b05ee52bdd6ccb (patch)
tree6c73a2fa9febe00fa0dd952764c07b3ed328ed20 /src/core
parentdd0b3c7a22eb957e5f2b9a71a2d3bdb342d62269 (diff)
Implemented SMTP OAuth 2.0
Diffstat (limited to 'src/core')
-rw-r--r--src/core/imap/MCIMAPSession.cc102
-rw-r--r--src/core/smtp/MCSMTPSession.cc158
-rw-r--r--src/core/smtp/MCSMTPSession.h6
3 files changed, 144 insertions, 122 deletions
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;