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

Side by Side Diff: content/browser/loader/resource_loader.cc

Issue 1368863002: Set SSL info when an HTTP auth dialog is triggered by direct navigation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fill in the rest of entry->GetSSL(). Created 5 years, 2 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 unified diff | Download patch
OLDNEW
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 "content/browser/loader/resource_loader.h" 5 #include "content/browser/loader/resource_loader.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/location.h" 8 #include "base/location.h"
9 #include "base/message_loop/message_loop.h"
9 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
10 #include "base/profiler/scoped_tracker.h" 11 #include "base/profiler/scoped_tracker.h"
11 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
12 #include "base/thread_task_runner_handle.h" 13 #include "base/thread_task_runner_handle.h"
13 #include "base/time/time.h" 14 #include "base/time/time.h"
14 #include "content/browser/appcache/appcache_interceptor.h" 15 #include "content/browser/appcache/appcache_interceptor.h"
15 #include "content/browser/child_process_security_policy_impl.h" 16 #include "content/browser/child_process_security_policy_impl.h"
16 #include "content/browser/loader/cross_site_resource_handler.h" 17 #include "content/browser/loader/cross_site_resource_handler.h"
17 #include "content/browser/loader/detachable_resource_handler.h" 18 #include "content/browser/loader/detachable_resource_handler.h"
18 #include "content/browser/loader/resource_loader_delegate.h" 19 #include "content/browser/loader/resource_loader_delegate.h"
19 #include "content/browser/loader/resource_request_info_impl.h" 20 #include "content/browser/loader/resource_request_info_impl.h"
20 #include "content/browser/service_worker/service_worker_request_handler.h" 21 #include "content/browser/service_worker/service_worker_request_handler.h"
21 #include "content/browser/ssl/ssl_client_auth_handler.h" 22 #include "content/browser/ssl/ssl_client_auth_handler.h"
22 #include "content/browser/ssl/ssl_manager.h" 23 #include "content/browser/ssl/ssl_manager.h"
23 #include "content/browser/ssl/ssl_policy.h" 24 #include "content/browser/ssl/ssl_policy.h"
24 #include "content/common/ssl_status_serialization.h" 25 #include "content/common/ssl_status_serialization.h"
25 #include "content/public/browser/cert_store.h" 26 #include "content/public/browser/cert_store.h"
26 #include "content/public/browser/resource_context.h" 27 #include "content/public/browser/resource_context.h"
27 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" 28 #include "content/public/browser/resource_dispatcher_host_login_delegate.h"
28 #include "content/public/browser/signed_certificate_timestamp_store.h" 29 #include "content/public/browser/signed_certificate_timestamp_store.h"
29 #include "content/public/common/content_client.h" 30 #include "content/public/common/content_client.h"
30 #include "content/public/common/content_switches.h" 31 #include "content/public/common/content_switches.h"
31 #include "content/public/common/process_type.h" 32 #include "content/public/common/process_type.h"
32 #include "content/public/common/resource_response.h" 33 #include "content/public/common/resource_response.h"
33 #include "content/public/common/security_style.h" 34 #include "content/public/common/security_style.h"
35 #include "content/public/common/ssl_status.h"
34 #include "net/base/io_buffer.h" 36 #include "net/base/io_buffer.h"
35 #include "net/base/load_flags.h" 37 #include "net/base/load_flags.h"
36 #include "net/http/http_response_headers.h" 38 #include "net/http/http_response_headers.h"
37 #include "net/ssl/client_cert_store.h" 39 #include "net/ssl/client_cert_store.h"
38 #include "net/url_request/redirect_info.h" 40 #include "net/url_request/redirect_info.h"
39 #include "net/url_request/url_request_status.h" 41 #include "net/url_request/url_request_status.h"
40 42
41 using base::TimeDelta; 43 using base::TimeDelta;
42 using base::TimeTicks; 44 using base::TimeTicks;
43 45
44 namespace content { 46 namespace content {
45 namespace { 47 namespace {
46 48
49 // Stores the SignedCertificateTimestamps held in |sct_list| in the
50 // SignedCertificateTimestampStore singleton, associated with |process_id|.
51 // On return, |sct_ids| contains the assigned ID and verification status of
52 // each SignedCertificateTimestamp.
47 void StoreSignedCertificateTimestamps( 53 void StoreSignedCertificateTimestamps(
48 const net::SignedCertificateTimestampAndStatusList& sct_list, 54 const net::SignedCertificateTimestampAndStatusList& sct_list,
49 int process_id, 55 int process_id,
50 SignedCertificateTimestampIDStatusList* sct_ids) { 56 SignedCertificateTimestampIDStatusList* sct_ids) {
51 SignedCertificateTimestampStore* sct_store( 57 SignedCertificateTimestampStore* sct_store(
52 SignedCertificateTimestampStore::GetInstance()); 58 SignedCertificateTimestampStore::GetInstance());
53 59
54 for (auto iter = sct_list.begin(); iter != sct_list.end(); ++iter) { 60 for (const auto& sct : sct_list) {
55 const int sct_id(sct_store->Store(iter->sct.get(), process_id)); 61 const int sct_id(sct_store->Store(sct.sct.get(), process_id));
56 sct_ids->push_back( 62 sct_ids->push_back(
57 SignedCertificateTimestampIDAndStatus(sct_id, iter->status)); 63 SignedCertificateTimestampIDAndStatus(sct_id, sct.status));
58 } 64 }
59 } 65 }
60 66
61 void GetSSLStatusForRequest(const GURL& url, 67 void GetSSLStatusForRequest(const GURL& url,
62 const net::SSLInfo& ssl_info, 68 const net::SSLInfo& ssl_info,
63 int child_id, 69 int child_id,
64 SSLStatus* ssl_status) { 70 SSLStatus* ssl_status) {
65 DCHECK(ssl_info.cert); 71 DCHECK(ssl_info.cert);
66 72
67 int cert_id = 73 int cert_id =
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 void ResourceLoader::OnAuthRequired(net::URLRequest* unused, 272 void ResourceLoader::OnAuthRequired(net::URLRequest* unused,
267 net::AuthChallengeInfo* auth_info) { 273 net::AuthChallengeInfo* auth_info) {
268 DCHECK_EQ(request_.get(), unused); 274 DCHECK_EQ(request_.get(), unused);
269 275
270 ResourceRequestInfoImpl* info = GetRequestInfo(); 276 ResourceRequestInfoImpl* info = GetRequestInfo();
271 if (info->do_not_prompt_for_login()) { 277 if (info->do_not_prompt_for_login()) {
272 request_->CancelAuth(); 278 request_->CancelAuth();
273 return; 279 return;
274 } 280 }
275 281
282 // Update the SSL state before showing the auth prompt.
283 const net::SSLInfo& ssl_info = request_->response_info().ssl_info;
284 if (ssl_info.cert.get()) {
285 bool is_main_frame = (request_->load_flags() & net::LOAD_MAIN_FRAME) != 0;
286 ResourceRequestInfoImpl* info = GetRequestInfo();
287 int render_process_id;
288 int render_frame_id;
289 if (!info->GetAssociatedRenderFrame(&render_process_id, &render_frame_id))
290 CHECK(false);
291
292 SSLStatus status;
293 GetSSLStatusForRequest(request_->url(), ssl_info, render_process_id,
294 &status);
295
296 SSLManager::OnAuthDialog(render_process_id, render_frame_id, status,
297 is_main_frame);
298 } else {
299 // We should not have any SSL state.
300 DCHECK(!ssl_info.cert_status && ssl_info.security_bits == -1 &&
301 !ssl_info.connection_status);
302 }
303
276 // Create a login dialog on the UI thread to get authentication data, or pull 304 // Create a login dialog on the UI thread to get authentication data, or pull
277 // from cache and continue on the IO thread. 305 // from cache and continue on the IO thread.
278
279 DCHECK(!login_delegate_.get()) 306 DCHECK(!login_delegate_.get())
280 << "OnAuthRequired called with login_delegate pending"; 307 << "OnAuthRequired called with login_delegate pending";
281 login_delegate_ = delegate_->CreateLoginDelegate(this, auth_info); 308 login_delegate_ = delegate_->CreateLoginDelegate(this, auth_info);
282 if (!login_delegate_.get()) 309 if (!login_delegate_.get())
283 request_->CancelAuth(); 310 request_->CancelAuth();
284 } 311 }
285 312
286 void ResourceLoader::OnCertificateRequested( 313 void ResourceLoader::OnCertificateRequested(
287 net::URLRequest* unused, 314 net::URLRequest* unused,
288 net::SSLCertRequestInfo* cert_info) { 315 net::SSLCertRequestInfo* cert_info) {
(...skipping 13 matching lines...) Expand all
302 } 329 }
303 330
304 void ResourceLoader::OnSSLCertificateError(net::URLRequest* request, 331 void ResourceLoader::OnSSLCertificateError(net::URLRequest* request,
305 const net::SSLInfo& ssl_info, 332 const net::SSLInfo& ssl_info,
306 bool fatal) { 333 bool fatal) {
307 ResourceRequestInfoImpl* info = GetRequestInfo(); 334 ResourceRequestInfoImpl* info = GetRequestInfo();
308 335
309 int render_process_id; 336 int render_process_id;
310 int render_frame_id; 337 int render_frame_id;
311 if (!info->GetAssociatedRenderFrame(&render_process_id, &render_frame_id)) 338 if (!info->GetAssociatedRenderFrame(&render_process_id, &render_frame_id))
312 NOTREACHED(); 339 CHECK(false);
313 340
314 SSLManager::OnSSLCertificateError( 341 SSLManager::OnSSLCertificateError(
315 weak_ptr_factory_.GetWeakPtr(), 342 weak_ptr_factory_.GetWeakPtr(),
316 info->GetResourceType(), 343 info->GetResourceType(),
317 request_->url(), 344 request_->url(),
318 render_process_id, 345 render_process_id,
319 render_frame_id, 346 render_frame_id,
320 ssl_info, 347 ssl_info,
321 fatal); 348 fatal);
322 } 349 }
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 } else { 542 } else {
516 times_cancelled_after_request_start_++; 543 times_cancelled_after_request_start_++;
517 } 544 }
518 545
519 request_->CancelWithError(error); 546 request_->CancelWithError(error);
520 547
521 if (!was_pending) { 548 if (!was_pending) {
522 // If the request isn't in flight, then we won't get an asynchronous 549 // If the request isn't in flight, then we won't get an asynchronous
523 // notification from the request, so we have to signal ourselves to finish 550 // notification from the request, so we have to signal ourselves to finish
524 // this request. 551 // this request.
525 base::ThreadTaskRunnerHandle::Get()->PostTask( 552 base::MessageLoop::current()->PostTask(
526 FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted, 553 FROM_HERE, base::Bind(&ResourceLoader::ResponseCompleted,
527 weak_ptr_factory_.GetWeakPtr())); 554 weak_ptr_factory_.GetWeakPtr()));
528 } 555 }
529 } 556 }
530 557
531 void ResourceLoader::CompleteResponseStarted() { 558 void ResourceLoader::CompleteResponseStarted() {
532 ResourceRequestInfoImpl* info = GetRequestInfo(); 559 ResourceRequestInfoImpl* info = GetRequestInfo();
533 scoped_refptr<ResourceResponse> response(new ResourceResponse()); 560 scoped_refptr<ResourceResponse> response(new ResourceResponse());
534 PopulateResourceResponse(info, request_.get(), response.get()); 561 PopulateResourceResponse(info, request_.get(), response.get());
535 562
563 if (request_->ssl_info().cert.get()) {
564 // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
565 tracked_objects::ScopedTracker tracking_profile3(
566 FROM_HERE_WITH_EXPLICIT_FUNCTION(
567 "423948 ResourceLoader::CompleteResponseStarted3"));
568
569 SSLStatus status;
570 GetSSLStatusForRequest(request_->url(), request_->ssl_info(),
571 info->GetChildID(), &status);
572 response->head.security_info = SerializeSecurityInfo(status);
573 } else {
574 // We should not have any SSL state.
575 DCHECK(!request_->ssl_info().cert_status &&
576 request_->ssl_info().security_bits == -1 &&
577 !request_->ssl_info().connection_status);
578 }
579
580 // TODO(vadimt): Remove ScopedTracker below once crbug.com/423948 is fixed.
581 tracked_objects::ScopedTracker tracking_profile5(
582 FROM_HERE_WITH_EXPLICIT_FUNCTION(
583 "423948 ResourceLoader::CompleteResponseStarted5"));
584
536 delegate_->DidReceiveResponse(this); 585 delegate_->DidReceiveResponse(this);
537 586
538 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. 587 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed.
539 tracked_objects::ScopedTracker tracking_profile( 588 tracked_objects::ScopedTracker tracking_profile(
540 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()")); 589 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseStarted()"));
541 590
542 bool defer = false; 591 bool defer = false;
543 if (!handler_->OnResponseStarted(response.get(), &defer)) { 592 if (!handler_->OnResponseStarted(response.get(), &defer)) {
544 Cancel(); 593 Cancel();
545 } else if (defer) { 594 } else if (defer) {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 } 683 }
635 684
636 void ResourceLoader::ResponseCompleted() { 685 void ResourceLoader::ResponseCompleted() {
637 DVLOG(1) << "ResponseCompleted: " << request_->url().spec(); 686 DVLOG(1) << "ResponseCompleted: " << request_->url().spec();
638 RecordHistograms(); 687 RecordHistograms();
639 ResourceRequestInfoImpl* info = GetRequestInfo(); 688 ResourceRequestInfoImpl* info = GetRequestInfo();
640 689
641 std::string security_info; 690 std::string security_info;
642 const net::SSLInfo& ssl_info = request_->ssl_info(); 691 const net::SSLInfo& ssl_info = request_->ssl_info();
643 if (ssl_info.cert.get() != NULL) { 692 if (ssl_info.cert.get() != NULL) {
644 SSLStatus ssl_status; 693 SSLStatus status;
645 GetSSLStatusForRequest(request_->url(), ssl_info, info->GetChildID(), 694 GetSSLStatusForRequest(request_->url(), ssl_info, info->GetChildID(),
646 &ssl_status); 695 &status);
647 696 security_info = SerializeSecurityInfo(status);
648 security_info = SerializeSecurityInfo(ssl_status);
649 } 697 }
650 698
651 bool defer = false; 699 bool defer = false;
652 { 700 {
653 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed. 701 // TODO(darin): Remove ScopedTracker below once crbug.com/475761 is fixed.
654 tracked_objects::ScopedTracker tracking_profile( 702 tracked_objects::ScopedTracker tracking_profile(
655 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseCompleted()")); 703 FROM_HERE_WITH_EXPLICIT_FUNCTION("475761 OnResponseCompleted()"));
656 704
657 handler_->OnResponseCompleted(request_->status(), security_info, &defer); 705 handler_->OnResponseCompleted(request_->status(), security_info, &defer);
658 } 706 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 case net::URLRequestStatus::FAILED: 745 case net::URLRequestStatus::FAILED:
698 status = STATUS_UNDEFINED; 746 status = STATUS_UNDEFINED;
699 break; 747 break;
700 } 748 }
701 749
702 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX); 750 UMA_HISTOGRAM_ENUMERATION("Net.Prefetch.Pattern", status, STATUS_MAX);
703 } 751 }
704 } 752 }
705 753
706 } // namespace content 754 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698