OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ssl_client_certificate_selector.h" | 5 #include "chrome/browser/ssl_client_certificate_selector.h" |
6 | 6 |
7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "app/gtk_signal.h" | 12 #include "app/gtk_signal.h" |
13 #include "app/l10n_util.h" | 13 #include "app/l10n_util.h" |
14 #include "base/i18n/time_formatting.h" | 14 #include "base/i18n/time_formatting.h" |
15 #include "base/logging.h" | 15 #include "base/logging.h" |
16 #include "base/nss_util.h" | 16 #include "base/nss_util.h" |
17 #include "base/utf_string_conversions.h" | 17 #include "base/utf_string_conversions.h" |
18 #include "chrome/browser/certificate_viewer.h" | 18 #include "chrome/browser/certificate_viewer.h" |
19 #include "chrome/browser/gtk/constrained_window_gtk.h" | 19 #include "chrome/browser/gtk/constrained_window_gtk.h" |
20 #include "chrome/browser/gtk/gtk_util.h" | 20 #include "chrome/browser/gtk/gtk_util.h" |
21 #include "chrome/browser/gtk/owned_widget_gtk.h" | 21 #include "chrome/browser/gtk/owned_widget_gtk.h" |
22 #include "chrome/browser/ssl/ssl_client_auth_handler.h" | 22 #include "chrome/browser/ssl/ssl_client_auth_handler.h" |
23 #include "chrome/browser/tab_contents/tab_contents.h" | 23 #include "chrome/browser/tab_contents/tab_contents.h" |
24 #include "chrome/browser/ui/pk11_password_dialog.h" | |
24 #include "chrome/common/net/x509_certificate_model.h" | 25 #include "chrome/common/net/x509_certificate_model.h" |
25 #include "gfx/native_widget_types.h" | 26 #include "gfx/native_widget_types.h" |
26 #include "grit/generated_resources.h" | 27 #include "grit/generated_resources.h" |
27 #include "net/base/x509_certificate.h" | 28 #include "net/base/x509_certificate.h" |
28 | 29 |
29 namespace { | 30 namespace { |
30 | 31 |
31 enum { | 32 enum { |
32 RESPONSE_SHOW_CERT_INFO = 1, | 33 RESPONSE_SHOW_CERT_INFO = 1, |
33 }; | 34 }; |
(...skipping 19 matching lines...) Expand all Loading... | |
53 void PopulateCerts(); | 54 void PopulateCerts(); |
54 | 55 |
55 net::X509Certificate* GetSelectedCert(); | 56 net::X509Certificate* GetSelectedCert(); |
56 | 57 |
57 static std::string FormatComboBoxText( | 58 static std::string FormatComboBoxText( |
58 net::X509Certificate::OSCertHandle cert, | 59 net::X509Certificate::OSCertHandle cert, |
59 const std::string& nickname); | 60 const std::string& nickname); |
60 static std::string FormatDetailsText( | 61 static std::string FormatDetailsText( |
61 net::X509Certificate::OSCertHandle cert); | 62 net::X509Certificate::OSCertHandle cert); |
62 | 63 |
64 // Callback after unlocking certificate slot. | |
65 void Unlocked(); | |
66 | |
63 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnComboBoxChanged); | 67 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnComboBoxChanged); |
64 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnViewClicked); | 68 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnViewClicked); |
65 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnCancelClicked); | 69 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnCancelClicked); |
66 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnOkClicked); | 70 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnOkClicked); |
67 CHROMEGTK_CALLBACK_1(SSLClientCertificateSelector, void, OnPromptShown, | 71 CHROMEGTK_CALLBACK_1(SSLClientCertificateSelector, void, OnPromptShown, |
68 GtkWidget*); | 72 GtkWidget*); |
69 | 73 |
70 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_; | 74 scoped_refptr<net::SSLCertRequestInfo> cert_request_info_; |
71 | 75 |
72 std::vector<std::string> details_strings_; | 76 std::vector<std::string> details_strings_; |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
239 return rv; | 243 return rv; |
240 } | 244 } |
241 | 245 |
242 // static | 246 // static |
243 std::string SSLClientCertificateSelector::FormatDetailsText( | 247 std::string SSLClientCertificateSelector::FormatDetailsText( |
244 net::X509Certificate::OSCertHandle cert) { | 248 net::X509Certificate::OSCertHandle cert) { |
245 std::string rv; | 249 std::string rv; |
246 | 250 |
247 rv += l10n_util::GetStringFUTF8( | 251 rv += l10n_util::GetStringFUTF8( |
248 IDS_CERT_SUBJECTNAME_FORMAT, | 252 IDS_CERT_SUBJECTNAME_FORMAT, |
249 UTF8ToUTF16(x509_certificate_model::GetSubjectName(cert)));; | 253 UTF8ToUTF16(x509_certificate_model::GetSubjectName(cert))); |
250 | 254 |
251 rv += "\n "; | 255 rv += "\n "; |
252 rv += l10n_util::GetStringFUTF8( | 256 rv += l10n_util::GetStringFUTF8( |
253 IDS_CERT_SERIAL_NUMBER_FORMAT, | 257 IDS_CERT_SERIAL_NUMBER_FORMAT, |
254 UTF8ToUTF16( | 258 UTF8ToUTF16( |
255 x509_certificate_model::GetSerialNumberHexified(cert, ""))); | 259 x509_certificate_model::GetSerialNumberHexified(cert, ""))); |
256 | 260 |
257 base::Time issued, expires; | 261 base::Time issued, expires; |
258 if (x509_certificate_model::GetTimes(cert, &issued, &expires)) { | 262 if (x509_certificate_model::GetTimes(cert, &issued, &expires)) { |
259 string16 issued_str = WideToUTF16( | 263 string16 issued_str = WideToUTF16( |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
296 | 300 |
297 string16 token(UTF8ToUTF16(x509_certificate_model::GetTokenName(cert))); | 301 string16 token(UTF8ToUTF16(x509_certificate_model::GetTokenName(cert))); |
298 if (!token.empty()) { | 302 if (!token.empty()) { |
299 rv += '\n'; | 303 rv += '\n'; |
300 rv += l10n_util::GetStringFUTF8(IDS_CERT_TOKEN_FORMAT, token); | 304 rv += l10n_util::GetStringFUTF8(IDS_CERT_TOKEN_FORMAT, token); |
301 } | 305 } |
302 | 306 |
303 return rv; | 307 return rv; |
304 } | 308 } |
305 | 309 |
310 void SSLClientCertificateSelector::Unlocked() { | |
311 net::X509Certificate* cert = GetSelectedCert(); | |
wtc
2010/12/15 20:54:36
Can |cert| be passed to this method as a parameter
mattm
2011/01/12 01:22:07
Could be done, but UnlockSlotIfNecessary and Unloc
| |
312 delegate_->CertificateSelected(cert); | |
313 delegate_ = NULL; | |
314 DCHECK(window_); | |
315 window_->CloseConstrainedWindow(); | |
316 } | |
317 | |
306 void SSLClientCertificateSelector::OnComboBoxChanged(GtkWidget* combo_box) { | 318 void SSLClientCertificateSelector::OnComboBoxChanged(GtkWidget* combo_box) { |
307 int selected = gtk_combo_box_get_active( | 319 int selected = gtk_combo_box_get_active( |
308 GTK_COMBO_BOX(cert_combo_box_)); | 320 GTK_COMBO_BOX(cert_combo_box_)); |
309 if (selected < 0) | 321 if (selected < 0) |
310 return; | 322 return; |
311 gtk_text_buffer_set_text(cert_details_buffer_, | 323 gtk_text_buffer_set_text(cert_details_buffer_, |
312 details_strings_[selected].c_str(), | 324 details_strings_[selected].c_str(), |
313 details_strings_[selected].size()); | 325 details_strings_[selected].size()); |
314 } | 326 } |
315 | 327 |
316 void SSLClientCertificateSelector::OnViewClicked(GtkWidget* button) { | 328 void SSLClientCertificateSelector::OnViewClicked(GtkWidget* button) { |
317 net::X509Certificate* cert = GetSelectedCert(); | 329 net::X509Certificate* cert = GetSelectedCert(); |
318 if (cert) { | 330 if (cert) { |
319 GtkWidget* toplevel = gtk_widget_get_toplevel(root_widget_.get()); | 331 GtkWidget* toplevel = gtk_widget_get_toplevel(root_widget_.get()); |
320 ShowCertificateViewer(GTK_WINDOW(toplevel), cert); | 332 ShowCertificateViewer(GTK_WINDOW(toplevel), cert); |
321 } | 333 } |
322 } | 334 } |
323 | 335 |
324 void SSLClientCertificateSelector::OnCancelClicked(GtkWidget* button) { | 336 void SSLClientCertificateSelector::OnCancelClicked(GtkWidget* button) { |
325 delegate_->CertificateSelected(NULL); | 337 delegate_->CertificateSelected(NULL); |
326 delegate_ = NULL; | 338 delegate_ = NULL; |
327 DCHECK(window_); | 339 DCHECK(window_); |
328 window_->CloseConstrainedWindow(); | 340 window_->CloseConstrainedWindow(); |
329 } | 341 } |
330 | 342 |
331 void SSLClientCertificateSelector::OnOkClicked(GtkWidget* button) { | 343 void SSLClientCertificateSelector::OnOkClicked(GtkWidget* button) { |
332 net::X509Certificate* cert = GetSelectedCert(); | 344 net::X509Certificate* cert = GetSelectedCert(); |
333 delegate_->CertificateSelected(cert); | 345 |
334 delegate_ = NULL; | 346 browser::UnlockCertSlotIfNecessary( |
335 DCHECK(window_); | 347 cert, |
336 window_->CloseConstrainedWindow(); | 348 browser::kPK11PasswordClientAuth, |
349 cert_request_info_->host_and_port, // TODO(mattm): strip port part? | |
wtc
2010/12/15 20:54:36
The port part is important.
mattm
2011/01/12 01:22:07
Done.
| |
350 NewCallback(this, &SSLClientCertificateSelector::Unlocked)); | |
337 } | 351 } |
338 | 352 |
339 void SSLClientCertificateSelector::OnPromptShown(GtkWidget* widget, | 353 void SSLClientCertificateSelector::OnPromptShown(GtkWidget* widget, |
340 GtkWidget* previous_toplevel) { | 354 GtkWidget* previous_toplevel) { |
341 if (!root_widget_.get() || | 355 if (!root_widget_.get() || |
342 !GTK_WIDGET_TOPLEVEL(gtk_widget_get_toplevel(root_widget_.get()))) | 356 !GTK_WIDGET_TOPLEVEL(gtk_widget_get_toplevel(root_widget_.get()))) |
343 return; | 357 return; |
344 GTK_WIDGET_SET_FLAGS(select_button_, GTK_CAN_DEFAULT); | 358 GTK_WIDGET_SET_FLAGS(select_button_, GTK_CAN_DEFAULT); |
345 gtk_widget_grab_default(select_button_); | 359 gtk_widget_grab_default(select_button_); |
346 gtk_widget_grab_focus(select_button_); | 360 gtk_widget_grab_focus(select_button_); |
347 } | 361 } |
348 | 362 |
349 } // namespace | 363 } // namespace |
350 | 364 |
351 /////////////////////////////////////////////////////////////////////////////// | 365 /////////////////////////////////////////////////////////////////////////////// |
352 // SSLClientAuthHandler platform specific implementation: | 366 // SSLClientAuthHandler platform specific implementation: |
353 | 367 |
354 namespace browser { | 368 namespace browser { |
355 | 369 |
356 void ShowSSLClientCertificateSelector( | 370 void ShowSSLClientCertificateSelector( |
357 TabContents* parent, | 371 TabContents* parent, |
358 net::SSLCertRequestInfo* cert_request_info, | 372 net::SSLCertRequestInfo* cert_request_info, |
359 SSLClientAuthHandler* delegate) { | 373 SSLClientAuthHandler* delegate) { |
360 (new SSLClientCertificateSelector(parent, | 374 (new SSLClientCertificateSelector(parent, |
361 cert_request_info, | 375 cert_request_info, |
362 delegate))->Show(); | 376 delegate))->Show(); |
363 } | 377 } |
364 | 378 |
365 } // namespace browser | 379 } // namespace browser |
OLD | NEW |