15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_filter.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler_factory.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler_mock.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_response_headers.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/mock_allow_url_security_manager.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpAuthHandlerMock* CreateMockHandler(bool connection_based) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthHandlerMock* auth_handler = new HttpAuthHandlerMock(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) auth_handler->set_connection_based(connection_based); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_text = "Basic"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_text.begin(), 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_text.end()); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin("www.example.com"); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(auth_handler->InitFromChallenge(&challenge, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SERVER, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundNetLog())); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return auth_handler; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpResponseHeaders* HeadersFromResponseText(const std::string& response) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new HttpResponseHeaders( 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::AssembleRawHeaders(response.c_str(), response.length())); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HttpAuth::AuthorizationResult HandleChallengeResponse( 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool connection_based, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& headers_text, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* challenge_used) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandlerMock> mock_handler( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateMockHandler(connection_based)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<HttpAuth::Scheme> disabled_schemes; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders> headers( 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HeadersFromResponseText(headers_text)); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HttpAuth::HandleChallengeResponse( 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_handler.get(), 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.get(), 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SERVER, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disabled_schemes, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_used); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChooseBestChallenge) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* headers; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::Scheme challenge_scheme; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* challenge_realm; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } tests[] = { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Basic is the only challenge type, pick it. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Y: Digest realm=\"X\", nonce=\"aaaaaaaaaa\"\n" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www-authenticate: Basic realm=\"BasicRealm\"\n", 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_BASIC, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "BasicRealm", 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fake is the only challenge type, but it is unsupported. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Y: Digest realm=\"FooBar\", nonce=\"aaaaaaaaaa\"\n" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www-authenticate: Fake realm=\"FooBar\"\n", 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_MAX, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pick Digest over Basic. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www-authenticate: Basic realm=\"FooBar\"\n" 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www-authenticate: Fake realm=\"FooBar\"\n" 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www-authenticate: nonce=\"aaaaaaaaaa\"\n" 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www-authenticate: Digest realm=\"DigestRealm\", nonce=\"aaaaaaaaaa\"\n", 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_DIGEST, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "DigestRealm", 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle an empty header correctly. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Y: Digest realm=\"X\", nonce=\"aaaaaaaaaa\"\n" 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "www-authenticate:\n", 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_MAX, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: Negotiate\n" 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: NTLM\n", 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_KERBEROS) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Choose Negotiate over NTLM on all platforms. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ahendrickson): This may be flaky on Linux and OSX as it 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relies on being able to load one of the known .so files 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for gssapi. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_NEGOTIATE, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On systems that don't use Kerberos fall back to NTLM. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SCHEME_NTLM, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(USE_KERBEROS) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "", 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL origin("http://www.example.com"); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<HttpAuth::Scheme> disabled_schemes; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockAllowURLSecurityManager url_security_manager; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HostResolver> host_resolver(new MockHostResolver()); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandlerRegistryFactory> http_auth_handler_factory( 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuthHandlerFactory::CreateDefault(host_resolver.get())); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) http_auth_handler_factory->SetURLSecurityManager( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "negotiate", &url_security_manager); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a HttpResponseHeaders object. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string headers_with_status_line("HTTP/1.1 401 Unauthorized\n"); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_with_status_line += tests[i].headers; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<HttpResponseHeaders> headers( 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HeadersFromResponseText(headers_with_status_line)); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<HttpAuthHandler> handler; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChooseBestChallenge(http_auth_handler_factory.get(), 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers.get(), 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTH_SERVER, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) disabled_schemes, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundNetLog(), 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &handler); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handler.get()) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(tests[i].challenge_scheme, handler->auth_scheme()); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(tests[i].challenge_realm, handler->realm().c_str()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(HttpAuth::AUTH_SCHEME_MAX, tests[i].challenge_scheme); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("", tests[i].challenge_realm); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, HandleChallengeResponse) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_used; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kMockChallenge = 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 401 Unauthorized\n" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: Mock token_here\n"; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kBasicChallenge = 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 401 Unauthorized\n" 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: Basic realm=\"happy\"\n"; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kMissingChallenge = 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 401 Unauthorized\n"; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kEmptyChallenge = 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 401 Unauthorized\n" 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: \n"; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kBasicAndMockChallenges = 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 401 Unauthorized\n" 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: Basic realm=\"happy\"\n" 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: Mock token_here\n"; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* const kTwoMockChallenges = 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "HTTP/1.1 401 Unauthorized\n" 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: Mock token_a\n" 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "WWW-Authenticate: Mock token_b\n"; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request based schemes should treat any new challenges as rejections of the 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // previous authentication attempt. (There is a slight exception for digest 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // authentication and the stale parameter, but that is covered in the 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http_auth_handler_digest_unittests). 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(false, kMockChallenge, &challenge_used)); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Mock token_here", challenge_used); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(false, kBasicChallenge, &challenge_used)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", challenge_used); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(false, kMissingChallenge, &challenge_used)); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", challenge_used); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(false, kEmptyChallenge, &challenge_used)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", challenge_used); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(false, kBasicAndMockChallenges, &challenge_used)); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Mock token_here", challenge_used); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(false, kTwoMockChallenges, &challenge_used)); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Mock token_a", challenge_used); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Connection based schemes will treat new auth challenges for the same scheme 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as acceptance (and continuance) of the current approach. If there are 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no auth challenges for the same scheme, the response will be treated as 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a rejection. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_ACCEPT, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(true, kMockChallenge, &challenge_used)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Mock token_here", challenge_used); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(true, kBasicChallenge, &challenge_used)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", challenge_used); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(true, kMissingChallenge, &challenge_used)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", challenge_used); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_REJECT, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(true, kEmptyChallenge, &challenge_used)); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", challenge_used); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_ACCEPT, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(true, kBasicAndMockChallenges, &challenge_used)); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Mock token_here", challenge_used); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::AUTHORIZATION_RESULT_ACCEPT, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleChallengeResponse(true, kTwoMockChallenges, &challenge_used)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("Mock token_a", challenge_used); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizer) { 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "Basic realm=\"foobar\""; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.end()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Basic"), challenge.scheme()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("realm"), parameters.name()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("foobar"), parameters.value()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use a name=value property with no quote marks. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerNoQuotes) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "Basic realm=foobar@baz.com"; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.end()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Basic"), challenge.scheme()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("realm"), parameters.name()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("foobar@baz.com"), parameters.value()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use a name=value property with mismatching quote marks. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerMismatchedQuotes) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "Basic realm=\"foobar@baz.com"; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.end()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Basic"), challenge.scheme()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("realm"), parameters.name()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("foobar@baz.com"), parameters.value()); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use a name= property without a value and with mismatching quote marks. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerMismatchedQuotesNoValue) { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "Basic realm=\""; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.end()); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Basic"), challenge.scheme()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("realm"), parameters.name()); 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(std::string(), parameters.value()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use a name=value property with mismatching quote marks and spaces in the 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerMismatchedQuotesSpaces) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "Basic realm=\"foo bar"; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.end()); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Basic"), challenge.scheme()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("realm"), parameters.name()); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("foo bar"), parameters.value()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use multiple name=value properties with mismatching quote marks in the last 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerMismatchedQuotesMultiple) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "Digest qop=auth-int, algorithm=md5, realm=\"foo"; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.end()); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Digest"), challenge.scheme()); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("qop"), parameters.name()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("auth-int"), parameters.value()); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("algorithm"), parameters.name()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("md5"), parameters.value()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("realm"), parameters.name()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("foo"), parameters.value()); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use a name= property which has no value. 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerNoValue) { 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "Digest qop="; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge( 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.begin(), challenge_str.end()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Digest"), challenge.scheme()); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.valid()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specify multiple properties, comma separated. 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerMultiple) { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Digest algorithm=md5, realm=\"Oblivion\", qop=auth-int"; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.end()); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Digest"), challenge.scheme()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("algorithm"), parameters.name()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("md5"), parameters.value()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("realm"), parameters.name()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Oblivion"), parameters.value()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.GetNext()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("qop"), parameters.name()); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("auth-int"), parameters.value()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use a challenge which has no property. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerNoProperty) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "NTLM"; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge( 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.begin(), challenge_str.end()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpUtil::NameValuePairsIterator parameters = challenge.param_pairs(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(parameters.valid()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("NTLM"), challenge.scheme()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(parameters.GetNext()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use a challenge with Base64 encoded token. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, ChallengeTokenizerBase64) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string challenge_str = "NTLM SGVsbG8sIFdvcmxkCg==="; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HttpAuth::ChallengeTokenizer challenge(challenge_str.begin(), 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) challenge_str.end()); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("NTLM"), challenge.scheme()); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notice the two equal statements below due to padding removal. 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("SGVsbG8sIFdvcmxkCg=="), challenge.base64_param()); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, GetChallengeHeaderName) { 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = HttpAuth::GetChallengeHeaderName(HttpAuth::AUTH_SERVER); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("WWW-Authenticate", name.c_str()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = HttpAuth::GetChallengeHeaderName(HttpAuth::AUTH_PROXY); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("Proxy-Authenticate", name.c_str()); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthTest, GetAuthorizationHeaderName) { 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string name; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = HttpAuth::GetAuthorizationHeaderName(HttpAuth::AUTH_SERVER); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("Authorization", name.c_str()); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name = HttpAuth::GetAuthorizationHeaderName(HttpAuth::AUTH_PROXY); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ("Proxy-Authorization", name.c_str()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 436