Blame gcr/frob-openpgp.c

Packit b00eeb
/*
Packit b00eeb
 * gnome-keyring
Packit b00eeb
 *
Packit b00eeb
 * Copyright (C) 2011 Collabora Ltd.
Packit b00eeb
 *
Packit b00eeb
 * This program is free software; you can redistribute it and/or modify
Packit b00eeb
 * it under the terms of the GNU Lesser General Public License as
Packit b00eeb
 * published by the Free Software Foundation; either version 2.1 of
Packit b00eeb
 * the License, or (at your option) any later version.
Packit b00eeb
 *
Packit b00eeb
 * This program is distributed in the hope that it will be useful, but
Packit b00eeb
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
 * Lesser General Public License for more details.
Packit b00eeb
 *
Packit b00eeb
 * You should have received a copy of the GNU Lesser General Public
Packit b00eeb
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit b00eeb
 *
Packit b00eeb
 * Author: Stef Walter <stefw@collabora.co.uk>
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "gcr/gcr-base.h"
Packit b00eeb
#include "gcr/gcr-openpgp.h"
Packit b00eeb
#include "gcr/gcr-record.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-armor.h"
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
on_packet_print_records (GPtrArray *records,
Packit b00eeb
                         GBytes *packet,
Packit b00eeb
                         gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	gchar *string;
Packit b00eeb
	guint i;
Packit b00eeb
Packit b00eeb
	for (i = 0; i < records->len; i++) {
Packit b00eeb
		string = _gcr_record_format (records->pdata[i]);
Packit b00eeb
		g_print ("%s\n", string);
Packit b00eeb
		g_free (string);
Packit b00eeb
	}
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static gboolean
Packit b00eeb
parse_binary (GBytes *contents)
Packit b00eeb
{
Packit b00eeb
	guint packets;
Packit b00eeb
Packit b00eeb
	packets = _gcr_openpgp_parse (contents,
Packit b00eeb
	                              GCR_OPENPGP_PARSE_KEYS |
Packit b00eeb
	                              GCR_OPENPGP_PARSE_ATTRIBUTES,
Packit b00eeb
	                              on_packet_print_records, NULL);
Packit b00eeb
Packit b00eeb
	return (packets > 0);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
on_armor_parsed (GQuark type,
Packit b00eeb
                 GBytes *data,
Packit b00eeb
                 GBytes *outer,
Packit b00eeb
                 GHashTable *headers,
Packit b00eeb
                 gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	const gchar *value;
Packit b00eeb
	gboolean *result = user_data;
Packit b00eeb
Packit b00eeb
	value = g_hash_table_lookup (headers, "Version");
Packit b00eeb
	g_assert_cmpstr (value, ==, "GnuPG v1.4.11 (GNU/Linux)");
Packit b00eeb
Packit b00eeb
	*result = parse_binary (data);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static gboolean
Packit b00eeb
parse_armor_or_binary (GBytes *contents)
Packit b00eeb
{
Packit b00eeb
	gboolean result;
Packit b00eeb
	guint parts;
Packit b00eeb
Packit b00eeb
	parts = egg_armor_parse (contents, on_armor_parsed, &result);
Packit b00eeb
	if (parts == 0)
Packit b00eeb
		result = parse_binary (contents);
Packit b00eeb
	return result;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
int
Packit b00eeb
main(int argc, char *argv[])
Packit b00eeb
{
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *contents;
Packit b00eeb
	gsize length;
Packit b00eeb
	GBytes *bytes;
Packit b00eeb
	int ret;
Packit b00eeb
Packit b00eeb
	g_set_prgname ("frob-openpgp");
Packit b00eeb
Packit b00eeb
	if (argc != 2) {
Packit b00eeb
		g_printerr ("usage: frob-openpgp filename\n");
Packit b00eeb
		return 2;
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	if (!g_file_get_contents (argv[1], &contents, &length, &error)) {
Packit b00eeb
		g_printerr ("frob-openpgp: couldn't read file: %s: %s", argv[1], error->message);
Packit b00eeb
		g_error_free (error);
Packit b00eeb
		return 1;
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	bytes = g_bytes_new_take (contents, length);
Packit b00eeb
	ret = 0;
Packit b00eeb
	if (!parse_armor_or_binary (bytes)) {
Packit b00eeb
		g_printerr ("frob-openpgp: no openpgp data found in data");
Packit b00eeb
		ret = 1;
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_bytes_unref (bytes);
Packit b00eeb
	return ret;
Packit b00eeb
}