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.
5 #include "chrome/browser/ui/crypto_module_password_dialog.h"
9 #include "base/basictypes.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/ui/gtk/gtk_util.h"
12 #include "crypto/crypto_module_blocking_password_delegate.h"
13 #include "grit/generated_resources.h"
14 #include "ui/base/gtk/gtk_hig_constants.h"
15 #include "ui/base/gtk/gtk_signal.h"
16 #include "ui/base/l10n/l10n_util.h"
21 // TODO(mattm): change into a constrained dialog.
22 class CryptoModulePasswordDialog {
24 CryptoModulePasswordDialog(
25 const std::string& slot_name,
27 chrome::CryptoModulePasswordReason reason,
28 const std::string& server,
29 const chrome::CryptoModulePasswordCallback& callback);
31 ~CryptoModulePasswordDialog() {}
36 CHROMEGTK_CALLBACK_1(CryptoModulePasswordDialog, void, OnResponse, int);
37 CHROMEGTK_CALLBACK_0(CryptoModulePasswordDialog, void, OnWindowDestroy);
39 chrome::CryptoModulePasswordCallback callback_;
42 GtkWidget* password_entry_;
44 DISALLOW_COPY_AND_ASSIGN(CryptoModulePasswordDialog);
47 CryptoModulePasswordDialog::CryptoModulePasswordDialog(
48 const std::string& slot_name,
50 chrome::CryptoModulePasswordReason reason,
51 const std::string& server,
52 const chrome::CryptoModulePasswordCallback& callback)
53 : callback_(callback) {
54 dialog_ = gtk_dialog_new_with_buttons(
55 l10n_util::GetStringUTF8(IDS_CRYPTO_MODULE_AUTH_DIALOG_TITLE).c_str(),
57 GTK_DIALOG_NO_SEPARATOR,
58 NULL); // Populate the buttons later, for control over the OK button.
59 gtk_dialog_add_button(GTK_DIALOG(dialog_),
60 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
61 GtkWidget* ok_button = gtk_util::AddButtonToDialog(
63 l10n_util::GetStringUTF8(
64 IDS_CRYPTO_MODULE_AUTH_DIALOG_OK_BUTTON_LABEL).c_str(),
67 gtk_widget_set_can_default(ok_button, TRUE);
68 gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT);
70 // Select an appropriate text for the reason.
72 const string16& server16 = UTF8ToUTF16(server);
73 const string16& slot16 = UTF8ToUTF16(slot_name);
75 case chrome::kCryptoModulePasswordKeygen:
76 text = l10n_util::GetStringFUTF8(
77 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_KEYGEN, slot16, server16);
79 case chrome::kCryptoModulePasswordCertEnrollment:
80 text = l10n_util::GetStringFUTF8(
81 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_ENROLLMENT, slot16, server16);
83 case chrome::kCryptoModulePasswordClientAuth:
84 text = l10n_util::GetStringFUTF8(
85 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CLIENT_AUTH, slot16, server16);
87 case chrome::kCryptoModulePasswordListCerts:
88 text = l10n_util::GetStringFUTF8(
89 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_LIST_CERTS, slot16);
91 case chrome::kCryptoModulePasswordCertImport:
92 text = l10n_util::GetStringFUTF8(
93 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_IMPORT, slot16);
95 case chrome::kCryptoModulePasswordCertExport:
96 text = l10n_util::GetStringFUTF8(
97 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_EXPORT, slot16);
102 GtkWidget* label = gtk_label_new(text.c_str());
103 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
104 gtk_util::LeftAlignMisc(label);
105 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), label,
108 password_entry_ = gtk_entry_new();
109 gtk_entry_set_activates_default(GTK_ENTRY(password_entry_), TRUE);
110 gtk_entry_set_visibility(GTK_ENTRY(password_entry_), FALSE);
112 GtkWidget* password_box = gtk_hbox_new(FALSE, ui::kLabelSpacing);
113 gtk_box_pack_start(GTK_BOX(password_box),
114 gtk_label_new(l10n_util::GetStringUTF8(
115 IDS_CRYPTO_MODULE_AUTH_DIALOG_PASSWORD_FIELD).c_str()),
117 gtk_box_pack_start(GTK_BOX(password_box), password_entry_,
120 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), password_box,
123 g_signal_connect(dialog_, "response",
124 G_CALLBACK(OnResponseThunk), this);
125 g_signal_connect(dialog_, "destroy",
126 G_CALLBACK(OnWindowDestroyThunk), this);
129 void CryptoModulePasswordDialog::Show() {
130 gtk_util::ShowDialog(dialog_);
133 void CryptoModulePasswordDialog::OnResponse(GtkWidget* dialog,
135 if (response_id == GTK_RESPONSE_ACCEPT)
136 callback_.Run(gtk_entry_get_text(GTK_ENTRY(password_entry_)));
138 callback_.Run(static_cast<const char*>(NULL));
140 // This will cause gtk to zero out the buffer. (see
141 // gtk_entry_buffer_normal_delete_text:
142 // http://git.gnome.org/browse/gtk+/tree/gtk/gtkentrybuffer.c#n187)
143 gtk_editable_delete_text(GTK_EDITABLE(password_entry_), 0, -1);
144 gtk_widget_destroy(dialog_);
147 void CryptoModulePasswordDialog::OnWindowDestroy(GtkWidget* widget) {
155 void ShowCryptoModulePasswordDialog(
156 const std::string& slot_name,
158 CryptoModulePasswordReason reason,
159 const std::string& server,
160 const CryptoModulePasswordCallback& callback) {
161 (new CryptoModulePasswordDialog(slot_name, retry, reason, server,
165 } // namespace chrome