Index: net/http/http_auth_handler_digest_unittest.cc |
=================================================================== |
--- net/http/http_auth_handler_digest_unittest.cc (revision 63735) |
+++ net/http/http_auth_handler_digest_unittest.cc (working copy) |
@@ -28,7 +28,7 @@ |
int parsed_algorithm; |
int parsed_qop; |
} tests[] = { |
- { |
+ { // Check that a minimal challenge works correctly. |
"Digest nonce=\"xyz\", realm=\"Thunder Bluff\"", |
true, |
"Thunder Bluff", |
@@ -40,6 +40,80 @@ |
HttpAuthHandlerDigest::QOP_UNSPECIFIED |
}, |
+ { // Realm does not need to be quoted, even though RFC2617 requires it. |
+ "Digest nonce=\"xyz\", realm=ThunderBluff", |
+ true, |
+ "ThunderBluff", |
+ "xyz", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
+ { // We allow the realm to be omitted, and will default it to empty string. |
+ // See http://crbug.com/20984. |
+ "Digest nonce=\"xyz\"", |
+ true, |
+ "", |
+ "xyz", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
+ { // Try with realm set to empty string. |
+ "Digest realm=\"\", nonce=\"xyz\"", |
+ true, |
+ "", |
+ "xyz", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
+ { // At a minimum, a nonce must be provided. |
+ "Digest realm=\"Thunder Bluff\"", |
+ false, |
+ "", |
+ "", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
+ { // The nonce does not need to be quoted, even though RFC2617 |
+ // requires it. |
+ "Digest nonce=xyz, realm=\"Thunder Bluff\"", |
+ true, |
+ "Thunder Bluff", |
+ "xyz", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
+ { // Unknown authentication parameters are ignored. |
+ "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", foo=\"bar\"", |
+ true, |
+ "Thunder Bluff", |
+ "xyz", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
{ // Check that when algorithm has an unsupported value, parsing fails. |
"Digest nonce=\"xyz\", algorithm=\"awezum\", realm=\"Thunder\"", |
false, |
@@ -53,7 +127,8 @@ |
HttpAuthHandlerDigest::QOP_UNSPECIFIED |
}, |
- { // Check that algorithm's value is case insensitive. |
+ { // Check that algorithm's value is case insensitive, and that MD5 is |
+ // a supported algorithm. |
"Digest nonce=\"xyz\", algorithm=\"mD5\", realm=\"Oblivion\"", |
true, |
"Oblivion", |
@@ -65,9 +140,8 @@ |
HttpAuthHandlerDigest::QOP_UNSPECIFIED |
}, |
- { // Check that md5-sess is recognized, as is single QOP |
- "Digest nonce=\"xyz\", algorithm=\"md5-sess\", " |
- "realm=\"Oblivion\", qop=\"auth\"", |
+ { // Check that md5-sess is a supported algorithm. |
+ "Digest nonce=\"xyz\", algorithm=\"md5-sess\", realm=\"Oblivion\"", |
true, |
"Oblivion", |
"xyz", |
@@ -75,33 +149,119 @@ |
"", |
false, |
HttpAuthHandlerDigest::ALGORITHM_MD5_SESS, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED, |
+ }, |
+ |
+ { // Check that qop's value is case insensitive, and that auth is known. |
+ "Digest nonce=\"xyz\", realm=\"Oblivion\", qop=\"aUth\"", |
+ true, |
+ "Oblivion", |
+ "xyz", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
HttpAuthHandlerDigest::QOP_AUTH |
}, |
- { // We allow the realm to be omitted, and will default it to empty string. |
- // See http://crbug.com/20984. |
- "Digest nonce=\"xyz\"", |
+ { // auth-int is not handled, but will fall back to default qop. |
+ "Digest nonce=\"xyz\", realm=\"Oblivion\", qop=\"auth-int\"", |
true, |
+ "Oblivion", |
+ "xyz", |
"", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
+ { // Unknown qop values are ignored. |
+ "Digest nonce=\"xyz\", realm=\"Oblivion\", qop=\"auth,foo\"", |
+ true, |
+ "Oblivion", |
"xyz", |
"", |
"", |
false, |
HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_AUTH |
+ }, |
+ |
+ { // If auth-int is included with auth, then use auth. |
+ "Digest nonce=\"xyz\", realm=\"Oblivion\", qop=\"auth,auth-int\"", |
+ true, |
+ "Oblivion", |
+ "xyz", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_AUTH |
+ }, |
+ |
+ { // Opaque parameter parsing should work correctly. |
+ "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", opaque=\"foobar\"", |
+ true, |
+ "Thunder Bluff", |
+ "xyz", |
+ "", |
+ "foobar", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
HttpAuthHandlerDigest::QOP_UNSPECIFIED |
}, |
- { // Try with realm set to empty string. |
- "Digest realm=\"\", nonce=\"xyz\"", |
+ { // Opaque parameters do not need to be quoted, even though RFC2617 |
+ // seems to require it. |
+ "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", opaque=foobar", |
true, |
+ "Thunder Bluff", |
+ "xyz", |
"", |
+ "foobar", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
+ { // Domain can be parsed. |
+ "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", " |
+ "domain=\"http://intranet.example.com/protection\"", |
+ true, |
+ "Thunder Bluff", |
"xyz", |
+ "http://intranet.example.com/protection", |
"", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
+ |
+ { // Multiple domains can be parsed. |
+ "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", " |
+ "domain=\"http://intranet.example.com/protection http://www.google.com\"", |
+ true, |
+ "Thunder Bluff", |
+ "xyz", |
+ "http://intranet.example.com/protection http://www.google.com", |
"", |
false, |
HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
HttpAuthHandlerDigest::QOP_UNSPECIFIED |
- } |
+ }, |
+ |
+ { // If a non-Digest scheme is somehow passed in, it should be rejected. |
+ "Basic realm=\"foo\"", |
+ false, |
+ "", |
+ "", |
+ "", |
+ "", |
+ false, |
+ HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
+ HttpAuthHandlerDigest::QOP_UNSPECIFIED |
+ }, |
}; |
GURL origin("http://www.example.com"); |
@@ -118,9 +278,10 @@ |
EXPECT_EQ(OK, rv); |
} else { |
EXPECT_NE(OK, rv); |
+ EXPECT_TRUE(handler.get() == NULL); |
continue; |
} |
- ASSERT_TRUE(handler != NULL); |
+ ASSERT_TRUE(handler.get() != NULL); |
HttpAuthHandlerDigest* digest = |
static_cast<HttpAuthHandlerDigest*>(handler.get()); |
EXPECT_STREQ(tests[i].parsed_realm, digest->realm_.c_str()); |
@@ -291,7 +452,7 @@ |
} |
} |
-TEST(HttpAuthHandlerDigest, HandleAnotherChallenge_Failed) { |
+TEST(HttpAuthHandlerDigest, HandleAnotherChallenge) { |
scoped_ptr<HttpAuthHandlerDigest::Factory> factory( |
new HttpAuthHandlerDigest::Factory()); |
scoped_ptr<HttpAuthHandler> handler; |