|  | // Copyright 2013 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_ | 
|  | #define CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "base/synchronization/waitable_event.h" | 
|  | #include "chrome/browser/ui/crypto_module_password_dialog.h" | 
|  | #include "crypto/nss_crypto_module_delegate.h" | 
|  | #include "net/base/host_port_pair.h" | 
|  |  | 
|  | // Delegate to handle unlocking a slot or indicating which slot to store a key | 
|  | // in. When passing to NSS functions which take a wincx argument, use the value | 
|  | // returned from the wincx() method. | 
|  | class ChromeNSSCryptoModuleDelegate | 
|  | : public crypto::CryptoModuleBlockingPasswordDelegate { | 
|  | public: | 
|  | // Create a ChromeNSSCryptoModuleDelegate. |reason| is used to select what | 
|  | // string to show the user, |server| is displayed to indicate which connection | 
|  | // is causing the dialog to appear. |slot| can be NULL. | 
|  | ChromeNSSCryptoModuleDelegate(CryptoModulePasswordReason reason, | 
|  | const net::HostPortPair& server); | 
|  |  | 
|  | ChromeNSSCryptoModuleDelegate(const ChromeNSSCryptoModuleDelegate&) = delete; | 
|  | ChromeNSSCryptoModuleDelegate& operator=( | 
|  | const ChromeNSSCryptoModuleDelegate&) = delete; | 
|  |  | 
|  | // crypto::CryptoModuleBlockingPasswordDelegate implementation. | 
|  | std::string RequestPassword(const std::string& slot_name, | 
|  | bool retry, | 
|  | bool* cancelled) override; | 
|  |  | 
|  | private: | 
|  | friend class base::RefCountedThreadSafe<ChromeNSSCryptoModuleDelegate>; | 
|  |  | 
|  | ~ChromeNSSCryptoModuleDelegate() override; | 
|  |  | 
|  | void ShowDialog(const std::string& slot_name, bool retry); | 
|  |  | 
|  | void GotPassword(const std::string& password); | 
|  |  | 
|  | // Parameters displayed in the dialog. | 
|  | const CryptoModulePasswordReason reason_; | 
|  | net::HostPortPair server_; | 
|  |  | 
|  | // Event to block worker thread while waiting for dialog on UI thread. | 
|  | base::WaitableEvent event_; | 
|  |  | 
|  | // Stores the results from the dialog for access on worker thread. | 
|  | std::string password_; | 
|  | bool cancelled_; | 
|  | }; | 
|  |  | 
|  | // Create a delegate which only handles unlocking slots. | 
|  | crypto::CryptoModuleBlockingPasswordDelegate* | 
|  | CreateCryptoModuleBlockingPasswordDelegate(CryptoModulePasswordReason reason, | 
|  | const net::HostPortPair& server); | 
|  |  | 
|  | #endif  // CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_ |