15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_BROWSER_SSL_SSL_POLICY_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_SSL_SSL_POLICY_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/common/resource_type.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NavigationEntryImpl; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLCertErrorHandler; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLPolicyBackend; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLRequestInfo; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContentsImpl; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SSLPolicy 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is responsible for making the security decisions that concern the 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SSL trust indicators. It relies on the SSLPolicyBackend to actually enact 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the decisions it reaches. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLPolicy { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit SSLPolicy(SSLPolicyBackend* backend); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An error occurred with the certificate in an SSL connection. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCertError(SSLCertErrorHandler* handler); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DidRunInsecureContent(NavigationEntryImpl* entry, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& security_origin); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We have started a resource request with the given info. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnRequestStarted(SSLRequestInfo* info); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the SSL information in |entry| to match the current state. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |web_contents| is the WebContentsImpl associated with this entry. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateEntry(NavigationEntryImpl* entry, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* web_contents); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLPolicyBackend* backend() const { return backend_; } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) enum OnCertErrorInternalOptionsMask { 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) OVERRIDABLE = 1 << 0, 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) STRICT_ENFORCEMENT = 1 << 1, 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPIRED_PREVIOUS_DECISION = 1 << 2 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) }; 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback that the user chose to accept or deny the certificate. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnAllowCertificate(scoped_refptr<SSLCertErrorHandler> handler, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper method for derived classes handling certificate errors. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Options should be a bitmask combination of OnCertErrorInternalOptionsMask. 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // OVERRIDABLE indicates whether or not the user could (assuming perfect 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // knowledge) successfully override the error and still get the security 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // guarantees of TLS. STRICT_ENFORCEMENT indicates whether or not the site the 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // user is trying to connect to has requested strict enforcement of 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // certificate validation (e.g. with HTTP Strict-Transport-Security). 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // EXPIRED_PREVIOUS_DECISION indicates whether a user decision had been 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // previously made but the decision has expired. 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void OnCertErrorInternal(SSLCertErrorHandler* handler, int options_mask); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the security style of |entry| has not been initialized, then initialize 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it with the default style for its URL. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void InitializeEntryIfNeeded(NavigationEntryImpl* entry); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mark |origin| as having run insecure content in the process with ID |pid|. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OriginRanInsecureContent(const std::string& origin, int pid); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The backend we use to enact our decisions. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SSLPolicyBackend* backend_; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SSLPolicy); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CONTENT_BROWSER_SSL_SSL_POLICY_H_ 85