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

Side by Side Diff: components/security_state/core/security_state_model.cc

Issue 2448943002: Refactor SecurityStateModel/Clients for simplicity and reusability. (Closed)
Patch Set: update comments. Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/security_state/security_state_model.h" 5 #include "components/security_state/core/security_state_model.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/metrics/field_trial.h" 10 #include "base/metrics/field_trial.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "components/security_state/security_state_model_client.h" 12 #include "components/security_state/core/switches.h"
13 #include "components/security_state/switches.h"
14 #include "net/ssl/ssl_cipher_suite_names.h" 13 #include "net/ssl/ssl_cipher_suite_names.h"
15 #include "net/ssl/ssl_connection_status_flags.h" 14 #include "net/ssl/ssl_connection_status_flags.h"
16 15
17 namespace security_state { 16 namespace security_state {
18 17
19 namespace { 18 namespace {
20 19
21 // Do not change or reorder this enum, and add new values at the end. It is used 20 // Do not change or reorder this enum, and add new values at the end. It is used
22 // in the MarkHttpAs histogram. 21 // in the MarkHttpAs histogram.
23 enum MarkHttpStatus { NEUTRAL, NON_SECURE, HTTP_SHOW_WARNING, LAST_STATUS }; 22 enum MarkHttpStatus { NEUTRAL, NON_SECURE, HTTP_SHOW_WARNING, LAST_STATUS };
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN; 110 return SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN;
112 if (ran) 111 if (ran)
113 return SecurityStateModel::CONTENT_STATUS_RAN; 112 return SecurityStateModel::CONTENT_STATUS_RAN;
114 if (displayed) 113 if (displayed)
115 return SecurityStateModel::CONTENT_STATUS_DISPLAYED; 114 return SecurityStateModel::CONTENT_STATUS_DISPLAYED;
116 return SecurityStateModel::CONTENT_STATUS_NONE; 115 return SecurityStateModel::CONTENT_STATUS_NONE;
117 } 116 }
118 117
119 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest( 118 SecurityStateModel::SecurityLevel GetSecurityLevelForRequest(
120 const SecurityStateModel::VisibleSecurityState& visible_security_state, 119 const SecurityStateModel::VisibleSecurityState& visible_security_state,
121 SecurityStateModelClient* client, 120 bool used_policy_installed_certificate,
121 const SecurityStateModel::IsOriginSecureCallback& is_origin_secure_callback,
122 SecurityStateModel::SHA1DeprecationStatus sha1_status, 122 SecurityStateModel::SHA1DeprecationStatus sha1_status,
123 SecurityStateModel::ContentStatus mixed_content_status, 123 SecurityStateModel::ContentStatus mixed_content_status,
124 SecurityStateModel::ContentStatus content_with_cert_errors_status) { 124 SecurityStateModel::ContentStatus content_with_cert_errors_status) {
125 DCHECK(visible_security_state.connection_info_initialized || 125 DCHECK(visible_security_state.connection_info_initialized ||
126 visible_security_state.fails_malware_check); 126 visible_security_state.fails_malware_check);
127 127
128 // Override the connection security information if the website failed the 128 // Override the connection security information if the website failed the
129 // browser's malware checks. 129 // browser's malware checks.
130 if (visible_security_state.fails_malware_check) 130 if (visible_security_state.fails_malware_check)
131 return SecurityStateModel::DANGEROUS; 131 return SecurityStateModel::DANGEROUS;
132 132
133 GURL url = visible_security_state.url; 133 GURL url = visible_security_state.url;
134 134
135 bool is_cryptographic_with_certificate = 135 bool is_cryptographic_with_certificate =
136 (url.SchemeIsCryptographic() && visible_security_state.certificate); 136 (url.SchemeIsCryptographic() && visible_security_state.certificate);
137 137
138 // Set the security level to DANGEROUS for major certificate errors. 138 // Set the security level to DANGEROUS for major certificate errors.
139 if (is_cryptographic_with_certificate && 139 if (is_cryptographic_with_certificate &&
140 net::IsCertStatusError(visible_security_state.cert_status) && 140 net::IsCertStatusError(visible_security_state.cert_status) &&
141 !net::IsCertStatusMinorError(visible_security_state.cert_status)) { 141 !net::IsCertStatusMinorError(visible_security_state.cert_status)) {
142 return SecurityStateModel::DANGEROUS; 142 return SecurityStateModel::DANGEROUS;
143 } 143 }
144 144
145 // Choose the appropriate security level for HTTP requests. 145 // Choose the appropriate security level for HTTP requests.
146 if (!is_cryptographic_with_certificate) { 146 if (!is_cryptographic_with_certificate) {
147 if (!client->IsOriginSecure(url) && url.IsStandard()) { 147 if (!is_origin_secure_callback.Run(url) && url.IsStandard()) {
148 return GetSecurityLevelForNonSecureFieldTrial( 148 return GetSecurityLevelForNonSecureFieldTrial(
149 visible_security_state.displayed_password_field_on_http || 149 visible_security_state.displayed_password_field_on_http ||
150 visible_security_state.displayed_credit_card_field_on_http); 150 visible_security_state.displayed_credit_card_field_on_http);
151 } 151 }
152 return SecurityStateModel::NONE; 152 return SecurityStateModel::NONE;
153 } 153 }
154 154
155 // Downgrade the security level for active insecure subresources. 155 // Downgrade the security level for active insecure subresources.
156 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN || 156 if (mixed_content_status == SecurityStateModel::CONTENT_STATUS_RAN ||
157 mixed_content_status == 157 mixed_content_status ==
158 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN || 158 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN ||
159 content_with_cert_errors_status == 159 content_with_cert_errors_status ==
160 SecurityStateModel::CONTENT_STATUS_RAN || 160 SecurityStateModel::CONTENT_STATUS_RAN ||
161 content_with_cert_errors_status == 161 content_with_cert_errors_status ==
162 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) { 162 SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN) {
163 return SecurityStateModel::kRanInsecureContentLevel; 163 return SecurityStateModel::kRanInsecureContentLevel;
164 } 164 }
165 165
166 // Report if there is a policy cert first, before reporting any other 166 // Report if there is a policy cert first, before reporting any other
167 // authenticated-but-with-errors cases. A policy cert is a strong 167 // authenticated-but-with-errors cases. A policy cert is a strong
168 // indicator of a MITM being present (the enterprise), while the 168 // indicator of a MITM being present (the enterprise), while the
169 // other authenticated-but-with-errors indicate something may 169 // other authenticated-but-with-errors indicate something may
170 // be wrong, or may be wrong in the future, but is unclear now. 170 // be wrong, or may be wrong in the future, but is unclear now.
171 if (client->UsedPolicyInstalledCertificate()) 171 if (used_policy_installed_certificate)
172 return SecurityStateModel::SECURE_WITH_POLICY_INSTALLED_CERT; 172 return SecurityStateModel::SECURE_WITH_POLICY_INSTALLED_CERT;
173 173
174 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR) 174 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MAJOR)
175 return SecurityStateModel::DANGEROUS; 175 return SecurityStateModel::DANGEROUS;
176 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR) 176 if (sha1_status == SecurityStateModel::DEPRECATED_SHA1_MINOR)
177 return SecurityStateModel::NONE; 177 return SecurityStateModel::NONE;
178 178
179 // Active mixed content is handled above. 179 // Active mixed content is handled above.
180 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status); 180 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_RAN, mixed_content_status);
181 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN, 181 DCHECK_NE(SecurityStateModel::CONTENT_STATUS_DISPLAYED_AND_RAN,
(...skipping 12 matching lines...) Expand all
194 } 194 }
195 195
196 if ((visible_security_state.cert_status & net::CERT_STATUS_IS_EV) && 196 if ((visible_security_state.cert_status & net::CERT_STATUS_IS_EV) &&
197 visible_security_state.certificate) { 197 visible_security_state.certificate) {
198 return SecurityStateModel::EV_SECURE; 198 return SecurityStateModel::EV_SECURE;
199 } 199 }
200 return SecurityStateModel::SECURE; 200 return SecurityStateModel::SECURE;
201 } 201 }
202 202
203 void SecurityInfoForRequest( 203 void SecurityInfoForRequest(
204 SecurityStateModelClient* client,
205 const SecurityStateModel::VisibleSecurityState& visible_security_state, 204 const SecurityStateModel::VisibleSecurityState& visible_security_state,
205 bool used_policy_installed_certificate,
206 const SecurityStateModel::IsOriginSecureCallback& is_origin_secure_callback,
206 SecurityStateModel::SecurityInfo* security_info) { 207 SecurityStateModel::SecurityInfo* security_info) {
207 if (!visible_security_state.connection_info_initialized) { 208 if (!visible_security_state.connection_info_initialized) {
208 *security_info = SecurityStateModel::SecurityInfo(); 209 *security_info = SecurityStateModel::SecurityInfo();
209 security_info->fails_malware_check = 210 security_info->fails_malware_check =
210 visible_security_state.fails_malware_check; 211 visible_security_state.fails_malware_check;
211 if (security_info->fails_malware_check) { 212 if (security_info->fails_malware_check) {
212 security_info->security_level = GetSecurityLevelForRequest( 213 security_info->security_level = GetSecurityLevelForRequest(
213 visible_security_state, client, SecurityStateModel::UNKNOWN_SHA1, 214 visible_security_state, used_policy_installed_certificate,
215 is_origin_secure_callback, SecurityStateModel::UNKNOWN_SHA1,
214 SecurityStateModel::CONTENT_STATUS_UNKNOWN, 216 SecurityStateModel::CONTENT_STATUS_UNKNOWN,
215 SecurityStateModel::CONTENT_STATUS_UNKNOWN); 217 SecurityStateModel::CONTENT_STATUS_UNKNOWN);
216 } 218 }
217 return; 219 return;
218 } 220 }
219 security_info->certificate = visible_security_state.certificate; 221 security_info->certificate = visible_security_state.certificate;
220 security_info->sha1_deprecation_status = 222 security_info->sha1_deprecation_status =
221 GetSHA1DeprecationStatus(visible_security_state); 223 GetSHA1DeprecationStatus(visible_security_state);
222 security_info->mixed_content_status = 224 security_info->mixed_content_status =
223 GetContentStatus(visible_security_state.displayed_mixed_content, 225 GetContentStatus(visible_security_state.displayed_mixed_content,
(...skipping 14 matching lines...) Expand all
238 visible_security_state.sct_verify_statuses; 240 visible_security_state.sct_verify_statuses;
239 241
240 security_info->fails_malware_check = 242 security_info->fails_malware_check =
241 visible_security_state.fails_malware_check; 243 visible_security_state.fails_malware_check;
242 244
243 security_info->displayed_private_user_data_input_on_http = 245 security_info->displayed_private_user_data_input_on_http =
244 visible_security_state.displayed_password_field_on_http || 246 visible_security_state.displayed_password_field_on_http ||
245 visible_security_state.displayed_credit_card_field_on_http; 247 visible_security_state.displayed_credit_card_field_on_http;
246 248
247 security_info->security_level = GetSecurityLevelForRequest( 249 security_info->security_level = GetSecurityLevelForRequest(
248 visible_security_state, client, security_info->sha1_deprecation_status, 250 visible_security_state, used_policy_installed_certificate,
251 is_origin_secure_callback, security_info->sha1_deprecation_status,
249 security_info->mixed_content_status, 252 security_info->mixed_content_status,
250 security_info->content_with_cert_errors_status); 253 security_info->content_with_cert_errors_status);
251 } 254 }
252 255
253 } // namespace 256 } // namespace
254 257
255 const SecurityStateModel::SecurityLevel 258 const SecurityStateModel::SecurityLevel
256 SecurityStateModel::kDisplayedInsecureContentLevel = 259 SecurityStateModel::kDisplayedInsecureContentLevel =
257 SecurityStateModel::NONE; 260 SecurityStateModel::NONE;
258 const SecurityStateModel::SecurityLevel 261 const SecurityStateModel::SecurityLevel
(...skipping 15 matching lines...) Expand all
274 pkp_bypassed(false), 277 pkp_bypassed(false),
275 displayed_private_user_data_input_on_http(false) {} 278 displayed_private_user_data_input_on_http(false) {}
276 279
277 SecurityStateModel::SecurityInfo::~SecurityInfo() {} 280 SecurityStateModel::SecurityInfo::~SecurityInfo() {}
278 281
279 SecurityStateModel::SecurityStateModel() {} 282 SecurityStateModel::SecurityStateModel() {}
280 283
281 SecurityStateModel::~SecurityStateModel() {} 284 SecurityStateModel::~SecurityStateModel() {}
282 285
283 void SecurityStateModel::GetSecurityInfo( 286 void SecurityStateModel::GetSecurityInfo(
284 SecurityStateModel::SecurityInfo* result) const { 287 SecurityStateModel::SecurityInfo* result,
285 VisibleSecurityState new_visible_state; 288 std::unique_ptr<VisibleSecurityState> visible_security_state,
286 client_->GetVisibleSecurityState(&new_visible_state); 289 bool used_policy_installed_certificate,
287 SecurityInfoForRequest(client_, new_visible_state, result); 290 IsOriginSecureCallback is_origin_secure_callback) const {
288 } 291 SecurityInfoForRequest(*visible_security_state,
289 292 used_policy_installed_certificate,
290 void SecurityStateModel::SetClient(SecurityStateModelClient* client) { 293 is_origin_secure_callback, result);
291 client_ = client;
292 } 294 }
293 295
294 SecurityStateModel::VisibleSecurityState::VisibleSecurityState() 296 SecurityStateModel::VisibleSecurityState::VisibleSecurityState()
295 : fails_malware_check(false), 297 : fails_malware_check(false),
296 connection_info_initialized(false), 298 connection_info_initialized(false),
297 cert_status(0), 299 cert_status(0),
298 connection_status(0), 300 connection_status(0),
299 key_exchange_group(0), 301 key_exchange_group(0),
300 security_bits(-1), 302 security_bits(-1),
301 displayed_mixed_content(false), 303 displayed_mixed_content(false),
(...skipping 22 matching lines...) Expand all
324 other.displayed_content_with_cert_errors && 326 other.displayed_content_with_cert_errors &&
325 ran_content_with_cert_errors == other.ran_content_with_cert_errors && 327 ran_content_with_cert_errors == other.ran_content_with_cert_errors &&
326 pkp_bypassed == other.pkp_bypassed && 328 pkp_bypassed == other.pkp_bypassed &&
327 displayed_password_field_on_http == 329 displayed_password_field_on_http ==
328 other.displayed_password_field_on_http && 330 other.displayed_password_field_on_http &&
329 displayed_credit_card_field_on_http == 331 displayed_credit_card_field_on_http ==
330 other.displayed_credit_card_field_on_http); 332 other.displayed_credit_card_field_on_http);
331 } 333 }
332 334
333 } // namespace security_state 335 } // namespace security_state
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698