Skip to content

Commit

Permalink
[qmf] Use password from SSO for CramMd5 authentication.
Browse files Browse the repository at this point in the history
  • Loading branch information
Valerio Valerio committed Dec 18, 2013
1 parent 586c02a commit c4a5e80
Show file tree
Hide file tree
Showing 12 changed files with 96 additions and 11 deletions.
18 changes: 18 additions & 0 deletions qmf/src/libraries/qmfmessageserver/qmailauthenticator.cpp
Expand Up @@ -138,6 +138,23 @@ QByteArray QMailAuthenticator::getAuthentication(const QMailAccountConfiguration
should be decoded before invocation, and the result should be encoded for
transmission.
*/
#ifdef USE_ACCOUNTS_QT
QByteArray QMailAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge, QString password)
{
QMailServiceConfiguration configuration(svcCfg);
if (!configuration.value("smtpusername").isEmpty()
&& (configuration.value("authentication") == QString::number(QMail::CramMd5Mechanism))) {
// SMTP server CRAM-MD5 authentication
return cramMd5Response(challenge, configuration.value("smtpusername").toUtf8(), password.toUtf8());
} else if (configuration.value("authentication") == QString::number(QMail::CramMd5Mechanism)) {
// IMAP/POP server CRAM-MD5 authentication
return cramMd5Response(challenge, configuration.value("username").toUtf8(), password.toUtf8());
}

// Unknown service type and/or authentication type
return QByteArray();
}
#else
QByteArray QMailAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge)
{
QMailServiceConfiguration configuration(svcCfg);
Expand All @@ -153,3 +170,4 @@ QByteArray QMailAuthenticator::getResponse(const QMailAccountConfiguration::Serv
// Unknown service type and/or authentication type
return QByteArray();
}
#endif
4 changes: 4 additions & 0 deletions qmf/src/libraries/qmfmessageserver/qmailauthenticator.h
Expand Up @@ -52,7 +52,11 @@ class MESSAGESERVER_EXPORT QMailAuthenticator
public:
static bool useEncryption(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities);
static QByteArray getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities);
#ifdef USE_ACCOUNTS_QT
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge, QString password);
#else
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge);
#endif
};

#endif
Expand Down
15 changes: 13 additions & 2 deletions qmf/src/plugins/messageservices/imap/imapauthenticator.cpp
Expand Up @@ -105,6 +105,16 @@ QByteArray ImapAuthenticator::getAuthentication(const QMailAccountConfiguration:
return QByteArray("LOGIN") + ' ' + ImapProtocol::quoteString(imapCfg.mailUserName().toLatin1())
+ ' ' + ImapProtocol::quoteString(_password.toLatin1());
}

QByteArray ImapAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge, const QByteArray &ssoLogin)
{
if (ssoLogin.size()) {
return QMailAuthenticator::getResponse(svcCfg, challenge, QString::fromLatin1(ssoLogin.constData()));
} else {
return QByteArray();
}
}

#else
QByteArray ImapAuthenticator::getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities)
{
Expand All @@ -123,10 +133,11 @@ QByteArray ImapAuthenticator::getAuthentication(const QMailAccountConfiguration:
return QByteArray("LOGIN") + ' ' + ImapProtocol::quoteString(imapCfg.mailUserName().toLatin1())
+ ' ' + ImapProtocol::quoteString(imapCfg.mailPassword().toLatin1());
}
#endif

QByteArray ImapAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge)
{
return QMailAuthenticator::getResponse(svcCfg, challenge);
}
#endif



4 changes: 3 additions & 1 deletion qmf/src/plugins/messageservices/imap/imapauthenticator.h
Expand Up @@ -53,10 +53,12 @@ class ImapAuthenticator
static bool useEncryption(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities);
#ifdef USE_ACCOUNTS_QT
static QByteArray getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities, const QByteArray &ssoLogin);
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge, const QByteArray &ssoLogin);
#else
static QByteArray getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities);
#endif
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge);
#endif

};

