Index: chrome/browser/gtk/certificate_viewer.cc |
=================================================================== |
--- chrome/browser/gtk/certificate_viewer.cc (revision 71352) |
+++ chrome/browser/gtk/certificate_viewer.cc (working copy) |
@@ -1,694 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/gtk/certificate_viewer.h" |
- |
-#include <gtk/gtk.h> |
- |
-#include <algorithm> |
-#include <vector> |
- |
-#include "app/l10n_util.h" |
-#include "base/i18n/time_formatting.h" |
-#include "base/nss_util.h" |
-#include "base/scoped_ptr.h" |
-#include "base/string_number_conversions.h" |
-#include "base/time.h" |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/gtk/certificate_dialogs.h" |
-#include "chrome/browser/gtk/gtk_util.h" |
-#include "chrome/common/net/x509_certificate_model.h" |
-#include "gfx/gtk_util.h" |
-#include "grit/generated_resources.h" |
-#include "net/base/x509_certificate.h" |
- |
-namespace { |
- |
-const char kDetailsFontFamily[] = "monospace"; |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// Gtk utility functions. |
- |
-void AddTitle(GtkTable* table, int row, const std::string& text) { |
- gtk_table_attach_defaults(table, |
- gtk_util::CreateBoldLabel(text), |
- 0, 2, |
- row, row + 1); |
-} |
- |
-void AddKeyValue(GtkTable* table, int row, const std::string& text, |
- const std::string& value) { |
- gtk_table_attach_defaults( |
- table, |
- gtk_util::IndentWidget( |
- gtk_util::LeftAlignMisc(gtk_label_new(text.c_str()))), |
- 0, 1, row, row + 1); |
- gtk_table_attach_defaults( |
- table, |
- gtk_util::LeftAlignMisc(gtk_label_new(value.c_str())), |
- 1, 2, row, row + 1); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// CertificateViewer class definition. |
- |
-class CertificateViewer { |
- public: |
- CertificateViewer(gfx::NativeWindow parent, |
- const net::X509Certificate::OSCertHandles& cert_chain_list); |
- ~CertificateViewer(); |
- |
- void InitGeneralPage(); |
- void InitDetailsPage(); |
- |
- void Show(); |
- |
- private: |
- // Indices and column count for the certificate chain hierarchy tree store. |
- enum { |
- HIERARCHY_NAME, |
- HIERARCHY_OBJECT, |
- HIERARCHY_INDEX, |
- HIERARCHY_COLUMNS |
- }; |
- |
- // Indices and column count for the certificate fields tree store. |
- enum { |
- FIELDS_NAME, |
- FIELDS_VALUE, |
- FIELDS_COLUMNS |
- }; |
- |
- // Fill the tree store with the certificate hierarchy, and set |leaf| to the |
- // iter of the leaf node. |
- void FillHierarchyStore(GtkTreeStore* hierarchy_store, |
- GtkTreeIter* leaf) const; |
- |
- // Fill the tree store with the details of the given certificate. |
- static void FillTreeStoreWithCertFields( |
- GtkTreeStore* store, net::X509Certificate::OSCertHandle cert); |
- |
- // Create a tree store filled with the details of the given certificate. |
- static GtkTreeStore* CreateFieldsTreeStore( |
- net::X509Certificate::OSCertHandle cert); |
- |
- // Callbacks for user selecting elements in the trees. |
- static void OnHierarchySelectionChanged(GtkTreeSelection* selection, |
- CertificateViewer* viewer); |
- static void OnFieldsSelectionChanged(GtkTreeSelection* selection, |
- CertificateViewer* viewer); |
- |
- // Callback for export button. |
- static void OnExportClicked(GtkButton *button, CertificateViewer* viewer); |
- |
- // The certificate hierarchy (leaf cert first). |
- net::X509Certificate::OSCertHandles cert_chain_list_; |
- |
- GtkWidget* dialog_; |
- GtkWidget* notebook_; |
- GtkWidget* general_page_vbox_; |
- GtkWidget* details_page_vbox_; |
- GtkTreeSelection* hierarchy_selection_; |
- GtkWidget* fields_tree_; |
- GtkTextBuffer* field_value_buffer_; |
- GtkWidget* export_button_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CertificateViewer); |
-}; |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// CertificateViewer implementation. |
- |
-// Close button callback. |
-void OnDialogResponse(GtkDialog* dialog, gint response_id, |
- gpointer user_data) { |
- // "Close" was clicked. |
- gtk_widget_destroy(GTK_WIDGET(dialog)); |
-} |
- |
-void OnDestroy(GtkDialog* dialog, CertificateViewer* cert_viewer) { |
- delete cert_viewer; |
-} |
- |
-CertificateViewer::CertificateViewer( |
- gfx::NativeWindow parent, |
- const net::X509Certificate::OSCertHandles& cert_chain_list) |
- : cert_chain_list_(cert_chain_list) { |
- dialog_ = gtk_dialog_new_with_buttons( |
- l10n_util::GetStringFUTF8( |
- IDS_CERT_INFO_DIALOG_TITLE, |
- UTF8ToUTF16( |
- x509_certificate_model::GetTitle( |
- cert_chain_list_.front()))).c_str(), |
- parent, |
- // Non-modal. |
- GTK_DIALOG_NO_SEPARATOR, |
- GTK_STOCK_CLOSE, |
- GTK_RESPONSE_CLOSE, |
- NULL); |
- gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog_)->vbox), |
- gtk_util::kContentAreaSpacing); |
- |
- x509_certificate_model::RegisterDynamicOids(); |
- InitGeneralPage(); |
- InitDetailsPage(); |
- |
- notebook_ = gtk_notebook_new(); |
- gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog_)->vbox), notebook_); |
- |
- gtk_notebook_append_page( |
- GTK_NOTEBOOK(notebook_), |
- general_page_vbox_, |
- gtk_label_new_with_mnemonic( |
- gfx::ConvertAcceleratorsFromWindowsStyle( |
- l10n_util::GetStringUTF8( |
- IDS_CERT_INFO_GENERAL_TAB_LABEL)).c_str())); |
- |
- gtk_notebook_append_page( |
- GTK_NOTEBOOK(notebook_), |
- details_page_vbox_, |
- gtk_label_new_with_mnemonic( |
- gfx::ConvertAcceleratorsFromWindowsStyle( |
- l10n_util::GetStringUTF8( |
- IDS_CERT_INFO_DETAILS_TAB_LABEL)).c_str())); |
- |
- g_signal_connect(dialog_, "response", G_CALLBACK(OnDialogResponse), NULL); |
- g_signal_connect(dialog_, "destroy", G_CALLBACK(OnDestroy), this); |
-} |
- |
-CertificateViewer::~CertificateViewer() { |
- x509_certificate_model::DestroyCertChain(&cert_chain_list_); |
-} |
- |
-void CertificateViewer::InitGeneralPage() { |
- net::X509Certificate::OSCertHandle cert = cert_chain_list_.front(); |
- general_page_vbox_ = gtk_vbox_new(FALSE, gtk_util::kContentAreaSpacing); |
- gtk_container_set_border_width(GTK_CONTAINER(general_page_vbox_), |
- gtk_util::kContentAreaBorder); |
- |
- GtkWidget* uses_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); |
- gtk_box_pack_start(GTK_BOX(general_page_vbox_), uses_vbox, FALSE, FALSE, 0); |
- gtk_box_pack_start( |
- GTK_BOX(uses_vbox), |
- gtk_util::CreateBoldLabel( |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_VERIFIED_USAGES_GROUP)), |
- FALSE, FALSE, 0); |
- |
- std::vector<std::string> usages; |
- x509_certificate_model::GetUsageStrings(cert, &usages); |
- for (size_t i = 0; i < usages.size(); ++i) |
- gtk_box_pack_start( |
- GTK_BOX(uses_vbox), |
- gtk_util::IndentWidget(gtk_util::LeftAlignMisc(gtk_label_new( |
- usages[i].c_str()))), |
- FALSE, FALSE, 0); |
- |
- gtk_box_pack_start(GTK_BOX(general_page_vbox_), gtk_hseparator_new(), |
- FALSE, FALSE, 0); |
- |
- const int num_rows = 21; |
- GtkTable* table = GTK_TABLE(gtk_table_new(num_rows, 2, FALSE)); |
- gtk_table_set_col_spacing(table, 0, gtk_util::kLabelSpacing); |
- gtk_table_set_row_spacings(table, gtk_util::kControlSpacing); |
- |
- gtk_box_pack_start(GTK_BOX(general_page_vbox_), GTK_WIDGET(table), |
- FALSE, FALSE, 0); |
- int row = 0; |
- const std::string alternative_text = |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_FIELD_NOT_PRESENT); |
- AddTitle(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_SUBJECT_GROUP)); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_COMMON_NAME_LABEL), |
- x509_certificate_model::ProcessIDN( |
- x509_certificate_model::GetSubjectCommonName( |
- cert, alternative_text))); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_ORGANIZATION_LABEL), |
- x509_certificate_model::GetSubjectOrgName( |
- cert, alternative_text)); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_ORGANIZATIONAL_UNIT_LABEL), |
- x509_certificate_model::GetSubjectOrgUnitName( |
- cert, alternative_text)); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_SERIAL_NUMBER_LABEL), |
- x509_certificate_model::GetSerialNumberHexified( |
- cert, alternative_text)); |
- |
- row += 2; // Add spacing (kControlSpacing * 3 == kContentAreaSpacing). |
- |
- AddTitle(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_ISSUER_GROUP)); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_COMMON_NAME_LABEL), |
- x509_certificate_model::ProcessIDN( |
- x509_certificate_model::GetIssuerCommonName( |
- cert, alternative_text))); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_ORGANIZATION_LABEL), |
- x509_certificate_model::GetIssuerOrgName( |
- cert, alternative_text)); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_ORGANIZATIONAL_UNIT_LABEL), |
- x509_certificate_model::GetIssuerOrgUnitName( |
- cert, alternative_text)); |
- |
- row += 2; // Add spacing (kControlSpacing * 3 == kContentAreaSpacing). |
- |
- base::Time issued, expires; |
- std::string issued_str, expires_str; |
- if (x509_certificate_model::GetTimes(cert, &issued, &expires)) { |
- issued_str = UTF16ToUTF8( |
- base::TimeFormatShortDateNumeric(issued)); |
- expires_str = UTF16ToUTF8( |
- base::TimeFormatShortDateNumeric(expires)); |
- } else { |
- issued_str = alternative_text; |
- expires_str = alternative_text; |
- } |
- AddTitle(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_VALIDITY_GROUP)); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_ISSUED_ON_LABEL), |
- issued_str); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_EXPIRES_ON_LABEL), |
- expires_str); |
- |
- row += 2; // Add spacing (kControlSpacing * 3 == kContentAreaSpacing). |
- |
- AddTitle(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_FINGERPRINTS_GROUP)); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_SHA256_FINGERPRINT_LABEL), |
- x509_certificate_model::HashCertSHA256(cert)); |
- AddKeyValue(table, row++, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_SHA1_FINGERPRINT_LABEL), |
- x509_certificate_model::HashCertSHA1(cert)); |
- |
- DCHECK_EQ(row, num_rows); |
-} |
- |
-void CertificateViewer::FillHierarchyStore(GtkTreeStore* hierarchy_store, |
- GtkTreeIter* leaf) const { |
- GtkTreeIter parent; |
- GtkTreeIter* parent_ptr = NULL; |
- GtkTreeIter iter; |
- gint index = cert_chain_list_.size() - 1; |
- for (net::X509Certificate::OSCertHandles::const_reverse_iterator i = |
- cert_chain_list_.rbegin(); |
- i != cert_chain_list_.rend(); ++i, --index) { |
- gtk_tree_store_append(hierarchy_store, &iter, parent_ptr); |
- GtkTreeStore* fields_store = CreateFieldsTreeStore(*i); |
- gtk_tree_store_set( |
- hierarchy_store, &iter, |
- HIERARCHY_NAME, x509_certificate_model::GetTitle(*i).c_str(), |
- HIERARCHY_OBJECT, fields_store, |
- HIERARCHY_INDEX, index, |
- -1); |
- g_object_unref(fields_store); |
- parent = iter; |
- parent_ptr = &parent; |
- } |
- *leaf = iter; |
-} |
- |
-// static |
-void CertificateViewer::FillTreeStoreWithCertFields( |
- GtkTreeStore* store, net::X509Certificate::OSCertHandle cert) { |
- GtkTreeIter top; |
- gtk_tree_store_append(store, &top, NULL); |
- gtk_tree_store_set( |
- store, &top, |
- FIELDS_NAME, x509_certificate_model::GetTitle(cert).c_str(), |
- FIELDS_VALUE, "", |
- -1); |
- |
- GtkTreeIter cert_iter; |
- gtk_tree_store_append(store, &cert_iter, &top); |
- gtk_tree_store_set( |
- store, &cert_iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE).c_str(), |
- FIELDS_VALUE, "", |
- -1); |
- |
- std::string version_str; |
- std::string version = x509_certificate_model::GetVersion(cert); |
- if (!version.empty()) |
- version_str = l10n_util::GetStringFUTF8(IDS_CERT_DETAILS_VERSION_FORMAT, |
- UTF8ToUTF16(version)); |
- GtkTreeIter iter; |
- gtk_tree_store_append(store, &iter, &cert_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_VERSION).c_str(), |
- FIELDS_VALUE, version_str.c_str(), |
- -1); |
- |
- gtk_tree_store_append(store, &iter, &cert_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SERIAL_NUMBER).c_str(), |
- FIELDS_VALUE, |
- x509_certificate_model::GetSerialNumberHexified( |
- cert, |
- l10n_util::GetStringUTF8(IDS_CERT_INFO_FIELD_NOT_PRESENT)).c_str(), |
- -1); |
- |
- gtk_tree_store_append(store, &iter, &cert_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_ALG).c_str(), |
- FIELDS_VALUE, |
- x509_certificate_model::ProcessSecAlgorithmSignature(cert).c_str(), |
- -1); |
- |
- gtk_tree_store_append(store, &iter, &cert_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_ISSUER).c_str(), |
- FIELDS_VALUE, x509_certificate_model::GetIssuerName(cert).c_str(), |
- -1); |
- |
- GtkTreeIter validity_iter; |
- gtk_tree_store_append(store, &validity_iter, &cert_iter); |
- gtk_tree_store_set( |
- store, &validity_iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_VALIDITY).c_str(), |
- FIELDS_VALUE, "", |
- -1); |
- |
- base::Time issued, expires; |
- std::string issued_str, expires_str; |
- if (x509_certificate_model::GetTimes(cert, &issued, &expires)) { |
- issued_str = UTF16ToUTF8(base::TimeFormatShortDateAndTime(issued)); |
- expires_str = UTF16ToUTF8(base::TimeFormatShortDateAndTime(expires)); |
- } |
- gtk_tree_store_append(store, &iter, &validity_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_NOT_BEFORE).c_str(), |
- FIELDS_VALUE, issued_str.c_str(), |
- -1); |
- gtk_tree_store_append(store, &iter, &validity_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_NOT_AFTER).c_str(), |
- FIELDS_VALUE, expires_str.c_str(), |
- -1); |
- |
- gtk_tree_store_append(store, &iter, &cert_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT).c_str(), |
- FIELDS_VALUE, x509_certificate_model::GetSubjectName(cert).c_str(), |
- -1); |
- |
- GtkTreeIter subject_public_key_iter; |
- gtk_tree_store_append(store, &subject_public_key_iter, &cert_iter); |
- gtk_tree_store_set( |
- store, &subject_public_key_iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY_INFO).c_str(), |
- FIELDS_VALUE, "", |
- -1); |
- |
- gtk_tree_store_append(store, &iter, &subject_public_key_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY_ALG).c_str(), |
- FIELDS_VALUE, |
- x509_certificate_model::ProcessSecAlgorithmSubjectPublicKey(cert).c_str(), |
- -1); |
- |
- gtk_tree_store_append(store, &iter, &subject_public_key_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_SUBJECT_KEY).c_str(), |
- FIELDS_VALUE, |
- x509_certificate_model::ProcessSubjectPublicKeyInfo(cert).c_str(), |
- -1); |
- |
- x509_certificate_model::Extensions extensions; |
- x509_certificate_model::GetExtensions( |
- l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_CRITICAL), |
- l10n_util::GetStringUTF8(IDS_CERT_EXTENSION_NON_CRITICAL), |
- cert, &extensions); |
- |
- if (!extensions.empty()) { |
- GtkTreeIter extensions_iter; |
- gtk_tree_store_append(store, &extensions_iter, &cert_iter); |
- gtk_tree_store_set( |
- store, &extensions_iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_EXTENSIONS).c_str(), |
- FIELDS_VALUE, "", |
- -1); |
- |
- for (x509_certificate_model::Extensions::const_iterator i = |
- extensions.begin(); i != extensions.end(); ++i) { |
- gtk_tree_store_append(store, &iter, &extensions_iter); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, i->name.c_str(), |
- FIELDS_VALUE, i->value.c_str(), |
- -1); |
- } |
- } |
- |
- gtk_tree_store_append(store, &iter, &top); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_ALG).c_str(), |
- FIELDS_VALUE, |
- x509_certificate_model::ProcessSecAlgorithmSignatureWrap(cert).c_str(), |
- -1); |
- |
- gtk_tree_store_append(store, &iter, &top); |
- gtk_tree_store_set( |
- store, &iter, |
- FIELDS_NAME, |
- l10n_util::GetStringUTF8(IDS_CERT_DETAILS_CERTIFICATE_SIG_VALUE).c_str(), |
- FIELDS_VALUE, |
- x509_certificate_model::ProcessRawBitsSignatureWrap(cert).c_str(), |
- -1); |
-} |
- |
-// static |
-GtkTreeStore* CertificateViewer::CreateFieldsTreeStore( |
- net::X509Certificate::OSCertHandle cert) { |
- GtkTreeStore* fields_store = gtk_tree_store_new(FIELDS_COLUMNS, G_TYPE_STRING, |
- G_TYPE_STRING); |
- FillTreeStoreWithCertFields(fields_store, cert); |
- return fields_store; |
-} |
- |
-void CertificateViewer::InitDetailsPage() { |
- details_page_vbox_ = gtk_vbox_new(FALSE, gtk_util::kContentAreaSpacing); |
- gtk_container_set_border_width(GTK_CONTAINER(details_page_vbox_), |
- gtk_util::kContentAreaBorder); |
- |
- GtkWidget* hierarchy_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); |
- gtk_box_pack_start(GTK_BOX(details_page_vbox_), hierarchy_vbox, |
- FALSE, FALSE, 0); |
- |
- gtk_box_pack_start(GTK_BOX(hierarchy_vbox), |
- gtk_util::CreateBoldLabel(l10n_util::GetStringUTF8( |
- IDS_CERT_DETAILS_CERTIFICATE_HIERARCHY_LABEL)), |
- FALSE, FALSE, 0); |
- |
- GtkTreeStore* hierarchy_store = gtk_tree_store_new(HIERARCHY_COLUMNS, |
- G_TYPE_STRING, |
- G_TYPE_OBJECT, |
- G_TYPE_INT); |
- GtkTreeIter hierarchy_leaf_iter; |
- FillHierarchyStore(hierarchy_store, &hierarchy_leaf_iter); |
- GtkWidget* hierarchy_tree = gtk_tree_view_new_with_model( |
- GTK_TREE_MODEL(hierarchy_store)); |
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(hierarchy_tree), FALSE); |
- gtk_tree_view_append_column( |
- GTK_TREE_VIEW(hierarchy_tree), |
- gtk_tree_view_column_new_with_attributes("", gtk_cell_renderer_text_new(), |
- "text", HIERARCHY_NAME, |
- NULL)); |
- gtk_tree_view_expand_all(GTK_TREE_VIEW(hierarchy_tree)); |
- hierarchy_selection_ = gtk_tree_view_get_selection( |
- GTK_TREE_VIEW(hierarchy_tree)); |
- gtk_tree_selection_set_mode(hierarchy_selection_, GTK_SELECTION_SINGLE); |
- g_signal_connect(hierarchy_selection_, "changed", |
- G_CALLBACK(OnHierarchySelectionChanged), this); |
- GtkWidget* hierarchy_scroll_window = gtk_scrolled_window_new(NULL, NULL); |
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(hierarchy_scroll_window), |
- GTK_POLICY_AUTOMATIC, |
- GTK_POLICY_NEVER); |
- gtk_scrolled_window_set_shadow_type( |
- GTK_SCROLLED_WINDOW(hierarchy_scroll_window), GTK_SHADOW_ETCHED_IN); |
- gtk_container_add(GTK_CONTAINER(hierarchy_scroll_window), hierarchy_tree); |
- gtk_box_pack_start(GTK_BOX(hierarchy_vbox), |
- hierarchy_scroll_window, FALSE, FALSE, 0); |
- |
- GtkWidget* fields_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); |
- gtk_box_pack_start(GTK_BOX(details_page_vbox_), fields_vbox, |
- TRUE, TRUE, 0); |
- gtk_box_pack_start(GTK_BOX(fields_vbox), |
- gtk_util::CreateBoldLabel(l10n_util::GetStringUTF8( |
- IDS_CERT_DETAILS_CERTIFICATE_FIELDS_LABEL)), |
- FALSE, FALSE, 0); |
- |
- fields_tree_ = gtk_tree_view_new(); |
- gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(fields_tree_), FALSE); |
- gtk_tree_view_append_column( |
- GTK_TREE_VIEW(fields_tree_), |
- gtk_tree_view_column_new_with_attributes("", gtk_cell_renderer_text_new(), |
- "text", FIELDS_NAME, |
- NULL)); |
- GtkTreeSelection* fields_selection = gtk_tree_view_get_selection( |
- GTK_TREE_VIEW(fields_tree_)); |
- gtk_tree_selection_set_mode(fields_selection, GTK_SELECTION_SINGLE); |
- g_signal_connect(fields_selection, "changed", |
- G_CALLBACK(OnFieldsSelectionChanged), this); |
- GtkWidget* fields_scroll_window = gtk_scrolled_window_new(NULL, NULL); |
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(fields_scroll_window), |
- GTK_POLICY_AUTOMATIC, |
- GTK_POLICY_AUTOMATIC); |
- gtk_scrolled_window_set_shadow_type( |
- GTK_SCROLLED_WINDOW(fields_scroll_window), GTK_SHADOW_ETCHED_IN); |
- gtk_container_add(GTK_CONTAINER(fields_scroll_window), fields_tree_); |
- gtk_box_pack_start(GTK_BOX(fields_vbox), |
- fields_scroll_window, TRUE, TRUE, 0); |
- |
- GtkWidget* value_vbox = gtk_vbox_new(FALSE, gtk_util::kControlSpacing); |
- gtk_box_pack_start(GTK_BOX(details_page_vbox_), value_vbox, |
- TRUE, TRUE, 0); |
- gtk_box_pack_start(GTK_BOX(value_vbox), |
- gtk_util::CreateBoldLabel(l10n_util::GetStringUTF8( |
- IDS_CERT_DETAILS_CERTIFICATE_FIELD_VALUE_LABEL)), |
- FALSE, FALSE, 0); |
- |
- // TODO(mattm): fix text view coloring (should have grey background). |
- GtkWidget* field_value_view = gtk_text_view_new(); |
- gtk_text_view_set_editable(GTK_TEXT_VIEW(field_value_view), FALSE); |
- gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(field_value_view), GTK_WRAP_NONE); |
- field_value_buffer_ = gtk_text_view_get_buffer( |
- GTK_TEXT_VIEW(field_value_view)); |
- GtkWidget* value_scroll_window = gtk_scrolled_window_new(NULL, NULL); |
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(value_scroll_window), |
- GTK_POLICY_AUTOMATIC, |
- GTK_POLICY_AUTOMATIC); |
- gtk_scrolled_window_set_shadow_type( |
- GTK_SCROLLED_WINDOW(value_scroll_window), GTK_SHADOW_ETCHED_IN); |
- gtk_container_add(GTK_CONTAINER(value_scroll_window), field_value_view); |
- gtk_box_pack_start(GTK_BOX(value_vbox), |
- value_scroll_window, TRUE, TRUE, 0); |
- |
- gtk_widget_ensure_style(field_value_view); |
- PangoFontDescription* font_desc = pango_font_description_copy( |
- gtk_widget_get_style(field_value_view)->font_desc); |
- pango_font_description_set_family(font_desc, kDetailsFontFamily); |
- gtk_widget_modify_font(field_value_view, font_desc); |
- pango_font_description_free(font_desc); |
- |
- GtkWidget* export_hbox = gtk_hbox_new(FALSE, 0); |
- gtk_box_pack_start(GTK_BOX(details_page_vbox_), export_hbox, |
- FALSE, FALSE, 0); |
- export_button_ = gtk_button_new_with_mnemonic( |
- gfx::ConvertAcceleratorsFromWindowsStyle( |
- l10n_util::GetStringUTF8( |
- IDS_CERT_DETAILS_EXPORT_CERTIFICATE)).c_str()); |
- g_signal_connect(export_button_, "clicked", |
- G_CALLBACK(OnExportClicked), this); |
- gtk_box_pack_start(GTK_BOX(export_hbox), export_button_, |
- FALSE, FALSE, 0); |
- |
- // Select the initial certificate in the hierarchy. |
- gtk_tree_selection_select_iter(hierarchy_selection_, &hierarchy_leaf_iter); |
-} |
- |
-// static |
-void CertificateViewer::OnHierarchySelectionChanged( |
- GtkTreeSelection* selection, CertificateViewer* viewer) { |
- GtkTreeIter iter; |
- GtkTreeModel* model; |
- if (gtk_tree_selection_get_selected(selection, &model, &iter)) { |
- GtkTreeStore* fields_store = NULL; |
- gtk_tree_model_get(model, &iter, HIERARCHY_OBJECT, &fields_store, -1); |
- gtk_tree_view_set_model(GTK_TREE_VIEW(viewer->fields_tree_), |
- GTK_TREE_MODEL(fields_store)); |
- gtk_tree_view_expand_all(GTK_TREE_VIEW(viewer->fields_tree_)); |
- gtk_widget_set_sensitive(viewer->export_button_, TRUE); |
- } else { |
- gtk_tree_view_set_model(GTK_TREE_VIEW(viewer->fields_tree_), NULL); |
- gtk_widget_set_sensitive(viewer->export_button_, FALSE); |
- } |
-} |
- |
-// static |
-void CertificateViewer::OnFieldsSelectionChanged(GtkTreeSelection* selection, |
- CertificateViewer* viewer) { |
- GtkTreeIter iter; |
- GtkTreeModel* model; |
- if (gtk_tree_selection_get_selected(selection, &model, &iter)) { |
- gchar* value_string = NULL; |
- gtk_tree_model_get(model, &iter, FIELDS_VALUE, &value_string, -1); |
- if (value_string) { |
- gtk_text_buffer_set_text(viewer->field_value_buffer_, value_string, -1); |
- g_free(value_string); |
- } else { |
- gtk_text_buffer_set_text(viewer->field_value_buffer_, "", 0); |
- } |
- } else { |
- gtk_text_buffer_set_text(viewer->field_value_buffer_, "", 0); |
- } |
-} |
- |
-// static |
-void CertificateViewer::OnExportClicked(GtkButton *button, |
- CertificateViewer* viewer) { |
- GtkTreeIter iter; |
- GtkTreeModel* model; |
- if (!gtk_tree_selection_get_selected(viewer->hierarchy_selection_, &model, |
- &iter)) |
- return; |
- gint cert_index = -1; |
- gtk_tree_model_get(model, &iter, HIERARCHY_INDEX, &cert_index, -1); |
- |
- if (cert_index < 0) { |
- NOTREACHED(); |
- return; |
- } |
- |
- ShowCertExportDialog(GTK_WINDOW(viewer->dialog_), |
- viewer->cert_chain_list_[cert_index]); |
-} |
- |
-void CertificateViewer::Show() { |
- gtk_util::ShowDialog(dialog_); |
-} |
- |
-} // namespace |
- |
-void ShowCertificateViewer(gfx::NativeWindow parent, |
- net::X509Certificate::OSCertHandle cert) { |
- net::X509Certificate::OSCertHandles cert_chain; |
- x509_certificate_model::GetCertChainFromCert(cert, &cert_chain); |
- (new CertificateViewer(parent, cert_chain))->Show(); |
-} |
- |
-void ShowCertificateViewer(gfx::NativeWindow parent, |
- net::X509Certificate* cert) { |
- ShowCertificateViewer(parent, cert->os_cert_handle()); |
-} |