1// Copyright (c) 2011 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_PASSWORD_DIALOG_H_
6#define CHROME_BROWSER_UI_CRYPTO_MODULE_PASSWORD_DIALOG_H_
7#pragma once
8
9#include <string>
10#include <vector>
11
12#include "base/callback.h"
13#include "base/memory/ref_counted.h"
14
15namespace crypto {
16class CryptoModuleBlockingPasswordDelegate;
17}
18
19namespace net {
20class CryptoModule;
21typedef std::vector<scoped_refptr<CryptoModule> > CryptoModuleList;
22class X509Certificate;
23}
24
25namespace browser {
26
27// An enum to describe the reason for the password request.
28enum CryptoModulePasswordReason {
29  kCryptoModulePasswordKeygen,
30  kCryptoModulePasswordCertEnrollment,
31  kCryptoModulePasswordClientAuth,
32  kCryptoModulePasswordListCerts,
33  kCryptoModulePasswordCertImport,
34  kCryptoModulePasswordCertExport,
35};
36
37typedef Callback1<const char*>::Type CryptoModulePasswordCallback;
38
39// Display a dialog, prompting the user to authenticate to unlock
40// |module|. |reason| describes the purpose of the authentication and
41// affects the message displayed in the dialog. |server| is the name
42// of the server which requested the access.
43void ShowCryptoModulePasswordDialog(const std::string& module_name,
44                            bool retry,
45                            CryptoModulePasswordReason reason,
46                            const std::string& server,
47                            CryptoModulePasswordCallback* callback);
48
49// Returns a CryptoModuleBlockingPasswordDelegate to open a dialog and block
50// until returning. Should only be used on a worker thread.
51crypto::CryptoModuleBlockingPasswordDelegate*
52    NewCryptoModuleBlockingDialogDelegate(
53        CryptoModulePasswordReason reason,
54        const std::string& server);
55
56// Asynchronously unlock |modules|, if necessary.  |callback| is called when
57// done (regardless if any modules were successfully unlocked or not).  Should
58// only be called on UI thread.
59void UnlockSlotsIfNecessary(const net::CryptoModuleList& modules,
60                            browser::CryptoModulePasswordReason reason,
61                            const std::string& server,
62                            Callback0::Type* callback);
63
64// Asynchronously unlock the |cert|'s module, if necessary.  |callback| is
65// called when done (regardless if module was successfully unlocked or not).
66// Should only be called on UI thread.
67void UnlockCertSlotIfNecessary(net::X509Certificate* cert,
68                               browser::CryptoModulePasswordReason reason,
69                               const std::string& server,
70                               Callback0::Type* callback);
71
72}  // namespace browser
73
74#endif  // CHROME_BROWSER_UI_CRYPTO_MODULE_PASSWORD_DIALOG_H_
75