// Copyright 2013 The Chromium Authors. All rights reserved. // 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 #include "base/compiler_specific.h" #include "base/macros.h" #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" namespace content { class ResourceContext; } // 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::NSSCryptoModuleDelegate { 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(chrome::CryptoModulePasswordReason reason, const net::HostPortPair& server, crypto::ScopedPK11Slot slot); ~ChromeNSSCryptoModuleDelegate() override; // Must be called on IO thread. Creates a delegate and returns it // synchronously or asynchronously to |callback|. If the delegate could not be // created, |callback| is called with NULL. static void CreateForResourceContext( chrome::CryptoModulePasswordReason reason, const net::HostPortPair& server, content::ResourceContext* context, const base::Callback)>& callback); // crypto::NSSCryptoModuleDelegate implementation. crypto::ScopedPK11Slot RequestSlot() override; // crypto::CryptoModuleBlockingPasswordDelegate implementation. std::string RequestPassword(const std::string& slot_name, bool retry, bool* cancelled) override; private: void ShowDialog(const std::string& slot_name, bool retry); void GotPassword(const std::string& password); // Parameters displayed in the dialog. const chrome::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_; // The slot which will be returned by RequestSlot. crypto::ScopedPK11Slot slot_; DISALLOW_COPY_AND_ASSIGN(ChromeNSSCryptoModuleDelegate); }; // Create a delegate which only handles unlocking slots. crypto::CryptoModuleBlockingPasswordDelegate* CreateCryptoModuleBlockingPasswordDelegate( chrome::CryptoModulePasswordReason reason, const net::HostPortPair& server); #endif // CHROME_BROWSER_UI_CRYPTO_MODULE_DELEGATE_NSS_H_