Home | History | Annotate | Download | only in ui
      1 // Copyright 2013 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 CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_
      6 #define CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_
      7 
      8 #include <string>
      9 
     10 #include "base/compiler_specific.h"
     11 #include "base/synchronization/waitable_event.h"
     12 #include "chrome/browser/ui/crypto_module_password_dialog.h"
     13 #include "crypto/nss_crypto_module_delegate.h"
     14 #include "net/base/host_port_pair.h"
     15 
     16 namespace content {
     17 class ResourceContext;
     18 }
     19 
     20 // Delegate to handle unlocking a slot or indicating which slot to store a key
     21 // in. When passing to NSS functions which take a wincx argument, use the value
     22 // returned from the wincx() method.
     23 class ChromeNSSCryptoModuleDelegate
     24     : public crypto::NSSCryptoModuleDelegate {
     25  public:
     26   // Create a ChromeNSSCryptoModuleDelegate. |reason| is used to select what
     27   // string to show the user, |server| is displayed to indicate which connection
     28   // is causing the dialog to appear.
     29   ChromeNSSCryptoModuleDelegate(chrome::CryptoModulePasswordReason reason,
     30                                 const net::HostPortPair& server);
     31 
     32   virtual ~ChromeNSSCryptoModuleDelegate();
     33 
     34   // Must be called on IO thread. Returns true if the delegate is ready for use.
     35   // Otherwise, if |initialization_complete_callback| is non-null, the
     36   // initialization will proceed asynchronously and the callback will be run
     37   // once the delegate is ready to use. In that case, the caller must ensure the
     38   // delegate remains alive until the callback is run.
     39   bool InitializeSlot(content::ResourceContext* context,
     40                       const base::Closure& initialization_complete_callback)
     41       WARN_UNUSED_RESULT;
     42 
     43   // crypto::NSSCryptoModuleDelegate implementation.
     44   virtual crypto::ScopedPK11Slot RequestSlot() OVERRIDE;
     45 
     46   // crypto::CryptoModuleBlockingPasswordDelegate implementation.
     47   virtual std::string RequestPassword(const std::string& slot_name,
     48                                       bool retry,
     49                                       bool* cancelled) OVERRIDE;
     50 
     51  private:
     52   void ShowDialog(const std::string& slot_name, bool retry);
     53 
     54   void GotPassword(const std::string& password);
     55 
     56   void DidGetSlot(const base::Closure& callback, crypto::ScopedPK11Slot slot);
     57 
     58   // Parameters displayed in the dialog.
     59   const chrome::CryptoModulePasswordReason reason_;
     60   net::HostPortPair server_;
     61 
     62   // Event to block worker thread while waiting for dialog on UI thread.
     63   base::WaitableEvent event_;
     64 
     65   // Stores the results from the dialog for access on worker thread.
     66   std::string password_;
     67   bool cancelled_;
     68 
     69   // The slot which will be returned by RequestSlot.
     70   crypto::ScopedPK11Slot slot_;
     71 
     72   DISALLOW_COPY_AND_ASSIGN(ChromeNSSCryptoModuleDelegate);
     73 };
     74 
     75 // Create a delegate which only handles unlocking slots.
     76 crypto::CryptoModuleBlockingPasswordDelegate*
     77     CreateCryptoModuleBlockingPasswordDelegate(
     78         chrome::CryptoModulePasswordReason reason,
     79         const net::HostPortPair& server);
     80 
     81 #endif  // CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_
     82