Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(745)

Side by Side Diff: chrome/browser/ui/gtk/crypto_module_password_dialog.cc

Issue 8115020: add crypto module password dialog view and test. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: include CryptoModulePasswordDialogView only when libviews.a is present. Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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 #include "chrome/browser/ui/crypto_module_password_dialog.h"
6
7 #include <gtk/gtk.h>
8
9 #include "base/basictypes.h"
10 #include "base/bind.h"
11 #include "base/synchronization/waitable_event.h"
12 #include "base/utf_string_conversions.h"
13 #include "crypto/crypto_module_blocking_password_delegate.h"
14 #include "chrome/browser/ui/gtk/gtk_util.h"
15 #include "content/browser/browser_thread.h"
16 #include "googleurl/src/gurl.h"
17 #include "grit/generated_resources.h"
18 #include "ui/base/gtk/gtk_hig_constants.h"
19 #include "ui/base/gtk/gtk_signal.h"
20 #include "ui/base/l10n/l10n_util.h"
21
22 namespace {
23
24 class CryptoModuleBlockingDialogDelegate
25 : public crypto::CryptoModuleBlockingPasswordDelegate {
26 public:
27 CryptoModuleBlockingDialogDelegate(browser::CryptoModulePasswordReason reason,
28 const std::string& server)
29 : event_(false, false),
30 reason_(reason),
31 server_(server),
32 password_(),
33 cancelled_(false) {
34 }
35
36 ~CryptoModuleBlockingDialogDelegate() {
37 password_.replace(0, password_.size(), password_.size(), 0);
38 }
39
40 // crypto::CryptoModuleBlockingDialogDelegate implementation.
41 virtual std::string RequestPassword(const std::string& slot_name, bool retry,
42 bool* cancelled) {
43 DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
44 DCHECK(!event_.IsSignaled());
45 event_.Reset();
46
47 if (BrowserThread::PostTask(
48 BrowserThread::UI, FROM_HERE,
49 base::Bind(&CryptoModuleBlockingDialogDelegate::ShowDialog,
50 // We block on event_ until the task completes, so
51 // there's no need to ref-count.
52 base::Unretained(this),
53 slot_name,
54 retry))) {
55 event_.Wait();
56 }
57 *cancelled = cancelled_;
58 return password_;
59 }
60
61 private:
62 void ShowDialog(const std::string& slot_name, bool retry) {
63 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
64 ShowCryptoModulePasswordDialog(
65 slot_name, retry, reason_, server_,
66 base::Bind(&CryptoModuleBlockingDialogDelegate::GotPassword,
67 base::Unretained(this)));
68 }
69 void GotPassword(const char* password) {
70 if (password)
71 password_ = password;
72 else
73 cancelled_ = true;
74 event_.Signal();
75 }
76 base::WaitableEvent event_;
77 browser::CryptoModulePasswordReason reason_;
78 std::string server_;
79 std::string password_;
80 bool cancelled_;
81
82 DISALLOW_COPY_AND_ASSIGN(CryptoModuleBlockingDialogDelegate);
83 };
84
85 // TODO(mattm): change into a constrained dialog.
86 class CryptoModulePasswordDialog {
87 public:
88 CryptoModulePasswordDialog(
89 const std::string& slot_name,
90 bool retry,
91 browser::CryptoModulePasswordReason reason,
92 const std::string& server,
93 const browser::CryptoModulePasswordCallback& callback);
94
95 virtual ~CryptoModulePasswordDialog() {}
96
97 void Show();
98
99 private:
100 CHROMEGTK_CALLBACK_1(CryptoModulePasswordDialog, void, OnResponse, int);
101 CHROMEGTK_CALLBACK_0(CryptoModulePasswordDialog, void, OnWindowDestroy);
102
103 browser::CryptoModulePasswordCallback callback_;
104
105 GtkWidget* dialog_;
106 GtkWidget* password_entry_;
107
108 DISALLOW_COPY_AND_ASSIGN(CryptoModulePasswordDialog);
109 };
110
111 CryptoModulePasswordDialog::CryptoModulePasswordDialog(
112 const std::string& slot_name,
113 bool retry,
114 browser::CryptoModulePasswordReason reason,
115 const std::string& server,
116 const browser::CryptoModulePasswordCallback& callback)
117 : callback_(callback) {
118 dialog_ = gtk_dialog_new_with_buttons(
119 l10n_util::GetStringUTF8(IDS_CRYPTO_MODULE_AUTH_DIALOG_TITLE).c_str(),
120 NULL,
121 GTK_DIALOG_NO_SEPARATOR,
122 NULL); // Populate the buttons later, for control over the OK button.
123 gtk_dialog_add_button(GTK_DIALOG(dialog_),
124 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
125 GtkWidget* ok_button = gtk_util::AddButtonToDialog(
126 dialog_,
127 l10n_util::GetStringUTF8(
128 IDS_CRYPTO_MODULE_AUTH_DIALOG_OK_BUTTON_LABEL).c_str(),
129 GTK_STOCK_OK,
130 GTK_RESPONSE_ACCEPT);
131 gtk_widget_set_can_default(ok_button, TRUE);
132 gtk_dialog_set_default_response(GTK_DIALOG(dialog_), GTK_RESPONSE_ACCEPT);
133
134 // Select an appropriate text for the reason.
135 std::string text;
136 const string16& server16 = UTF8ToUTF16(server);
137 const string16& slot16 = UTF8ToUTF16(slot_name);
138 switch (reason) {
139 case browser::kCryptoModulePasswordKeygen:
140 text = l10n_util::GetStringFUTF8(
141 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_KEYGEN, slot16, server16);
142 break;
143 case browser::kCryptoModulePasswordCertEnrollment:
144 text = l10n_util::GetStringFUTF8(
145 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_ENROLLMENT, slot16, server16);
146 break;
147 case browser::kCryptoModulePasswordClientAuth:
148 text = l10n_util::GetStringFUTF8(
149 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CLIENT_AUTH, slot16, server16);
150 break;
151 case browser::kCryptoModulePasswordListCerts:
152 text = l10n_util::GetStringFUTF8(
153 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_LIST_CERTS, slot16);
154 break;
155 case browser::kCryptoModulePasswordCertImport:
156 text = l10n_util::GetStringFUTF8(
157 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_IMPORT, slot16);
158 break;
159 case browser::kCryptoModulePasswordCertExport:
160 text = l10n_util::GetStringFUTF8(
161 IDS_CRYPTO_MODULE_AUTH_DIALOG_TEXT_CERT_EXPORT, slot16);
162 break;
163 default:
164 NOTREACHED();
165 }
166 GtkWidget* label = gtk_label_new(text.c_str());
167 gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
168 gtk_util::LeftAlignMisc(label);
169 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), label,
170 FALSE, FALSE, 0);
171
172 password_entry_ = gtk_entry_new();
173 gtk_entry_set_activates_default(GTK_ENTRY(password_entry_), TRUE);
174 gtk_entry_set_visibility(GTK_ENTRY(password_entry_), FALSE);
175
176 GtkWidget* password_box = gtk_hbox_new(FALSE, ui::kLabelSpacing);
177 gtk_box_pack_start(GTK_BOX(password_box),
178 gtk_label_new(l10n_util::GetStringUTF8(
179 IDS_CRYPTO_MODULE_AUTH_DIALOG_PASSWORD_FIELD).c_str()),
180 FALSE, FALSE, 0);
181 gtk_box_pack_start(GTK_BOX(password_box), password_entry_,
182 TRUE, TRUE, 0);
183
184 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog_)->vbox), password_box,
185 FALSE, FALSE, 0);
186
187 g_signal_connect(dialog_, "response",
188 G_CALLBACK(OnResponseThunk), this);
189 g_signal_connect(dialog_, "destroy",
190 G_CALLBACK(OnWindowDestroyThunk), this);
191 }
192
193 void CryptoModulePasswordDialog::Show() {
194 gtk_util::ShowDialog(dialog_);
195 }
196
197 void CryptoModulePasswordDialog::OnResponse(GtkWidget* dialog,
198 int response_id) {
199 if (response_id == GTK_RESPONSE_ACCEPT)
200 callback_.Run(gtk_entry_get_text(GTK_ENTRY(password_entry_)));
201 else
202 callback_.Run(static_cast<const char*>(NULL));
203
204 // This will cause gtk to zero out the buffer. (see
205 // gtk_entry_buffer_normal_delete_text:
206 // http://git.gnome.org/browse/gtk+/tree/gtk/gtkentrybuffer.c#n187)
207 gtk_editable_delete_text(GTK_EDITABLE(password_entry_), 0, -1);
208 gtk_widget_destroy(dialog_);
209 }
210
211 void CryptoModulePasswordDialog::OnWindowDestroy(GtkWidget* widget) {
212 delete this;
213 }
214
215 } // namespace
216
217 namespace browser {
218
219 void ShowCryptoModulePasswordDialog(
220 const std::string& slot_name,
221 bool retry,
222 CryptoModulePasswordReason reason,
223 const std::string& server,
224 const CryptoModulePasswordCallback& callback) {
225 (new CryptoModulePasswordDialog(slot_name, retry, reason, server,
226 callback))->Show();
227 }
228
229 crypto::CryptoModuleBlockingPasswordDelegate*
230 NewCryptoModuleBlockingDialogDelegate(
231 CryptoModulePasswordReason reason,
232 const std::string& server) {
233 return new CryptoModuleBlockingDialogDelegate(reason, server);
234 }
235
236 } // namespace browser
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698