[gnome-keyring] gcr: Show warnings about keys that have not been verified



commit fb23b74a8488b781b74d9f2d2fbb50e9bdc85f70
Author: Stef Walter <stefw collabora co uk>
Date:   Fri Sep 23 12:43:25 2011 +0200

    gcr: Show warnings about keys that have not been verified
    
     * And emblem icons that have not been verified.

 gcr/gcr-display-view.c   |   71 ++++++++++++++++++++++++++++++++++++++++++++++
 gcr/gcr-display-view.h   |    5 +++
 gcr/gcr-gnupg-records.c  |   31 +++++++++++++++++--
 gcr/gcr-gnupg-renderer.c |   43 ++++++++++++++-------------
 gcr/gcr-parser.c         |    4 ++-
 5 files changed, 128 insertions(+), 26 deletions(-)
---
diff --git a/gcr/gcr-display-view.c b/gcr/gcr-display-view.c
index 035a3a7..8010a68 100644
--- a/gcr/gcr-display-view.c
+++ b/gcr/gcr-display-view.c
@@ -39,6 +39,7 @@ G_DEFINE_TYPE_WITH_CODE (GcrDisplayView, _gcr_display_view, GTK_TYPE_TEXT_VIEW,
 #define FIELD_MARGIN 17
 #define COLUMN_MARGIN 6
 #define ICON_MARGIN 8
+#define MESSAGE_PADDING 8
 
 typedef struct _GcrDisplayItem {
 	GcrDisplayView *display_view;
@@ -64,6 +65,7 @@ struct _GcrDisplayViewPrivate {
 	GtkTextTag *title_tag;
 	GtkTextTag *content_tag;
 	GtkTextTag *heading_tag;
+	GtkTextTag *message_tag;
 	GtkTextTag *monospace_tag;
 	GtkTextTag *area_tag;
 	GcrDisplayItem *current_item;
@@ -194,6 +196,15 @@ create_tag_table (GcrDisplayView *self)
 	                                      NULL);
 	gtk_text_tag_table_add (tags, self->pv->content_tag);
 
+	self->pv->message_tag = g_object_new (GTK_TYPE_TEXT_TAG,
+	                                      "name", "message",
+	                                      "right-margin", (ICON_MARGIN * 2) + width,
+	                                      "rise", 3 * PANGO_SCALE,
+	                                      "pixels-below-lines", 3,
+	                                      "wrap-mode", GTK_WRAP_WORD,
+	                                      NULL);
+	gtk_text_tag_table_add (tags, self->pv->message_tag);
+
 	self->pv->heading_tag = g_object_new (GTK_TYPE_TEXT_TAG,
 	                                      "name", "heading",
 	                                      "pixels-above-lines", 9,
@@ -1107,6 +1118,66 @@ _gcr_display_view_append_fingerprint (GcrDisplayView *self, GcrRenderer *rendere
 }
 
 void
+_gcr_display_view_append_message (GcrDisplayView *self,
+                                  GcrRenderer *renderer,
+                                  GtkMessageType message_type,
+                                  const gchar *message)
+{
+	const gchar *stock_id = NULL;
+	GtkWidget *image = NULL;
+	GcrDisplayItem *item;
+	GtkTextChildAnchor *anchor;
+	GtkTextIter iter;
+
+	g_return_if_fail (GCR_IS_DISPLAY_VIEW (self));
+	g_return_if_fail (GCR_IS_RENDERER (renderer));
+
+	item = lookup_display_item (self, renderer);
+	g_return_if_fail (item);
+
+	switch (message_type) {
+	case GTK_MESSAGE_INFO:
+		stock_id = GTK_STOCK_DIALOG_INFO;
+		break;
+
+	case GTK_MESSAGE_QUESTION:
+		stock_id = GTK_STOCK_DIALOG_QUESTION;
+		break;
+
+	case GTK_MESSAGE_WARNING:
+		stock_id = GTK_STOCK_DIALOG_WARNING;
+		break;
+
+	case GTK_MESSAGE_ERROR:
+		stock_id = GTK_STOCK_DIALOG_ERROR;
+		break;
+
+	case GTK_MESSAGE_OTHER:
+		break;
+
+	default:
+		g_warning ("unknown GtkMessageType: %u", message_type);
+		break;
+	}
+
+	gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending);
+
+	if (stock_id != NULL) {
+		image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
+		gtk_misc_set_padding (GTK_MISC (image), MESSAGE_PADDING, 0);
+		gtk_widget_show (image);
+
+		anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter);
+		gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), image, anchor);
+	}
+
+	gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, message, -1,
+	                                  self->pv->message_tag, item->extra_tag, NULL);
+	gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1,
+	                                  item->extra_tag, NULL);
+}
+
+void
 _gcr_display_view_set_icon (GcrDisplayView *self, GcrRenderer *renderer, GIcon *icon)
 {
 	GcrDisplayItem *item;
diff --git a/gcr/gcr-display-view.h b/gcr/gcr-display-view.h
index d1c84f7..28dddd5 100644
--- a/gcr/gcr-display-view.h
+++ b/gcr/gcr-display-view.h
@@ -96,6 +96,11 @@ void             _gcr_display_view_append_fingerprint          (GcrDisplayView *
                                                                 const gchar *name,
                                                                 GChecksumType type);
 
+void             _gcr_display_view_append_message              (GcrDisplayView *self,
+                                                                GcrRenderer *renderer,
+                                                                GtkMessageType message_type,
+                                                                const gchar *message);
+
 void             _gcr_display_view_set_icon                    (GcrDisplayView *self,
                                                                 GcrRenderer *renderer,
                                                                 GIcon *icon);
diff --git a/gcr/gcr-gnupg-records.c b/gcr/gcr-gnupg-records.c
index 1389350..e634b1f 100644
--- a/gcr/gcr-gnupg-records.c
+++ b/gcr/gcr-gnupg-records.c
@@ -193,13 +193,32 @@ _gcr_gnupg_records_get_fingerprint (GPtrArray *records)
 #define IMAGE_JPEG_SIG "\x10\x00\x01\x01"
 #define IMAGE_JPEG_SIG_LEN 4
 
+static void
+add_emblem_to_icon (GIcon **icon,
+                    const gchar *emblem_name)
+{
+	GIcon *emblem_icon;
+	GIcon *result;
+	GEmblem *emblem;
+
+	emblem_icon = g_themed_icon_new (emblem_name);
+	emblem = g_emblem_new_with_origin (emblem_icon, G_EMBLEM_ORIGIN_LIVEMETADATA);
+	result = g_emblemed_icon_new (*icon, emblem);
+	g_object_unref (*icon);
+	*icon = result;
+	g_object_unref (emblem);
+	g_object_unref (emblem_icon);
+}
+
 GIcon *
 _gcr_gnupg_records_get_icon (GPtrArray *records)
 {
 	GcrRecord *record;
+	gchar validity;
 	guchar *data;
 	gsize n_data;
 	guint type;
+	GIcon *icon;
 	guint i;
 
 	for (i = 0; i < records->len; i++) {
@@ -211,8 +230,6 @@ _gcr_gnupg_records_get_icon (GPtrArray *records)
 		if (type != TYPE_IMAGE)
 			continue;
 
-		/* TODO: Validity? */
-
 		data = _gcr_record_get_base64 (record, GCR_RECORD_XA1_DATA, &n_data);
 		g_return_val_if_fail (data != NULL, NULL);
 
@@ -229,10 +246,16 @@ _gcr_gnupg_records_get_icon (GPtrArray *records)
 			continue;
 		}
 
-		/* We have a valid header */
-		return G_ICON (_gcr_memory_icon_new_full ("image/jpeg", data,
+		icon = G_ICON (_gcr_memory_icon_new_full ("image/jpeg", data,
 		                                          n_data, IMAGE_HEADER_LEN,
 		                                          g_free));
+
+		validity = _gcr_record_get_char (record, GCR_RECORD_XA1_TRUST);
+		if (validity != 0 && validity != 'm' && validity != 'f' && validity != 'u')
+			add_emblem_to_icon (&icon, "dialog-question");
+
+		/* We have a valid header */
+		return icon;
 	}
 
 	if (_gcr_records_find (records, GCR_RECORD_SCHEMA_SEC))
diff --git a/gcr/gcr-gnupg-renderer.c b/gcr/gcr-gnupg-renderer.c
index c0b6495..663e32c 100644
--- a/gcr/gcr-gnupg-renderer.c
+++ b/gcr/gcr-gnupg-renderer.c
@@ -277,43 +277,45 @@ status_for_code (gchar code)
 	}
 }
 
-#ifdef TODO
 static const gchar *
-description_for_code (gchar code, gboolean *warning)
+message_for_code (gchar code,
+                  GtkMessageType *message_type)
 {
-	*warning = FALSE;
+	*message_type = GTK_MESSAGE_OTHER;
 	switch (code) {
 	case 'o':
-		*warning = TRUE;
-		return _("This key has not been verified");
+		*message_type = GTK_MESSAGE_QUESTION;
+		return _("The information in this key has not yet been verified");
 	case 'i':
-		*warning = TRUE;
+		*message_type = GTK_MESSAGE_ERROR;
 		return _("This key is invalid");
 	case 'd':
-		*warning = TRUE;
+		*message_type = GTK_MESSAGE_WARNING;
 		return _("This key has been disabled");
 	case 'r':
-		*warning = TRUE;
+		*message_type = GTK_MESSAGE_ERROR;
 		return _("This key has been revoked");
 	case 'e':
-		*warning = TRUE;
+		*message_type = GTK_MESSAGE_ERROR;
 		return _("This key has expired");
 	case 'q': case '-':
-		return _("The trust in this key is undefined");
+		return NULL;
 	case 'n':
-		*warning = TRUE;
+		*message_type = GTK_MESSAGE_WARNING;
 		return _("This key is distrusted");
 	case 'm':
-		return _("Marginally trusted");
+		*message_type = GTK_MESSAGE_OTHER;
+		return _("This key is marginally trusted");
 	case 'f':
-		return _("Fully trusted");
+		*message_type = GTK_MESSAGE_OTHER;
+		return _("This key is fully trusted");
 	case 'u':
-		return _("Ultimately trusted");
+		*message_type = GTK_MESSAGE_OTHER;
+		return _("This key is ultimately trusted");
 	default:
 		return NULL;
 	}
 }
-#endif
 
 static void
 append_key_record (GcrGnupgRenderer *self,
@@ -656,6 +658,7 @@ static void
 _gcr_gnupg_renderer_render (GcrRenderer *renderer,
                             GcrViewer *viewer)
 {
+	GtkMessageType message_type;
 	GcrGnupgRenderer *self;
 	GcrDisplayView *view;
 	GDateTime *date;
@@ -709,10 +712,6 @@ _gcr_gnupg_renderer_render (GcrRenderer *renderer,
 		g_free (userid);
 	}
 
-	value = _gcr_gnupg_records_get_short_keyid (self->pv->records);
-	if (value != NULL)
-		_gcr_display_view_append_content (view, renderer, _("Key ID"), value);
-
 	code = _gcr_record_get_char (self->pv->records->pdata[0], GCR_RECORD_TRUST);
 	if (code != 'e') {
 		date = _gcr_record_get_date (self->pv->records->pdata[0], GCR_RECORD_KEY_EXPIRY);
@@ -724,8 +723,10 @@ _gcr_gnupg_renderer_render (GcrRenderer *renderer,
 		}
 	}
 
-	/* TODO: Warning */
-
+	/* The warning or status */
+	value = message_for_code (code, &message_type);
+	if (value != NULL)
+		_gcr_display_view_append_message (view, renderer, message_type, value);
 
 	_gcr_display_view_start_details (view, renderer);
 
diff --git a/gcr/gcr-parser.c b/gcr/gcr-parser.c
index 33aaad4..7990633 100644
--- a/gcr/gcr-parser.c
+++ b/gcr/gcr-parser.c
@@ -1441,7 +1441,9 @@ parse_openpgp_packets (GcrParser *self,
 	gint num_parsed;
 
 	num_parsed = _gcr_openpgp_parse (data, n_data,
-	                                 GCR_OPENPGP_PARSE_KEYS,
+	                                 GCR_OPENPGP_PARSE_KEYS |
+	                                 GCR_OPENPGP_PARSE_ATTRIBUTES |
+	                                 GCR_OPENPGP_PARSE_SIGNATURES,
 	                                 on_openpgp_packet, self);
 
 	if (num_parsed == 0)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]