/*
* 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, see .
*
* Author: Stef Walter
*/
#include "config.h"
#include "gcr-gnupg-records.h"
#include "gcr-record.h"
#include "gck/gck.h"
#include
/* Copied from GPGME */
gboolean
_gcr_gnupg_records_parse_user_id (const gchar *user_id,
gchar **rname,
gchar **remail,
gchar **rcomment)
{
gchar *src, *tail, *x;
int in_name = 0;
int in_email = 0;
int in_comment = 0;
gboolean anything;
const gchar *name = NULL;
const gchar *email = NULL;
const gchar *comment = NULL;
x = tail = src = g_strdup (user_id);
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;
}
}
anything = FALSE;
if (rname) {
*rname = g_strdup (name);
if (name) {
g_strstrip (*rname);
anything = TRUE;
}
}
if (remail) {
*remail = g_strdup (email);
if (email) {
g_strstrip (*remail);
anything = TRUE;
}
}
if (rcomment) {
*rcomment = g_strdup (comment);
if (comment) {
g_strstrip (*rcomment);
anything = TRUE;
}
}
g_free (x);
return anything;
}
const gchar *
_gcr_gnupg_records_get_keyid (GPtrArray *records)
{
GcrRecord *record;
record = _gcr_records_find (records, GCR_RECORD_SCHEMA_PUB);
if (record != NULL)
return _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID);
record = _gcr_records_find (records, GCR_RECORD_SCHEMA_SEC);
if (record != NULL)
return _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID);
return NULL;
}
const gchar *
_gcr_gnupg_records_get_short_keyid (GPtrArray *records)
{
const gchar *keyid;
gsize length;
keyid = _gcr_gnupg_records_get_keyid (records);
if (keyid == NULL)
return NULL;
length = strlen (keyid);
if (length > 8)
keyid += (length - 8);
return keyid;
}
gchar *
_gcr_gnupg_records_get_user_id (GPtrArray *records)
{
GcrRecord *record;
record = _gcr_records_find (records, GCR_RECORD_SCHEMA_UID);
if (record != NULL)
return _gcr_record_get_string (record, GCR_RECORD_UID_USERID);
return NULL;
}
const gchar *
_gcr_gnupg_records_get_fingerprint (GPtrArray *records)
{
GcrRecord *record;
record = _gcr_records_find (records, GCR_RECORD_SCHEMA_FPR);
if (record != NULL)
return _gcr_record_get_raw (record, GCR_RECORD_FPR_FINGERPRINT);
return NULL;
}