| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/ssl_client_certificate_selector.h" | 5 #include "chrome/browser/ssl/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> |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 | 36 |
| 37 namespace { | 37 namespace { |
| 38 | 38 |
| 39 enum { | 39 enum { |
| 40 RESPONSE_SHOW_CERT_INFO = 1, | 40 RESPONSE_SHOW_CERT_INFO = 1, |
| 41 }; | 41 }; |
| 42 | 42 |
| 43 /////////////////////////////////////////////////////////////////////////////// | 43 /////////////////////////////////////////////////////////////////////////////// |
| 44 // SSLClientCertificateSelector | 44 // SSLClientCertificateSelector |
| 45 | 45 |
| 46 class SSLClientCertificateSelector : public SSLClientAuthObserver, | 46 class SSLClientCertificateSelector : public SSLClientAuthObserver { |
| 47 public ConstrainedWindowGtkDelegate { | |
| 48 public: | 47 public: |
| 49 explicit SSLClientCertificateSelector( | 48 explicit SSLClientCertificateSelector( |
| 50 WebContents* parent, | 49 WebContents* parent, |
| 51 const net::HttpNetworkSession* network_session, | 50 const net::HttpNetworkSession* network_session, |
| 52 net::SSLCertRequestInfo* cert_request_info, | 51 net::SSLCertRequestInfo* cert_request_info, |
| 53 const base::Callback<void(net::X509Certificate*)>& callback); | 52 const base::Callback<void(net::X509Certificate*)>& callback); |
| 54 virtual ~SSLClientCertificateSelector(); | 53 virtual ~SSLClientCertificateSelector(); |
| 55 | 54 |
| 56 void Show(); | 55 void Show(); |
| 57 | 56 |
| 58 // SSLClientAuthObserver implementation: | 57 // SSLClientAuthObserver implementation: |
| 59 virtual void OnCertSelectedByNotification() OVERRIDE; | 58 virtual void OnCertSelectedByNotification() OVERRIDE; |
| 60 | 59 |
| 61 // ConstrainedWindowGtkDelegate implementation: | |
| 62 virtual GtkWidget* GetWidgetRoot() OVERRIDE { return root_widget_.get(); } | |
| 63 virtual GtkWidget* GetFocusWidget() OVERRIDE; | |
| 64 virtual void DeleteDelegate() OVERRIDE; | |
| 65 | |
| 66 private: | 60 private: |
| 67 void PopulateCerts(); | 61 void PopulateCerts(); |
| 68 | 62 |
| 69 net::X509Certificate* GetSelectedCert(); | 63 net::X509Certificate* GetSelectedCert(); |
| 70 | 64 |
| 71 static std::string FormatComboBoxText( | 65 static std::string FormatComboBoxText( |
| 72 net::X509Certificate::OSCertHandle cert, | 66 net::X509Certificate::OSCertHandle cert, |
| 73 const std::string& nickname); | 67 const std::string& nickname); |
| 74 static std::string FormatDetailsText( | 68 static std::string FormatDetailsText( |
| 75 net::X509Certificate::OSCertHandle cert); | 69 net::X509Certificate::OSCertHandle cert); |
| 76 | 70 |
| 77 // Callback after unlocking certificate slot. | 71 // Callback after unlocking certificate slot. |
| 78 void Unlocked(); | 72 void Unlocked(); |
| 79 | 73 |
| 80 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnComboBoxChanged); | 74 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnComboBoxChanged); |
| 81 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnViewClicked); | 75 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnViewClicked); |
| 82 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnCancelClicked); | 76 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnCancelClicked); |
| 83 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnOkClicked); | 77 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnOkClicked); |
| 84 CHROMEGTK_CALLBACK_1(SSLClientCertificateSelector, void, OnPromptShown, | 78 CHROMEGTK_CALLBACK_1(SSLClientCertificateSelector, void, OnPromptShown, |
| 85 GtkWidget*); | 79 GtkWidget*); |
| 80 CHROMEGTK_CALLBACK_0(SSLClientCertificateSelector, void, OnDestroy); |
| 86 | 81 |
| 87 std::vector<std::string> details_strings_; | 82 std::vector<std::string> details_strings_; |
| 88 | 83 |
| 89 GtkWidget* cert_combo_box_; | 84 GtkWidget* cert_combo_box_; |
| 90 GtkTextBuffer* cert_details_buffer_; | 85 GtkTextBuffer* cert_details_buffer_; |
| 91 | 86 |
| 92 ui::OwnedWidgetGtk root_widget_; | 87 ui::OwnedWidgetGtk root_widget_; |
| 93 // Hold on to the select button to focus it. | 88 // Hold on to the select button to focus it. |
| 94 GtkWidget* select_button_; | 89 GtkWidget* select_button_; |
| 95 | 90 |
| 96 WebContents* web_contents_; | 91 WebContents* web_contents_; |
| 97 GtkWidget* window_; | 92 GtkWidget* window_; |
| 98 | 93 |
| 99 DISALLOW_COPY_AND_ASSIGN(SSLClientCertificateSelector); | 94 DISALLOW_COPY_AND_ASSIGN(SSLClientCertificateSelector); |
| 100 }; | 95 }; |
| 101 | 96 |
| 102 SSLClientCertificateSelector::SSLClientCertificateSelector( | 97 SSLClientCertificateSelector::SSLClientCertificateSelector( |
| 103 WebContents* web_contents, | 98 WebContents* web_contents, |
| 104 const net::HttpNetworkSession* network_session, | 99 const net::HttpNetworkSession* network_session, |
| 105 net::SSLCertRequestInfo* cert_request_info, | 100 net::SSLCertRequestInfo* cert_request_info, |
| 106 const base::Callback<void(net::X509Certificate*)>& callback) | 101 const base::Callback<void(net::X509Certificate*)>& callback) |
| 107 : SSLClientAuthObserver(network_session, cert_request_info, callback), | 102 : SSLClientAuthObserver(network_session, cert_request_info, callback), |
| 108 web_contents_(web_contents), | 103 web_contents_(web_contents), |
| 109 window_(NULL) { | 104 window_(NULL) { |
| 110 root_widget_.Own(gtk_vbox_new(FALSE, ui::kControlSpacing)); | 105 root_widget_.Own(gtk_vbox_new(FALSE, ui::kControlSpacing)); |
| 106 g_signal_connect(root_widget_.get(), |
| 107 "destroy", |
| 108 G_CALLBACK(OnDestroyThunk), |
| 109 this); |
| 111 | 110 |
| 112 GtkWidget* site_vbox = gtk_vbox_new(FALSE, ui::kControlSpacing); | 111 GtkWidget* site_vbox = gtk_vbox_new(FALSE, ui::kControlSpacing); |
| 113 gtk_box_pack_start(GTK_BOX(root_widget_.get()), site_vbox, | 112 gtk_box_pack_start(GTK_BOX(root_widget_.get()), site_vbox, |
| 114 FALSE, FALSE, 0); | 113 FALSE, FALSE, 0); |
| 115 | 114 |
| 116 GtkWidget* site_description_label = gtk_util::CreateBoldLabel( | 115 GtkWidget* site_description_label = gtk_util::CreateBoldLabel( |
| 117 l10n_util::GetStringUTF8(IDS_CERT_SELECTOR_SITE_DESCRIPTION_LABEL)); | 116 l10n_util::GetStringUTF8(IDS_CERT_SELECTOR_SITE_DESCRIPTION_LABEL)); |
| 118 gtk_box_pack_start(GTK_BOX(site_vbox), site_description_label, | 117 gtk_box_pack_start(GTK_BOX(site_vbox), site_description_label, |
| 119 FALSE, FALSE, 0); | 118 FALSE, FALSE, 0); |
| 120 | 119 |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 | 190 |
| 192 StartObserving(); | 191 StartObserving(); |
| 193 } | 192 } |
| 194 | 193 |
| 195 SSLClientCertificateSelector::~SSLClientCertificateSelector() { | 194 SSLClientCertificateSelector::~SSLClientCertificateSelector() { |
| 196 root_widget_.Destroy(); | 195 root_widget_.Destroy(); |
| 197 } | 196 } |
| 198 | 197 |
| 199 void SSLClientCertificateSelector::Show() { | 198 void SSLClientCertificateSelector::Show() { |
| 200 DCHECK(!window_); | 199 DCHECK(!window_); |
| 201 window_ = CreateWebContentsModalDialogGtk(web_contents_, this); | 200 window_ = CreateWebContentsModalDialogGtk(web_contents_, |
| 201 root_widget_.get(), |
| 202 select_button_); |
| 202 | 203 |
| 203 WebContentsModalDialogManager* web_contents_modal_dialog_manager = | 204 WebContentsModalDialogManager* web_contents_modal_dialog_manager = |
| 204 WebContentsModalDialogManager::FromWebContents(web_contents_); | 205 WebContentsModalDialogManager::FromWebContents(web_contents_); |
| 205 web_contents_modal_dialog_manager->ShowDialog(window_); | 206 web_contents_modal_dialog_manager->ShowDialog(window_); |
| 206 } | 207 } |
| 207 | 208 |
| 208 void SSLClientCertificateSelector::OnCertSelectedByNotification() { | 209 void SSLClientCertificateSelector::OnCertSelectedByNotification() { |
| 209 DCHECK(window_); | 210 DCHECK(window_); |
| 210 gtk_widget_destroy(window_); | 211 gtk_widget_destroy(window_); |
| 211 } | 212 } |
| 212 | 213 |
| 213 GtkWidget* SSLClientCertificateSelector::GetFocusWidget() { | |
| 214 return select_button_; | |
| 215 } | |
| 216 | |
| 217 void SSLClientCertificateSelector::DeleteDelegate() { | |
| 218 // The dialog was closed by escape key. | |
| 219 StopObserving(); | |
| 220 CertificateSelected(NULL); | |
| 221 delete this; | |
| 222 } | |
| 223 | |
| 224 void SSLClientCertificateSelector::PopulateCerts() { | 214 void SSLClientCertificateSelector::PopulateCerts() { |
| 225 std::vector<std::string> nicknames; | 215 std::vector<std::string> nicknames; |
| 226 x509_certificate_model::GetNicknameStringsFromCertList( | 216 x509_certificate_model::GetNicknameStringsFromCertList( |
| 227 cert_request_info()->client_certs, | 217 cert_request_info()->client_certs, |
| 228 l10n_util::GetStringUTF8(IDS_CERT_SELECTOR_CERT_EXPIRED), | 218 l10n_util::GetStringUTF8(IDS_CERT_SELECTOR_CERT_EXPIRED), |
| 229 l10n_util::GetStringUTF8(IDS_CERT_SELECTOR_CERT_NOT_YET_VALID), | 219 l10n_util::GetStringUTF8(IDS_CERT_SELECTOR_CERT_NOT_YET_VALID), |
| 230 &nicknames); | 220 &nicknames); |
| 231 | 221 |
| 232 DCHECK_EQ(nicknames.size(), | 222 DCHECK_EQ(nicknames.size(), |
| 233 cert_request_info()->client_certs.size()); | 223 cert_request_info()->client_certs.size()); |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 | 368 |
| 379 void SSLClientCertificateSelector::OnPromptShown(GtkWidget* widget, | 369 void SSLClientCertificateSelector::OnPromptShown(GtkWidget* widget, |
| 380 GtkWidget* previous_toplevel) { | 370 GtkWidget* previous_toplevel) { |
| 381 if (!root_widget_.get() || | 371 if (!root_widget_.get() || |
| 382 !gtk_widget_is_toplevel(gtk_widget_get_toplevel(root_widget_.get()))) | 372 !gtk_widget_is_toplevel(gtk_widget_get_toplevel(root_widget_.get()))) |
| 383 return; | 373 return; |
| 384 gtk_widget_set_can_default(select_button_, TRUE); | 374 gtk_widget_set_can_default(select_button_, TRUE); |
| 385 gtk_widget_grab_default(select_button_); | 375 gtk_widget_grab_default(select_button_); |
| 386 } | 376 } |
| 387 | 377 |
| 378 void SSLClientCertificateSelector::OnDestroy(GtkWidget* widget) { |
| 379 // The dialog was closed by escape key. |
| 380 StopObserving(); |
| 381 CertificateSelected(NULL); |
| 382 delete this; |
| 383 } |
| 384 |
| 388 } // namespace | 385 } // namespace |
| 389 | 386 |
| 390 namespace chrome { | 387 namespace chrome { |
| 391 | 388 |
| 392 void ShowSSLClientCertificateSelector( | 389 void ShowSSLClientCertificateSelector( |
| 393 content::WebContents* contents, | 390 content::WebContents* contents, |
| 394 const net::HttpNetworkSession* network_session, | 391 const net::HttpNetworkSession* network_session, |
| 395 net::SSLCertRequestInfo* cert_request_info, | 392 net::SSLCertRequestInfo* cert_request_info, |
| 396 const base::Callback<void(net::X509Certificate*)>& callback) { | 393 const base::Callback<void(net::X509Certificate*)>& callback) { |
| 397 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 394 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 398 (new SSLClientCertificateSelector( | 395 (new SSLClientCertificateSelector( |
| 399 contents, network_session, cert_request_info, callback))->Show(); | 396 contents, network_session, cert_request_info, callback))->Show(); |
| 400 } | 397 } |
| 401 | 398 |
| 402 } // namespace chrome | 399 } // namespace chrome |
| OLD | NEW |