// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/browser/devtools/protocol/security_handler.h" #include #include "content/browser/devtools/protocol/devtools_protocol_dispatcher.h" #include "content/public/browser/security_style_explanations.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_delegate.h" namespace content { namespace devtools { namespace security { typedef DevToolsProtocolClient::Response Response; namespace { std::string SecurityStyleToProtocolSecurityState( SecurityStyle security_style) { switch (security_style) { case SECURITY_STYLE_UNKNOWN: return kSecurityStateUnknown; case SECURITY_STYLE_UNAUTHENTICATED: return kSecurityStateNeutral; case SECURITY_STYLE_AUTHENTICATION_BROKEN: return kSecurityStateInsecure; case SECURITY_STYLE_WARNING: return kSecurityStateWarning; case SECURITY_STYLE_AUTHENTICATED: return kSecurityStateSecure; default: NOTREACHED(); return kSecurityStateUnknown; } } void AddExplanations( const std::string& security_style, const std::vector& explanations_to_add, std::vector>* explanations) { for (const auto& it : explanations_to_add) { scoped_refptr explanation = SecurityStateExplanation::Create()->set_security_state(security_style) ->set_summary(it.summary) ->set_description(it.description); if (it.cert_id > 0) explanation->set_certificate_id(it.cert_id); explanations->push_back(explanation); } } } // namespace SecurityHandler::SecurityHandler() : enabled_(false), host_(nullptr) { } SecurityHandler::~SecurityHandler() { } void SecurityHandler::SetClient(scoped_ptr client) { client_.swap(client); } void SecurityHandler::AttachToRenderFrameHost() { DCHECK(host_); WebContents* web_contents = WebContents::FromRenderFrameHost(host_); WebContentsObserver::Observe(web_contents); // Send an initial SecurityStyleChanged event. DCHECK(enabled_); SecurityStyleExplanations security_style_explanations; SecurityStyle security_style = web_contents->GetDelegate()->GetSecurityStyle( web_contents, &security_style_explanations); SecurityStyleChanged(security_style, security_style_explanations); } void SecurityHandler::SetRenderFrameHost(RenderFrameHost* host) { host_ = host; if (enabled_ && host_) AttachToRenderFrameHost(); } void SecurityHandler::SecurityStyleChanged( SecurityStyle security_style, const SecurityStyleExplanations& security_style_explanations) { DCHECK(enabled_); const std::string security_state = SecurityStyleToProtocolSecurityState(security_style); std::vector> explanations; AddExplanations(kSecurityStateInsecure, security_style_explanations.broken_explanations, &explanations); AddExplanations(kSecurityStateNeutral, security_style_explanations.unauthenticated_explanations, &explanations); AddExplanations(kSecurityStateSecure, security_style_explanations.secure_explanations, &explanations); scoped_refptr mixed_content_status = MixedContentStatus::Create() ->set_ran_insecure_content( security_style_explanations.ran_insecure_content) ->set_displayed_insecure_content( security_style_explanations.displayed_insecure_content) ->set_ran_insecure_content_style(SecurityStyleToProtocolSecurityState( security_style_explanations.ran_insecure_content_style)) ->set_displayed_insecure_content_style( SecurityStyleToProtocolSecurityState( security_style_explanations .displayed_insecure_content_style)); client_->SecurityStateChanged( SecurityStateChangedParams::Create() ->set_security_state(security_state) ->set_scheme_is_cryptographic( security_style_explanations.scheme_is_cryptographic) ->set_mixed_content_status(mixed_content_status) ->set_explanations(explanations)); } Response SecurityHandler::Enable() { enabled_ = true; if (host_) AttachToRenderFrameHost(); return Response::OK(); } Response SecurityHandler::Disable() { enabled_ = false; WebContentsObserver::Observe(nullptr); return Response::OK(); } } // namespace security } // namespace devtools } // namespace content