#endif
Expand Down
4 changes: 4 additions & 0 deletions qmf/src/plugins/messageservices/imap/imapprotocol.cpp
Expand Up @@ -599,7 +599,11 @@ bool LoginState::continuationResponse(ImapContext *c, const QString &received)
{
// The server input is Base64 encoded
QByteArray challenge = QByteArray::fromBase64(received.toLatin1());
#ifdef USE_ACCOUNTS_QT
QByteArray response(ImapAuthenticator::getResponse(_config.serviceConfiguration("imap4"), challenge, _ssoLogin));
#else
QByteArray response(ImapAuthenticator::getResponse(_config.serviceConfiguration("imap4"), challenge));
#endif
if (!response.isEmpty()) {
c->sendData(response.toBase64());
} else {
Expand Down
11 changes: 10 additions & 1 deletion qmf/src/plugins/messageservices/pop/popauthenticator.cpp
Expand Up @@ -97,6 +97,15 @@ QList<QByteArray> PopAuthenticator::getAuthentication(const QMailAccountConfigur

return result;
}
QByteArray PopAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge, const QList<QByteArray> &ssoLogin)
{
if (ssoLogin.size()) {
QByteArray pass = ssoLogin.at(0);
return QMailAuthenticator::getResponse(svcCfg, challenge, QString::fromLatin1(pass.constData()));
} else {
return QByteArray();
}
}
#else
QList<QByteArray> PopAuthenticator::getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities)
{
Expand All @@ -115,10 +124,10 @@ QList<QByteArray> PopAuthenticator::getAuthentication(const QMailAccountConfigur

return result;
}
#endif

QByteArray PopAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge)
{
return QMailAuthenticator::getResponse(svcCfg, challenge);
}
#endif

3 changes: 2 additions & 1 deletion qmf/src/plugins/messageservices/pop/popauthenticator.h
Expand Up @@ -53,10 +53,11 @@ class PopAuthenticator
static bool useEncryption(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities);
#ifdef USE_ACCOUNTS_QT
static QList<QByteArray> getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities, const QList<QByteArray> &ssoLogin);
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge, const QList<QByteArray> &ssoLogin);
#else
static QList<QByteArray> getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities);
#endif
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge);
#endif
};

#endif
Expand Down
4 changes: 4 additions & 0 deletions qmf/src/plugins/messageservices/pop/popclient.cpp
Expand Up @@ -548,7 +548,11 @@ void PopClient::processResponse(const QString &response)
if ((response.length() > 2) && (response[1] == ' ')) {
// This is a continuation containing a challenge string (in Base64)
QByteArray challenge = QByteArray::fromBase64(response.mid(2).toLatin1());
#ifdef USE_ACCOUNTS_QT
QByteArray response(PopAuthenticator::getResponse(config.serviceConfiguration("pop3"), challenge, ssoLogin));
#else
QByteArray response(PopAuthenticator::getResponse(config.serviceConfiguration("pop3"), challenge));
#endif

if (!response.isEmpty()) {
// Send the response as Base64 encoded
Expand Down
23 changes: 22 additions & 1 deletion qmf/src/plugins/messageservices/smtp/smtpauthenticator.cpp
Expand Up @@ -91,6 +91,27 @@ QByteArray SmtpAuthenticator::getAuthentication(const QMailAccountConfiguration:
}
return result;
}

QByteArray SmtpAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge, QList<QByteArray> &ssoLogin)
{
QByteArray result;

QMap<QMailAccountId, QList<QByteArray> >::iterator it = gResponses.find(svcCfg.id());
if (it != gResponses.end()) {
QList<QByteArray> &responses = it.value();
result = responses.takeFirst();

if (responses.isEmpty())
gResponses.erase(it);
} else {
if (ssoLogin.size()) {
QByteArray pass = ssoLogin.at(0);
result = QMailAuthenticator::getResponse(svcCfg, challenge, QString::fromLatin1(pass.constData()));
}
}

return result;
}
#else
QByteArray SmtpAuthenticator::getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities)
{
Expand Down Expand Up @@ -120,7 +141,6 @@ QByteArray SmtpAuthenticator::getAuthentication(const QMailAccountConfiguration:
}
return result;
}
#endif

