diff --git a/src/network/kernel/qauthenticator.cpp b/src/network/kernel/qauthenticator.cpp index 4daf11cb3e..f79a7196bf 100644 --- a/src/network/kernel/qauthenticator.cpp +++ b/src/network/kernel/qauthenticator.cpp @@ -423,6 +423,26 @@ void QAuthenticatorPrivate::updateCredentials() } } +bool QAuthenticatorPrivate::isMethodSupported(QByteArrayView method) +{ + Q_ASSERT(!method.startsWith(' ')); // This should be trimmed during parsing + auto separator = method.indexOf(' '); + if (separator != -1) + method = method.first(separator); + const auto isSupported = [method](QByteArrayView reference) { + return method.compare(reference, Qt::CaseInsensitive) == 0; + }; + static const char methods[][10] = { + "basic", + "ntlm", + "digest", +#if QT_CONFIG(sspi) || QT_CONFIG(gssapi) + "negotiate", +#endif + }; + return std::any_of(methods, methods + std::size(methods), isSupported); +} + void QAuthenticatorPrivate::parseHttpResponse(const QList > &values, bool isProxy, const QString &host) { #if !QT_CONFIG(gssapi) diff --git a/src/network/kernel/qauthenticator_p.h b/src/network/kernel/qauthenticator_p.h index 1813634ee0..9ef6330ceb 100644 --- a/src/network/kernel/qauthenticator_p.h +++ b/src/network/kernel/qauthenticator_p.h @@ -115,6 +115,8 @@ public: void parseHttpResponse(const QList >&, bool isProxy, const QString &host); void updateCredentials(); + + static bool isMethodSupported(QByteArrayView method); }; diff --git a/tests/auto/network/kernel/qauthenticator/tst_qauthenticator.cpp b/tests/auto/network/kernel/qauthenticator/tst_qauthenticator.cpp index df5543a28e..529386f50f 100644 --- a/tests/auto/network/kernel/qauthenticator/tst_qauthenticator.cpp +++ b/tests/auto/network/kernel/qauthenticator/tst_qauthenticator.cpp @@ -49,6 +49,8 @@ private Q_SLOTS: void ntlmAuth(); void equalityOperators(); + + void isMethodSupported(); }; tst_QAuthenticator::tst_QAuthenticator() @@ -163,6 +165,22 @@ void tst_QAuthenticator::equalityOperators() QVERIFY(s2 != s1); } +void tst_QAuthenticator::isMethodSupported() +{ + QVERIFY(QAuthenticatorPrivate::isMethodSupported("basic")); + QVERIFY(QAuthenticatorPrivate::isMethodSupported("Basic realm=\"Shadow\"")); + QVERIFY(QAuthenticatorPrivate::isMethodSupported("DIgesT")); + QVERIFY(QAuthenticatorPrivate::isMethodSupported("NTLM")); + QVERIFY(QAuthenticatorPrivate::isMethodSupported("ntlm")); +#if QT_CONFIG(sspi) || QT_CONFIG(gssapi) + QVERIFY(QAuthenticatorPrivate::isMethodSupported("negotiate")); +#else + QVERIFY(!QAuthenticatorPrivate::isMethodSupported("negotiate")); +#endif + + QVERIFY(!QAuthenticatorPrivate::isMethodSupported("Bearer")); +} + QTEST_MAIN(tst_QAuthenticator); #include "tst_qauthenticator.moc"