aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Richard <[email protected]>2017-12-20 07:46:28 +0000
committerGitHub <[email protected]>2017-12-20 07:46:28 +0000
commit680057bacd8d77a5677ffa68fba55ebafd608213 (patch)
treebc265e25a65cc8ba2ecce332722e279c68c55006
parentIssue #186: SMTPUTF8 is not an argument to RCPT + UTF8 in recipient address m... (diff)
parentAdd SMTPS with AUTH PLAIN without SASL (diff)
downloadvmime-680057bacd8d77a5677ffa68fba55ebafd608213.tar.gz
vmime-680057bacd8d77a5677ffa68fba55ebafd608213.zip
Merge pull request #184 from josusky/smtp-auth
Add SMTPS with AUTH PLAIN without SASL.
-rw-r--r--src/vmime/net/smtp/SMTPConnection.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/vmime/net/smtp/SMTPConnection.cpp b/src/vmime/net/smtp/SMTPConnection.cpp
index 3785126a..8709efe4 100644
--- a/src/vmime/net/smtp/SMTPConnection.cpp
+++ b/src/vmime/net/smtp/SMTPConnection.cpp
@@ -40,6 +40,10 @@
#if VMIME_HAVE_SASL_SUPPORT
#include "vmime/security/sasl/SASLContext.hpp"
+#else
+ #include "vmime/utility/encoder/b64Encoder.hpp"
+ #include "vmime/utility/inputStreamStringAdapter.hpp"
+ #include "vmime/utility/outputStreamStringAdapter.hpp"
#endif // VMIME_HAVE_SASL_SUPPORT
#if VMIME_HAVE_TLS_SUPPORT
@@ -48,7 +52,6 @@
#endif // VMIME_HAVE_TLS_SUPPORT
-
// Helpers for service properties
#define GET_PROPERTY(type, prop) \
(m_transport.lock()->getInfos().getPropertyValue <type>(getSession(), \
@@ -307,6 +310,39 @@ void SMTPConnection::authenticate()
throw;
}
}
+#else // no SASL
+
+ // allow AUTH PLAIN over TLS - it is a popular and simple mechanism
+ if (m_secured)
+ {
+ std::vector <string> authMechs;
+ hasExtension("AUTH", &authMechs);
+
+ if (authMechs.empty())
+ throw exceptions::authentication_error("No AUTH mechanism available.");
+
+ const string plain("PLAIN");
+ if (std::find(authMechs.begin(), authMechs.end(), plain) != authMechs.end())
+ {
+ const string username = getAuthenticator()->getUsername();
+ const string password = getAuthenticator()->getPassword();
+ const string authToken = username + '\0' + username + '\0' + password;
+ auto encoder = new vmime::utility::encoder::b64Encoder();
+ utility::inputStreamStringAdapter in(authToken);
+ string authTokenBase64;
+ utility::outputStreamStringAdapter out(authTokenBase64);
+ encoder->encode(in, out);
+ sendRequest(SMTPCommand::AUTH(plain, authTokenBase64));
+ shared_ptr <SMTPResponse> response = readResponse();
+ const int code = response ? response->getCode() : -1;
+ if (code == 235)
+ {
+ m_authenticated = true;
+ return;
+ }
+ }
+ }
+
#endif // VMIME_HAVE_SASL_SUPPORT
// No other authentication method is possible