summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authorStef Walter <stefw@collabora.co.uk>2011-09-21 13:55:51 +0200
committerStef Walter <stefw@collabora.co.uk>2011-09-27 09:55:06 +0200
commit01098245b36a76321b6fc38dca50efa64b0a6b8e (patch)
treed8fb596bcaa2f26569728bd0f20d1486db2ace4a /tool
parent95296d139236df1cb3d916b89f30a1bc31572c1f (diff)
downloadgnome-keyring-01098245b36a76321b6fc38dca50efa64b0a6b8e.tar.gz
gcr: Refactor the importer with multiple registered importers
* Allow multiple importers to register, and have a way for them to identify whether something is importable by the importer or not. * Create a new GnuPG keyring importer. * Add boxed type for a GList of GObject * Some other minor cleanups.
Diffstat (limited to 'tool')
-rw-r--r--tool/gkr-tool-import.c138
1 files changed, 105 insertions, 33 deletions
diff --git a/tool/gkr-tool-import.c b/tool/gkr-tool-import.c
index fdb8e018..05f26ddc 100644
--- a/tool/gkr-tool-import.c
+++ b/tool/gkr-tool-import.c
@@ -39,7 +39,16 @@ static GOptionEntry import_entries[] = {
};
static void
-on_imported (GcrImporter *importer, GckObject *object)
+imported_fingerprint (const gchar *fingerprint,
+ const gchar *destination)
+{
+ g_print ("%s: imported openpgp\n", destination);
+ g_print ("\tfingerprint: %s\n", fingerprint);
+}
+
+static void
+imported_object (GckObject *object,
+ const gchar *destination)
{
gulong attr_types[3];
GckAttributes *attrs;
@@ -67,30 +76,30 @@ on_imported (GcrImporter *importer, GckObject *object)
switch (klass) {
case CKO_CERTIFICATE:
- message = "Imported certificate: %s\n";
+ message = "%s: imported certificate: %s\n";
break;
case CKO_DATA:
- message = "Imported data: %s\n";
+ message = "%s: imported data: %s\n";
break;
case CKO_PRIVATE_KEY:
- message = "Imported private key: %s\n";
+ message = "%s: imported private key: %s\n";
break;
case CKO_PUBLIC_KEY:
- message = "Imported public key: %s\n";
+ message = "%s: imported public key: %s\n";
break;
case CKO_SECRET_KEY:
- message = "Imported secret key: %s\n";
+ message = "%s: imported secret key: %s\n";
break;
default:
- message = "Imported object: %s\n";
+ message = "%s: imported object: %s\n";
break;
};
- g_print (message, label);
+ g_print (message, destination, label);
if (id) {
hex = egg_hex_encode (id->value, id->length);
- g_print ("\tID: %s\n", hex);
+ g_print ("\tidentifier: %s\n", hex);
g_free (hex);
}
@@ -98,18 +107,70 @@ on_imported (GcrImporter *importer, GckObject *object)
g_free (label);
}
+static void
+imported_display (GcrImporter *importer)
+{
+ GParamSpec *spec;
+ gchar *label = NULL;
+
+ spec = g_object_class_find_property (G_OBJECT_GET_CLASS (importer), "imported");
+ if (spec == NULL)
+ return;
+
+ g_object_get (importer, "label", &label, NULL);
+
+ if (spec->value_type == GCK_TYPE_LIST) {
+ GList *list, *l;
+ g_object_get (importer, "imported", &list, NULL);
+ for (l = list; l != NULL; l = g_list_next (l))
+ imported_object (l->data, label);
+ gck_list_unref_free (list);
+
+ } else if (spec->value_type == G_TYPE_STRV) {
+ gchar **fingerprints;
+ guint i;
+ g_object_get (importer, "imported", &fingerprints, NULL);
+ for (i = 0; fingerprints && fingerprints[i] != NULL; i++)
+ imported_fingerprint (fingerprints[i], label);
+ g_strfreev (fingerprints);
+ }
+}
+
+typedef struct {
+ GList *importers;
+ gboolean num_parsed;
+} ImportClosure;
+
+static void
+on_parser_parsed (GcrParser *parser,
+ gpointer user_data)
+{
+ ImportClosure *closure = user_data;
+ GList *filtered;
+
+ if (closure->num_parsed == 0) {
+ closure->importers = gcr_importer_create_for_parsed (parser);
+ } else {
+ filtered = gcr_importer_queue_and_filter_for_parsed (closure->importers, parser);
+ gck_list_unref_free (closure->importers);
+ closure->importers = filtered;
+ }
+
+ closure->num_parsed++;
+}
+
int
gkr_tool_import (int argc, char *argv[])
{
- GcrImporter *importer;
GcrParser *parser;
GError *error = NULL;
GInputStream *input;
- gboolean res;
+ ImportClosure *closure;
GFile *file;
gchar **imp;
int ret = 0;
-
+ GList *l;
+
ret = gkr_tool_parse_options (&argc, &argv, import_entries);
if (ret != 0)
return ret;
@@ -118,39 +179,50 @@ gkr_tool_import (int argc, char *argv[])
gkr_tool_handle_error (NULL, "specify files to import");
return 2;
}
-
- importer = gcr_importer_new ();
- gcr_importer_set_prompt_behavior (importer, GCR_IMPORTER_PROMPT_NEEDED);
-
- if (!gkr_tool_mode_quiet)
- g_signal_connect (importer, "imported", G_CALLBACK (on_imported), NULL);
-
+
+ parser = gcr_parser_new ();
+ closure = g_new0 (ImportClosure, 1);
+ g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), closure);
+
for (imp = import_files; *imp; ++imp) {
file = g_file_new_for_commandline_arg (*imp);
input = G_INPUT_STREAM (g_file_read (file, NULL, &error));
g_object_unref (file);
- if (!input) {
+ if (input == NULL) {
gkr_tool_handle_error (&error, "couldn't read file: %s", *imp);
ret = 1;
+
} else {
- parser = gcr_parser_new ();
- gcr_importer_listen (importer, parser);
- res = gcr_parser_parse_stream (parser, input, NULL, &error);
+ if (!gcr_parser_parse_stream (parser, input, NULL, &error)) {
+ if (error->code != GCR_ERROR_CANCELLED)
+ gkr_tool_handle_error (&error, "couldn't parse: %s", *imp);
+ ret = 1;
+ }
+
g_object_unref (input);
- g_object_unref (parser);
+ }
+ }
- if (res == TRUE)
- res = gcr_importer_import (importer, NULL, &error);
+ if (closure->importers == NULL) {
+ gkr_tool_handle_error (NULL, "couldn't find any place to import files");
+ ret = 1;
+ }
- if (res == FALSE) {
- if (!error || error->code != GCR_ERROR_CANCELLED)
- gkr_tool_handle_error (&error, "couldn't import file: %s", *imp);
- ret = 1;
- }
+ for (l = closure->importers; l != NULL; l = g_list_next (l)) {
+ if (gcr_importer_import (l->data, NULL, &error)) {
+ if (!gkr_tool_mode_quiet)
+ imported_display (l->data);
+ } else {
+ if (error->code != GCR_ERROR_CANCELLED)
+ gkr_tool_handle_error (&error, "couldn't import");
+ ret = 1;
}
}
-
- g_object_unref (importer);
+
+ gck_list_unref_free (closure->importers);
+ g_free (closure);
+
+ g_object_unref (parser);
return ret;
}