OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 #include "components/safe_browsing/password_protection/password_protection_reque
st.h" | 4 #include "components/safe_browsing/password_protection/password_protection_reque
st.h" |
5 | 5 |
6 #include "base/memory/ptr_util.h" | 6 #include "base/memory/ptr_util.h" |
7 #include "base/memory/weak_ptr.h" | 7 #include "base/memory/weak_ptr.h" |
8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
9 #include "components/data_use_measurement/core/data_use_user_data.h" | 9 #include "components/data_use_measurement/core/data_use_user_data.h" |
10 #include "components/safe_browsing_db/database_manager.h" | 10 #include "components/safe_browsing_db/database_manager.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 base::Unretained(password_protection_service_), | 53 base::Unretained(password_protection_service_), |
54 main_frame_url_, match_whitelist), | 54 main_frame_url_, match_whitelist), |
55 base::Bind(&PasswordProtectionRequest::OnWhitelistCheckDone, this, | 55 base::Bind(&PasswordProtectionRequest::OnWhitelistCheckDone, this, |
56 base::Owned(match_whitelist))); | 56 base::Owned(match_whitelist))); |
57 } | 57 } |
58 | 58 |
59 void PasswordProtectionRequest::OnWhitelistCheckDone( | 59 void PasswordProtectionRequest::OnWhitelistCheckDone( |
60 const bool* match_whitelist) { | 60 const bool* match_whitelist) { |
61 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 61 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
62 if (*match_whitelist) | 62 if (*match_whitelist) |
63 Finish(RequestOutcome::MATCHED_WHITELIST, nullptr); | 63 Finish(PasswordProtectionService::MATCHED_WHITELIST, nullptr); |
64 else | 64 else |
65 CheckCachedVerdicts(); | 65 CheckCachedVerdicts(); |
66 } | 66 } |
67 | 67 |
68 void PasswordProtectionRequest::CheckCachedVerdicts() { | 68 void PasswordProtectionRequest::CheckCachedVerdicts() { |
69 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 69 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
70 if (!password_protection_service_) { | 70 if (!password_protection_service_) { |
71 Finish(RequestOutcome::SERVICE_DESTROYED, nullptr); | 71 Finish(PasswordProtectionService::SERVICE_DESTROYED, nullptr); |
72 return; | 72 return; |
73 } | 73 } |
74 | 74 |
75 std::unique_ptr<LoginReputationClientResponse> cached_response = | 75 std::unique_ptr<LoginReputationClientResponse> cached_response = |
76 base::MakeUnique<LoginReputationClientResponse>(); | 76 base::MakeUnique<LoginReputationClientResponse>(); |
77 auto verdict = password_protection_service_->GetCachedVerdict( | 77 auto verdict = password_protection_service_->GetCachedVerdict( |
78 main_frame_url_, cached_response.get()); | 78 main_frame_url_, cached_response.get()); |
79 if (verdict != LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED) | 79 if (verdict != LoginReputationClientResponse::VERDICT_TYPE_UNSPECIFIED) |
80 Finish(RequestOutcome::RESPONSE_ALREADY_CACHED, std::move(cached_response)); | 80 Finish(PasswordProtectionService::RESPONSE_ALREADY_CACHED, |
| 81 std::move(cached_response)); |
81 else | 82 else |
82 SendRequest(); | 83 SendRequest(); |
83 } | 84 } |
84 | 85 |
85 void PasswordProtectionRequest::FillRequestProto() { | 86 void PasswordProtectionRequest::FillRequestProto() { |
86 request_proto_ = base::MakeUnique<LoginReputationClientRequest>(); | 87 request_proto_ = base::MakeUnique<LoginReputationClientRequest>(); |
87 request_proto_->set_page_url(main_frame_url_.spec()); | 88 request_proto_->set_page_url(main_frame_url_.spec()); |
88 request_proto_->set_trigger_type(request_type_); | 89 request_proto_->set_trigger_type(request_type_); |
89 password_protection_service_->FillUserPopulation(request_type_, | 90 password_protection_service_->FillUserPopulation(request_type_, |
90 request_proto_.get()); | 91 request_proto_.get()); |
(...skipping 22 matching lines...) Expand all Loading... |
113 // TODO(jialiul): Fill more frame specific info when Safe Browsing backend | 114 // TODO(jialiul): Fill more frame specific info when Safe Browsing backend |
114 // is ready to handle these pieces of information. | 115 // is ready to handle these pieces of information. |
115 } | 116 } |
116 | 117 |
117 void PasswordProtectionRequest::SendRequest() { | 118 void PasswordProtectionRequest::SendRequest() { |
118 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 119 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
119 FillRequestProto(); | 120 FillRequestProto(); |
120 | 121 |
121 std::string serialized_request; | 122 std::string serialized_request; |
122 if (!request_proto_->SerializeToString(&serialized_request)) { | 123 if (!request_proto_->SerializeToString(&serialized_request)) { |
123 Finish(RequestOutcome::REQUEST_MALFORMED, nullptr); | 124 Finish(PasswordProtectionService::REQUEST_MALFORMED, nullptr); |
124 return; | 125 return; |
125 } | 126 } |
126 | 127 |
127 // In case the request take too long, we set a timer to cancel this request. | 128 // In case the request take too long, we set a timer to cancel this request. |
128 StartTimeout(); | 129 StartTimeout(); |
129 | 130 |
130 fetcher_ = net::URLFetcher::Create( | 131 fetcher_ = net::URLFetcher::Create( |
131 0, PasswordProtectionService::GetPasswordProtectionRequestUrl(), | 132 0, PasswordProtectionService::GetPasswordProtectionRequestUrl(), |
132 net::URLFetcher::POST, this); | 133 net::URLFetcher::POST, this); |
133 data_use_measurement::DataUseUserData::AttachToFetcher( | 134 data_use_measurement::DataUseUserData::AttachToFetcher( |
(...skipping 25 matching lines...) Expand all Loading... |
159 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 160 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
160 net::URLRequestStatus status = source->GetStatus(); | 161 net::URLRequestStatus status = source->GetStatus(); |
161 const bool is_success = status.is_success(); | 162 const bool is_success = status.is_success(); |
162 const int response_code = source->GetResponseCode(); | 163 const int response_code = source->GetResponseCode(); |
163 | 164 |
164 UMA_HISTOGRAM_SPARSE_SLOWLY( | 165 UMA_HISTOGRAM_SPARSE_SLOWLY( |
165 "PasswordProtection.PasswordProtectionResponseOrErrorCode", | 166 "PasswordProtection.PasswordProtectionResponseOrErrorCode", |
166 is_success ? response_code : status.error()); | 167 is_success ? response_code : status.error()); |
167 | 168 |
168 if (!is_success || net::HTTP_OK != response_code) { | 169 if (!is_success || net::HTTP_OK != response_code) { |
169 Finish(RequestOutcome::FETCH_FAILED, nullptr); | 170 Finish(PasswordProtectionService::FETCH_FAILED, nullptr); |
170 return; | 171 return; |
171 } | 172 } |
172 | 173 |
173 std::unique_ptr<LoginReputationClientResponse> response = | 174 std::unique_ptr<LoginReputationClientResponse> response = |
174 base::MakeUnique<LoginReputationClientResponse>(); | 175 base::MakeUnique<LoginReputationClientResponse>(); |
175 std::string response_body; | 176 std::string response_body; |
176 bool received_data = source->GetResponseAsString(&response_body); | 177 bool received_data = source->GetResponseAsString(&response_body); |
177 DCHECK(received_data); | 178 DCHECK(received_data); |
178 fetcher_.reset(); // We don't need it anymore. | 179 fetcher_.reset(); // We don't need it anymore. |
179 UMA_HISTOGRAM_TIMES("PasswordProtection.RequestNetworkDuration", | 180 UMA_HISTOGRAM_TIMES("PasswordProtection.RequestNetworkDuration", |
180 base::TimeTicks::Now() - request_start_time_); | 181 base::TimeTicks::Now() - request_start_time_); |
181 if (response->ParseFromString(response_body)) | 182 if (response->ParseFromString(response_body)) |
182 Finish(RequestOutcome::SUCCEEDED, std::move(response)); | 183 Finish(PasswordProtectionService::SUCCEEDED, std::move(response)); |
183 else | 184 else |
184 Finish(RequestOutcome::RESPONSE_MALFORMED, nullptr); | 185 Finish(PasswordProtectionService::RESPONSE_MALFORMED, nullptr); |
185 } | 186 } |
186 | 187 |
187 void PasswordProtectionRequest::Finish( | 188 void PasswordProtectionRequest::Finish( |
188 RequestOutcome outcome, | 189 PasswordProtectionService::RequestOutcome outcome, |
189 std::unique_ptr<LoginReputationClientResponse> response) { | 190 std::unique_ptr<LoginReputationClientResponse> response) { |
190 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 191 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
191 tracker_.TryCancelAll(); | 192 tracker_.TryCancelAll(); |
192 | 193 |
193 UMA_HISTOGRAM_ENUMERATION("PasswordProtection.RequestOutcome", outcome, | 194 if (request_type_ == LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE) { |
194 RequestOutcome::MAX_OUTCOME); | 195 UMA_HISTOGRAM_ENUMERATION(kPasswordOnFocusRequestOutcomeHistogramName, |
| 196 outcome, PasswordProtectionService::MAX_OUTCOME); |
| 197 } else { |
| 198 UMA_HISTOGRAM_ENUMERATION(kPasswordEntryRequestOutcomeHistogramName, |
| 199 outcome, PasswordProtectionService::MAX_OUTCOME); |
| 200 } |
195 | 201 |
196 if (response) { | 202 if (response) { |
197 switch (request_type_) { | 203 switch (request_type_) { |
198 case LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE: | 204 case LoginReputationClientRequest::UNFAMILIAR_LOGIN_PAGE: |
199 UMA_HISTOGRAM_ENUMERATION( | 205 UMA_HISTOGRAM_ENUMERATION( |
200 "PasswordProtection.UnfamiliarLoginPageVerdict", | 206 "PasswordProtection.Verdict.PasswordFieldOnFocus", |
201 response->verdict_type(), | 207 response->verdict_type(), |
202 LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1); | 208 LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1); |
203 break; | 209 break; |
204 case LoginReputationClientRequest::PASSWORD_REUSE_EVENT: | 210 case LoginReputationClientRequest::PASSWORD_REUSE_EVENT: |
205 UMA_HISTOGRAM_ENUMERATION( | 211 UMA_HISTOGRAM_ENUMERATION( |
206 "PasswordProtection.PasswordReuseEventVerdict", | 212 "PasswordProtection.Verdict.ProtectedPasswordEntry", |
207 response->verdict_type(), | 213 response->verdict_type(), |
208 LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1); | 214 LoginReputationClientResponse_VerdictType_VerdictType_MAX + 1); |
209 break; | 215 break; |
210 default: | 216 default: |
211 NOTREACHED(); | 217 NOTREACHED(); |
212 } | 218 } |
213 } | 219 } |
214 | 220 |
215 DCHECK(password_protection_service_); | 221 DCHECK(password_protection_service_); |
216 password_protection_service_->RequestFinished(this, std::move(response)); | 222 password_protection_service_->RequestFinished(this, std::move(response)); |
217 } | 223 } |
218 | 224 |
219 void PasswordProtectionRequest::Cancel(bool timed_out) { | 225 void PasswordProtectionRequest::Cancel(bool timed_out) { |
220 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 226 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
221 fetcher_.reset(); | 227 fetcher_.reset(); |
222 | 228 |
223 Finish(timed_out ? TIMEDOUT : CANCELED, nullptr); | 229 Finish(timed_out ? PasswordProtectionService::TIMEDOUT |
| 230 : PasswordProtectionService::CANCELED, |
| 231 nullptr); |
224 } | 232 } |
225 | 233 |
226 } // namespace safe_browsing | 234 } // namespace safe_browsing |
OLD | NEW |