QByteArray SmtpAuthenticator::getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge)
{
Expand All @@ -139,3 +159,4 @@ QByteArray SmtpAuthenticator::getResponse(const QMailAccountConfiguration::Servi

return result;
}
#endif
3 changes: 2 additions & 1 deletion qmf/src/plugins/messageservices/smtp/smtpauthenticator.h
Expand Up @@ -50,11 +50,12 @@
class SmtpAuthenticator
{
public:
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge);
#ifdef USE_ACCOUNTS_QT
static QByteArray getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities, QList<QByteArray> &ssoLogin);
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge, QList<QByteArray> &ssoLogin);
#else
static QByteArray getAuthentication(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QStringList &capabilities);
static QByteArray getResponse(const QMailAccountConfiguration::ServiceConfiguration &svcCfg, const QByteArray &challenge);
#endif
};

Expand Down
4 changes: 4 additions & 0 deletions qmf/src/plugins/messageservices/smtp/smtpclient.cpp
Expand Up @@ -637,7 +637,11 @@ void SmtpClient::nextAction(const QString &response)
if (responseCode == 334) {
// This is a continuation containing a challenge string (in Base64)
QByteArray challenge = QByteArray::fromBase64(response.mid(4).toLatin1());
#ifdef USE_ACCOUNTS_QT
QByteArray response(SmtpAuthenticator::getResponse(config.serviceConfiguration("smtp"), challenge, ssoLogin));
#else
QByteArray response(SmtpAuthenticator::getResponse(config.serviceConfiguration("smtp"), challenge));
#endif

if (!response.isEmpty()) {
// Send the response as Base64 encoded
Expand Down
14 changes: 10 additions & 4 deletions qmf/src/plugins/ssoauth/password/passwordplugin.cpp
Expand Up @@ -95,6 +95,8 @@ QList<QByteArray> SSOPasswordPlugin::getIMAPAuthentication(const QString &passwo
QByteArray user(username.toLatin1());
QByteArray pass(password.toLatin1());
return QList<QByteArray>() << QByteArray("AUTHENTICATE PLAIN ") + QByteArray(user + '\0' + user + '\0' + pass).toBase64();
} if (serviceAuthentication == QMail::CramMd5Mechanism) {
return QList<QByteArray>() << QByteArray(password.toLatin1());
} else {
return QList<QByteArray>() << QByteArray("LOGIN") + ' ' + quoteIMAPString(username.toLatin1())
+ ' ' + quoteIMAPString(password.toLatin1());
Expand All @@ -104,11 +106,13 @@ QList<QByteArray> SSOPasswordPlugin::getIMAPAuthentication(const QString &passwo
QList<QByteArray> SSOPasswordPlugin::getPOPAuthentication(const QString &password,
const QString &username, int serviceAuthentication) const
{
Q_UNUSED(serviceAuthentication);
QList<QByteArray> result;

result.append(QByteArray("USER ") + username.toLatin1());
result.append(QByteArray("PASS ") + password.toLatin1());
if (serviceAuthentication == QMail::CramMd5Mechanism) {
result.append(QByteArray(password.toLatin1()));
} else {
result.append(QByteArray("USER ") + username.toLatin1());
result.append(QByteArray("PASS ") + password.toLatin1());
}

return result;
}
Expand All @@ -127,6 +131,8 @@ QList<QByteArray> SSOPasswordPlugin::getSMTPAuthentication(const QString &passwo
} else if (serviceAuthentication == QMail::PlainMechanism) {
result.append(QByteArray("AUTH PLAIN"));
result.append(QByteArray(user + '\0' + user + '\0' + pass));
} else if (serviceAuthentication == QMail::CramMd5Mechanism) {
result.append(QByteArray(pass));
}
return result;
}
Expand Down

0 comments on commit c4a5e80

Please sign in to comment.