diff --git a/src/gpasubkeylist.c b/src/gpasubkeylist.c index 9862521..2039e0a 100644 --- a/src/gpasubkeylist.c +++ b/src/gpasubkeylist.c @@ -1,318 +1,318 @@ /* gpasubkeylist.c - The GNU Privacy Assistant * Copyright (C) 2003 Miguel Coca. * Copyright (C) 2009 g10 Code GmbH. * * This file is part of GPA * * GPA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GPA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see . */ #include #include "gpa.h" #include "convert.h" #include "gtktools.h" #include "keytable.h" #include "gpasubkeylist.h" static gboolean query_tooltip_cb (GtkWidget *wdiget, int x, int y, gboolean keyboard_mode, GtkTooltip *tooltip, gpointer user_data); /* * Implement a List showing the subkeys in a given key */ typedef enum { SUBKEY_ID, #if GPGME_VERSION_NUMBER < 0x010601 /* GPGME < 1.6.1 */ SUBKEY_SIZE, #endif SUBKEY_ALGO, SUBKEY_CREATED, SUBKEY_EXPIRE, SUBKEY_CAN_SIGN, SUBKEY_CAN_CERTIFY, SUBKEY_CAN_ENCRYPT, SUBKEY_CAN_AUTHENTICATE, SUBKEY_IS_CARDKEY, SUBKEY_CARD_NUMBER, SUBKEY_STATUS, SUBKEY_N_COLUMNS } SubkeyListColumn; /* Create a new subkey list. */ GtkWidget * gpa_subkey_list_new (void) { GtkListStore *store; GtkWidget *list; GtkTreeViewColumn *column; GtkCellRenderer *renderer; /* Init the model */ store = gtk_list_store_new (SUBKEY_N_COLUMNS, #if GPGME_VERSION_NUMBER < 0x010601 /* GPGME < 1.6.1 */ G_TYPE_STRING, #endif G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING); /* The view */ list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (list), TRUE); /* Add the columns */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Subkey ID"), renderer, "text", SUBKEY_ID, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Status"), renderer, "text", SUBKEY_STATUS, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Algo"), renderer, "text", SUBKEY_ALGO, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); #if GPGME_VERSION_NUMBER < 0x010601 /* GPGME < 1.6.1 */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Size"), renderer, "text", SUBKEY_SIZE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); #endif renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Created"), renderer, "text", SUBKEY_CREATED, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Expires"), renderer, "text", SUBKEY_EXPIRE, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_toggle_new (); column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "active", SUBKEY_CAN_SIGN, NULL); gpa_set_column_title (column, _("S"), _("Can sign")); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_toggle_new (); column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "active", SUBKEY_CAN_CERTIFY, NULL); gpa_set_column_title (column, _("C"), _("Can certify")); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_toggle_new (); column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "active", SUBKEY_CAN_ENCRYPT, NULL); gpa_set_column_title (column, _("E"), _("Can encrypt")); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_toggle_new (); column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "active", SUBKEY_CAN_AUTHENTICATE, NULL); gpa_set_column_title (column, _("A"), _("Can authenticate")); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_toggle_new (); column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "active", SUBKEY_IS_CARDKEY, NULL); gpa_set_column_title (column, _("T"), _("Secret key stored on a smartcard.")); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (NULL, renderer, "text", SUBKEY_CARD_NUMBER, NULL); gpa_set_column_title (column, _("Card S/N"), _("Serial number of the smart card.")); gtk_tree_view_append_column (GTK_TREE_VIEW (list), column); g_object_set (list, "has-tooltip", TRUE, NULL); g_signal_connect (list, "query-tooltip", G_CALLBACK (query_tooltip_cb), list); return list; } const gchar * subkey_status (gpgme_subkey_t subkey) { if (subkey->revoked) { return _("Revoked"); } else if (subkey->expired) { return _("Expired"); } else if (subkey->disabled) { return _("Disabled"); } else if (subkey->invalid) { return _("Unsigned"); } else { return _("Valid"); } } /* Set the key whose subkeys should be displayed. */ void gpa_subkey_list_set_key (GtkWidget *list, gpgme_key_t key) { GtkListStore *store = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (list))); gpgme_subkey_t subkey, secsubkey; gpgme_key_t seckey; gchar *p, *size, *expires; #if GPGME_VERSION_NUMBER >= 0x010601 /* GPGME >= 1.6.1 */ char *algostr_buf; #endif const char *algostr; /* Empty the list */ gtk_list_store_clear (store); if (key) { seckey = gpa_keytable_lookup_key (gpa_keytable_get_secret_instance (), key->subkeys->fpr); /* Add all the subkeys */ for (subkey = key->subkeys; subkey; subkey = subkey->next) { GtkTreeIter iter; if (seckey) { for (secsubkey = seckey->subkeys; secsubkey; secsubkey = secsubkey->next) if (subkey->fpr && secsubkey->fpr && g_str_equal (subkey->fpr, secsubkey->fpr)) break; } else secsubkey = NULL; /* Append */ gtk_list_store_append (store, &iter); if (subkey->curve) size = g_strdup (subkey->curve); else size = g_strdup_printf ("%i bits", subkey->length); /* We only want "never" and not "never expires" but we need to take care of the ">= 2038" string. */ expires = gpa_expiry_date_string (subkey->expires); if (*expires != '>' && (p = strchr (expires, ' '))) *p = 0; #if GPGME_VERSION_NUMBER >= 0x010601 /* GPGME >= 1.6.1 */ - algostr_buf = gpgme_pubkey_algo_string (key->subkeys); + algostr_buf = gpgme_pubkey_algo_string (subkey); algostr = algostr_buf? algostr_buf : "?"; #else /* GPGME < 1.6.1 */ algostr = gpgme_pubkey_algo_name (subkey->pubkey_algo), #endif /* GPGME < 1.6.1 */ gtk_list_store_set (store, &iter, SUBKEY_ID, subkey->keyid+8, #if GPGME_VERSION_NUMBER < 0x010601 /* GPGME < 1.6.1 */ SUBKEY_SIZE, size, #endif SUBKEY_ALGO, algostr, SUBKEY_CREATED, gpa_creation_date_string (subkey->timestamp), SUBKEY_EXPIRE, expires, SUBKEY_CAN_SIGN, subkey->can_sign, SUBKEY_CAN_CERTIFY, subkey->can_certify, SUBKEY_CAN_ENCRYPT, subkey->can_encrypt, SUBKEY_CAN_AUTHENTICATE, subkey->can_authenticate, SUBKEY_IS_CARDKEY, secsubkey? secsubkey->is_cardkey :0, SUBKEY_CARD_NUMBER, secsubkey? secsubkey->card_number:NULL, SUBKEY_STATUS, subkey_status (subkey), -1); g_free (size); g_free (expires); #if GPGME_VERSION_NUMBER >= 0x010601 /* GPGME >= 1.6.1 */ gpgme_free (algostr_buf); #endif } } } /* Tooltip display callback. */ static gboolean query_tooltip_cb (GtkWidget *widget, int x, int y, gboolean keyboard_tip, GtkTooltip *tooltip, gpointer user_data) { GtkTreeView *tv = GTK_TREE_VIEW (widget); GtkTreeViewColumn *column; char *text; (void)user_data; if (!gtk_tree_view_get_tooltip_context (tv, &x, &y, keyboard_tip, NULL, NULL, NULL)) return FALSE; /* Not at a row - do not show a tooltip. */ if (!gtk_tree_view_get_path_at_pos (tv, x, y, NULL, &column, NULL, NULL)) return FALSE; widget = gtk_tree_view_column_get_widget (column); text = widget? gtk_widget_get_tooltip_text (widget) : NULL; if (!text) return FALSE; /* No tooltip desired. */ gtk_tooltip_set_text (tooltip, text); g_free (text); return TRUE; /* Show tooltip. */ }