Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F36623926
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
12 KB
Subscribers
None
View Options
diff --git a/src/verifydlg.c b/src/verifydlg.c
index 59c90a2..e959766 100644
--- a/src/verifydlg.c
+++ b/src/verifydlg.c
@@ -1,445 +1,445 @@
/* fileverifydlg.c - Dialog for verifying files.
Copyright (C) 2000, 2001 G-N-U GmbH.
Copyright (C) 2005, 2012 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 GPA; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */
#include <config.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include <string.h>
#include <errno.h>
#include "gpa.h"
#include "gtktools.h"
#include "gpawidgets.h"
#include "verifydlg.h"
/* Properties */
enum
{
PROP_0,
PROP_WINDOW,
};
static GObjectClass *parent_class = NULL;
static void
gpa_file_verify_dialog_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
GpaFileVerifyDialog *dialog = GPA_FILE_VERIFY_DIALOG (object);
switch (prop_id)
{
case PROP_WINDOW:
g_value_set_object (value,
gtk_window_get_transient_for (GTK_WINDOW (dialog)));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gpa_file_verify_dialog_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
GpaFileVerifyDialog *dialog = GPA_FILE_VERIFY_DIALOG (object);
switch (prop_id)
{
case PROP_WINDOW:
gtk_window_set_transient_for (GTK_WINDOW (dialog),
g_value_get_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gpa_file_verify_dialog_finalize (GObject *object)
{
GpaFileVerifyDialog *dialog = GPA_FILE_VERIFY_DIALOG (object);
g_object_unref (dialog->ctx);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
gpa_file_verify_dialog_init (GpaFileVerifyDialog *dialog)
{
}
static GObject*
gpa_file_verify_dialog_constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
GObject *object;
GpaFileVerifyDialog *dialog;
/* Invoke parent's constructor */
object = parent_class->constructor (type,
n_construct_properties,
construct_properties);
dialog = GPA_FILE_VERIFY_DIALOG (object);
/* Initialize */
dialog->ctx = gpa_context_new ();
/* Set up the dialog */
gtk_dialog_add_buttons (GTK_DIALOG (dialog),
_("_Close"), GTK_RESPONSE_CLOSE, NULL);
gpa_window_set_title (GTK_WINDOW (dialog), _("Verify documents"));
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
dialog->notebook = gtk_notebook_new ();
//vboxEncrypt = gtk_dialog_get_content_area(dialog);
GtkWidget *box = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
gtk_box_pack_start (GTK_BOX (box),
dialog->notebook, TRUE, TRUE, 0);
/* Hide on response */
g_signal_connect (G_OBJECT (dialog), "response",
G_CALLBACK (gtk_widget_hide), NULL);
return object;
}
static void
gpa_file_verify_dialog_class_init (GpaFileVerifyDialogClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
object_class->constructor = gpa_file_verify_dialog_constructor;
object_class->finalize = gpa_file_verify_dialog_finalize;
object_class->set_property = gpa_file_verify_dialog_set_property;
object_class->get_property = gpa_file_verify_dialog_get_property;
/* Properties */
g_object_class_install_property (object_class,
PROP_WINDOW,
g_param_spec_object
("window", "Parent window",
"Parent window", GTK_TYPE_WIDGET,
G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY));
}
GType
gpa_file_verify_dialog_get_type (void)
{
static GType verify_dialog_type = 0;
if (!verify_dialog_type)
{
static const GTypeInfo verify_dialog_info =
{
sizeof (GpaFileVerifyDialogClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) gpa_file_verify_dialog_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GpaFileVerifyDialog),
0, /* n_preallocs */
(GInstanceInitFunc) gpa_file_verify_dialog_init,
};
verify_dialog_type = g_type_register_static (GTK_TYPE_DIALOG,
"GpaFileVerifyDialog",
&verify_dialog_info, 0);
}
return verify_dialog_type;
}
/* Internal */
typedef struct
{
gchar *fpr;
gpgme_key_t key;
gpgme_validity_t validity;
unsigned long summary;
time_t created;
time_t expire;
char *sigdesc;
char *keydesc;
} SignatureData;
typedef enum
{
SIG_KEYID_COLUMN,
SIG_STATUS_COLUMN,
SIG_USERID_COLUMN,
SIG_DESC_COLUMN,
SIG_N_COLUMNS
} SignatureListColumn;
/* Return the text of the "status" column in pango markup language.
*/
static gchar*
signature_status_label (SignatureData *data)
{
gchar *text = NULL;
gchar *color = NULL;
gchar *label = NULL;
if (data->summary & GPGME_SIGSUM_VALID)
{
text = _("Valid");
color = "green";
}
else if (data->summary & GPGME_SIGSUM_RED)
{
text = _("Bad");
color = "red";
}
else if (data->summary & GPGME_SIGSUM_KEY_MISSING)
{
text = _("Unknown Key");
color = "red";
}
else if (data->summary & GPGME_SIGSUM_KEY_REVOKED)
{
text = _("Revoked Key");
color = "red";
}
else if (data->summary & GPGME_SIGSUM_KEY_EXPIRED)
{
text = _("Expired Key");
color = "orange";
}
else
{
/* If we arrived here we know the key is available, the signature is
* not bad, but it's not completely valid. So, the signature is good
* but the key is not valid. */
text = _("Key NOT valid");
color = "orange";
}
label = g_strdup_printf ("<span foreground=\"%s\" weight=\"bold\">%s</span>",
color, text);
return label;
}
/* Add a signature to the list */
static void
add_signature_to_model (GtkListStore *store, SignatureData *data)
{
GtkTreeIter iter;
const gchar *keyid;
gchar *userid;
gchar *status;
if (data->key)
{
keyid = gpa_gpgme_key_get_short_keyid (data->key);
}
else if (data->fpr && strlen (data->fpr) > 8)
{
/* We use the last 8 bytes of fingerprint for the keyID. */
keyid = data->fpr + strlen (data->fpr) - 8;
}
else
{
keyid = "";
}
status = signature_status_label (data);
userid = data->keydesc;
if (!userid)
userid = _("[Unknown user ID]");
gtk_list_store_append (store, &iter);
gtk_list_store_set (store, &iter,
SIG_KEYID_COLUMN, keyid,
SIG_STATUS_COLUMN, status,
SIG_USERID_COLUMN, userid,
SIG_DESC_COLUMN, data->sigdesc,
-1);
g_free (status);
gpgme_key_unref (data->key);
g_free (data->sigdesc);
g_free (data->keydesc);
g_free (data);
}
/* Fill the list of signatures with the data from the verification */
static void
fill_sig_model (GtkListStore *store, gpgme_signature_t sigs,
gpgme_ctx_t ctx)
{
SignatureData *data;
gpgme_signature_t sig;
for (sig = sigs; sig; sig = sig->next)
{
data = g_malloc (sizeof (SignatureData));
data->fpr = sig->fpr? g_strdup (sig->fpr) : NULL;
data->validity = sig->validity;
data->summary = sig->summary;
data->created = sig->timestamp;
data->expire = sig->exp_timestamp;
data->sigdesc = gpa_gpgme_get_signature_desc (ctx, sig,
&data->keydesc, &data->key);
add_signature_to_model (store, data);
}
}
/* Create the list of signatures */
static GtkWidget *
signature_list (gpgme_signature_t sigs, gpgme_ctx_t ctx)
{
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
GtkListStore *store;
GtkWidget *list;
store = gtk_list_store_new (SIG_N_COLUMNS, G_TYPE_STRING,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (list), TRUE);
gtk_widget_set_size_request (list, 400, 100);
renderer = gtk_cell_renderer_text_new ();
column = gtk_tree_view_column_new_with_attributes (_("Key ID"), renderer,
"text", SIG_KEYID_COLUMN,
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,
"markup",
SIG_STATUS_COLUMN, 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 (_("User Name"), renderer,
"text", SIG_USERID_COLUMN,
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 (_("Description"), renderer,
"text", SIG_DESC_COLUMN,
NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (list), column);
fill_sig_model (store, sigs, ctx);
return list;
}
static GtkWidget *
verify_file_page (gpgme_signature_t sigs, const gchar *signed_file,
const gchar *signature_file, gpgme_ctx_t ctx)
{
GtkWidget *vbox;
GtkWidget *list;
GtkWidget *label;
GtkWidget *scrolled;
- vbox = gtk_vbox_new (FALSE, 5);
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
if (signed_file)
{
gchar *text = g_strdup_printf (_("Verified data in file: %s"),
signed_file);
label = gtk_label_new (text);
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
g_free (text);
text = g_strdup_printf (_("Signature: %s"), signature_file);
label = gtk_label_new (text);
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
g_free (text);
}
label = gtk_label_new (_("Signatures:"));
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 0);
list = signature_list (sigs, ctx);
scrolled = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled),
GTK_SHADOW_IN);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
GTK_POLICY_AUTOMATIC,
GTK_POLICY_AUTOMATIC);
gtk_container_add (GTK_CONTAINER (scrolled), list);
gtk_box_pack_start (GTK_BOX (vbox), scrolled, TRUE, TRUE, 0);
return vbox;
}
/* API */
GtkWidget *gpa_file_verify_dialog_new (GtkWidget *parent)
{
GpaFileVerifyDialog *dialog;
dialog = g_object_new (GPA_FILE_VERIFY_DIALOG_TYPE,
"window", parent,
NULL);
return GTK_WIDGET(dialog);
}
void
gpa_file_verify_dialog_set_title (GpaFileVerifyDialog *dialog,
const char *title)
{
if (dialog && title && *title)
gpa_window_set_title (GTK_WINDOW (dialog), title);
}
void gpa_file_verify_dialog_add_file (GpaFileVerifyDialog *dialog,
const gchar *filename,
const gchar *signed_file,
const gchar *signature_file,
gpgme_signature_t sigs)
{
GtkWidget *page;
page = verify_file_page (sigs, signed_file, signature_file,
dialog->ctx->ctx);
gtk_notebook_append_page (GTK_NOTEBOOK (dialog->notebook), page,
gtk_label_new (filename));
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Thu, Feb 26, 7:03 PM (19 h, 8 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
94/59/94e54c8274fce3c27ceaba7ad4e3
Attached To
rGPA Gnu Privacy Assistant
Event Timeline
Log In to Comment