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

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

Powered by Google App Engine
This is Rietveld 408576698