Fix http authentication to a different realm on the same server
authorShane Kearns <shane.kearns@accenture.com>
Thu, 22 Dec 2011 14:08:17 +0000 (14:08 +0000)
committerQt by Nokia <qt-info@nokia.com>
Thu, 22 Dec 2011 15:10:33 +0000 (16:10 +0100)
This is a regression caused by the NTLMv2 authentication patch.
I have manually tested NTLMv2 authentication against MS IIS and reverting
these two lines does not break it.

Task-number: QT-5209
Change-Id: I64159cbe468e1a7f834f8726fd0c9d4ab4c54b38
Reviewed-by: Peter Hartmann <peter.hartmann@nokia.com>
src/network/kernel/qauthenticator.cpp
tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp

index 8042424..ec3abdf 100644 (file)
@@ -388,8 +388,7 @@ void QAuthenticatorPrivate::parseHttpResponse(const QList<QPair<QByteArray, QByt
 
     switch(method) {
     case Basic:
-        if(realm.isEmpty())
-            this->options[QLatin1String("realm")] = realm = QString::fromLatin1(options.value("realm"));
+        this->options[QLatin1String("realm")] = realm = QString::fromLatin1(options.value("realm"));
         if (user.isEmpty() && password.isEmpty())
             phase = Done;
         break;
@@ -397,8 +396,7 @@ void QAuthenticatorPrivate::parseHttpResponse(const QList<QPair<QByteArray, QByt
         // #### extract from header
         break;
     case DigestMd5: {
-        if(realm.isEmpty())
-            this->options[QLatin1String("realm")] = realm = QString::fromLatin1(options.value("realm"));
+        this->options[QLatin1String("realm")] = realm = QString::fromLatin1(options.value("realm"));
         if (options.value("stale").toLower() == "true")
             phase = Start;
         if (user.isEmpty() && password.isEmpty())
index cc520a6..dc1dd4a 100644 (file)
@@ -382,6 +382,7 @@ private Q_SLOTS:
     void httpUserAgent();
     void authenticationCacheAfterCancel_data();
     void authenticationCacheAfterCancel();
+    void authenticationWithDifferentRealm();
     void synchronousAuthenticationCache();
 
     // NOTE: This test must be last!
@@ -6212,6 +6213,38 @@ void tst_QNetworkReply::authenticationCacheAfterCancel()
 
 }
 
+void tst_QNetworkReply::authenticationWithDifferentRealm()
+{
+    AuthenticationCacheHelper helper;
+    QNetworkAccessManager manager;
+#ifndef QT_NO_OPENSSL
+    connect(&manager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)),
+            SLOT(sslErrors(QNetworkReply*,QList<QSslError>)));
+#endif
+    connect(&manager, SIGNAL(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)), &helper, SLOT(proxyAuthenticationRequired(const QNetworkProxy &, QAuthenticator *)));
+    connect(&manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), &helper, SLOT(authenticationRequired(QNetworkReply*,QAuthenticator*)));
+
+    helper.httpUserName = "httptest";
+    helper.httpPassword = "httptest";
+
+    QNetworkRequest request(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/rfcs-auth/rfc3252.txt"));
+    QNetworkReply* reply = manager.get(request);
+    connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()), Qt::QueuedConnection);
+    QTestEventLoop::instance().enterLoop(10);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+    QCOMPARE(reply->error(), QNetworkReply::NoError);
+
+    helper.httpUserName = "httptest";
+    helper.httpPassword = "httptest";
+
+    request.setUrl(QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/auth-digest/"));
+    reply = manager.get(request);
+    connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()), Qt::QueuedConnection);
+    QTestEventLoop::instance().enterLoop(10);
+    QVERIFY(!QTestEventLoop::instance().timeout());
+    QCOMPARE(reply->error(), QNetworkReply::NoError);
+}
+
 class QtBug13431Helper : public QObject {
     Q_OBJECT
 public: