Home | History | Annotate | Download | only in ssl
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_BROWSER_SSL_SSL_CLIENT_AUTH_HANDLER_H_
      6 #define CONTENT_BROWSER_SSL_SSL_CLIENT_AUTH_HANDLER_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/ref_counted.h"
     10 #include "base/sequenced_task_runner_helpers.h"
     11 #include "content/common/content_export.h"
     12 #include "content/public/browser/browser_thread.h"
     13 #include "net/ssl/ssl_cert_request_info.h"
     14 
     15 namespace net {
     16 class HttpNetworkSession;
     17 class URLRequest;
     18 class X509Certificate;
     19 }  // namespace net
     20 
     21 namespace content {
     22 
     23 // This class handles the approval and selection of a certificate for SSL client
     24 // authentication by the user.
     25 // It is self-owned and deletes itself when the UI reports the user selection or
     26 // when the net::URLRequest is cancelled.
     27 class CONTENT_EXPORT SSLClientAuthHandler
     28     : public base::RefCountedThreadSafe<
     29           SSLClientAuthHandler, BrowserThread::DeleteOnIOThread> {
     30  public:
     31   SSLClientAuthHandler(net::URLRequest* request,
     32                        net::SSLCertRequestInfo* cert_request_info);
     33 
     34   // Selects a certificate and resumes the URL request with that certificate.
     35   // Should only be called on the IO thread.
     36   void SelectCertificate();
     37 
     38   // Invoked when the request associated with this handler is cancelled.
     39   // Should only be called on the IO thread.
     40   void OnRequestCancelled();
     41 
     42   // Calls DoCertificateSelected on the I/O thread.
     43   // Called on the UI thread after the user has made a selection (which may
     44   // be long after DoSelectCertificate returns, if the UI is modeless/async.)
     45   void CertificateSelected(net::X509Certificate* cert);
     46 
     47  protected:
     48   virtual ~SSLClientAuthHandler();
     49 
     50  private:
     51   friend class base::RefCountedThreadSafe<
     52       SSLClientAuthHandler, BrowserThread::DeleteOnIOThread>;
     53   friend class BrowserThread;
     54   friend class base::DeleteHelper<SSLClientAuthHandler>;
     55 
     56   // Notifies that the user has selected a cert.
     57   // Called on the IO thread.
     58   void DoCertificateSelected(net::X509Certificate* cert);
     59 
     60   // Selects a client certificate on the UI thread.
     61   void DoSelectCertificate(int render_process_host_id,
     62                            int render_view_host_id);
     63 
     64   // The net::URLRequest that triggered this client auth.
     65   net::URLRequest* request_;
     66 
     67   // The HttpNetworkSession |request_| is associated with.
     68   const net::HttpNetworkSession* http_network_session_;
     69 
     70   // The certs to choose from.
     71   scoped_refptr<net::SSLCertRequestInfo> cert_request_info_;
     72 
     73   DISALLOW_COPY_AND_ASSIGN(SSLClientAuthHandler);
     74 };
     75 
     76 }  // namespace content
     77 
     78 #endif  // CONTENT_BROWSER_SSL_SSL_CLIENT_AUTH_HANDLER_H_
     79