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_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_SSL_SSL_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/ssl/ssl_error_handler.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/browser/ssl/ssl_policy_backend.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/global_request_id.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/cert/cert_status_flags.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLInfo;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrowserContext;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NavigationEntryImpl;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NavigationControllerImpl;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SSLPolicy;
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)struct LoadCommittedDetails;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LoadFromMemoryCacheDetails;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResourceRedirectDetails;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ResourceRequestDetails;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The SSLManager SSLManager controls the SSL UI elements in a WebContents.  It
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// listens for various events that influence when these elements should or
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should not be displayed and adjusts them accordingly.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There is one SSLManager per tab.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The security state (secure/insecure) is stored in the navigation entry.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Along with it are stored any SSL error code and the associated cert.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class SSLManager {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Entry point for SSLCertificateErrors.  This function begins the process
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of resolving a certificate error during an SSL connection.  SSLManager
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will adjust the security UI and either call |CancelSSLRequest| or
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |ContinueSSLRequest| of |delegate| with |id| as the first argument.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called on the IO thread.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void OnSSLCertificateError(
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::WeakPtr<SSLErrorHandler::Delegate>& delegate,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GlobalRequestID& id,
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ResourceType resource_type,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GURL& url,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int render_process_id,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      int render_frame_id,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const net::SSLInfo& ssl_info,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool fatal);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when SSL state for a host or tab changes.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void NotifySSLInternalStateChanged(BrowserContext* context);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Construct an SSLManager for the specified tab.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |delegate| is NULL, SSLPolicy::GetDefaultPolicy() is used.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit SSLManager(NavigationControllerImpl* controller);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SSLManager();
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLPolicy* policy() { return policy_.get(); }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLPolicyBackend* backend() { return &backend_; }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The navigation controller associated with this SSLManager.  The
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NavigationController is guaranteed to outlive the SSLManager.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationControllerImpl* controller() { return controller_; }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DidCommitProvisionalLoad(const LoadCommittedDetails& details);
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DidLoadFromMemoryCache(const LoadFromMemoryCacheDetails& details);
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DidStartResourceResponse(const ResourceRequestDetails& details);
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DidReceiveResourceRedirect(const ResourceRedirectDetails& details);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insecure content entry point.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DidDisplayInsecureContent();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DidRunInsecureContent(const std::string& security_origin);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the NavigationEntry with our current state.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateEntry(NavigationEntryImpl* entry);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The backend for the SSLPolicy to actuate its decisions.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SSLPolicyBackend backend_;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The SSLPolicy instance for this manager.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<SSLPolicy> policy_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The NavigationController that owns this SSLManager.  We are responsible
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the security UI of this tab.
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NavigationControllerImpl* controller_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SSLManager);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_SSL_SSL_MANAGER_H_
105