Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(533)

Unified Diff: net/http/http_auth_controller_unittest.cc

Issue 7748033: Don't try to use explicit credentials with schemes that don't support it. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase and cleanup Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/http/http_auth_controller_unittest.cc
diff --git a/net/http/http_auth_controller_unittest.cc b/net/http/http_auth_controller_unittest.cc
index fafc1e761332af90033a4260276ad6566123da06..7d4d05f3aee7dcb9c90f081ebddb851bfcd28304 100644
--- a/net/http/http_auth_controller_unittest.cc
+++ b/net/http/http_auth_controller_unittest.cc
@@ -28,6 +28,15 @@ enum SchemeState {
SCHEME_IS_ENABLED
};
+scoped_refptr<HttpResponseHeaders> HeadersFromString(const char* string) {
+ std::string raw_string(string);
+ std::string headers_string = HttpUtil::AssembleRawHeaders(
+ raw_string.c_str(), raw_string.length());
+ scoped_refptr<HttpResponseHeaders> headers(
+ new HttpResponseHeaders(headers_string));
+ return headers;
+}
+
// Runs an HttpAuthController with a single round mock auth handler
// that returns |handler_rv| on token generation. The handler runs in
// async if |run_mode| is RUN_HANDLER_ASYNC. Upon completion, the
@@ -45,14 +54,10 @@ void RunSingleRoundAuthTest(HandlerRunMode run_mode,
request.method = "GET";
request.url = GURL("http://example.com");
- const std::string headers_raw_string =
+ scoped_refptr<HttpResponseHeaders> headers(HeadersFromString(
"HTTP/1.1 407\r\n"
"Proxy-Authenticate: MOCK foo\r\n"
- "\r\n";
- std::string headers_string = HttpUtil::AssembleRawHeaders(
- headers_raw_string.c_str(), headers_raw_string.length());
- scoped_refptr<HttpResponseHeaders> headers(
- new HttpResponseHeaders(headers_string));
+ "\r\n"));
HttpAuthHandlerMock::Factory auth_handler_factory;
HttpAuthHandlerMock* auth_handler = new HttpAuthHandlerMock();
@@ -67,7 +72,7 @@ void RunSingleRoundAuthTest(HandlerRunMode run_mode,
&dummy_auth_cache, &auth_handler_factory));
ASSERT_EQ(OK,
controller->HandleAuthChallenge(headers, false, false, dummy_log));
- EXPECT_TRUE(controller->HaveAuthHandler());
+ ASSERT_TRUE(controller->HaveAuthHandler());
controller->ResetAuth(string16(), string16());
EXPECT_TRUE(controller->HaveAuth());
@@ -109,4 +114,67 @@ TEST(HttpAuthControllerTest, PermanentErrors) {
ERR_INVALID_AUTH_CREDENTIALS, SCHEME_IS_ENABLED);
}
+// If an HttpAuthHandler indicates that it doesn't allow explicit
+// credentials, don't prompt for credentials.
+TEST(HttpAuthControllerTest, NoExplicitCredentialsAllowed) {
+ BoundNetLog dummy_log;
+ HttpAuthCache dummy_auth_cache;
+
+ HttpRequestInfo request;
+ request.method = "GET";
+ request.url = GURL("http://example.com");
+
+ scoped_refptr<HttpResponseHeaders> headers(HeadersFromString(
+ "HTTP/1.1 401\r\n"
+ "WWW-Authenticate: MOCK\r\n"
+ "\r\n"));
+
+ HttpAuthHandlerMock::Factory auth_handler_factory;
+
+ // auth_handler_1 is the handler for the first attempt at authentication. It
+ // accepts the default identity and successfully constructs a token.
+ HttpAuthHandlerMock* auth_handler_1 = new HttpAuthHandlerMock();
+ auth_handler_1->SetGenerateExpectation(true, OK);
+ auth_handler_1->set_allows_default_credentials(true);
+ auth_handler_1->set_allows_explicit_credentials(false);
+ auth_handler_1->set_connection_based(true);
+ auth_handler_factory.AddMockHandler(auth_handler_1, HttpAuth::AUTH_SERVER);
+
+ // auth_handler_2 is the handler for the second attempt. It should not be
+ // used to generate a token. Instead the controller should realize that there
+ // are no viable identities to use with this handler and fail.
cbentzel 2011/08/30 14:16:51 Should you do test that we fallback to a less-secu
asanka 2011/08/30 18:55:44 I added a mock class that pretends to be Basic and
+ HttpAuthHandlerMock* auth_handler_2 = new HttpAuthHandlerMock();
+ auth_handler_2->SetGenerateExpectation(true, ERR_UNEXPECTED);
+ auth_handler_2->set_allows_default_credentials(true);
+ auth_handler_2->set_allows_explicit_credentials(false);
+ auth_handler_2->set_connection_based(true);
+ auth_handler_factory.AddMockHandler(auth_handler_2, HttpAuth::AUTH_SERVER);
+ auth_handler_factory.set_do_init_from_challenge(true);
+
+ scoped_refptr<HttpAuthController> controller(
+ new HttpAuthController(HttpAuth::AUTH_SERVER,
+ GURL("http://example.com"),
+ &dummy_auth_cache, &auth_handler_factory));
+ ASSERT_EQ(OK,
+ controller->HandleAuthChallenge(headers, false, false, dummy_log));
+ ASSERT_TRUE(controller->HaveAuthHandler());
+ controller->ResetAuth(string16(), string16());
+ EXPECT_TRUE(controller->HaveAuth());
+
+ {
+ TestCompletionCallback callback;
+ int result = controller->MaybeGenerateAuthToken(&request, &callback,
+ dummy_log);
+ EXPECT_EQ(ERR_IO_PENDING, result);
+ EXPECT_EQ(OK, callback.WaitForResult());
+ }
+
+ // Once a token is generated, simulate the receipt of a server response
+ // indicating that the authentication attempt was rejected.
+ EXPECT_EQ(OK,
+ controller->HandleAuthChallenge(headers, false, false, dummy_log));
+ EXPECT_FALSE(controller->HaveAuthHandler());
+ EXPECT_TRUE(controller->IsAuthSchemeDisabled(HttpAuth::AUTH_SCHEME_MOCK));
+}
+
} // namespace net

Powered by Google App Engine
This is Rietveld 408576698