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

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

Issue 2315443003: Stop sending serialized SSLStatus to the renderer. (Closed)
Patch Set: self review fix and merge fix Created 4 years, 3 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 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc e-loading 5 // See http://dev.chromium.org/developers/design-documents/multi-process-resourc e-loading
6 6
7 #include "content/browser/loader/resource_dispatcher_host_impl.h" 7 #include "content/browser/loader/resource_dispatcher_host_impl.h"
8 8
9 #include <stddef.h> 9 #include <stddef.h>
10 10
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 #include "content/browser/streams/stream.h" 69 #include "content/browser/streams/stream.h"
70 #include "content/browser/streams/stream_context.h" 70 #include "content/browser/streams/stream_context.h"
71 #include "content/browser/streams/stream_registry.h" 71 #include "content/browser/streams/stream_registry.h"
72 #include "content/common/navigation_params.h" 72 #include "content/common/navigation_params.h"
73 #include "content/common/net/url_request_service_worker_data.h" 73 #include "content/common/net/url_request_service_worker_data.h"
74 #include "content/common/resource_messages.h" 74 #include "content/common/resource_messages.h"
75 #include "content/common/resource_request.h" 75 #include "content/common/resource_request.h"
76 #include "content/common/resource_request_body_impl.h" 76 #include "content/common/resource_request_body_impl.h"
77 #include "content/common/resource_request_completion_status.h" 77 #include "content/common/resource_request_completion_status.h"
78 #include "content/common/site_isolation_policy.h" 78 #include "content/common/site_isolation_policy.h"
79 #include "content/common/ssl_status_serialization.h"
80 #include "content/common/view_messages.h" 79 #include "content/common/view_messages.h"
81 #include "content/public/browser/browser_thread.h" 80 #include "content/public/browser/browser_thread.h"
82 #include "content/public/browser/global_request_id.h" 81 #include "content/public/browser/global_request_id.h"
83 #include "content/public/browser/plugin_service.h" 82 #include "content/public/browser/plugin_service.h"
84 #include "content/public/browser/resource_dispatcher_host_delegate.h" 83 #include "content/public/browser/resource_dispatcher_host_delegate.h"
85 #include "content/public/browser/resource_request_details.h" 84 #include "content/public/browser/resource_request_details.h"
86 #include "content/public/browser/resource_throttle.h" 85 #include "content/public/browser/resource_throttle.h"
87 #include "content/public/browser/stream_handle.h" 86 #include "content/public/browser/stream_handle.h"
88 #include "content/public/browser/stream_info.h" 87 #include "content/public/browser/stream_info.h"
89 #include "content/public/common/browser_side_navigation_policy.h" 88 #include "content/public/common/browser_side_navigation_policy.h"
(...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 routing_ids->insert(pending_frame_host->GetGlobalFrameRoutingId()); 416 routing_ids->insert(pending_frame_host->GetGlobalFrameRoutingId());
418 } 417 }
419 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 418 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
420 base::Bind(&NotifyForRouteSetOnIO, frame_callback, 419 base::Bind(&NotifyForRouteSetOnIO, frame_callback,
421 base::Passed(std::move(routing_ids)))); 420 base::Passed(std::move(routing_ids))));
422 } 421 }
423 422
424 void UpdateSSLStatus(int render_process_id, 423 void UpdateSSLStatus(int render_process_id,
425 int render_frame_host_id, 424 int render_frame_host_id,
426 const GURL& url, 425 const GURL& url,
427 int new_cert_id) { 426 CertStore* cert_store) {
428 RenderFrameHostImpl* render_frame_host = 427 RenderFrameHostImpl* render_frame_host =
429 RenderFrameHostImpl::FromID(render_process_id, render_frame_host_id); 428 RenderFrameHostImpl::FromID(render_process_id, render_frame_host_id);
430 if (!render_frame_host) 429 if (!render_frame_host)
431 return; 430 return;
432 431
433 NavigationHandleImpl* navigation_handle = 432 NavigationHandleImpl* navigation_handle =
434 render_frame_host->navigation_handle(); 433 render_frame_host->navigation_handle();
435 if (navigation_handle && navigation_handle->GetURL() == url) 434 if (!navigation_handle || navigation_handle->GetURL() != url)
436 navigation_handle->UpdateSSLCertId(new_cert_id); 435 return;
436
437 scoped_refptr<net::X509Certificate> cert;
438 if (!cert_store->RetrieveCert(
439 navigation_handle->ssl_status().cert_id, &cert)) {
440 NOTREACHED() << "Must have set an SSL certificate already.";
441 return;
442 }
443
444 int new_cert_id = cert_store->StoreCert(cert.get(), render_process_id);
445 navigation_handle->UpdateSSLCertId(new_cert_id);
437 } 446 }
438 447
439 } // namespace 448 } // namespace
440 449
441 ResourceDispatcherHostImpl::HeaderInterceptorInfo::HeaderInterceptorInfo() {} 450 ResourceDispatcherHostImpl::HeaderInterceptorInfo::HeaderInterceptorInfo() {}
442 451
443 ResourceDispatcherHostImpl::HeaderInterceptorInfo::~HeaderInterceptorInfo() {} 452 ResourceDispatcherHostImpl::HeaderInterceptorInfo::~HeaderInterceptorInfo() {}
444 453
445 ResourceDispatcherHostImpl::HeaderInterceptorInfo::HeaderInterceptorInfo( 454 ResourceDispatcherHostImpl::HeaderInterceptorInfo::HeaderInterceptorInfo(
446 const HeaderInterceptorInfo& other) {} 455 const HeaderInterceptorInfo& other) {}
(...skipping 1852 matching lines...) Expand 10 before | Expand all | Expand 10 after
2299 2308
2300 // If enqueing/starting this request will exceed our per-process memory 2309 // If enqueing/starting this request will exceed our per-process memory
2301 // bound, abort it right away. 2310 // bound, abort it right away.
2302 OustandingRequestsStats stats = IncrementOutstandingRequestsMemory(1, *info); 2311 OustandingRequestsStats stats = IncrementOutstandingRequestsMemory(1, *info);
2303 if (stats.memory_cost > max_outstanding_requests_cost_per_process_) { 2312 if (stats.memory_cost > max_outstanding_requests_cost_per_process_) {
2304 // We call "CancelWithError()" as a way of setting the net::URLRequest's 2313 // We call "CancelWithError()" as a way of setting the net::URLRequest's
2305 // status -- it has no effect beyond this, since the request hasn't started. 2314 // status -- it has no effect beyond this, since the request hasn't started.
2306 request->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); 2315 request->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES);
2307 2316
2308 bool defer = false; 2317 bool defer = false;
2309 handler->OnResponseCompleted(request->status(), std::string(), &defer); 2318 handler->OnResponseCompleted(request->status(), &defer);
2310 if (defer) { 2319 if (defer) {
2311 // TODO(darin): The handler is not ready for us to kill the request. Oops! 2320 // TODO(darin): The handler is not ready for us to kill the request. Oops!
2312 NOTREACHED(); 2321 NOTREACHED();
2313 } 2322 }
2314 2323
2315 IncrementOutstandingRequestsMemory(-1, *info); 2324 IncrementOutstandingRequestsMemory(-1, *info);
2316 2325
2317 // A ResourceHandler must not outlive its associated URLRequest. 2326 // A ResourceHandler must not outlive its associated URLRequest.
2318 handler.reset(); 2327 handler.reset();
2319 return; 2328 return;
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
2623 load_flags |= net::LOAD_IGNORE_LIMITS; 2632 load_flags |= net::LOAD_IGNORE_LIMITS;
2624 2633
2625 return load_flags; 2634 return load_flags;
2626 } 2635 }
2627 2636
2628 void ResourceDispatcherHostImpl::UpdateResponseCertificateForTransfer( 2637 void ResourceDispatcherHostImpl::UpdateResponseCertificateForTransfer(
2629 ResourceResponse* response, 2638 ResourceResponse* response,
2630 net::URLRequest* request, 2639 net::URLRequest* request,
2631 ResourceRequestInfoImpl* info) { 2640 ResourceRequestInfoImpl* info) {
2632 const net::SSLInfo& ssl_info = request->ssl_info(); 2641 const net::SSLInfo& ssl_info = request->ssl_info();
2633 if (!ssl_info.cert) 2642 if (info->GetResourceType() != RESOURCE_TYPE_MAIN_FRAME || !ssl_info.cert)
2634 return; 2643 return;
2635 SSLStatus ssl; 2644 int render_process_id, render_frame_id;
2636 // DeserializeSecurityInfo() often takes security info sent by a 2645 if (info->GetAssociatedRenderFrame(&render_process_id, &render_frame_id)) {
2637 // renderer as input, in which case it's important to check that the 2646 BrowserThread::PostTask(BrowserThread::UI,
2638 // security info deserializes properly and kill the renderer if 2647 FROM_HERE,
2639 // not. In this case, however, the security info has been provided by 2648 base::Bind(UpdateSSLStatus,
2640 // the ResourceLoader, so it does not need to be treated as untrusted 2649 render_process_id,
2641 // data. 2650 render_frame_id,
2642 bool deserialized = 2651 request->url(),
2643 DeserializeSecurityInfo(response->head.security_info, &ssl); 2652 GetCertStore()));
2644 DCHECK(deserialized);
2645 ssl.cert_id = GetCertStore()->StoreCert(ssl_info.cert.get(),
2646 info->GetChildID());
2647 response->head.security_info = SerializeSecurityInfo(ssl);
2648
2649 if (info->GetResourceType() == RESOURCE_TYPE_MAIN_FRAME) {
2650 int render_process_id, render_frame_id;
2651 if (info->GetAssociatedRenderFrame(&render_process_id, &render_frame_id)) {
2652 BrowserThread::PostTask(BrowserThread::UI,
2653 FROM_HERE,
2654 base::Bind(UpdateSSLStatus,
2655 render_process_id,
2656 render_frame_id,
2657 request->url(),
2658 ssl.cert_id));
2659 }
2660 } 2653 }
2661 } 2654 }
2662 2655
2663 CertStore* ResourceDispatcherHostImpl::GetCertStore() { 2656 CertStore* ResourceDispatcherHostImpl::GetCertStore() {
2664 return cert_store_for_testing_ ? cert_store_for_testing_ 2657 return cert_store_for_testing_ ? cert_store_for_testing_
2665 : CertStore::GetInstance(); 2658 : CertStore::GetInstance();
2666 } 2659 }
2667 2660
2668 bool ResourceDispatcherHostImpl::ShouldServiceRequest( 2661 bool ResourceDispatcherHostImpl::ShouldServiceRequest(
2669 int process_type, 2662 int process_type,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
2737 request_info->GetRouteID(), is_content_initiated, true, &throttles); 2730 request_info->GetRouteID(), is_content_initiated, true, &throttles);
2738 if (!throttles.empty()) { 2731 if (!throttles.empty()) {
2739 handler.reset(new ThrottlingResourceHandler(std::move(handler), request, 2732 handler.reset(new ThrottlingResourceHandler(std::move(handler), request,
2740 std::move(throttles))); 2733 std::move(throttles)));
2741 } 2734 }
2742 } 2735 }
2743 return handler; 2736 return handler;
2744 } 2737 }
2745 2738
2746 } // namespace content 2739 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698