[gnome-keyring] gcr: Show warnings about keys that have not been verified
- From: Stefan Walter <stefw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-keyring] gcr: Show warnings about keys that have not been verified
- Date: Tue, 27 Sep 2011 15:15:53 +0000 (UTC)
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]