diff options
Diffstat (limited to 'src/base/QXmppSaslAuth.cpp')
| -rw-r--r-- | src/base/QXmppSaslAuth.cpp | 27 |
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()); |
