Blame gcr/test-gnupg-key.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/*
Packit b00eeb
   Copyright (C) 2011 Collabora Ltd
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit b00eeb
   modify it under the terms of the GNU Library General Public License as
Packit b00eeb
   published by the Free Software Foundation; either version 2 of the
Packit b00eeb
   License, or (at your option) any later version.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit b00eeb
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
   Library General Public License for more details.
Packit b00eeb
Packit b00eeb
   You should have received a copy of the GNU Library General Public
Packit b00eeb
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit b00eeb
   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-record.h"
Packit b00eeb
#include "gcr/gcr-gnupg-key.h"
Packit b00eeb
#include "gcr/gcr-gnupg-records.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-testing.h"
Packit b00eeb
Packit b00eeb
#include <glib.h>
Packit b00eeb
Packit b00eeb
#include <errno.h>
Packit b00eeb
#include <stdlib.h>
Packit b00eeb
#include <string.h>
Packit b00eeb
Packit b00eeb
typedef struct {
Packit b00eeb
	GPtrArray *records;
Packit b00eeb
	GPtrArray *pubset;
Packit b00eeb
	GPtrArray *secset;
Packit b00eeb
	GcrGnupgKey *key;
Packit b00eeb
} Test;
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
setup (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GPtrArray *records;
Packit b00eeb
Packit b00eeb
	records = g_ptr_array_new_with_free_func (_gcr_record_free);
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("pub:f:1024:17:6C7EE1B8621CC013:899817715:1055898235::m:::scESC:", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("fpr:::::::::ECAF7590EB3443B5C7CF3ACB6C7EE1B8621CC013:", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("uid:f::::::::Werner Koch <wk@g10code.com>:\n", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("uid:f::::::::Werner Koch <wk@gnupg.org>:\n", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("sub:f:1536:16:06AD222CADF6A6E1:919537416:1036177416:::::e:\n", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("fpr:::::::::CF8BCC4B18DE08FCD8A1615906AD222CADF6A6E1:\n", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("sub:r:1536:20:5CE086B5B5A18FF4:899817788:1025961788:::::esc:\n", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("fpr:::::::::AB059359A3B81F410FCFF97F5CE086B5B5A18FF4:", -1));
Packit b00eeb
	test->records = records;
Packit b00eeb
Packit b00eeb
	test->key = _gcr_gnupg_key_new (records, NULL);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->key), (gpointer *)&test->key);
Packit b00eeb
Packit b00eeb
	records = g_ptr_array_new_with_free_func (_gcr_record_free);
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("pub:u:2048:1:4842D952AFC000FD:1305189489:::u:::scESC:", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("uid:u::::1305189849::D0A8FA7B15DC4BE3F8F03A49C372F2718C78AFC0::Dr. Strangelove <lovingbomb@example.com>:", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("uid:u::::1305189489::D449F1605254754B0BBFA424FC34E50609103BBB::Test Number 1 (unlimited) <test-number-1@example.com>:", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("sub:u:2048:1:4852132BBED15014:1305189489::::::e:", -1));
Packit b00eeb
	test->pubset = records;
Packit b00eeb
Packit b00eeb
	records = g_ptr_array_new_with_free_func (_gcr_record_free);
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("sec::2048:1:4842D952AFC000FD:1305189489::::::::::", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("uid:::::::D449F1605254754B0BBFA424FC34E50609103BBB::Test Number 1 (unlimited) <test-number-1@example.com>:", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("uid:::::::D0A8FA7B15DC4BE3F8F03A49C372F2718C78AFC0::Dr. Strangelove <lovingbomb@example.com>:", -1));
Packit b00eeb
	g_ptr_array_add (records, _gcr_record_parse_colons ("ssb::2048:1:4852132BBED15014:1305189489::::::::::", -1));
Packit b00eeb
	test->secset = records;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
teardown (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	g_object_unref (test->key);
Packit b00eeb
	g_assert (test->key == NULL);
Packit b00eeb
Packit b00eeb
	g_ptr_array_unref (test->records);
Packit b00eeb
	g_ptr_array_unref (test->pubset);
Packit b00eeb
	g_ptr_array_unref (test->secset);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_label (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	gchar *label;
Packit b00eeb
Packit b00eeb
	g_object_get (test->key, "label", &label, NULL);
Packit b00eeb
	g_assert_cmpstr (label, ==, "Werner Koch <wk@g10code.com>");
Packit b00eeb
Packit b00eeb
	g_free (label);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_markup (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	gchar *markup;
Packit b00eeb
Packit b00eeb
	g_object_get (test->key, "markup", &markup, NULL);
Packit b00eeb
	g_assert_cmpstr (markup, ==, "Werner Koch\n<small>wk@g10code.com</small>");
Packit b00eeb
Packit b00eeb
	g_free (markup);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_description (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	gchar *description;
Packit b00eeb
Packit b00eeb
	g_object_get (test->key, "description", &description, NULL);
Packit b00eeb
	g_assert_cmpstr (description, ==, "PGP Key");
Packit b00eeb
Packit b00eeb
	g_free (description);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_records (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GPtrArray *records;
Packit b00eeb
Packit b00eeb
	g_object_get (test->key, "public-records", &records, NULL);
Packit b00eeb
	g_assert (records == test->records);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_key_set_public_records (test->key, records);
Packit b00eeb
	g_assert (records == _gcr_gnupg_key_get_public_records (test->key));
Packit b00eeb
Packit b00eeb
	g_ptr_array_unref (records);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_keyid (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	gchar *keyid;
Packit b00eeb
Packit b00eeb
	g_object_get (test->key, "keyid", &keyid, NULL);
Packit b00eeb
	g_assert_cmpstr (keyid, ==, "6C7EE1B8621CC013");
Packit b00eeb
Packit b00eeb
	g_free (keyid);
Packit b00eeb
Packit b00eeb
	g_assert_cmpstr (_gcr_gnupg_key_get_keyid (test->key), ==, "6C7EE1B8621CC013");
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_short_keyid (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	gchar *keyid;
Packit b00eeb
Packit b00eeb
	g_object_get (test->key, "short-keyid", &keyid, NULL);
Packit b00eeb
	g_assert_cmpstr (keyid, ==, "621CC013");
Packit b00eeb
Packit b00eeb
	g_free (keyid);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_keyid_for_records (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	const gchar *keyid;
Packit b00eeb
Packit b00eeb
	keyid = _gcr_gnupg_records_get_keyid (test->records);
Packit b00eeb
	g_assert_cmpstr (keyid, ==, "6C7EE1B8621CC013");
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_with_secret (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GcrGnupgKey *key;
Packit b00eeb
	GPtrArray *secset;
Packit b00eeb
Packit b00eeb
	key = _gcr_gnupg_key_new (test->pubset, test->secset);
Packit b00eeb
	g_assert (GCR_IS_GNUPG_KEY (key));
Packit b00eeb
Packit b00eeb
	g_object_get (key, "secret-records", &secset, NULL);
Packit b00eeb
	g_assert (secset == _gcr_gnupg_key_get_secret_records (key));
Packit b00eeb
	g_object_set (key, "secret-records", secset, NULL);
Packit b00eeb
	g_ptr_array_unref (secset);
Packit b00eeb
Packit b00eeb
	g_object_unref (key);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_no_change_keyid (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	if (g_test_subprocess ()) {
Packit b00eeb
		/* Changing the keyid. This should fail with a warning */
