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_controller.h" | 5 #include "net/http/http_auth_controller.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 }; | 60 }; |
61 | 61 |
62 enum AuthTarget { | 62 enum AuthTarget { |
63 AUTH_TARGET_PROXY = 0, | 63 AUTH_TARGET_PROXY = 0, |
64 AUTH_TARGET_SECURE_PROXY, | 64 AUTH_TARGET_SECURE_PROXY, |
65 AUTH_TARGET_SERVER, | 65 AUTH_TARGET_SERVER, |
66 AUTH_TARGET_SECURE_SERVER, | 66 AUTH_TARGET_SECURE_SERVER, |
67 AUTH_TARGET_MAX, | 67 AUTH_TARGET_MAX, |
68 }; | 68 }; |
69 | 69 |
| 70 // Known authentication schemes. |
| 71 enum AuthScheme { |
| 72 AUTH_SCHEME_BASIC = 0, |
| 73 AUTH_SCHEME_DIGEST, |
| 74 AUTH_SCHEME_NTLM, |
| 75 AUTH_SCHEME_NEGOTIATE, |
| 76 AUTH_SCHEME_SPDYPROXY_DEPRECATED, |
| 77 AUTH_SCHEME_MOCK, |
| 78 |
| 79 // Add new schemes above this line and don't remove any values. This |
| 80 // enumeration is used for UMA. |
| 81 AUTH_SCHEME_MAX, |
| 82 }; |
| 83 |
| 84 AuthScheme AuthSchemeForUMA(const std::string& scheme) { |
| 85 DCHECK(HttpAuth::IsValidNormalizedScheme(scheme)); |
| 86 |
| 87 if (scheme == "basic") |
| 88 return AUTH_SCHEME_BASIC; |
| 89 |
| 90 if (scheme == "digest") |
| 91 return AUTH_SCHEME_DIGEST; |
| 92 |
| 93 if (scheme == "ntlm") |
| 94 return AUTH_SCHEME_NTLM; |
| 95 |
| 96 if (scheme == "negotiate") |
| 97 return AUTH_SCHEME_NEGOTIATE; |
| 98 |
| 99 if (scheme == "mock") |
| 100 return AUTH_SCHEME_MOCK; |
| 101 |
| 102 return AUTH_SCHEME_MAX; |
| 103 } |
| 104 |
70 AuthTarget DetermineAuthTarget(const HttpAuthHandler* handler) { | 105 AuthTarget DetermineAuthTarget(const HttpAuthHandler* handler) { |
71 switch (handler->target()) { | 106 switch (handler->target()) { |
72 case HttpAuth::AUTH_PROXY: | 107 case HttpAuth::AUTH_PROXY: |
73 if (handler->origin().SchemeIsCryptographic()) | 108 if (handler->origin().SchemeIsCryptographic()) |
74 return AUTH_TARGET_SECURE_PROXY; | 109 return AUTH_TARGET_SECURE_PROXY; |
75 else | 110 else |
76 return AUTH_TARGET_PROXY; | 111 return AUTH_TARGET_PROXY; |
77 case HttpAuth::AUTH_SERVER: | 112 case HttpAuth::AUTH_SERVER: |
78 if (handler->origin().SchemeIsCryptographic()) | 113 if (handler->origin().SchemeIsCryptographic()) |
79 return AUTH_TARGET_SECURE_SERVER; | 114 return AUTH_TARGET_SECURE_SERVER; |
(...skipping 11 matching lines...) Expand all Loading... |
91 // Note: The on-same-thread check is intentionally not using a lock | 126 // Note: The on-same-thread check is intentionally not using a lock |
92 // to protect access to first_thread. This method is meant to be only | 127 // to protect access to first_thread. This method is meant to be only |
93 // used on the same thread, in which case there are no race conditions. If | 128 // used on the same thread, in which case there are no race conditions. If |
94 // there are race conditions (say, a read completes during a partial write), | 129 // there are race conditions (say, a read completes during a partial write), |
95 // the DCHECK will correctly fail. | 130 // the DCHECK will correctly fail. |
96 static base::PlatformThreadId first_thread = | 131 static base::PlatformThreadId first_thread = |
97 base::PlatformThread::CurrentId(); | 132 base::PlatformThread::CurrentId(); |
98 DCHECK_EQ(first_thread, base::PlatformThread::CurrentId()); | 133 DCHECK_EQ(first_thread, base::PlatformThread::CurrentId()); |
99 #endif | 134 #endif |
100 | 135 |
101 HttpAuth::Scheme auth_scheme = handler->auth_scheme(); | 136 AuthScheme auth_scheme = AuthSchemeForUMA(handler->auth_scheme()); |
102 DCHECK(auth_scheme >= 0 && auth_scheme < HttpAuth::AUTH_SCHEME_MAX); | 137 // Only measure known auth schemes. |
| 138 if (auth_scheme == AUTH_SCHEME_MAX) |
| 139 return; |
103 | 140 |
104 // Record start and rejection events for authentication. | 141 // Record start and rejection events for authentication. |
105 // | 142 // |
106 // The results map to: | 143 // The results map to: |
107 // Basic Start: 0 | 144 // Basic Start: 0 |
108 // Basic Reject: 1 | 145 // Basic Reject: 1 |
109 // Digest Start: 2 | 146 // Digest Start: 2 |
110 // Digest Reject: 3 | 147 // Digest Reject: 3 |
111 // NTLM Start: 4 | 148 // NTLM Start: 4 |
112 // NTLM Reject: 5 | 149 // NTLM Reject: 5 |
113 // Negotiate Start: 6 | 150 // Negotiate Start: 6 |
114 // Negotiate Reject: 7 | 151 // Negotiate Reject: 7 |
115 static const int kEventBucketsEnd = | 152 static const int kEventBucketsEnd = AUTH_SCHEME_MAX * AUTH_EVENT_MAX; |
116 HttpAuth::AUTH_SCHEME_MAX * AUTH_EVENT_MAX; | |
117 int event_bucket = auth_scheme * AUTH_EVENT_MAX + auth_event; | 153 int event_bucket = auth_scheme * AUTH_EVENT_MAX + auth_event; |
118 DCHECK(event_bucket >= 0 && event_bucket < kEventBucketsEnd); | 154 DCHECK(event_bucket >= 0 && event_bucket < kEventBucketsEnd); |
119 UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthCount", event_bucket, | 155 UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthCount", event_bucket, |
120 kEventBucketsEnd); | 156 kEventBucketsEnd); |
121 | 157 |
122 // Record the target of the authentication. | 158 // Record the target of the authentication. |
123 // | 159 // |
124 // The results map to: | 160 // The results map to: |
125 // Basic Proxy: 0 | 161 // Basic Proxy: 0 |
126 // Basic Secure Proxy: 1 | 162 // Basic Secure Proxy: 1 |
127 // Basic Server: 2 | 163 // Basic Server: 2 |
128 // Basic Secure Server: 3 | 164 // Basic Secure Server: 3 |
129 // Digest Proxy: 4 | 165 // Digest Proxy: 4 |
130 // Digest Secure Proxy: 5 | 166 // Digest Secure Proxy: 5 |
131 // Digest Server: 6 | 167 // Digest Server: 6 |
132 // Digest Secure Server: 7 | 168 // Digest Secure Server: 7 |
133 // NTLM Proxy: 8 | 169 // NTLM Proxy: 8 |
134 // NTLM Secure Proxy: 9 | 170 // NTLM Secure Proxy: 9 |
135 // NTLM Server: 10 | 171 // NTLM Server: 10 |
136 // NTLM Secure Server: 11 | 172 // NTLM Secure Server: 11 |
137 // Negotiate Proxy: 12 | 173 // Negotiate Proxy: 12 |
138 // Negotiate Secure Proxy: 13 | 174 // Negotiate Secure Proxy: 13 |
139 // Negotiate Server: 14 | 175 // Negotiate Server: 14 |
140 // Negotiate Secure Server: 15 | 176 // Negotiate Secure Server: 15 |
141 if (auth_event != AUTH_EVENT_START) | 177 if (auth_event != AUTH_EVENT_START) |
142 return; | 178 return; |
143 static const int kTargetBucketsEnd = | 179 static const int kTargetBucketsEnd = AUTH_SCHEME_MAX * AUTH_TARGET_MAX; |
144 HttpAuth::AUTH_SCHEME_MAX * AUTH_TARGET_MAX; | |
145 AuthTarget auth_target = DetermineAuthTarget(handler); | 180 AuthTarget auth_target = DetermineAuthTarget(handler); |
146 int target_bucket = auth_scheme * AUTH_TARGET_MAX + auth_target; | 181 int target_bucket = auth_scheme * AUTH_TARGET_MAX + auth_target; |
147 DCHECK(target_bucket >= 0 && target_bucket < kTargetBucketsEnd); | 182 DCHECK(target_bucket >= 0 && target_bucket < kTargetBucketsEnd); |
148 UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthTarget", target_bucket, | 183 UMA_HISTOGRAM_ENUMERATION("Net.HttpAuthTarget", target_bucket, |
149 kTargetBucketsEnd); | 184 kTargetBucketsEnd); |
150 } | 185 } |
151 | 186 |
152 } // namespace | 187 } // namespace |
153 | 188 |
154 HttpAuthController::HttpAuthController( | 189 HttpAuthController::HttpAuthController( |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 | 538 |
504 void HttpAuthController::PopulateAuthChallenge() { | 539 void HttpAuthController::PopulateAuthChallenge() { |
505 DCHECK(CalledOnValidThread()); | 540 DCHECK(CalledOnValidThread()); |
506 | 541 |
507 // Populates response_.auth_challenge with the authentication challenge info. | 542 // Populates response_.auth_challenge with the authentication challenge info. |
508 // This info is consumed by URLRequestHttpJob::GetAuthChallengeInfo(). | 543 // This info is consumed by URLRequestHttpJob::GetAuthChallengeInfo(). |
509 | 544 |
510 auth_info_ = new AuthChallengeInfo; | 545 auth_info_ = new AuthChallengeInfo; |
511 auth_info_->is_proxy = (target_ == HttpAuth::AUTH_PROXY); | 546 auth_info_->is_proxy = (target_ == HttpAuth::AUTH_PROXY); |
512 auth_info_->challenger = HostPortPair::FromURL(auth_origin_); | 547 auth_info_->challenger = HostPortPair::FromURL(auth_origin_); |
513 auth_info_->scheme = HttpAuth::SchemeToString(handler_->auth_scheme()); | 548 auth_info_->scheme = handler_->auth_scheme(); |
514 auth_info_->realm = handler_->realm(); | 549 auth_info_->realm = handler_->realm(); |
515 } | 550 } |
516 | 551 |
517 bool HttpAuthController::DisableOnAuthHandlerResult(int result) { | 552 bool HttpAuthController::DisableOnAuthHandlerResult(int result) { |
518 DCHECK(CalledOnValidThread()); | 553 DCHECK(CalledOnValidThread()); |
519 | 554 |
520 switch (result) { | 555 switch (result) { |
521 // Occurs with GSSAPI, if the user has not already logged in. | 556 // Occurs with GSSAPI, if the user has not already logged in. |
522 case ERR_MISSING_AUTH_CREDENTIALS: | 557 case ERR_MISSING_AUTH_CREDENTIALS: |
523 | 558 |
(...skipping 29 matching lines...) Expand all Loading... |
553 callback_.Reset(); | 588 callback_.Reset(); |
554 c.Run(result); | 589 c.Run(result); |
555 } | 590 } |
556 } | 591 } |
557 | 592 |
558 scoped_refptr<AuthChallengeInfo> HttpAuthController::auth_info() { | 593 scoped_refptr<AuthChallengeInfo> HttpAuthController::auth_info() { |
559 DCHECK(CalledOnValidThread()); | 594 DCHECK(CalledOnValidThread()); |
560 return auth_info_; | 595 return auth_info_; |
561 } | 596 } |
562 | 597 |
563 bool HttpAuthController::IsAuthSchemeDisabled(HttpAuth::Scheme scheme) const { | 598 bool HttpAuthController::IsAuthSchemeDisabled(const std::string& scheme) const { |
564 DCHECK(CalledOnValidThread()); | 599 DCHECK(CalledOnValidThread()); |
565 return disabled_schemes_.find(scheme) != disabled_schemes_.end(); | 600 return disabled_schemes_.Contains(scheme); |
566 } | 601 } |
567 | 602 |
568 void HttpAuthController::DisableAuthScheme(HttpAuth::Scheme scheme) { | 603 void HttpAuthController::DisableAuthScheme(const std::string& scheme) { |
569 DCHECK(CalledOnValidThread()); | 604 DCHECK(CalledOnValidThread()); |
570 disabled_schemes_.insert(scheme); | 605 disabled_schemes_.Add(scheme); |
571 } | 606 } |
572 | 607 |
573 void HttpAuthController::DisableEmbeddedIdentity() { | 608 void HttpAuthController::DisableEmbeddedIdentity() { |
574 DCHECK(CalledOnValidThread()); | 609 DCHECK(CalledOnValidThread()); |
575 embedded_identity_used_ = true; | 610 embedded_identity_used_ = true; |
576 } | 611 } |
577 | 612 |
578 } // namespace net | 613 } // namespace net |
OLD | NEW |