| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/http/http_auth_handler_negotiate.h" | 5 #include "net/http/http_auth_handler_negotiate.h" |
| 6 | 6 |
| 7 #include <string> |
| 8 |
| 7 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| 9 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" |
| 10 #include "net/base/test_completion_callback.h" | 12 #include "net/base/test_completion_callback.h" |
| 11 #include "net/dns/mock_host_resolver.h" | 13 #include "net/dns/mock_host_resolver.h" |
| 12 #include "net/http/http_request_info.h" | 14 #include "net/http/http_request_info.h" |
| 13 #include "net/http/mock_allow_url_security_manager.h" | 15 #include "net/http/mock_allow_url_security_manager.h" |
| 14 #if defined(OS_WIN) | 16 #if defined(OS_ANDROID) |
| 17 #include "net/android/dummy_spnego_authenticator.h" |
| 18 #elif defined(OS_WIN) |
| 15 #include "net/http/mock_sspi_library_win.h" | 19 #include "net/http/mock_sspi_library_win.h" |
| 16 #elif defined(OS_POSIX) | 20 #elif defined(OS_POSIX) |
| 17 #include "net/http/mock_gssapi_library_posix.h" | 21 #include "net/http/mock_gssapi_library_posix.h" |
| 18 #endif | 22 #endif |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "testing/platform_test.h" | 24 #include "testing/platform_test.h" |
| 21 | 25 |
| 22 namespace net { | 26 namespace net { |
| 23 | 27 |
| 24 #if defined(OS_WIN) | 28 #if defined(OS_ANDROID) |
| 29 typedef net::android::DummySpnegoAuthenticator MockAuthLibrary; |
| 30 #elif defined(OS_WIN) |
| 25 typedef MockSSPILibrary MockAuthLibrary; | 31 typedef MockSSPILibrary MockAuthLibrary; |
| 26 #elif defined(OS_POSIX) | 32 #elif defined(OS_POSIX) |
| 27 typedef test::MockGSSAPILibrary MockAuthLibrary; | 33 typedef test::MockGSSAPILibrary MockAuthLibrary; |
| 28 #endif | 34 #endif |
| 29 | 35 |
| 30 class HttpAuthHandlerNegotiateTest : public PlatformTest { | 36 class HttpAuthHandlerNegotiateTest : public PlatformTest { |
| 31 public: | 37 public: |
| 32 void SetUp() override { | 38 void SetUp() override { |
| 33 auth_library_ = new MockAuthLibrary(); | 39 auth_library_ = new MockAuthLibrary(); |
| 34 resolver_.reset(new MockHostResolver()); | 40 resolver_.reset(new MockHostResolver()); |
| 35 resolver_->rules()->AddIPLiteralRule("alias", "10.0.0.2", | 41 resolver_->rules()->AddIPLiteralRule("alias", "10.0.0.2", |
| 36 "canonical.example.com"); | 42 "canonical.example.com"); |
| 37 | 43 |
| 38 url_security_manager_.reset(new MockAllowURLSecurityManager()); | 44 url_security_manager_.reset(new MockAllowURLSecurityManager()); |
| 39 factory_.reset(new HttpAuthHandlerNegotiate::Factory()); | 45 factory_.reset(new HttpAuthHandlerNegotiate::Factory()); |
| 40 factory_->set_url_security_manager(url_security_manager_.get()); | 46 factory_->set_url_security_manager(url_security_manager_.get()); |
| 47 #if defined(OS_ANDROID) |
| 48 std::string* authenticator = |
| 49 new std::string("org.chromium.test.DummySpnegoAuthenticator"); |
| 50 factory_->set_library(authenticator); |
| 51 MockAuthLibrary::EnsureTestAccountExists(); |
| 52 #endif |
| 53 #if defined(OS_WIN) || (defined(OS_POSIX) && !defined(OS_ANDROID)) |
| 41 factory_->set_library(auth_library_); | 54 factory_->set_library(auth_library_); |
| 55 #endif |
| 42 factory_->set_host_resolver(resolver_.get()); | 56 factory_->set_host_resolver(resolver_.get()); |
| 43 } | 57 } |
| 44 | 58 |
| 59 #if defined(OS_ANDROID) |
| 60 void TearDown() override { MockAuthLibrary::RemoveTestAccounts(); } |
| 61 #endif |
| 62 |
| 45 void SetupMocks(MockAuthLibrary* mock_library) { | 63 void SetupMocks(MockAuthLibrary* mock_library) { |
| 46 #if defined(OS_WIN) | 64 #if defined(OS_WIN) |
| 47 security_package_.reset(new SecPkgInfoW); | 65 security_package_.reset(new SecPkgInfoW); |
| 48 memset(security_package_.get(), 0x0, sizeof(SecPkgInfoW)); | 66 memset(security_package_.get(), 0x0, sizeof(SecPkgInfoW)); |
| 49 security_package_->cbMaxToken = 1337; | 67 security_package_->cbMaxToken = 1337; |
| 50 mock_library->ExpectQuerySecurityPackageInfo( | 68 mock_library->ExpectQuerySecurityPackageInfo( |
| 51 L"Negotiate", SEC_E_OK, security_package_.get()); | 69 L"Negotiate", SEC_E_OK, security_package_.get()); |
| 52 #elif defined(OS_POSIX) | 70 #elif defined(OS_POSIX) |
| 53 // Copied from an actual transaction! | 71 // Copied from an actual transaction! |
| 54 static const char kAuthResponse[] = | 72 static const char kAuthResponse[] = |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 1, // Locally initiated | 124 1, // Locally initiated |
| 107 0); // Open | 125 0); // Open |
| 108 test::GssContextMockImpl context2( | 126 test::GssContextMockImpl context2( |
| 109 "localhost", // Source name | 127 "localhost", // Source name |
| 110 "example.com", // Target name | 128 "example.com", // Target name |
| 111 23, // Lifetime | 129 23, // Lifetime |
| 112 *CHROME_GSS_SPNEGO_MECH_OID_DESC, // Mechanism | 130 *CHROME_GSS_SPNEGO_MECH_OID_DESC, // Mechanism |
| 113 0, // Context flags | 131 0, // Context flags |
| 114 1, // Locally initiated | 132 1, // Locally initiated |
| 115 1); // Open | 133 1); // Open |
| 116 test::MockGSSAPILibrary::SecurityContextQuery queries[] = { | 134 MockAuthLibrary::SecurityContextQuery queries[] = { |
| 117 test::MockGSSAPILibrary::SecurityContextQuery( | 135 MockAuthLibrary::SecurityContextQuery( |
| 118 "Negotiate", // Package name | 136 "Negotiate", // Package name |
| 119 GSS_S_CONTINUE_NEEDED, // Major response code | 137 GSS_S_CONTINUE_NEEDED, // Major response code |
| 120 0, // Minor response code | 138 0, // Minor response code |
| 121 context1, // Context | 139 context1, // Context |
| 122 NULL, // Expected input token | 140 NULL, // Expected input token |
| 123 kAuthResponse), // Output token | 141 kAuthResponse), // Output token |
| 124 test::MockGSSAPILibrary::SecurityContextQuery( | 142 MockAuthLibrary::SecurityContextQuery( |
| 125 "Negotiate", // Package name | 143 "Negotiate", // Package name |
| 126 GSS_S_COMPLETE, // Major response code | 144 GSS_S_COMPLETE, // Major response code |
| 127 0, // Minor response code | 145 0, // Minor response code |
| 128 context2, // Context | 146 context2, // Context |
| 129 kAuthResponse, // Expected input token | 147 kAuthResponse, // Expected input token |
| 130 kAuthResponse) // Output token | 148 kAuthResponse) // Output token |
| 131 }; | 149 }; |
| 132 | 150 |
| 133 for (size_t i = 0; i < arraysize(queries); ++i) { | 151 for (size_t i = 0; i < arraysize(queries); ++i) { |
| 134 mock_library->ExpectSecurityContext(queries[i].expected_package, | 152 mock_library->ExpectSecurityContext(queries[i].expected_package, |
| 135 queries[i].response_code, | 153 queries[i].response_code, |
| 136 queries[i].minor_response_code, | 154 queries[i].minor_response_code, |
| 137 queries[i].context_info, | 155 queries[i].context_info, |
| 138 queries[i].expected_input_token, | 156 queries[i].expected_input_token, |
| 139 queries[i].output_token); | 157 queries[i].output_token); |
| 140 } | 158 } |
| 141 #endif // defined(OS_POSIX) | 159 #endif // defined(OS_POSIX) |
| 142 } | 160 } |
| 143 | 161 |
| 144 #if defined(OS_POSIX) | 162 #if defined(OS_POSIX) |
| 145 void SetupErrorMocks(MockAuthLibrary* mock_library, | 163 void SetupErrorMocks(MockAuthLibrary* mock_library, |
| 146 int major_status, | 164 int major_status, |
| 147 int minor_status) { | 165 int minor_status) { |
| 148 const gss_OID_desc kDefaultMech = { 0, NULL }; | 166 const gss_OID_desc kDefaultMech = { 0, NULL }; |
| 149 test::GssContextMockImpl context( | 167 test::GssContextMockImpl context( |
| 150 "localhost", // Source name | 168 "localhost", // Source name |
| 151 "example.com", // Target name | 169 "example.com", // Target name |
| 152 0, // Lifetime | 170 0, // Lifetime |
| 153 kDefaultMech, // Mechanism | 171 kDefaultMech, // Mechanism |
| 154 0, // Context flags | 172 0, // Context flags |
| 155 1, // Locally initiated | 173 1, // Locally initiated |
| 156 0); // Open | 174 0); // Open |
| 157 test::MockGSSAPILibrary::SecurityContextQuery query( | 175 MockAuthLibrary::SecurityContextQuery query( |
| 158 "Negotiate", // Package name | 176 "Negotiate", // Package name |
| 159 major_status, // Major response code | 177 major_status, // Major response code |
| 160 minor_status, // Minor response code | 178 minor_status, // Minor response code |
| 161 context, // Context | 179 context, // Context |
| 162 NULL, // Expected input token | 180 NULL, // Expected input token |
| 163 NULL); // Output token | 181 NULL); // Output token |
| 164 | 182 |
| 165 mock_library->ExpectSecurityContext(query.expected_package, | 183 mock_library->ExpectSecurityContext(query.expected_package, |
| 166 query.response_code, | 184 query.response_code, |
| 167 query.minor_response_code, | 185 query.minor_response_code, |
| 168 query.context_info, | 186 query.context_info, |
| 169 query.expected_input_token, | 187 query.expected_input_token, |
| 170 query.output_token); | 188 query.output_token); |
| 171 } | 189 } |
| 172 | 190 |
| 173 #endif // defined(OS_POSIX) | 191 #endif // defined(OS_POSIX) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 TEST_F(HttpAuthHandlerNegotiateTest, DisableCname) { | 234 TEST_F(HttpAuthHandlerNegotiateTest, DisableCname) { |
| 217 SetupMocks(AuthLibrary()); | 235 SetupMocks(AuthLibrary()); |
| 218 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; | 236 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; |
| 219 EXPECT_EQ(OK, CreateHandler( | 237 EXPECT_EQ(OK, CreateHandler( |
| 220 true, false, true, "http://alias:500", &auth_handler)); | 238 true, false, true, "http://alias:500", &auth_handler)); |
| 221 | 239 |
| 222 ASSERT_TRUE(auth_handler.get() != NULL); | 240 ASSERT_TRUE(auth_handler.get() != NULL); |
| 223 TestCompletionCallback callback; | 241 TestCompletionCallback callback; |
| 224 HttpRequestInfo request_info; | 242 HttpRequestInfo request_info; |
| 225 std::string token; | 243 std::string token; |
| 226 EXPECT_EQ(OK, auth_handler->GenerateAuthToken(NULL, &request_info, | 244 EXPECT_EQ(OK, callback.GetResult(auth_handler->GenerateAuthToken( |
| 227 callback.callback(), &token)); | 245 NULL, &request_info, callback.callback(), &token))); |
| 228 #if defined(OS_WIN) | 246 #if defined(OS_WIN) |
| 229 EXPECT_EQ("HTTP/alias", auth_handler->spn()); | 247 EXPECT_EQ("HTTP/alias", auth_handler->spn()); |
| 230 #elif defined(OS_POSIX) | 248 #elif defined(OS_POSIX) |
| 231 EXPECT_EQ("HTTP@alias", auth_handler->spn()); | 249 EXPECT_EQ("HTTP@alias", auth_handler->spn()); |
| 232 #endif | 250 #endif |
| 233 } | 251 } |
| 234 | 252 |
| 235 TEST_F(HttpAuthHandlerNegotiateTest, DisableCnameStandardPort) { | 253 TEST_F(HttpAuthHandlerNegotiateTest, DisableCnameStandardPort) { |
| 236 SetupMocks(AuthLibrary()); | 254 SetupMocks(AuthLibrary()); |
| 237 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; | 255 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; |
| 238 EXPECT_EQ(OK, CreateHandler( | 256 EXPECT_EQ(OK, CreateHandler( |
| 239 true, true, true, "http://alias:80", &auth_handler)); | 257 true, true, true, "http://alias:80", &auth_handler)); |
| 240 ASSERT_TRUE(auth_handler.get() != NULL); | 258 ASSERT_TRUE(auth_handler.get() != NULL); |
| 241 TestCompletionCallback callback; | 259 TestCompletionCallback callback; |
| 242 HttpRequestInfo request_info; | 260 HttpRequestInfo request_info; |
| 243 std::string token; | 261 std::string token; |
| 244 EXPECT_EQ(OK, auth_handler->GenerateAuthToken(NULL, &request_info, | 262 EXPECT_EQ(OK, callback.GetResult(auth_handler->GenerateAuthToken( |
| 245 callback.callback(), &token)); | 263 NULL, &request_info, callback.callback(), &token))); |
| 246 #if defined(OS_WIN) | 264 #if defined(OS_WIN) |
| 247 EXPECT_EQ("HTTP/alias", auth_handler->spn()); | 265 EXPECT_EQ("HTTP/alias", auth_handler->spn()); |
| 248 #elif defined(OS_POSIX) | 266 #elif defined(OS_POSIX) |
| 249 EXPECT_EQ("HTTP@alias", auth_handler->spn()); | 267 EXPECT_EQ("HTTP@alias", auth_handler->spn()); |
| 250 #endif | 268 #endif |
| 251 } | 269 } |
| 252 | 270 |
| 253 TEST_F(HttpAuthHandlerNegotiateTest, DisableCnameNonstandardPort) { | 271 TEST_F(HttpAuthHandlerNegotiateTest, DisableCnameNonstandardPort) { |
| 254 SetupMocks(AuthLibrary()); | 272 SetupMocks(AuthLibrary()); |
| 255 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; | 273 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; |
| 256 EXPECT_EQ(OK, CreateHandler( | 274 EXPECT_EQ(OK, CreateHandler( |
| 257 true, true, true, "http://alias:500", &auth_handler)); | 275 true, true, true, "http://alias:500", &auth_handler)); |
| 258 ASSERT_TRUE(auth_handler.get() != NULL); | 276 ASSERT_TRUE(auth_handler.get() != NULL); |
| 259 TestCompletionCallback callback; | 277 TestCompletionCallback callback; |
| 260 HttpRequestInfo request_info; | 278 HttpRequestInfo request_info; |
| 261 std::string token; | 279 std::string token; |
| 262 EXPECT_EQ(OK, auth_handler->GenerateAuthToken(NULL, &request_info, | 280 EXPECT_EQ(OK, callback.GetResult(auth_handler->GenerateAuthToken( |
| 263 callback.callback(), &token)); | 281 NULL, &request_info, callback.callback(), &token))); |
| 264 #if defined(OS_WIN) | 282 #if defined(OS_WIN) |
| 265 EXPECT_EQ("HTTP/alias:500", auth_handler->spn()); | 283 EXPECT_EQ("HTTP/alias:500", auth_handler->spn()); |
| 266 #elif defined(OS_POSIX) | 284 #elif defined(OS_POSIX) |
| 267 EXPECT_EQ("HTTP@alias:500", auth_handler->spn()); | 285 EXPECT_EQ("HTTP@alias:500", auth_handler->spn()); |
| 268 #endif | 286 #endif |
| 269 } | 287 } |
| 270 | 288 |
| 271 TEST_F(HttpAuthHandlerNegotiateTest, CnameSync) { | 289 TEST_F(HttpAuthHandlerNegotiateTest, CnameSync) { |
| 272 SetupMocks(AuthLibrary()); | 290 SetupMocks(AuthLibrary()); |
| 273 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; | 291 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; |
| 274 EXPECT_EQ(OK, CreateHandler( | 292 EXPECT_EQ(OK, CreateHandler( |
| 275 false, false, true, "http://alias:500", &auth_handler)); | 293 false, false, true, "http://alias:500", &auth_handler)); |
| 276 ASSERT_TRUE(auth_handler.get() != NULL); | 294 ASSERT_TRUE(auth_handler.get() != NULL); |
| 277 TestCompletionCallback callback; | 295 TestCompletionCallback callback; |
| 278 HttpRequestInfo request_info; | 296 HttpRequestInfo request_info; |
| 279 std::string token; | 297 std::string token; |
| 280 EXPECT_EQ(OK, auth_handler->GenerateAuthToken(NULL, &request_info, | 298 EXPECT_EQ(OK, callback.GetResult(auth_handler->GenerateAuthToken( |
| 281 callback.callback(), &token)); | 299 NULL, &request_info, callback.callback(), &token))); |
| 282 #if defined(OS_WIN) | 300 #if defined(OS_WIN) |
| 283 EXPECT_EQ("HTTP/canonical.example.com", auth_handler->spn()); | 301 EXPECT_EQ("HTTP/canonical.example.com", auth_handler->spn()); |
| 284 #elif defined(OS_POSIX) | 302 #elif defined(OS_POSIX) |
| 285 EXPECT_EQ("HTTP@canonical.example.com", auth_handler->spn()); | 303 EXPECT_EQ("HTTP@canonical.example.com", auth_handler->spn()); |
| 286 #endif | 304 #endif |
| 287 } | 305 } |
| 288 | 306 |
| 289 TEST_F(HttpAuthHandlerNegotiateTest, CnameAsync) { | 307 TEST_F(HttpAuthHandlerNegotiateTest, CnameAsync) { |
| 290 SetupMocks(AuthLibrary()); | 308 SetupMocks(AuthLibrary()); |
| 291 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; | 309 scoped_ptr<HttpAuthHandlerNegotiate> auth_handler; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 BoundNetLog(), | 377 BoundNetLog(), |
| 360 &generic_handler); | 378 &generic_handler); |
| 361 EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, rv); | 379 EXPECT_EQ(ERR_UNSUPPORTED_AUTH_SCHEME, rv); |
| 362 EXPECT_TRUE(generic_handler.get() == NULL); | 380 EXPECT_TRUE(generic_handler.get() == NULL); |
| 363 } | 381 } |
| 364 #endif // defined(DLOPEN_KERBEROS) | 382 #endif // defined(DLOPEN_KERBEROS) |
| 365 | 383 |
| 366 #endif // defined(OS_POSIX) | 384 #endif // defined(OS_POSIX) |
| 367 | 385 |
| 368 } // namespace net | 386 } // namespace net |
| OLD | NEW |