diff options
author | Milan Crha <mcrha@redhat.com> | 2012-12-12 02:48:07 +0800 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2012-12-12 02:48:07 +0800 |
commit | 8a1eb1f24e2a4624d78d3eeb4ab563d9e48ec865 (patch) | |
tree | a1bc41f9d06c7206fc4ba9a217b356966a99a569 /smime/gui | |
parent | c18043684137440e5853d5c952f89751148b6c24 (diff) | |
download | gsoc2013-evolution-8a1eb1f24e2a4624d78d3eeb4ab563d9e48ec865.tar.gz gsoc2013-evolution-8a1eb1f24e2a4624d78d3eeb4ab563d9e48ec865.tar.zst gsoc2013-evolution-8a1eb1f24e2a4624d78d3eeb4ab563d9e48ec865.zip |
Use the same certificate-viewer as the trust-prompt from eds
This way it'll be possible to copy whole files if change in one
of them will be done. A real code reuse, rather than copy, would be
ideal, but the trust-prompt is just a module for evolution-user-prompter.
Diffstat (limited to 'smime/gui')
-rw-r--r-- | smime/gui/ca-trust-dialog.c | 8 | ||||
-rw-r--r-- | smime/gui/ca-trust-dialog.h | 6 | ||||
-rw-r--r-- | smime/gui/certificate-manager.c | 33 | ||||
-rw-r--r-- | smime/gui/certificate-manager.h | 4 | ||||
-rw-r--r-- | smime/gui/certificate-viewer.c | 725 | ||||
-rw-r--r-- | smime/gui/certificate-viewer.h | 13 | ||||
-rw-r--r-- | smime/gui/smime-ui.ui | 708 |
7 files changed, 565 insertions, 932 deletions
diff --git a/smime/gui/ca-trust-dialog.c b/smime/gui/ca-trust-dialog.c index 7037b26677..332b92bcd1 100644 --- a/smime/gui/ca-trust-dialog.c +++ b/smime/gui/ca-trust-dialog.c @@ -26,7 +26,7 @@ #endif #include "ca-trust-dialog.h" -#include "certificate-viewer.h" +#include "certificate-manager.h" #include <glib/gi18n.h> @@ -60,12 +60,14 @@ catd_response (GtkWidget *w, { switch (id) { case GTK_RESPONSE_ACCEPT: { - GtkWidget *dialog = certificate_viewer_show (data->cert); + GtkWidget *dialog; + + dialog = e_cert_manager_new_certificate_viewer (GTK_WINDOW (data->dialog), data->cert); g_signal_stop_emission_by_name (w, "response"); - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (data->dialog)); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); + break; } } } diff --git a/smime/gui/ca-trust-dialog.h b/smime/gui/ca-trust-dialog.h index 8b7d945c00..62b842d945 100644 --- a/smime/gui/ca-trust-dialog.h +++ b/smime/gui/ca-trust-dialog.h @@ -21,8 +21,8 @@ * */ -#ifndef _CA_TRUST_DIALOG_H_ -#define _CA_TRUST_DIALOG_H +#ifndef CA_TRUST_DIALOG_H +#define CA_TRUST_DIALOG_H #include <gtk/gtk.h> #include "e-cert.h" @@ -32,4 +32,4 @@ GtkWidget * ca_trust_dialog_show (ECert *cert, gboolean importing); void ca_trust_dialog_set_trust (GtkWidget *widget, gboolean ssl, gboolean email, gboolean objsign); void ca_trust_dialog_get_trust (GtkWidget *widget, gboolean *ssl, gboolean *email, gboolean *objsign); -#endif /* _CA_TRUST_DIALOG_H_ */ +#endif /* CA_TRUST_DIALOG_H */ diff --git a/smime/gui/certificate-manager.c b/smime/gui/certificate-manager.c index 548c9c7d79..109bbba515 100644 --- a/smime/gui/certificate-manager.c +++ b/smime/gui/certificate-manager.c @@ -531,7 +531,13 @@ view_cert (GtkWidget *button, -1); if (cert) { - GtkWidget *dialog = certificate_viewer_show (cert); + GtkWidget *dialog, *parent; + + parent = gtk_widget_get_toplevel (button); + if (!parent || !GTK_IS_WINDOW (parent)) + parent = NULL; + + dialog = e_cert_manager_new_certificate_viewer ((GtkWindow *) parent, cert); g_signal_connect ( dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL); @@ -1107,3 +1113,28 @@ e_cert_manager_config_new (EPreferencesWindow *window) return GTK_WIDGET (ecmc); } + +GtkWidget * +e_cert_manager_new_certificate_viewer (GtkWindow *parent, + ECert *cert) +{ + GtkWidget *dialog; + GList *chain, *citer; + GSList *issuers = NULL; + + g_return_val_if_fail (cert != NULL, NULL); + + chain = e_cert_get_issuers_chain (cert); + for (citer = chain; citer; citer = g_list_next (citer)) { + issuers = g_slist_append (issuers, e_cert_get_internal_cert (citer->data)); + } + + dialog = certificate_viewer_new ((GtkWindow *) parent, + e_cert_get_internal_cert (cert), + issuers); + + g_list_free_full (chain, g_object_unref); + g_slist_free (issuers); + + return dialog; +} diff --git a/smime/gui/certificate-manager.h b/smime/gui/certificate-manager.h index 2eba92cd01..0f74d30694 100644 --- a/smime/gui/certificate-manager.h +++ b/smime/gui/certificate-manager.h @@ -65,6 +65,10 @@ GType e_cert_manager_config_get_type (void) G_GNUC_CONST; GtkWidget *e_cert_manager_config_new (EPreferencesWindow *window); +struct _ECert; /* forward declaration */ +GtkWidget *e_cert_manager_new_certificate_viewer (GtkWindow *parent, + struct _ECert *cert); + G_END_DECLS #endif /* _CERTIFICATE_MANAGER_H_ */ diff --git a/smime/gui/certificate-viewer.c b/smime/gui/certificate-viewer.c index 9f140cadaa..ce96e50d35 100644 --- a/smime/gui/certificate-viewer.c +++ b/smime/gui/certificate-viewer.c @@ -17,359 +17,662 @@ * Chris Toshok <toshok@ximian.com> * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * */ #ifdef HAVE_CONFIG_H #include <config.h> #endif -#include "certificate-viewer.h" +#include <glib/gi18n.h> -#include "e-asn1-object.h" +#include "pk11pub.h" +#include "hasht.h" -#include <glib/gi18n.h> +#include <libedataserver/libedataserver.h> -#include "e-util/e-util.h" -#include "e-util/e-util-private.h" +#include "e-asn1-object.h" +#include "certificate-viewer.h" -typedef struct { - GtkBuilder *builder; - GtkWidget *dialog; - GtkTreeStore *hierarchy_store, *fields_store; - GtkWidget *hierarchy_tree, *fields_tree; - GtkWidget *field_text; - GtkTextTag *text_tag; +#define CERTIFICATE_VIEWER_PRIV_KEY "CertificateViewerPriv-key" - GList *cert_chain; -} CertificateViewerData; +typedef struct _CertificateViewerPriv +{ + GtkWidget *issued_to_cn; + GtkWidget *issued_to_o; + GtkWidget *issued_to_ou; + GtkWidget *issued_to_serial; + GtkWidget *issued_by_cn; + GtkWidget *issued_by_o; + GtkWidget *issued_by_ou; + GtkWidget *validity_issued_on; + GtkWidget *validity_expires_on; + GtkWidget *fingerprints_sha1; + GtkWidget *fingerprints_md5; + GtkWidget *cert_hierarchy_treeview; + GtkWidget *cert_fields_treeview; + GtkWidget *cert_field_value_textview; + + CERTCertificate *cert; + GSList *issuers; + GtkTextTag *monospace_tag; +} CertificateViewerPriv; static void -free_data (gpointer data, - GObject *where_the_object_was) +free_priv_struct (gpointer ptr) { - CertificateViewerData *cvm = data; + CertificateViewerPriv *priv = ptr; + GSList *iter; - g_list_foreach (cvm->cert_chain, (GFunc) g_object_unref, NULL); - g_list_free (cvm->cert_chain); + if (!priv) + return; - g_object_unref (cvm->builder); - g_free (cvm); -} + if (priv->cert) + CERT_DestroyCertificate (priv->cert); -#define NOT_PART_OF_CERT_MARKUP "<i><Not part of certificate></i>" + for (iter = priv->issuers; iter; iter = iter->next) { + CERTCertificate *cert = iter->data; + + if (cert) + CERT_DestroyCertificate (cert); + } + + g_slist_free (priv->issuers); + + g_free (priv); +} static void -fill_in_general (CertificateViewerData *cvm_data, - ECert *cert) +begin_section (GtkGrid *add_to, + const gchar *caption, + gint *from_row, + gint for_rows) { - GtkWidget *label; - const gchar *text; - gchar *markup; - - /* issued to */ - label = e_builder_get_widget (cvm_data->builder, "issued-to-cn"); - if (e_cert_get_cn (cert)) { - gtk_label_set_text (GTK_LABEL (label), e_cert_get_cn (cert)); - } - else { - gtk_label_set_markup (GTK_LABEL (label), NOT_PART_OF_CERT_MARKUP); - } + GtkWidget *widget; + PangoAttribute *attr; + PangoAttrList *bold; + + g_return_if_fail (add_to != NULL); + g_return_if_fail (caption != NULL); + g_return_if_fail (from_row != NULL); + + bold = pango_attr_list_new (); + attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD); + pango_attr_list_insert (bold, attr); + + widget = gtk_label_new (caption); + g_object_set (G_OBJECT (widget), + "hexpand", TRUE, + "halign", GTK_ALIGN_START, + "justify", GTK_JUSTIFY_LEFT, + "attributes", bold, + "ellipsize", PANGO_ELLIPSIZE_NONE, + NULL); - label = e_builder_get_widget (cvm_data->builder, "issued-to-o"); - if (e_cert_get_org (cert)) { - gtk_label_set_text (GTK_LABEL (label), e_cert_get_org (cert)); - } - else { - gtk_label_set_markup (GTK_LABEL (label), NOT_PART_OF_CERT_MARKUP); - } + pango_attr_list_unref (bold); - label = e_builder_get_widget (cvm_data->builder, "issued-to-ou"); - if (e_cert_get_org_unit (cert)) { - gtk_label_set_text (GTK_LABEL (label), e_cert_get_org_unit (cert)); - } - else { - gtk_label_set_markup (GTK_LABEL (label), NOT_PART_OF_CERT_MARKUP); - } + gtk_grid_attach (add_to, widget, 0, *from_row, 3, 1); + (*from_row)++; - text = e_cert_get_serial_number (cert); - label = e_builder_get_widget (cvm_data->builder, "issued-to-serial"); - gtk_label_set_text (GTK_LABEL (label), text); + widget = gtk_alignment_new (0.0, 0.0, 0.0, 0.0); + gtk_alignment_set_padding (GTK_ALIGNMENT (widget), 0, 0, 12, 0); - /* issued by */ - label = e_builder_get_widget (cvm_data->builder, "issued-by-cn"); - if (e_cert_get_issuer_cn (cert)) { - gtk_label_set_text (GTK_LABEL (label), e_cert_get_issuer_cn (cert)); - } - else { - gtk_label_set_markup (GTK_LABEL (label), NOT_PART_OF_CERT_MARKUP); - } + gtk_grid_attach (add_to, widget, 0, *from_row, 1, for_rows); +} - label = e_builder_get_widget (cvm_data->builder, "issued-by-o"); - if (e_cert_get_issuer_org (cert)) { - gtk_label_set_text (GTK_LABEL (label), e_cert_get_issuer_org (cert)); - } - else { - gtk_label_set_markup (GTK_LABEL (label), NOT_PART_OF_CERT_MARKUP); - } +static GtkWidget * +add_info_label (GtkGrid *add_to, + const gchar *caption, + gint *at_row) +{ + GtkWidget *widget; - label = e_builder_get_widget (cvm_data->builder, "issued-by-ou"); - if (e_cert_get_issuer_org_unit (cert)) { - gtk_label_set_text (GTK_LABEL (label), e_cert_get_issuer_org_unit (cert)); - } - else { - gtk_label_set_markup (GTK_LABEL (label), NOT_PART_OF_CERT_MARKUP); - } + g_return_val_if_fail (add_to != NULL, NULL); + g_return_val_if_fail (at_row != NULL, NULL); - /* validity */ - label = e_builder_get_widget (cvm_data->builder, "validity-issued-on"); - if (e_cert_get_issued_on (cert)) { - gtk_label_set_text (GTK_LABEL (label), e_cert_get_issued_on (cert)); - } - else { - gtk_label_set_markup (GTK_LABEL (label), NOT_PART_OF_CERT_MARKUP); - } + if (caption) { + widget = gtk_label_new (caption); + g_object_set (G_OBJECT (widget), + "hexpand", FALSE, + "halign", GTK_ALIGN_START, + "justify", GTK_JUSTIFY_LEFT, + "ellipsize", PANGO_ELLIPSIZE_NONE, + NULL); - label = e_builder_get_widget (cvm_data->builder, "validity-expires-on"); - if (e_cert_get_expires_on (cert)) { - gtk_label_set_text (GTK_LABEL (label), e_cert_get_expires_on (cert)); + gtk_grid_attach (add_to, widget, 1, *at_row, 1, 1); } - else { - gtk_label_set_markup (GTK_LABEL (label), NOT_PART_OF_CERT_MARKUP); + + widget = gtk_label_new (""); + g_object_set (G_OBJECT (widget), + "hexpand", TRUE, + "halign", GTK_ALIGN_START, + "justify", GTK_JUSTIFY_LEFT, + "ellipsize", PANGO_ELLIPSIZE_NONE, + "selectable", caption != NULL, + NULL); + + gtk_grid_attach (add_to, widget, caption ? 2 : 1, *at_row, caption ? 1 : 2, 1); + + (*at_row)++; + + return widget; +} + +static GtkWidget * +add_scrolled_window (GtkGrid *add_to, + const gchar *caption, + gint *at_row, + GtkWidget *add_widget) +{ + GtkWidget *widget; + PangoAttribute *attr; + PangoAttrList *bold; + + g_return_val_if_fail (add_to != NULL, NULL); + g_return_val_if_fail (caption != NULL, NULL); + g_return_val_if_fail (at_row != NULL, NULL); + + bold = pango_attr_list_new (); + attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD); + pango_attr_list_insert (bold, attr); + + widget = gtk_label_new (caption); + g_object_set (G_OBJECT (widget), + "hexpand", TRUE, + "halign", GTK_ALIGN_START, + "justify", GTK_JUSTIFY_LEFT, + "attributes", bold, + "ellipsize", PANGO_ELLIPSIZE_NONE, + NULL); + + pango_attr_list_unref (bold); + + gtk_grid_attach (add_to, widget, 0, *at_row, 1, 1); + (*at_row)++; + + widget = gtk_scrolled_window_new (NULL, NULL); + g_object_set (G_OBJECT (widget), + "hexpand", TRUE, + "halign", GTK_ALIGN_FILL, + "vexpand", TRUE, + "valign", GTK_ALIGN_FILL, + "hscrollbar-policy", GTK_POLICY_AUTOMATIC, + "vscrollbar-policy", GTK_POLICY_AUTOMATIC, + "shadow-type", GTK_SHADOW_ETCHED_IN, + NULL); + + gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (widget), add_widget); + + gtk_grid_attach (add_to, widget, 0, *at_row, 1, 1); + (*at_row)++; + + return add_widget; +} + +#define FLAG_NONE (0) +#define FLAG_PORT_MEMORY (1 << 0) +#define FLAG_MARKUP (1 << 1) + +static void +set_label_text (GtkWidget *label, + const gchar *not_part_markup, + gchar *text, + guint32 flags) +{ + if (text) { + if ((flags & FLAG_MARKUP) != 0) + gtk_label_set_markup (GTK_LABEL (label), text); + else + gtk_label_set_text (GTK_LABEL (label), text); + + if ((flags & FLAG_PORT_MEMORY) != 0) + PORT_Free (text); + else + g_free (text); + } else { + gtk_label_set_markup (GTK_LABEL (label), not_part_markup); } +} - /* fingerprints */ - markup = g_strdup_printf ("<tt>%s</tt>", e_cert_get_sha1_fingerprint (cert)); - label = e_builder_get_widget (cvm_data->builder, "fingerprints-sha1"); - gtk_label_set_markup (GTK_LABEL (label), markup); - g_free (markup); +static void +get_cert_times (CERTCertificate *cert, + gchar **issued_on, + gchar **expires_on) +{ + PRTime time_issued_on; + PRTime time_expires_on; + PRExplodedTime explodedTime; + struct tm exploded_tm; + gchar buf[128]; + + g_return_if_fail (cert != NULL); + g_return_if_fail (issued_on != NULL); + g_return_if_fail (expires_on != NULL); + + if (SECSuccess != CERT_GetCertTimes (cert, &time_issued_on, &time_expires_on)) + return; + + PR_ExplodeTime (time_issued_on, PR_LocalTimeParameters, &explodedTime); + exploded_tm.tm_sec = explodedTime.tm_sec; + exploded_tm.tm_min = explodedTime.tm_min; + exploded_tm.tm_hour = explodedTime.tm_hour; + exploded_tm.tm_mday = explodedTime.tm_mday; + exploded_tm.tm_mon = explodedTime.tm_month; + exploded_tm.tm_year = explodedTime.tm_year - 1900; + e_utf8_strftime (buf, sizeof (buf), "%x", &exploded_tm); + *issued_on = g_strdup (buf); + + PR_ExplodeTime (time_expires_on, PR_LocalTimeParameters, &explodedTime); + exploded_tm.tm_sec = explodedTime.tm_sec; + exploded_tm.tm_min = explodedTime.tm_min; + exploded_tm.tm_hour = explodedTime.tm_hour; + exploded_tm.tm_mday = explodedTime.tm_mday; + exploded_tm.tm_mon = explodedTime.tm_month; + exploded_tm.tm_year = explodedTime.tm_year - 1900; + e_utf8_strftime (buf, sizeof (buf), "%x", &exploded_tm); + *expires_on = g_strdup (buf); +} - markup = g_strdup_printf ("<tt>%s</tt>", e_cert_get_md5_fingerprint (cert)); - label = e_builder_get_widget (cvm_data->builder, "fingerprints-md5"); - gtk_label_set_markup (GTK_LABEL (label), markup); - g_free (markup); +static void +fill_general_page (CertificateViewerPriv *priv) +{ + gchar *not_part_markup; + gchar *issued_on = NULL; + gchar *expires_on = NULL; + gchar *port_str; + guchar fingerprint[128]; + SECItem fpItem; + + g_return_if_fail (priv != NULL); + + not_part_markup = g_strconcat ("<i><", _("Not part of certificate"), "></i>", NULL); + + set_label_text (priv->issued_to_cn, not_part_markup, CERT_GetCommonName (&priv->cert->subject), FLAG_PORT_MEMORY); + set_label_text (priv->issued_to_o, not_part_markup, CERT_GetOrgName (&priv->cert->subject), FLAG_PORT_MEMORY); + set_label_text (priv->issued_to_ou, not_part_markup, CERT_GetOrgUnitName (&priv->cert->subject), FLAG_PORT_MEMORY); + set_label_text (priv->issued_to_serial, not_part_markup, CERT_Hexify (&priv->cert->serialNumber, TRUE), FLAG_PORT_MEMORY); + + set_label_text (priv->issued_by_cn, not_part_markup, CERT_GetCommonName (&priv->cert->issuer), FLAG_PORT_MEMORY); + set_label_text (priv->issued_by_o, not_part_markup, CERT_GetOrgName (&priv->cert->issuer), FLAG_PORT_MEMORY); + set_label_text (priv->issued_by_ou, not_part_markup, CERT_GetOrgUnitName (&priv->cert->issuer), FLAG_PORT_MEMORY); + + get_cert_times (priv->cert, &issued_on, &expires_on); + set_label_text (priv->validity_issued_on, not_part_markup, issued_on, FLAG_NONE); + set_label_text (priv->validity_expires_on, not_part_markup, expires_on, FLAG_NONE); + + memset (fingerprint, 0, sizeof fingerprint); + PK11_HashBuf ( + SEC_OID_SHA1, fingerprint, + priv->cert->derCert.data, + priv->cert->derCert.len); + fpItem.data = fingerprint; + fpItem.len = SHA1_LENGTH; + port_str = CERT_Hexify (&fpItem, TRUE); + set_label_text (priv->fingerprints_sha1, not_part_markup, g_strconcat ("<tt>", port_str, "</tt>", NULL), FLAG_MARKUP); + PORT_Free (port_str); + + memset (fingerprint, 0, sizeof fingerprint); + PK11_HashBuf ( + SEC_OID_MD5, fingerprint, + priv->cert->derCert.data, + priv->cert->derCert.len); + fpItem.data = fingerprint; + fpItem.len = MD5_LENGTH; + port_str = CERT_Hexify (&fpItem, TRUE); + set_label_text (priv->fingerprints_md5, not_part_markup, g_strconcat ("<tt>", port_str, "</tt>", NULL), FLAG_MARKUP); + PORT_Free (port_str); + + g_free (not_part_markup); } static void -populate_fields_tree (CertificateViewerData *cvm_data, +populate_fields_tree (CertificateViewerPriv *priv, EASN1Object *asn1, GtkTreeIter *root) { + GtkTreeStore *fields_store; GtkTreeIter new_iter; + if (!asn1) + return; + + fields_store = GTK_TREE_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (priv->cert_fields_treeview))); + /* first insert a node for the current asn1 */ - gtk_tree_store_insert (cvm_data->fields_store, &new_iter, root, -1); + gtk_tree_store_insert (fields_store, &new_iter, root, -1); gtk_tree_store_set ( - cvm_data->fields_store, &new_iter, + fields_store, &new_iter, 0, e_asn1_object_get_display_name (asn1), 1, asn1, -1); if (e_asn1_object_is_valid_container (asn1)) { GList *children = e_asn1_object_get_children (asn1); + if (children) { - GList *l; - for (l = children; l; l = l->next) { - EASN1Object *subasn1 = l->data; - populate_fields_tree (cvm_data, subasn1, &new_iter); + GList *iter; + for (iter = children; iter; iter = iter->next) { + EASN1Object *subasn1 = iter->data; + + populate_fields_tree (priv, subasn1, &new_iter); } } - g_list_foreach (children, (GFunc) g_object_unref, NULL); - g_list_free (children); + + g_list_free_full (children, g_object_unref); } } static void -hierarchy_selection_changed (GtkTreeSelection *selection, - CertificateViewerData *cvm_data) +hierarchy_selection_changed_cb (GtkTreeSelection *selection, + CertificateViewerPriv *priv) { GtkTreeIter iter; GtkTreeModel *model; - if (gtk_tree_selection_get_selected (selection, - &model, - &iter)) { - EASN1Object *asn1_object; - ECert *cert; + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + CERTCertificate *cert; + EASN1Object *asn1; + GtkTreeStore *fields_store; - gtk_tree_model_get ( - model, - &iter, - 1, &cert, - -1); + gtk_tree_model_get (model, &iter, 1, &cert, -1); if (!cert) return; /* display the cert's ASN1 structure */ - asn1_object = e_cert_get_asn1_struct (cert); + asn1 = e_asn1_object_new_from_cert (cert); /* wipe out the old model */ - cvm_data->fields_store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); + fields_store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_OBJECT); gtk_tree_view_set_model ( - GTK_TREE_VIEW (cvm_data->fields_tree), - GTK_TREE_MODEL (cvm_data->fields_store)); + GTK_TREE_VIEW (priv->cert_fields_treeview), + GTK_TREE_MODEL (fields_store)); /* populate the fields from the newly selected cert */ - populate_fields_tree (cvm_data, asn1_object, NULL); - gtk_tree_view_expand_all (GTK_TREE_VIEW (cvm_data->fields_tree)); - g_object_unref (asn1_object); + populate_fields_tree (priv, asn1, NULL); + gtk_tree_view_expand_all (GTK_TREE_VIEW (priv->cert_fields_treeview)); + if (asn1) + g_object_unref (asn1); /* and blow away the field value */ gtk_text_buffer_set_text ( - gtk_text_view_get_buffer (GTK_TEXT_VIEW (cvm_data->field_text)), + gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->cert_field_value_textview)), "", 0); } } static void -fields_selection_changed (GtkTreeSelection *selection, - CertificateViewerData *cvm_data) +fields_selection_changed_cb (GtkTreeSelection *selection, + CertificateViewerPriv *priv) { GtkTreeIter iter; GtkTreeModel *model; - if (gtk_tree_selection_get_selected (selection, - &model, - &iter)) { - EASN1Object *asn1_object; - const gchar *value; + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + EASN1Object *asn1 = NULL; + const gchar *value = NULL; + GtkTextView *textview; + GtkTextBuffer *textbuffer; - gtk_tree_model_get ( - model, - &iter, - 1, &asn1_object, - -1); + gtk_tree_model_get (model, &iter, 1, &asn1, -1); - value = e_asn1_object_get_display_value (asn1_object); + if (asn1) + value = e_asn1_object_get_display_value (asn1); - gtk_text_buffer_set_text ( - gtk_text_view_get_buffer (GTK_TEXT_VIEW (cvm_data->field_text)), - "", 0); + textview = GTK_TEXT_VIEW (priv->cert_field_value_textview); + textbuffer = gtk_text_view_get_buffer (textview); + + gtk_text_buffer_set_text (textbuffer, "", 0); if (value) { GtkTextIter text_iter; - gtk_text_buffer_get_start_iter ( - gtk_text_view_get_buffer (GTK_TEXT_VIEW (cvm_data->field_text)), - &text_iter); + gtk_text_buffer_get_start_iter (textbuffer, &text_iter); - gtk_text_buffer_insert_with_tags ( - gtk_text_view_get_buffer (GTK_TEXT_VIEW (cvm_data->field_text)), - &text_iter, + gtk_text_buffer_insert_with_tags (textbuffer, &text_iter, value, strlen (value), - cvm_data->text_tag, NULL); + priv->monospace_tag, NULL); } + + if (asn1) + g_object_unref (asn1); } } static void -fill_in_details (CertificateViewerData *cvm_data, - ECert *cert) +fill_details_page (CertificateViewerPriv *priv) { - GList *l; + GSList *iter; GtkTreeIter root; GtkTreeSelection *selection; gboolean root_set = FALSE; + GtkTreeStore *hierarchy_store; - /* hook up all the hierarchy tree foo */ - cvm_data->hierarchy_store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_OBJECT); - cvm_data->hierarchy_tree = e_builder_get_widget (cvm_data->builder, "cert-hierarchy-treeview"); + g_return_if_fail (priv != NULL); + + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->cert_hierarchy_treeview), FALSE); + + hierarchy_store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); gtk_tree_view_set_model ( - GTK_TREE_VIEW (cvm_data->hierarchy_tree), - GTK_TREE_MODEL (cvm_data->hierarchy_store)); + GTK_TREE_VIEW (priv->cert_hierarchy_treeview), + GTK_TREE_MODEL (hierarchy_store)); gtk_tree_view_insert_column_with_attributes ( - GTK_TREE_VIEW (cvm_data->hierarchy_tree), + GTK_TREE_VIEW (priv->cert_hierarchy_treeview), -1, "Cert", gtk_cell_renderer_text_new (), "text", 0, NULL); - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (cvm_data->hierarchy_tree)); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->cert_hierarchy_treeview)); g_signal_connect ( selection, "changed", - G_CALLBACK (hierarchy_selection_changed), cvm_data); + G_CALLBACK (hierarchy_selection_changed_cb), priv); - /* hook up all the fields tree foo */ - cvm_data->fields_tree = e_builder_get_widget (cvm_data->builder, "cert-fields-treeview"); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->cert_fields_treeview), FALSE); gtk_tree_view_insert_column_with_attributes ( - GTK_TREE_VIEW (cvm_data->fields_tree), + GTK_TREE_VIEW (priv->cert_fields_treeview), -1, "Field", gtk_cell_renderer_text_new (), "text", 0, NULL); - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (cvm_data->fields_tree)); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->cert_fields_treeview)); g_signal_connect ( selection, "changed", - G_CALLBACK (fields_selection_changed), cvm_data); - - /* hook up all the field display foo */ - cvm_data->field_text = e_builder_get_widget (cvm_data->builder, "cert-field-value-textview"); + G_CALLBACK (fields_selection_changed_cb), priv); /* set the font of the field value viewer to be some fixed - * width font to the hex display doesn't look like ass. */ - cvm_data->text_tag = gtk_text_buffer_create_tag ( - gtk_text_view_get_buffer (GTK_TEXT_VIEW (cvm_data->field_text)), - "mono", - "font", "Mono", - NULL); - - /* initially populate the hierarchy from the cert's chain */ - cvm_data->cert_chain = e_cert_get_chain (cert); - cvm_data->cert_chain = g_list_reverse (cvm_data->cert_chain); - for (l = cvm_data->cert_chain; l; l = l->next) { - ECert *c = l->data; - const gchar *str; + * width font to the hex display looks nice. */ + priv->monospace_tag = gtk_text_buffer_create_tag ( + gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->cert_field_value_textview)), + "mono", "font", "Mono", NULL); + + /* initially populate the hierarchy from the issuers' chain */ + for (iter = priv->issuers; iter; iter = g_slist_next (iter)) { + CERTCertificate *cert = iter->data; + gchar *str; GtkTreeIter new_iter; - str = e_cert_get_cn (c); - if (!str) - str = e_cert_get_subject_name (c); + if (!cert) + continue; + + str = CERT_GetCommonName (&cert->subject); - gtk_tree_store_insert (cvm_data->hierarchy_store, &new_iter, root_set ? &root : NULL, -1); + gtk_tree_store_insert (hierarchy_store, &new_iter, root_set ? &root : NULL, -1); gtk_tree_store_set ( - cvm_data->hierarchy_store, &new_iter, - 0, str, - 1, c, + hierarchy_store, &new_iter, + 0, str ? str : cert->subjectName, + 1, cert, -1); root = new_iter; root_set = TRUE; + + if (str) + PORT_Free (str); + } + + gtk_tree_view_expand_all (GTK_TREE_VIEW (priv->cert_hierarchy_treeview)); +} + +static gchar * +get_window_title (CERTCertificate *cert) +{ + gchar *str; + + g_return_val_if_fail (cert != NULL, NULL); + + if (cert->nickname) + return g_strdup (cert->nickname); + + str = CERT_GetCommonName (&cert->subject); + if (str) { + gchar *title; + + title = g_strdup (str); + PORT_Free (str); + + return title; } - gtk_tree_view_expand_all (GTK_TREE_VIEW (cvm_data->hierarchy_tree)); + return cert->subjectName; } GtkWidget * -certificate_viewer_show (ECert *cert) +certificate_viewer_new (GtkWindow *parent, + const CERTCertificate *cert, + const GSList *issuers_chain_certs) { - CertificateViewerData *cvm_data; - GtkDialog *dialog; - GtkWidget *action_area; + CertificateViewerPriv *priv; + GtkWidget *dialog, *notebook, *widget; + GtkGrid *grid; + gint row; + GSList *iter; gchar *title; - cvm_data = g_new0 (CertificateViewerData, 1); + g_return_val_if_fail (cert != NULL, NULL); + + priv = g_new0 (CertificateViewerPriv, 1); + priv->cert = CERT_DupCertificate ((CERTCertificate *) cert); + priv->issuers = g_slist_copy ((GSList *) issuers_chain_certs); - cvm_data->builder = gtk_builder_new (); - e_load_ui_builder_definition (cvm_data->builder, "smime-ui.ui"); + /* root issuer first, then bottom down to certificate itself */ + priv->issuers = g_slist_reverse (priv->issuers); + priv->issuers = g_slist_append (priv->issuers, priv->cert); - cvm_data->dialog = e_builder_get_widget (cvm_data->builder, "certificate-viewer-dialog"); + for (iter = priv->issuers; iter; iter = g_slist_next (iter)) { + iter->data = CERT_DupCertificate (iter->data); + } - gtk_widget_realize (cvm_data->dialog); + title = get_window_title (priv->cert); - dialog = GTK_DIALOG (cvm_data->dialog); - action_area = gtk_dialog_get_action_area (dialog); - gtk_container_set_border_width (GTK_CONTAINER (action_area), 12); + dialog = gtk_dialog_new_with_buttons (title, parent, + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); - title = g_strdup_printf ( - _("Certificate Viewer: %s"), e_cert_get_window_title (cert)); - gtk_window_set_title (GTK_WINDOW (cvm_data->dialog), title); g_free (title); - fill_in_general (cvm_data, cert); - fill_in_details (cvm_data, cert); + g_object_set_data_full (G_OBJECT (dialog), CERTIFICATE_VIEWER_PRIV_KEY, priv, free_priv_struct); + + notebook = gtk_notebook_new (); + gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), notebook); + gtk_container_set_border_width (GTK_CONTAINER (notebook), 12); + + /* General page */ + row = 0; + grid = GTK_GRID (gtk_grid_new ()); + g_object_set (G_OBJECT (grid), + "hexpand", TRUE, + "halign", GTK_ALIGN_FILL, + "vexpand", FALSE, + "valign", GTK_ALIGN_START, + "border-width", 12, + "row-spacing", 6, + "column-spacing", 6, + NULL); + + begin_section (grid, _("This certificate has been verified for the following uses:"), &row, 4); + + if (!priv->cert->keyUsagePresent || (priv->cert->keyUsage & certificateUsageSSLClient) != 0) { + widget = add_info_label (grid, NULL, &row); + gtk_label_set_text (GTK_LABEL (widget), _("SSL Client Certificate")); + } + + if (!priv->cert->keyUsagePresent || (priv->cert->keyUsage & (certificateUsageSSLServer | certificateUsageSSLCA)) != 0) { + widget = add_info_label (grid, NULL, &row); + gtk_label_set_text (GTK_LABEL (widget), _("SSL Server Certificate")); + } + + if (!priv->cert->keyUsagePresent || (priv->cert->keyUsage & certificateUsageEmailSigner) != 0) { + widget = add_info_label (grid, NULL, &row); + gtk_label_set_text (GTK_LABEL (widget), _("Email Signer Certificate")); + } + + if (!priv->cert->keyUsagePresent || (priv->cert->keyUsage & certificateUsageEmailRecipient) != 0) { + widget = add_info_label (grid, NULL, &row); + gtk_label_set_text (GTK_LABEL (widget), _("Email Recipient Certificate")); + } + + widget = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL); + g_object_set (G_OBJECT (widget), + "hexpand", TRUE, + "halign", GTK_ALIGN_FILL, + "vexpand", FALSE, + "valign", GTK_ALIGN_START, + NULL); + + gtk_grid_attach (grid, widget, 0, row, 3, 1); + row++; + + begin_section (grid, _("Issued To"), &row, 4); + priv->issued_to_cn = add_info_label (grid, _("Common Name (CN)"), &row); + priv->issued_to_o = add_info_label (grid, _("Organization (O)"), &row); + priv->issued_to_ou = add_info_label (grid, _("Organizational Unit (OU)"), &row); + priv->issued_to_serial = add_info_label (grid, _("Serial Number"), &row); + + begin_section (grid, _("Issued By"), &row, 3); + priv->issued_by_cn = add_info_label (grid, _("Common Name (CN)"), &row); + priv->issued_by_o = add_info_label (grid, _("Organization (O)"), &row); + priv->issued_by_ou = add_info_label (grid, _("Organizational Unit (OU)"), &row); + + begin_section (grid, _("Validity"), &row, 2); + priv->validity_issued_on = add_info_label (grid, _("Issued On"), &row); + priv->validity_expires_on = add_info_label (grid, _("Expires On"), &row); + + begin_section (grid, _("Fingerprints"), &row, 2); + priv->fingerprints_sha1 = add_info_label (grid, _("SHA1 Fingerprint"), &row); + priv->fingerprints_md5 = add_info_label (grid, _("MD5 Fingerprint"), &row); + + widget = gtk_label_new (_("General")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), GTK_WIDGET (grid), widget); + + /* Details page */ + row = 0; + grid = GTK_GRID (gtk_grid_new ()); + g_object_set (G_OBJECT (grid), + "hexpand", TRUE, + "halign", GTK_ALIGN_FILL, + "vexpand", TRUE, + "valign", GTK_ALIGN_FILL, + "border-width", 12, + "row-spacing", 6, + "column-spacing", 6, + NULL); + + priv->cert_hierarchy_treeview = add_scrolled_window (grid, + _("Certificate Hierarchy"), &row, gtk_tree_view_new ()); + + priv->cert_fields_treeview = add_scrolled_window (grid, + _("Certificate Fields"), &row, gtk_tree_view_new ()); + + priv->cert_field_value_textview = add_scrolled_window (grid, + _("Field Value"), &row, gtk_text_view_new ()); + + widget = gtk_label_new (_("Details")); + gtk_notebook_append_page (GTK_NOTEBOOK (notebook), GTK_WIDGET (grid), widget); + + gtk_widget_show_all (notebook); - g_object_weak_ref (G_OBJECT (cvm_data->dialog), free_data, cvm_data); + fill_general_page (priv); + fill_details_page (priv); - /* gtk_widget_show (cvm_data->dialog);*/ - return cvm_data->dialog; + return dialog; } diff --git a/smime/gui/certificate-viewer.h b/smime/gui/certificate-viewer.h index d452b76c2c..41f2c83c7b 100644 --- a/smime/gui/certificate-viewer.h +++ b/smime/gui/certificate-viewer.h @@ -17,15 +17,16 @@ * Chris Toshok <toshok@ximian.com> * * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) - * */ -#ifndef _CERTIFICATE_VIEWER_H_ -#define _CERTIFICATE_VIEWER_H +#ifndef CERTIFICATE_VIEWER_H +#define CERTIFICATE_VIEWER_H #include <gtk/gtk.h> -#include "e-cert.h" +#include <cert.h> -GtkWidget * certificate_viewer_show (ECert *cert); +GtkWidget * certificate_viewer_new (GtkWindow *parent, + const CERTCertificate *cert, + const GSList *issuers_chain_certs); -#endif /* _CERTIFICATE_VIEWER_H_ */ +#endif /* CERTIFICATE_VIEWER_H */ diff --git a/smime/gui/smime-ui.ui b/smime/gui/smime-ui.ui index 0ad3f47d81..5622c4d0e5 100644 --- a/smime/gui/smime-ui.ui +++ b/smime/gui/smime-ui.ui @@ -16,714 +16,6 @@ </row> </data> </object> - <object class="GtkDialog" id="certificate-viewer-dialog"> - <property name="title">dialog1</property> - <property name="window_position">center</property> - <property name="type_hint">dialog</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkNotebook" id="notebook1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="border_width">12</property> - <child> - <object class="GtkVBox" id="vbox1"> - <property name="visible">True</property> - <property name="border_width">6</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkVBox" id="vbox2"> - <property name="visible">True</property> - <property name="border_width">6</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkLabel" id="ssl-client-cert-verified-label"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">SSL Client Certificate</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="ssl-server-cert-verified-label"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">SSL Server Certificate</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="email-signer-cert-verified-label"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Email Signer Certificate</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="email-recipient-cert-verified-label"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Email Recipient Certificate</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">3</property> - </packing> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="label" translatable="yes">This certificate has been verified for the following uses:</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkHSeparator" id="hseparator1"> - <property name="visible">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkTable" id="table3"> - <property name="visible">True</property> - <property name="border_width">3</property> - <property name="n_rows">15</property> - <property name="n_columns">2</property> - <property name="column_spacing">6</property> - <child> - <object class="GtkLabel" id="label25"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">1</property> - <property name="ypad">3</property> - <property name="label" translatable="yes">Issued To</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label26"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Common Name (CN)</property> - </object> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label27"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Organization (O)</property> - </object> - <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label28"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Organizational Unit (OU)</property> - </object> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label29"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Serial Number</property> - </object> - <packing> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label31"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Common Name (CN)</property> - </object> - <packing> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label32"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Organization (O)</property> - </object> - <packing> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label33"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Organizational Unit (OU)</property> - </object> - <packing> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label36"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Issued On</property> - </object> - <packing> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label37"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">Expires On</property> - </object> - <packing> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label30"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="yalign">1</property> - <property name="ypad">3</property> - <property name="label" translatable="yes">Issued By</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label35"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="ypad">3</property> - <property name="label" translatable="yes">Fingerprints</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">12</property> - <property name="bottom_attach">13</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label38"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">SHA1 Fingerprint</property> - </object> - <packing> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label39"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">6</property> - <property name="label" translatable="yes">MD5 Fingerprint</property> - </object> - <packing> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="issued-to-o"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="issued-to-ou"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="issued-to-serial"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="issued-by-cn"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">6</property> - <property name="bottom_attach">7</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="issued-by-o"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">7</property> - <property name="bottom_attach">8</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="issued-by-ou"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">8</property> - <property name="bottom_attach">9</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="validity-issued-on"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">10</property> - <property name="bottom_attach">11</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="validity-expires-on"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">11</property> - <property name="bottom_attach">12</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fingerprints-sha1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">13</property> - <property name="bottom_attach">14</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="fingerprints-md5"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">14</property> - <property name="bottom_attach">15</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="issued-to-cn"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><Not Part of Certificate></property> - <property name="selectable">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label34"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="ypad">3</property> - <property name="label" translatable="yes">Validity</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - <packing> - <property name="right_attach">2</property> - <property name="top_attach">9</property> - <property name="bottom_attach">10</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - </object> - </child> - <child type="tab"> - <object class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">General</property> - </object> - <packing> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <object class="GtkVBox" id="vbox3"> - <property name="visible">True</property> - <property name="border_width">6</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkFrame" id="frame4"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="border_width">6</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <property name="shadow_type">in</property> - <child> - <object class="GtkTreeView" id="cert-hierarchy-treeview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="headers_visible">False</property> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label51"> - <property name="visible">True</property> - <property name="label" translatable="yes">Certificate Hierarchy</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - </child> - </object> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkFrame" id="frame5"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="border_width">6</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <property name="shadow_type">in</property> - <child> - <object class="GtkTreeView" id="cert-fields-treeview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="headers_visible">False</property> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label52"> - <property name="visible">True</property> - <property name="label" translatable="yes">Certificate Fields</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkFrame" id="frame6"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="border_width">6</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <property name="shadow_type">etched-in</property> - <child> - <object class="GtkTextView" id="cert-field-value-textview"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - <property name="cursor_visible">False</property> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label53"> - <property name="visible">True</property> - <property name="label" translatable="yes">Field Value</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child type="tab"> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="label" translatable="yes">Details</property> - </object> - <packing> - <property name="position">1</property> - <property name="tab_fill">False</property> - </packing> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="closebutton1"> - <property name="label">gtk-close</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-7">closebutton1</action-widget> - </action-widgets> - </object> <object class="GtkWindow" id="cert-manager-config-control"> <property name="title">window1</property> <child> |