ssl_client_auth_handler.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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
15namespace net {
16class ClientCertStore;
17class HttpNetworkSession;
18class URLRequest;
19class X509Certificate;
20}  // namespace net
21
22namespace content {
23
24class ResourceContext;
25
26// This class handles the approval and selection of a certificate for SSL client
27// authentication by the user.
28// It is self-owned and deletes itself when the UI reports the user selection or
29// when the net::URLRequest is cancelled.
30class CONTENT_EXPORT SSLClientAuthHandler
31    : public base::RefCountedThreadSafe<
32          SSLClientAuthHandler, BrowserThread::DeleteOnIOThread> {
33 public:
34  SSLClientAuthHandler(scoped_ptr<net::ClientCertStore> client_cert_store,
35                       net::URLRequest* request,
36                       net::SSLCertRequestInfo* cert_request_info);
37
38  // Selects a certificate and resumes the URL request with that certificate.
39  // Should only be called on the IO thread.
40  void SelectCertificate();
41
42  // Invoked when the request associated with this handler is cancelled.
43  // Should only be called on the IO thread.
44  void OnRequestCancelled();
45
46  // Calls DoCertificateSelected on the I/O thread.
47  // Called on the UI thread after the user has made a selection (which may
48  // be long after DoSelectCertificate returns, if the UI is modeless/async.)
49  void CertificateSelected(net::X509Certificate* cert);
50
51 protected:
52  virtual ~SSLClientAuthHandler();
53
54 private:
55  friend class base::RefCountedThreadSafe<
56      SSLClientAuthHandler, BrowserThread::DeleteOnIOThread>;
57  friend class BrowserThread;
58  friend class base::DeleteHelper<SSLClientAuthHandler>;
59
60  // Called when ClientCertStore is done retrieving the cert list.
61  void DidGetClientCerts();
62
63  // Notifies that the user has selected a cert.
64  // Called on the IO thread.
65  void DoCertificateSelected(net::X509Certificate* cert);
66
67  // Selects a client certificate on the UI thread.
68  void DoSelectCertificate(int render_process_host_id,
69                           int render_frame_host_id);
70
71  // The net::URLRequest that triggered this client auth.
72  net::URLRequest* request_;
73
74  // The HttpNetworkSession |request_| is associated with.
75  const net::HttpNetworkSession* http_network_session_;
76
77  // The certs to choose from.
78  scoped_refptr<net::SSLCertRequestInfo> cert_request_info_;
79
80  scoped_ptr<net::ClientCertStore> client_cert_store_;
81
82  DISALLOW_COPY_AND_ASSIGN(SSLClientAuthHandler);
83};
84
85}  // namespace content
86
87#endif  // CONTENT_BROWSER_SSL_SSL_CLIENT_AUTH_HANDLER_H_
88