| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
| 11 #include "net/base/test_completion_callback.h" | 11 #include "net/base/test_completion_callback.h" |
| 12 #include "net/http/http_auth_challenge_tokenizer.h" | 12 #include "net/http/http_auth_challenge_tokenizer.h" |
| 13 #include "net/http/http_auth_handler_digest.h" | 13 #include "net/http/http_auth_handler_digest.h" |
| 14 #include "net/http/http_request_info.h" | 14 #include "net/http/http_request_info.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "url/origin.h" |
| 16 | 17 |
| 17 namespace net { | 18 namespace net { |
| 18 | 19 |
| 19 namespace { | 20 namespace { |
| 20 | 21 |
| 21 const char* const kSimpleChallenge = | 22 const char* const kSimpleChallenge = |
| 22 "Digest realm=\"Oblivion\", nonce=\"nonce-value\""; | 23 "Digest realm=\"Oblivion\", nonce=\"nonce-value\""; |
| 23 | 24 |
| 24 // RespondToChallenge creates an HttpAuthHandlerDigest for the specified | 25 // RespondToChallenge creates an HttpAuthHandlerDigest for the specified |
| 25 // |challenge|, and generates a response to the challenge which is returned in | 26 // |challenge|, and generates a response to the challenge which is returned in |
| (...skipping 20 matching lines...) Expand all Loading... |
| 46 | 47 |
| 47 token->clear(); | 48 token->clear(); |
| 48 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( | 49 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( |
| 49 new HttpAuthHandlerDigest::Factory()); | 50 new HttpAuthHandlerDigest::Factory()); |
| 50 HttpAuthHandlerDigest::NonceGenerator* nonce_generator = | 51 HttpAuthHandlerDigest::NonceGenerator* nonce_generator = |
| 51 new HttpAuthHandlerDigest::FixedNonceGenerator("client_nonce"); | 52 new HttpAuthHandlerDigest::FixedNonceGenerator("client_nonce"); |
| 52 factory->set_nonce_generator(nonce_generator); | 53 factory->set_nonce_generator(nonce_generator); |
| 53 scoped_ptr<HttpAuthHandler> handler; | 54 scoped_ptr<HttpAuthHandler> handler; |
| 54 | 55 |
| 55 // Create a handler for a particular challenge. | 56 // Create a handler for a particular challenge. |
| 56 GURL url_origin(target == HttpAuth::AUTH_SERVER ? request_url : proxy_name); | 57 url::Origin url_origin(target == HttpAuth::AUTH_SERVER ? request_url |
| 58 : proxy_name); |
| 57 int rv_create = factory->CreateAuthHandlerFromString( | 59 int rv_create = factory->CreateAuthHandlerFromString( |
| 58 challenge, target, url_origin.GetOrigin(), BoundNetLog(), &handler); | 60 challenge, target, url_origin, BoundNetLog(), &handler); |
| 59 if (rv_create != OK || handler.get() == NULL) { | 61 if (rv_create != OK || handler.get() == NULL) { |
| 60 ADD_FAILURE() << "Unable to create auth handler."; | 62 ADD_FAILURE() << "Unable to create auth handler."; |
| 61 return false; | 63 return false; |
| 62 } | 64 } |
| 63 | 65 |
| 64 // Create a token in response to the challenge. | 66 // Create a token in response to the challenge. |
| 65 // NOTE: HttpAuthHandlerDigest's implementation of GenerateAuthToken always | 67 // NOTE: HttpAuthHandlerDigest's implementation of GenerateAuthToken always |
| 66 // completes synchronously. That's why this test can get away with a | 68 // completes synchronously. That's why this test can get away with a |
| 67 // TestCompletionCallback without an IO thread. | 69 // TestCompletionCallback without an IO thread. |
| 68 TestCompletionCallback callback; | 70 TestCompletionCallback callback; |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 "", | 343 "", |
| 342 "", | 344 "", |
| 343 "", | 345 "", |
| 344 "", | 346 "", |
| 345 false, | 347 false, |
| 346 HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, | 348 HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED, |
| 347 HttpAuthHandlerDigest::QOP_UNSPECIFIED | 349 HttpAuthHandlerDigest::QOP_UNSPECIFIED |
| 348 }, | 350 }, |
| 349 }; | 351 }; |
| 350 | 352 |
| 351 GURL origin("http://www.example.com"); | 353 url::Origin origin("http://www.example.com"); |
| 352 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( | 354 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( |
| 353 new HttpAuthHandlerDigest::Factory()); | 355 new HttpAuthHandlerDigest::Factory()); |
| 354 for (size_t i = 0; i < arraysize(tests); ++i) { | 356 for (size_t i = 0; i < arraysize(tests); ++i) { |
| 355 scoped_ptr<HttpAuthHandler> handler; | 357 scoped_ptr<HttpAuthHandler> handler; |
| 356 int rv = factory->CreateAuthHandlerFromString(tests[i].challenge, | 358 int rv = factory->CreateAuthHandlerFromString(tests[i].challenge, |
| 357 HttpAuth::AUTH_SERVER, | 359 HttpAuth::AUTH_SERVER, |
| 358 origin, | 360 origin, |
| 359 BoundNetLog(), | 361 BoundNetLog(), |
| 360 &handler); | 362 &handler); |
| 361 if (tests[i].parsed_success) { | 363 if (tests[i].parsed_success) { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 506 "15c07961ed8575c4", // cnonce | 508 "15c07961ed8575c4", // cnonce |
| 507 1, // nc | 509 1, // nc |
| 508 | 510 |
| 509 // Authorization | 511 // Authorization |
| 510 "Digest username=\"USER\", realm=\"Baztastic\", " | 512 "Digest username=\"USER\", realm=\"Baztastic\", " |
| 511 "nonce=\"AAAAAAAA\", uri=\"/\", algorithm=MD5-sess, " | 513 "nonce=\"AAAAAAAA\", uri=\"/\", algorithm=MD5-sess, " |
| 512 "response=\"cbc1139821ee7192069580570c541a03\", " | 514 "response=\"cbc1139821ee7192069580570c541a03\", " |
| 513 "qop=auth, nc=00000001, cnonce=\"15c07961ed8575c4\"" | 515 "qop=auth, nc=00000001, cnonce=\"15c07961ed8575c4\"" |
| 514 } | 516 } |
| 515 }; | 517 }; |
| 516 GURL origin("http://www.example.com"); | 518 url::Origin origin("http://www.example.com"); |
| 517 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( | 519 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( |
| 518 new HttpAuthHandlerDigest::Factory()); | 520 new HttpAuthHandlerDigest::Factory()); |
| 519 for (size_t i = 0; i < arraysize(tests); ++i) { | 521 for (size_t i = 0; i < arraysize(tests); ++i) { |
| 520 scoped_ptr<HttpAuthHandler> handler; | 522 scoped_ptr<HttpAuthHandler> handler; |
| 521 int rv = factory->CreateAuthHandlerFromString(tests[i].challenge, | 523 int rv = factory->CreateAuthHandlerFromString(tests[i].challenge, |
| 522 HttpAuth::AUTH_SERVER, | 524 HttpAuth::AUTH_SERVER, |
| 523 origin, | 525 origin, |
| 524 BoundNetLog(), | 526 BoundNetLog(), |
| 525 &handler); | 527 &handler); |
| 526 EXPECT_EQ(OK, rv); | 528 EXPECT_EQ(OK, rv); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 540 EXPECT_STREQ(tests[i].expected_creds, creds.c_str()); | 542 EXPECT_STREQ(tests[i].expected_creds, creds.c_str()); |
| 541 } | 543 } |
| 542 } | 544 } |
| 543 | 545 |
| 544 TEST(HttpAuthHandlerDigest, HandleAnotherChallenge) { | 546 TEST(HttpAuthHandlerDigest, HandleAnotherChallenge) { |
| 545 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( | 547 scoped_ptr<HttpAuthHandlerDigest::Factory> factory( |
| 546 new HttpAuthHandlerDigest::Factory()); | 548 new HttpAuthHandlerDigest::Factory()); |
| 547 scoped_ptr<HttpAuthHandler> handler; | 549 scoped_ptr<HttpAuthHandler> handler; |
| 548 std::string default_challenge = | 550 std::string default_challenge = |
| 549 "Digest realm=\"Oblivion\", nonce=\"nonce-value\""; | 551 "Digest realm=\"Oblivion\", nonce=\"nonce-value\""; |
| 550 GURL origin("intranet.google.com"); | 552 url::Origin origin("http://intranet.google.com"); |
| 551 int rv = factory->CreateAuthHandlerFromString( | 553 int rv = factory->CreateAuthHandlerFromString( |
| 552 default_challenge, HttpAuth::AUTH_SERVER, origin, BoundNetLog(), | 554 default_challenge, HttpAuth::AUTH_SERVER, origin, BoundNetLog(), |
| 553 &handler); | 555 &handler); |
| 554 EXPECT_EQ(OK, rv); | 556 EXPECT_EQ(OK, rv); |
| 555 ASSERT_TRUE(handler.get() != NULL); | 557 ASSERT_TRUE(handler.get() != NULL); |
| 556 HttpAuthChallengeTokenizer tok_default(default_challenge.begin(), | 558 HttpAuthChallengeTokenizer tok_default(default_challenge.begin(), |
| 557 default_challenge.end()); | 559 default_challenge.end()); |
| 558 EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_REJECT, | 560 EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_REJECT, |
| 559 handler->HandleAnotherChallenge(&tok_default)); | 561 handler->HandleAnotherChallenge(&tok_default)); |
| 560 | 562 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", " | 691 EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", " |
| 690 "nonce=\"nonce-value\", uri=\"/path/to/resource\", " | 692 "nonce=\"nonce-value\", uri=\"/path/to/resource\", " |
| 691 "response=\"5b1459beda5cee30d6ff9e970a69c0ea\", " | 693 "response=\"5b1459beda5cee30d6ff9e970a69c0ea\", " |
| 692 "opaque=\"opaque text\", " | 694 "opaque=\"opaque text\", " |
| 693 "qop=auth, nc=00000001, cnonce=\"client_nonce\"", | 695 "qop=auth, nc=00000001, cnonce=\"client_nonce\"", |
| 694 auth_token); | 696 auth_token); |
| 695 } | 697 } |
| 696 | 698 |
| 697 | 699 |
| 698 } // namespace net | 700 } // namespace net |
| OLD | NEW |