diff options
Diffstat (limited to 'chrome/browser/ssl')
-rw-r--r-- | chrome/browser/ssl/ssl_host_state.cc | 9 | ||||
-rw-r--r-- | chrome/browser/ssl/ssl_host_state.h | 16 | ||||
-rw-r--r-- | chrome/browser/ssl/ssl_manager.cc | 11 | ||||
-rw-r--r-- | chrome/browser/ssl/ssl_manager.h | 16 | ||||
-rw-r--r-- | chrome/browser/ssl/ssl_policy.cc | 17 | ||||
-rw-r--r-- | chrome/browser/ssl/ssl_uitest.cc | 11 |
6 files changed, 50 insertions, 30 deletions
diff --git a/chrome/browser/ssl/ssl_host_state.cc b/chrome/browser/ssl/ssl_host_state.cc index f8a063b..62bcb94 100644 --- a/chrome/browser/ssl/ssl_host_state.cc +++ b/chrome/browser/ssl/ssl_host_state.cc @@ -23,13 +23,13 @@ SSLHostState::SSLHostState() { SSLHostState::~SSLHostState() { } -void SSLHostState::MarkHostAsBroken(const std::string& host) { +void SSLHostState::MarkHostAsBroken(const std::string& host, int pid) { DCHECK(CalledOnValidThread()); - broken_hosts_.insert(host); + broken_hosts_.insert(BrokenHostEntry(host, pid)); } -bool SSLHostState::DidMarkHostAsBroken(const std::string& host) { +bool SSLHostState::DidMarkHostAsBroken(const std::string& host, int pid) { DCHECK(CalledOnValidThread()); // CAs issue certificate for intranet hosts to everyone. Therefore, we always @@ -37,7 +37,8 @@ bool SSLHostState::DidMarkHostAsBroken(const std::string& host) { if (IsIntranetHost(host)) return true; - return (broken_hosts_.find(host) != broken_hosts_.end()); + return (broken_hosts_.find( + BrokenHostEntry(host, pid)) != broken_hosts_.end()); } void SSLHostState::DenyCertForHost(net::X509Certificate* cert, diff --git a/chrome/browser/ssl/ssl_host_state.h b/chrome/browser/ssl/ssl_host_state.h index f66e9bc..a5018c7 100644 --- a/chrome/browser/ssl/ssl_host_state.h +++ b/chrome/browser/ssl/ssl_host_state.h @@ -27,13 +27,14 @@ class SSLHostState : public NonThreadSafe { SSLHostState(); ~SSLHostState(); - // Records that a host is "broken," that is, the origin for that host has been - // contaminated with insecure content, either via HTTP or via HTTPS with a - // bad certificate. - void MarkHostAsBroken(const std::string& host); + // Records that a host is "broken" in a particular render process. That is, + // the origin for that host has been contaminated with insecure content, + // either via HTTP or via HTTPS with a bad certificate. + void MarkHostAsBroken(const std::string& host, int pid); - // Returns whether the specified host was marked as broken. - bool DidMarkHostAsBroken(const std::string& host); + // Returns whether the specified host was marked as broken in a particular + // render process. + bool DidMarkHostAsBroken(const std::string& host, int pid); // Records that |cert| is permitted to be used for |host| in the future. void DenyCertForHost(net::X509Certificate* cert, const std::string& host); @@ -52,8 +53,9 @@ class SSLHostState : public NonThreadSafe { bool DidAllowMixedContentForHost(const std::string& host); private: + typedef std::pair<std::string, int> BrokenHostEntry; // Hosts which have been contaminated with unsafe content. - std::set<std::string> broken_hosts_; + std::set<BrokenHostEntry> broken_hosts_; // Certificate policies for each host. std::map<std::string, net::X509Certificate::Policy> cert_policy_for_host_; diff --git a/chrome/browser/ssl/ssl_manager.cc b/chrome/browser/ssl/ssl_manager.cc index 9d8da4b..0510810 100644 --- a/chrome/browser/ssl/ssl_manager.cc +++ b/chrome/browser/ssl/ssl_manager.cc @@ -182,14 +182,14 @@ void SSLManager::AddMessageToConsole(const string16& message, } // Delegate API method. -void SSLManager::MarkHostAsBroken(const std::string& host) { - ssl_host_state_->MarkHostAsBroken(host); +void SSLManager::MarkHostAsBroken(const std::string& host, int pid) { + ssl_host_state_->MarkHostAsBroken(host, pid); DispatchSSLInternalStateChanged(); } // Delegate API method. -bool SSLManager::DidMarkHostAsBroken(const std::string& host) const { - return ssl_host_state_->DidMarkHostAsBroken(host); +bool SSLManager::DidMarkHostAsBroken(const std::string& host, int pid) const { + return ssl_host_state_->DidMarkHostAsBroken(host, pid); } // Delegate API method. @@ -504,6 +504,7 @@ bool SSLManager::ShouldStartRequest(ResourceDispatcherHost* rdh, info->resource_type, info->frame_origin, info->main_frame_origin, + info->process_id, ui_loop), &MixedContentHandler::Dispatch)); return false; @@ -588,6 +589,7 @@ void SSLManager::DidLoadFromMemoryCache(LoadFromMemoryCacheDetails* details) { details->frame_origin(), details->main_frame_origin(), FilterPolicy::DONT_FILTER, + details->pid(), details->ssl_cert_id(), details->ssl_cert_status()); @@ -651,6 +653,7 @@ void SSLManager::DidStartResourceResponse(ResourceRequestDetails* details) { details->frame_origin(), details->main_frame_origin(), details->filter_policy(), + details->origin_pid(), details->ssl_cert_id(), details->ssl_cert_status()); diff --git a/chrome/browser/ssl/ssl_manager.h b/chrome/browser/ssl/ssl_manager.h index 57a6d63..5e6e77d 100644 --- a/chrome/browser/ssl/ssl_manager.h +++ b/chrome/browser/ssl/ssl_manager.h @@ -248,15 +248,21 @@ class SSLManager : public NotificationObserver { ResourceType::Type resource_type, const std::string& frame_origin, const std::string& main_frame_origin, + int pid, MessageLoop* ui_loop) : ErrorHandler(rdh, request, resource_type, frame_origin, - main_frame_origin, ui_loop) { } + main_frame_origin, ui_loop), + pid_(pid) {} + + int pid() const { return pid_; } protected: virtual void OnDispatchFailed() { TakeNoAction(); } virtual void OnDispatched() { manager()->OnMixedContent(this); } private: + int pid_; + DISALLOW_COPY_AND_ASSIGN(MixedContentHandler); }; @@ -271,6 +277,7 @@ class SSLManager : public NotificationObserver { const std::string& frame_origin, const std::string& main_frame_origin, FilterPolicy::Type filter_policy, + int pid, int ssl_cert_id, int ssl_cert_status) : manager_(manager), @@ -279,6 +286,7 @@ class SSLManager : public NotificationObserver { frame_origin_(frame_origin), main_frame_origin_(main_frame_origin), filter_policy_(filter_policy), + pid_(pid), ssl_cert_id_(ssl_cert_id), ssl_cert_status_(ssl_cert_status) { } @@ -289,6 +297,7 @@ class SSLManager : public NotificationObserver { const std::string& frame_origin() const { return frame_origin_; } const std::string& main_frame_origin() const { return main_frame_origin_; } FilterPolicy::Type filter_policy() const { return filter_policy_; } + int pid() const { return pid_; } int ssl_cert_id() const { return ssl_cert_id_; } int ssl_cert_status() const { return ssl_cert_status_; } @@ -299,6 +308,7 @@ class SSLManager : public NotificationObserver { std::string frame_origin_; std::string main_frame_origin_; FilterPolicy::Type filter_policy_; + int pid_; int ssl_cert_id_; int ssl_cert_status_; @@ -358,10 +368,10 @@ class SSLManager : public NotificationObserver { // Records that a host is "broken," that is, the origin for that host has been // contaminated with insecure content, either via HTTP or via HTTPS with a // bad certificate. - void MarkHostAsBroken(const std::string& host); + void MarkHostAsBroken(const std::string& host, int pid); // Returns whether the specified host was marked as broken. - bool DidMarkHostAsBroken(const std::string& host) const; + bool DidMarkHostAsBroken(const std::string& host, int pid) const; // Sets the maximum security style for the page. If the current security // style is lower than |style|, this will not have an effect on the security diff --git a/chrome/browser/ssl/ssl_policy.cc b/chrome/browser/ssl/ssl_policy.cc index 829af05..6785eec 100644 --- a/chrome/browser/ssl/ssl_policy.cc +++ b/chrome/browser/ssl/ssl_policy.cc @@ -33,12 +33,14 @@ using WebKit::WebConsoleMessage; // Wrap all these helper classes in an anonymous namespace. namespace { -static void MarkOriginAsBroken(SSLManager* manager, const std::string& origin) { +static void MarkOriginAsBroken(SSLManager* manager, + const std::string& origin, + int pid) { GURL parsed_origin(origin); if (!parsed_origin.SchemeIsSecure()) return; - manager->MarkHostAsBroken(parsed_origin.host()); + manager->MarkHostAsBroken(parsed_origin.host(), pid); } static void AllowMixedContentForOrigin(SSLManager* manager, @@ -54,19 +56,19 @@ static void UpdateStateForMixedContent(SSLManager::RequestInfo* info) { if (info->resource_type() != ResourceType::MAIN_FRAME || info->resource_type() != ResourceType::SUB_FRAME) { // The frame's origin now contains mixed content and therefore is broken. - MarkOriginAsBroken(info->manager(), info->frame_origin()); + MarkOriginAsBroken(info->manager(), info->frame_origin(), info->pid()); } if (info->resource_type() != ResourceType::MAIN_FRAME) { // The main frame now contains a frame with mixed content. Therefore, we // mark the main frame's origin as broken too. - MarkOriginAsBroken(info->manager(), info->main_frame_origin()); + MarkOriginAsBroken(info->manager(), info->main_frame_origin(), info->pid()); } } static void UpdateStateForUnsafeContent(SSLManager::RequestInfo* info) { // This request as a broken cert, which means its host is broken. - info->manager()->MarkHostAsBroken(info->url().host()); + info->manager()->MarkHostAsBroken(info->url().host(), info->pid()); UpdateStateForMixedContent(info); } @@ -223,7 +225,7 @@ void SSLPolicy::OnMixedContent(SSLManager::MixedContentHandler* handler) { // If the user has added an exception, doctor the |filter_policy|. std::string host = GURL(handler->main_frame_origin()).host(); if (handler->manager()->DidAllowMixedContentForHost(host) || - handler->manager()->DidMarkHostAsBroken(host)) + handler->manager()->DidMarkHostAsBroken(host, handler->pid())) filter_policy = FilterPolicy::DONT_FILTER; if (filter_policy != FilterPolicy::DONT_FILTER) { @@ -269,7 +271,8 @@ void SSLPolicy::UpdateEntry(SSLManager* manager, NavigationEntry* entry) { return; } - if (manager->DidMarkHostAsBroken(entry->url().host())) + if (manager->DidMarkHostAsBroken(entry->url().host(), + entry->site_instance()->GetProcess()->pid())) entry->ssl().set_has_mixed_content(); } diff --git a/chrome/browser/ssl/ssl_uitest.cc b/chrome/browser/ssl/ssl_uitest.cc index 5275b92..02d5d23 100644 --- a/chrome/browser/ssl/ssl_uitest.cc +++ b/chrome/browser/ssl/ssl_uitest.cc @@ -424,8 +424,9 @@ TEST_F(SSLUITest, TestMixedContentsLoadedFromJS) { } // Visits two pages from the same origin: one with mixed content and one -// without. The test checks that we propagate the mixed content state from one -// to the other. +// without. The test checks that we don't propagate the mixed content state +// from one process to another process. This test is expected to fail in +// single process mode. TEST_F(SSLUITest, TestMixedContentsTwoTabs) { scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); scoped_refptr<HTTPTestServer> http_server = PlainServer(); @@ -465,13 +466,13 @@ TEST_F(SSLUITest, TestMixedContentsTwoTabs) { EXPECT_EQ(0, cert_status & net::CERT_STATUS_ALL_ERRORS); EXPECT_EQ(NavigationEntry::SSLStatus::MIXED_CONTENT, mixed_content_state); - // Which means the origin for the first tab has also been contaminated with - // mixed content. + // The origin for the first tab has not been contaminated with + // mixed content because its in a separate process. EXPECT_TRUE(tab1->GetSecurityState(&security_style, &cert_status, &mixed_content_state)); EXPECT_EQ(SECURITY_STYLE_AUTHENTICATED, security_style); EXPECT_EQ(0, cert_status & net::CERT_STATUS_ALL_ERRORS); - EXPECT_EQ(NavigationEntry::SSLStatus::MIXED_CONTENT, mixed_content_state); + EXPECT_EQ(NavigationEntry::SSLStatus::NORMAL_CONTENT, mixed_content_state); } // Visits a page with an image over http. Visits another page over https |