Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/child/web_url_loader_impl.h" | 5 #include "content/child/web_url_loader_impl.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <iomanip> | |
| 10 #include <iostream> | |
|
Eran Messeri
2016/03/09 20:58:47
Including iostream will introduce additional stati
dwaxweiler
2016/03/10 11:02:28
Acknowledged.
| |
| 11 #include <sstream> | |
| 9 #include <string> | 12 #include <string> |
| 10 #include <utility> | 13 #include <utility> |
| 11 #include <vector> | 14 #include <vector> |
| 12 | 15 |
| 13 #include "base/bind.h" | 16 #include "base/bind.h" |
| 14 #include "base/files/file_path.h" | 17 #include "base/files/file_path.h" |
| 15 #include "base/logging.h" | 18 #include "base/logging.h" |
| 16 #include "base/memory/scoped_ptr.h" | 19 #include "base/memory/scoped_ptr.h" |
| 17 #include "base/single_thread_task_runner.h" | 20 #include "base/single_thread_task_runner.h" |
| 18 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 37 #include "content/public/child/fixed_received_data.h" | 40 #include "content/public/child/fixed_received_data.h" |
| 38 #include "content/public/child/request_peer.h" | 41 #include "content/public/child/request_peer.h" |
| 39 #include "content/public/common/browser_side_navigation_policy.h" | 42 #include "content/public/common/browser_side_navigation_policy.h" |
| 40 #include "content/public/common/signed_certificate_timestamp_id_and_status.h" | 43 #include "content/public/common/signed_certificate_timestamp_id_and_status.h" |
| 41 #include "content/public/common/ssl_status.h" | 44 #include "content/public/common/ssl_status.h" |
| 42 #include "net/base/data_url.h" | 45 #include "net/base/data_url.h" |
| 43 #include "net/base/filename_util.h" | 46 #include "net/base/filename_util.h" |
| 44 #include "net/base/net_errors.h" | 47 #include "net/base/net_errors.h" |
| 45 #include "net/cert/cert_status_flags.h" | 48 #include "net/cert/cert_status_flags.h" |
| 46 #include "net/cert/sct_status_flags.h" | 49 #include "net/cert/sct_status_flags.h" |
| 50 #include "net/cert/signed_certificate_timestamp.h" | |
| 47 #include "net/http/http_response_headers.h" | 51 #include "net/http/http_response_headers.h" |
| 48 #include "net/http/http_util.h" | 52 #include "net/http/http_util.h" |
| 49 #include "net/ssl/ssl_cipher_suite_names.h" | 53 #include "net/ssl/ssl_cipher_suite_names.h" |
| 50 #include "net/ssl/ssl_connection_status_flags.h" | 54 #include "net/ssl/ssl_connection_status_flags.h" |
| 51 #include "net/url_request/url_request_data_job.h" | 55 #include "net/url_request/url_request_data_job.h" |
| 52 #include "third_party/WebKit/public/platform/WebHTTPLoadInfo.h" | 56 #include "third_party/WebKit/public/platform/WebHTTPLoadInfo.h" |
| 53 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" | 57 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
| 54 #include "third_party/WebKit/public/platform/WebTraceLocation.h" | 58 #include "third_party/WebKit/public/platform/WebTraceLocation.h" |
| 55 #include "third_party/WebKit/public/platform/WebURL.h" | 59 #include "third_party/WebKit/public/platform/WebURL.h" |
| 56 #include "third_party/WebKit/public/platform/WebURLError.h" | 60 #include "third_party/WebKit/public/platform/WebURLError.h" |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 167 info->headers = headers; | 171 info->headers = headers; |
| 168 info->mime_type.swap(mime_type); | 172 info->mime_type.swap(mime_type); |
| 169 info->charset.swap(charset); | 173 info->charset.swap(charset); |
| 170 info->security_info.clear(); | 174 info->security_info.clear(); |
| 171 info->content_length = data->length(); | 175 info->content_length = data->length(); |
| 172 info->encoded_data_length = 0; | 176 info->encoded_data_length = 0; |
| 173 | 177 |
| 174 return net::OK; | 178 return net::OK; |
| 175 } | 179 } |
| 176 | 180 |
| 181 const WebString HashAlgorithmToString( | |
|
Eran Messeri
2016/03/09 20:58:46
Perhaps we can extract the function https://code.g
dwaxweiler
2016/03/10 11:02:27
Acknowledged.
| |
| 182 net::ct::DigitallySigned::HashAlgorithm hashAlgorithm) { | |
| 183 switch (hashAlgorithm) { | |
| 184 case net::ct::DigitallySigned::HASH_ALGO_NONE: | |
| 185 return "None / invalid"; | |
| 186 case net::ct::DigitallySigned::HASH_ALGO_MD5: | |
| 187 return "MD5"; | |
| 188 case net::ct::DigitallySigned::HASH_ALGO_SHA1: | |
| 189 return "SHA-1"; | |
| 190 case net::ct::DigitallySigned::HASH_ALGO_SHA224: | |
| 191 return "SHA-224"; | |
| 192 case net::ct::DigitallySigned::HASH_ALGO_SHA256: | |
| 193 return "SHA-256"; | |
| 194 case net::ct::DigitallySigned::HASH_ALGO_SHA384: | |
| 195 return "SHA-384"; | |
| 196 case net::ct::DigitallySigned::HASH_ALGO_SHA512: | |
| 197 return "SHA-512"; | |
| 198 } | |
| 199 return "Unknown"; | |
| 200 } | |
| 201 | |
| 202 const WebString SignatureAlgorithmToString( | |
|
Eran Messeri
2016/03/09 20:58:47
Same for https://code.google.com/p/chromium/codese
dwaxweiler
2016/03/10 11:02:28
Acknowledged.
| |
| 203 net::ct::DigitallySigned::SignatureAlgorithm signatureAlgorithm) { | |
| 204 switch (signatureAlgorithm) { | |
| 205 case net::ct::DigitallySigned::SIG_ALGO_ANONYMOUS: | |
| 206 return "Unknown"; | |
| 207 case net::ct::DigitallySigned::SIG_ALGO_RSA: | |
| 208 return "RSA"; | |
| 209 case net::ct::DigitallySigned::SIG_ALGO_DSA: | |
| 210 return "DSA"; | |
| 211 case net::ct::DigitallySigned::SIG_ALGO_ECDSA: | |
| 212 return "ECDSA"; | |
| 213 } | |
| 214 return "Unknown"; | |
| 215 } | |
| 216 | |
| 217 const WebString OriginToString( | |
|
Eran Messeri
2016/03/09 20:58:47
Same for https://code.google.com/p/chromium/codese
dwaxweiler
2016/03/10 11:02:27
Acknowledged.
| |
| 218 net::ct::SignedCertificateTimestamp::Origin origin) { | |
| 219 switch (origin) { | |
| 220 case net::ct::SignedCertificateTimestamp::SCT_EMBEDDED: | |
| 221 return "Embedded"; | |
| 222 case net::ct::SignedCertificateTimestamp::SCT_FROM_TLS_EXTENSION: | |
| 223 return "TLS extension"; | |
| 224 case net::ct::SignedCertificateTimestamp::SCT_FROM_OCSP_RESPONSE: | |
| 225 return "OCSP"; | |
| 226 } | |
| 227 return "Unknown"; | |
| 228 } | |
| 229 | |
| 230 const WebString StatusToString(net::ct::SCTVerifyStatus status) { | |
| 231 switch (status) { | |
| 232 case net::ct::SCT_STATUS_LOG_UNKNOWN: | |
| 233 return "From unknown log"; | |
| 234 case net::ct::SCT_STATUS_INVALID: | |
| 235 return "Invalid"; | |
| 236 case net::ct::SCT_STATUS_OK: | |
| 237 return "Verified"; | |
| 238 case net::ct::SCT_STATUS_NONE: | |
| 239 return "None"; | |
| 240 } | |
| 241 return "Unknown"; | |
| 242 } | |
| 243 | |
| 244 const WebString VersionToString( | |
| 245 net::ct::SignedCertificateTimestamp::Version version) { | |
| 246 switch (version) { | |
| 247 case net::ct::SignedCertificateTimestamp::SCT_VERSION_1: | |
| 248 return "1"; | |
| 249 } | |
| 250 return "Unknown"; | |
| 251 } | |
| 252 | |
| 253 std::string ByteToHex(const unsigned char *data, int length) { | |
|
Eran Messeri
2016/03/09 20:58:47
How about using HexEncode in https://code.google.c
dwaxweiler
2016/03/10 11:02:28
Acknowledged.
| |
| 254 std::stringstream stream; | |
| 255 for (int i = 0; i < length; ++i) { | |
| 256 stream << std::hex | |
| 257 << std::uppercase | |
| 258 << std::setw(2) | |
| 259 << std::setfill('0') | |
| 260 << (int)data[i]; | |
| 261 } | |
| 262 return stream.str(); | |
| 263 } | |
| 264 | |
| 177 void SetSecurityStyleAndDetails(const GURL& url, | 265 void SetSecurityStyleAndDetails(const GURL& url, |
| 178 const std::string& security_info, | 266 const std::string& security_info, |
| 179 WebURLResponse* response, | 267 WebURLResponse* response, |
| 180 bool report_security_info) { | 268 bool report_security_info) { |
| 181 if (!report_security_info) { | 269 if (!report_security_info) { |
| 182 response->setSecurityStyle(WebURLResponse::SecurityStyleUnknown); | 270 response->setSecurityStyle(WebURLResponse::SecurityStyleUnknown); |
| 183 return; | 271 return; |
| 184 } | 272 } |
| 185 if (!url.SchemeIsCryptographic()) { | 273 if (!url.SchemeIsCryptographic()) { |
| 186 response->setSecurityStyle(WebURLResponse::SecurityStyleUnauthenticated); | 274 response->setSecurityStyle(WebURLResponse::SecurityStyleUnauthenticated); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 242 | 330 |
| 243 response->setSecurityStyle(securityStyle); | 331 response->setSecurityStyle(securityStyle); |
| 244 | 332 |
| 245 SignedCertificateTimestampIDStatusList sct_list = | 333 SignedCertificateTimestampIDStatusList sct_list = |
| 246 ssl_status.signed_certificate_timestamp_ids; | 334 ssl_status.signed_certificate_timestamp_ids; |
| 247 | 335 |
| 248 size_t num_unknown_scts = 0; | 336 size_t num_unknown_scts = 0; |
| 249 size_t num_invalid_scts = 0; | 337 size_t num_invalid_scts = 0; |
| 250 size_t num_valid_scts = 0; | 338 size_t num_valid_scts = 0; |
| 251 | 339 |
| 340 blink::WebURLResponse::SignedCertificateTimestampList sctList; | |
| 341 | |
| 252 SignedCertificateTimestampIDStatusList::iterator iter; | 342 SignedCertificateTimestampIDStatusList::iterator iter; |
| 253 for (iter = sct_list.begin(); iter < sct_list.end(); ++iter) { | 343 for (iter = sct_list.begin(); iter < sct_list.end(); ++iter) { |
| 344 // Extract SCT's details. | |
|
Eran Messeri
2016/03/09 21:04:35
I think this is where you'd use the SignedCertific
dwaxweiler
2016/03/10 11:02:27
I have thought of the SCT store too, but Retrieve(
Eran Messeri
2016/03/14 18:27:26
+lgarron - is that the reason pages have to be re-
| |
| 345 blink::WebURLResponse::SignedCertificateTimestamp sct( | |
| 346 StatusToString(iter->status), | |
| 347 OriginToString(iter->origin), | |
| 348 VersionToString(iter->version), | |
| 349 WebString::fromUTF8(iter->logDescription), | |
| 350 WebString::fromUTF8(ByteToHex( | |
| 351 reinterpret_cast<const unsigned char*>(iter->logId.data()), | |
| 352 iter->logId.length())), | |
| 353 iter->timestamp, | |
| 354 HashAlgorithmToString(iter->signature.hash_algorithm), | |
| 355 SignatureAlgorithmToString(iter->signature.signature_algorithm), | |
| 356 WebString::fromUTF8(ByteToHex( | |
| 357 reinterpret_cast<const unsigned char*>( | |
| 358 iter->signature.signature_data.data()), | |
| 359 iter->signature.signature_data.length()))); | |
| 360 sctList.push_back(sct); | |
| 361 // Count unknown, invalid and valid SCTs. | |
| 254 switch (iter->status) { | 362 switch (iter->status) { |
| 255 case net::ct::SCT_STATUS_LOG_UNKNOWN: | 363 case net::ct::SCT_STATUS_LOG_UNKNOWN: |
| 256 num_unknown_scts++; | 364 num_unknown_scts++; |
| 257 break; | 365 break; |
| 258 case net::ct::SCT_STATUS_INVALID: | 366 case net::ct::SCT_STATUS_INVALID: |
| 259 num_invalid_scts++; | 367 num_invalid_scts++; |
| 260 break; | 368 break; |
| 261 case net::ct::SCT_STATUS_OK: | 369 case net::ct::SCT_STATUS_OK: |
| 262 num_valid_scts++; | 370 num_valid_scts++; |
| 263 break; | 371 break; |
| 264 case net::ct::SCT_STATUS_NONE: | 372 case net::ct::SCT_STATUS_NONE: |
| 265 case net::ct::SCT_STATUS_MAX: | 373 case net::ct::SCT_STATUS_MAX: |
| 266 // These enum values do not represent SCTs that are taken into account | 374 // These enum values do not represent SCTs that are taken into account |
| 267 // for CT compliance calculations, so we ignore them. | 375 // for CT compliance calculations, so we ignore them. |
| 268 break; | 376 break; |
| 269 } | 377 } |
| 270 } | 378 } |
| 271 | 379 |
| 272 blink::WebURLResponse::WebSecurityDetails webSecurityDetails( | 380 blink::WebURLResponse::WebSecurityDetails webSecurityDetails( |
| 273 WebString::fromUTF8(protocol), WebString::fromUTF8(cipher), | 381 WebString::fromUTF8(protocol), WebString::fromUTF8(cipher), |
| 274 WebString::fromUTF8(key_exchange), WebString::fromUTF8(mac), | 382 WebString::fromUTF8(key_exchange), WebString::fromUTF8(mac), |
| 275 ssl_status.cert_id, num_unknown_scts, num_invalid_scts, num_valid_scts); | 383 ssl_status.cert_id, num_unknown_scts, num_invalid_scts, num_valid_scts, |
| 384 sctList); | |
| 276 | 385 |
| 277 response->setSecurityDetails(webSecurityDetails); | 386 response->setSecurityDetails(webSecurityDetails); |
| 278 } | 387 } |
| 279 | 388 |
| 280 } // namespace | 389 } // namespace |
| 281 | 390 |
| 282 // This inner class exists since the WebURLLoader may be deleted while inside a | 391 // This inner class exists since the WebURLLoader may be deleted while inside a |
| 283 // call to WebURLLoaderClient. Refcounting is to keep the context from being | 392 // call to WebURLLoaderClient. Refcounting is to keep the context from being |
| 284 // deleted if it may have work to do after calling into the client. | 393 // deleted if it may have work to do after calling into the client. |
| 285 class WebURLLoaderImpl::Context : public base::RefCounted<Context> { | 394 class WebURLLoaderImpl::Context : public base::RefCounted<Context> { |
| (...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1154 } | 1263 } |
| 1155 | 1264 |
| 1156 void WebURLLoaderImpl::setLoadingTaskRunner( | 1265 void WebURLLoaderImpl::setLoadingTaskRunner( |
| 1157 blink::WebTaskRunner* loading_task_runner) { | 1266 blink::WebTaskRunner* loading_task_runner) { |
| 1158 // There's no guarantee on the lifetime of |loading_task_runner| so we take a | 1267 // There's no guarantee on the lifetime of |loading_task_runner| so we take a |
| 1159 // copy. | 1268 // copy. |
| 1160 context_->SetWebTaskRunner(make_scoped_ptr(loading_task_runner->clone())); | 1269 context_->SetWebTaskRunner(make_scoped_ptr(loading_task_runner->clone())); |
| 1161 } | 1270 } |
| 1162 | 1271 |
| 1163 } // namespace content | 1272 } // namespace content |
| OLD | NEW |