aboutsummaryrefslogtreecommitdiff
path: root/src/base/QXmppSaslAuth.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/QXmppSaslAuth.cpp')
-rw-r--r--src/base/QXmppSaslAuth.cpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/base/QXmppSaslAuth.cpp b/src/base/QXmppSaslAuth.cpp
index ddec1e0d..200dc08a 100644
--- a/src/base/QXmppSaslAuth.cpp
+++ b/src/base/QXmppSaslAuth.cpp
@@ -427,6 +427,7 @@ class QXmppSaslServerPrivate
public:
QString username;
QString password;
+ QByteArray passwordDigest;
QString realm;
};
@@ -484,6 +485,20 @@ void QXmppSaslServer::setPassword(const QString &password)
d->password = password;
}
+/// Returns the password digest.
+
+QByteArray QXmppSaslServer::passwordDigest() const
+{
+ return d->passwordDigest;
+}
+
+/// Sets the password digest.
+
+void QXmppSaslServer::setPasswordDigest(const QByteArray &digest)
+{
+ d->passwordDigest = digest;
+}
+
/// Returns the realm.
QString QXmppSaslServer::realm() const
@@ -556,16 +571,20 @@ QXmppSaslServer::Response QXmppSaslServerDigestMd5::respond(const QByteArray &re
const QByteArray realm = input.value("realm");
setUsername(QString::fromUtf8(input.value("username")));
- if (password().isEmpty())
+ if (password().isEmpty() && passwordDigest().isEmpty())
return InputNeeded;
m_saslDigest.setQop("auth");
m_saslDigest.setDigestUri(input.value("digest-uri"));
m_saslDigest.setNc(input.value("nc"));
m_saslDigest.setCnonce(input.value("cnonce"));
- m_saslDigest.setSecret(QCryptographicHash::hash(
- username().toUtf8() + ":" + realm + ":" + password().toUtf8(),
- QCryptographicHash::Md5));
+ if (!password().isEmpty()) {
+ m_saslDigest.setSecret(QCryptographicHash::hash(
+ username().toUtf8() + ":" + realm + ":" + password().toUtf8(),
+ QCryptographicHash::Md5));
+ } else {
+ m_saslDigest.setSecret(passwordDigest());
+ }
const QByteArray expectedResponse = m_saslDigest.calculateDigest(
QByteArray("AUTHENTICATE:") + m_saslDigest.digestUri());