Packit b00eeb
		_gcr_gnupg_key_set_public_records (test->key, test->pubset);
Packit b00eeb
		return;
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_test_trap_subprocess ("/gcr/gnupg-key/no_change_keyid", 0, G_TEST_SUBPROCESS_INHERIT_STDOUT);
Packit b00eeb
	g_test_trap_assert_failed ();
Packit b00eeb
	g_test_trap_assert_stderr ("*fingerprint is no longer the same:*");
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_secret_mismatched_keyid (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	if (g_test_subprocess ()) {
Packit b00eeb
		/* Different keyid for secret part. This should fail with a warning */
Packit b00eeb
		_gcr_gnupg_key_set_secret_records (test->key, test->secset);
Packit b00eeb
		return;
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_test_trap_subprocess ("/gcr/gnupg-key/secret_mismatched_keyid", 0, G_TEST_SUBPROCESS_INHERIT_STDOUT);
Packit b00eeb
	g_test_trap_assert_failed ();
Packit b00eeb
	g_test_trap_assert_stderr ("*pub and sec parts are not the same:*");
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
int
Packit b00eeb
main (int argc, char **argv)
Packit b00eeb
{
Packit b00eeb
	g_test_init (&argc, &argv, NULL);
Packit b00eeb
Packit b00eeb
	g_test_add ("/gcr/gnupg-key/label", Test, NULL, setup, test_label, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-key/description", Test, NULL, setup, test_description, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-key/markup", Test, NULL, setup, test_markup, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-key/records", Test, NULL, setup, test_records, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-key/keyid", Test, NULL, setup, test_keyid, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-key/short_keyid", Test, NULL, setup, test_short_keyid, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-key/keyid_for_records", Test, NULL, setup, test_keyid_for_records, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-key/with_secret", Test, NULL, setup, test_with_secret, teardown);
Packit b00eeb
Packit b00eeb
	/* Valgrind seems to have problems with g_test_trap_fork() */
Packit b00eeb
	if (!egg_testing_on_valgrind ()) {
Packit b00eeb
		g_test_add ("/gcr/gnupg-key/no_change_keyid", Test, NULL, setup, test_no_change_keyid, teardown);
Packit b00eeb
		g_test_add ("/gcr/gnupg-key/secret_mismatched_keyid", Test, NULL, setup, test_secret_mismatched_keyid, teardown);
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	return g_test_run ();
Packit b00eeb
}