summaryrefslogtreecommitdiff
path: root/gcr/gcr-gnupg-key.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcr/gcr-gnupg-key.c')
-rw-r--r--gcr/gcr-gnupg-key.c530
1 files changed, 0 insertions, 530 deletions
diff --git a/gcr/gcr-gnupg-key.c b/gcr/gcr-gnupg-key.c
deleted file mode 100644
index 1d1bc420..00000000
--- a/gcr/gcr-gnupg-key.c
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- * Copyright (C) 2011 Collabora Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This program 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
- *
- * Author: Stef Walter <stefw@collabora.co.uk>
- */
-
-#include "config.h"
-
-#include "gcr-gnupg-key.h"
-#include "gcr-gnupg-records.h"
-#include "gcr-record.h"
-#include "gcr-memory-icon.h"
-
-#include "gck/gck.h"
-
-#include <glib/gi18n-lib.h>
-
-enum {
- PROP_0,
- PROP_KEYID,
- PROP_PUBLIC_RECORDS,
- PROP_SECRET_RECORDS,
- PROP_LABEL,
- PROP_MARKUP,
- PROP_DESCRIPTION,
- PROP_SHORT_KEYID,
- PROP_ICON
-};
-
-struct _GcrGnupgKeyPrivate {
- GPtrArray *public_records;
- GPtrArray *secret_records;
- GIcon *icon;
-};
-
-G_DEFINE_TYPE (GcrGnupgKey, _gcr_gnupg_key, G_TYPE_OBJECT);
-
-/* -----------------------------------------------------------------------------
- * INTERNAL
- */
-
-/* Copied from GPGME */
-static void
-parse_user_id (const gchar *uid, gchar **name, gchar **email, gchar **comment)
-{
- gchar *src, *tail, *x;
- int in_name = 0;
- int in_email = 0;
- int in_comment = 0;
-
- *name = NULL;
- *email = NULL;
- *comment = NULL;
-
- x = tail = src = g_strdup (uid);
-
- while (*src) {
- if (in_email) {
- /* Not legal but anyway. */
- if (*src == '<')
- in_email++;
- else if (*src == '>') {
- if (!--in_email && !*email) {
- *email = tail;
- *src = 0;
- tail = src + 1;
- }
- }
- } else if (in_comment) {
- if (*src == '(')
- in_comment++;
- else if (*src == ')') {
- if (!--in_comment && !*comment) {
- *comment = tail;
- *src = 0;
- tail = src + 1;
- }
- }
- } else if (*src == '<') {
- if (in_name) {
- if (!*name) {
- *name = tail;
- *src = 0;
- tail = src + 1;
- }
- in_name = 0;
- } else
- tail = src + 1;
-
- in_email = 1;
- } else if (*src == '(') {
- if (in_name) {
- if (!*name) {
- *name = tail;
- *src = 0;
- tail = src + 1;
- }
- in_name = 0;
- }
- in_comment = 1;
- } else if (!in_name && *src != ' ' && *src != '\t') {
- in_name = 1;
- }
- src++;
- }
-
- if (in_name) {
- if (!*name) {
- *name = tail;
- *src = 0;
- tail = src + 1;
- }
- }
-
- /* Let unused parts point to an EOS. */
- *name = g_strdup (*name ? *name : "");
- *email = g_strdup (*email ? *email : "");
- *comment = g_strdup (*comment ? *comment : "");
-
- g_strstrip (*name);
- g_strstrip (*email);
- g_strstrip (*comment);
-
- g_free (x);
-}
-
-static gchar *
-calculate_name (GcrGnupgKey *self)
-{
- GcrRecord* record;
-
- record = _gcr_records_find (self->pv->public_records, GCR_RECORD_SCHEMA_UID);
- g_return_val_if_fail (record, NULL);
-
- return _gcr_record_get_string (record, GCR_RECORD_UID_USERID);
-}
-
-static gchar *
-calculate_markup (GcrGnupgKey *self)
-{
- gchar *markup = NULL;
- gchar *uid, *name, *email, *comment;
-
- uid = calculate_name (self);
- if (uid == NULL)
- return NULL;
-
- parse_user_id (uid, &name, &email, &comment);
- if (comment != NULL && comment[0] != '\0')
- markup = g_markup_printf_escaped ("%s\n<small>%s \'%s\'</small>", name, email, comment);
- else
- markup = g_markup_printf_escaped ("%s\n<small>%s</small>", name, email);
- g_free (name);
- g_free (email);
- g_free (comment);
- g_free (uid);
-
- return markup;
-}
-
-static void
-_gcr_gnupg_key_init (GcrGnupgKey *self)
-{
- self->pv = (G_TYPE_INSTANCE_GET_PRIVATE (self, GCR_TYPE_GNUPG_KEY, GcrGnupgKeyPrivate));
-}
-
-static void
-_gcr_gnupg_key_finalize (GObject *obj)
-{
- GcrGnupgKey *self = GCR_GNUPG_KEY (obj);
-
- if (self->pv->public_records)
- g_ptr_array_free (self->pv->public_records, TRUE);
- if (self->pv->secret_records)
- g_ptr_array_free (self->pv->secret_records, TRUE);
-
- G_OBJECT_CLASS (_gcr_gnupg_key_parent_class)->finalize (obj);
-}
-
-static void
-_gcr_gnupg_key_set_property (GObject *obj, guint prop_id, const GValue *value,
- GParamSpec *pspec)
-{
- GcrGnupgKey *self = GCR_GNUPG_KEY (obj);
-
- switch (prop_id) {
- case PROP_PUBLIC_RECORDS:
- _gcr_gnupg_key_set_public_records (self, g_value_get_boxed (value));
- break;
- case PROP_SECRET_RECORDS:
- _gcr_gnupg_key_set_secret_records (self, g_value_get_boxed (value));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_gnupg_key_get_property (GObject *obj, guint prop_id, GValue *value,
- GParamSpec *pspec)
-{
- GcrGnupgKey *self = GCR_GNUPG_KEY (obj);
-
- switch (prop_id) {
- case PROP_PUBLIC_RECORDS:
- g_value_set_boxed (value, self->pv->public_records);
- break;
- case PROP_SECRET_RECORDS:
- g_value_set_boxed (value, self->pv->secret_records);
- break;
- case PROP_KEYID:
- g_value_set_string (value, _gcr_gnupg_key_get_keyid (self));
- break;
- case PROP_LABEL:
- g_value_take_string (value, calculate_name (self));
- break;
- case PROP_DESCRIPTION:
- g_value_set_string (value, _("PGP Key"));
- break;
- case PROP_MARKUP:
- g_value_take_string (value, calculate_markup (self));
- break;
- case PROP_SHORT_KEYID:
- g_value_set_string (value, _gcr_gnupg_records_get_short_keyid (self->pv->public_records));
- break;
- case PROP_ICON:
- g_value_set_object (value, _gcr_gnupg_key_get_icon (self));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
- break;
- }
-}
-
-static void
-_gcr_gnupg_key_class_init (GcrGnupgKeyClass *klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- _gcr_gnupg_key_parent_class = g_type_class_peek_parent (klass);
- g_type_class_add_private (klass, sizeof (GcrGnupgKeyPrivate));
-
- gobject_class->finalize = _gcr_gnupg_key_finalize;
- gobject_class->set_property = _gcr_gnupg_key_set_property;
- gobject_class->get_property = _gcr_gnupg_key_get_property;
-
- /**
- * GcrGnupgKey:public-records:
- *
- * Public key data. Should always be present.
- */
- g_object_class_install_property (gobject_class, PROP_PUBLIC_RECORDS,
- g_param_spec_boxed ("public-records", "Public Records", "Public Key Colon Records",
- G_TYPE_PTR_ARRAY, G_PARAM_READWRITE));
-
- /**
- * GcrGnupgKey:secret-records:
- *
- * Secret key data. The keyid of this data must match public-dataset.
- * If present, this key represents a secret key.
- */
- g_object_class_install_property (gobject_class, PROP_SECRET_RECORDS,
- g_param_spec_boxed ("secret-records", "Secret Records", "Secret Key Colon Records",
- G_TYPE_PTR_ARRAY, G_PARAM_READWRITE));
-
- /**
- * GcrGnupgKey:keyid:
- *
- * Key identifier.
- */
- g_object_class_install_property (gobject_class, PROP_KEYID,
- g_param_spec_string ("keyid", "Key ID", "Key identifier",
- "", G_PARAM_READABLE));
-
- /**
- * GcrGnupgKey:label:
- *
- * User readable label for this key.
- */
- g_object_class_install_property (gobject_class, PROP_LABEL,
- g_param_spec_string ("label", "Label", "Key label",
- "", G_PARAM_READABLE));
-
- /**
- * GcrGnupgKey::description:
- *
- * Description of type of key.
- */
- g_object_class_install_property (gobject_class, PROP_DESCRIPTION,
- g_param_spec_string ("description", "Description", "Description of object type",
- "", G_PARAM_READABLE));
-
- /**
- * GcrGnupgKey:markup:
- *
- * User readable markup which contains key label.
- */
- g_object_class_install_property (gobject_class, PROP_MARKUP,
- g_param_spec_string ("markup", "Markup", "Markup which describes key",
- "", G_PARAM_READABLE));
-
- /**
- * GcrGnupgKey:short-keyid:
- *
- * User readable key identifier.
- */
- g_object_class_install_property (gobject_class, PROP_SHORT_KEYID,
- g_param_spec_string ("short-keyid", "Short Key ID", "Display key identifier",
- "", G_PARAM_READABLE));
-
- /**
- * GcrGnupgKey:icon:
- *
- * Icon for this key.
- */
- g_object_class_install_property (gobject_class, PROP_ICON,
- g_param_spec_object ("icon", "Icon", "Icon for this key",
- G_TYPE_ICON, G_PARAM_READABLE));
-}
-
-/**
- * _gcr_gnupg_key_new:
- * @pubset: array of GcrRecord* representing public part of key
- * @secset: (allow-none): array of GcrRecord* representing secret part of key.
- *
- * Create a new GcrGnupgKey for the record data passed. If the secret part
- * of the key is set, then this represents a secret key; otherwise it represents
- * a public key.
- *
- * Returns: (transfer full): A newly allocated key.
- */
-GcrGnupgKey*
-_gcr_gnupg_key_new (GPtrArray *pubset, GPtrArray *secset)
-{
- g_return_val_if_fail (pubset, NULL);
- return g_object_new (GCR_TYPE_GNUPG_KEY,
- "public-records", pubset,
- "secret-records", secset,
- NULL);
-}
-
-/**
- * _gcr_gnupg_key_get_public_records:
- * @self: The key
- *
- * Get the record data this key is based on.
- *
- * Returns: (transfer none): An array of GcrRecord*.
- */
-GPtrArray*
-_gcr_gnupg_key_get_public_records (GcrGnupgKey *self)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_KEY (self), NULL);
- return self->pv->public_records;
-}
-
-/**
- * _gcr_gnupg_key_set_public_records:
- * @self: The key
- * @records: The new array of GcrRecord*
- *
- * Change the record data that this key is based on.
- */
-void
-_gcr_gnupg_key_set_public_records (GcrGnupgKey *self, GPtrArray *records)
-{
- GObject *obj;
-
- g_return_if_fail (GCR_IS_GNUPG_KEY (self));
- g_return_if_fail (records);
-
- /* Check that it matches previous */
- if (self->pv->public_records) {
- const gchar *old_keyid = _gcr_gnupg_records_get_keyid (self->pv->public_records);
- const gchar *new_keyid = _gcr_gnupg_records_get_keyid (records);
-
- if (g_strcmp0 (old_keyid, new_keyid) != 0) {
- g_warning ("it is an error to change a gnupg key so that the "
- "fingerprint is no longer the same: %s != %s",
- old_keyid, new_keyid);
- return;
- }
- }
-
- g_ptr_array_ref (records);
- if (self->pv->public_records)
- g_ptr_array_unref (self->pv->public_records);
- self->pv->public_records = records;
-
- obj = G_OBJECT (self);
- g_object_freeze_notify (obj);
- g_object_notify (obj, "public-records");
- g_object_notify (obj, "label");
- g_object_notify (obj, "markup");
- g_object_thaw_notify (obj);
-}
-
-/**
- * _gcr_gnupg_key_get_secret_records:
- * @self: The key
- *
- * Get the record secret data this key is based on. %NULL if a public key.
- *
- * Returns: (transfer none) (allow-none): An array of GcrColons*.
- */
-GPtrArray*
-_gcr_gnupg_key_get_secret_records (GcrGnupgKey *self)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_KEY (self), NULL);
- return self->pv->secret_records;
-}
-
-/**
- * _gcr_gnupg_key_set_secret_records:
- * @self: The key
- * @records: (allow-none): The new array of GcrRecord*
- *
- * Set the secret data for this key. %NULL if public key.
- */
-void
-_gcr_gnupg_key_set_secret_records (GcrGnupgKey *self, GPtrArray *records)
-{
- GObject *obj;
-
- g_return_if_fail (GCR_IS_GNUPG_KEY (self));
-
- /* Check that it matches public key */
- if (self->pv->public_records && records) {
- const gchar *pub_keyid = _gcr_gnupg_records_get_keyid (self->pv->public_records);
- const gchar *sec_keyid = _gcr_gnupg_records_get_keyid (records);
-
- if (g_strcmp0 (pub_keyid, sec_keyid) != 0) {
- g_warning ("it is an error to create a gnupg key so that the "
- "fingerprint of thet pub and sec parts are not the same: %s != %s",
- pub_keyid, sec_keyid);
- return;
- }
- }
-
- if (records)
- g_ptr_array_ref (records);
- if (self->pv->secret_records)
- g_ptr_array_unref (self->pv->secret_records);
- self->pv->secret_records = records;
-
- obj = G_OBJECT (self);
- g_object_freeze_notify (obj);
- g_object_notify (obj, "secret-records");
- g_object_thaw_notify (obj);
-}
-
-/**
- * _gcr_gnupg_key_get_keyid:
- * @self: The key
- *
- * Get the keyid for this key.
- *
- * Returns: (transfer none): The keyid.
- */
-const gchar*
-_gcr_gnupg_key_get_keyid (GcrGnupgKey *self)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_KEY (self), NULL);
- return _gcr_gnupg_records_get_keyid (self->pv->public_records);
-}
-
-/**
- * _gcr_gnupg_key_get_icon:
- * @self: A gnupg key.
- *
- * Get the display icon for this key.
- *
- * Return value: (transfer none): The icon, owned by the key.
- */
-GIcon*
-_gcr_gnupg_key_get_icon (GcrGnupgKey *self)
-{
- g_return_val_if_fail (GCR_IS_GNUPG_KEY (self), NULL);
-
- if (self->pv->icon == NULL) {
- self->pv->icon = _gcr_gnupg_records_get_icon (self->pv->public_records);
- if (self->pv->icon == NULL) {
- if (self->pv->secret_records)
- self->pv->icon = g_themed_icon_new ("gcr-key-pair");
- else
- self->pv->icon = g_themed_icon_new ("gcr-key");
- }
- }
-
- return self->pv->icon;
-}
-
-/**
- * _gcr_gnupg_key_get_columns:
- *
- * Get the columns that we should display for gnupg keys.
- *
- * Returns: (transfer none): The columns, NULL terminated, should not be freed.
- */
-const GcrColumn*
-_gcr_gnupg_key_get_columns (void)
-{
- static GcrColumn columns[] = {
- { "icon", /* later */ 0, /* later */ 0, NULL, 0, NULL, 0 },
- { "label", G_TYPE_STRING, G_TYPE_STRING, NC_("column", "Name"),
- GCR_COLUMN_SORTABLE, NULL, 0 },
- { "short-keyid", G_TYPE_STRING, G_TYPE_STRING, NC_("column", "Key ID"),
- GCR_COLUMN_SORTABLE, NULL, 0 },
- { NULL }
- };
-
- columns[0].property_type = columns[0].column_type = G_TYPE_ICON;
- return columns;
-}