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