/* * gnome-keyring * * 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/gcr-base.h" #include #include #include static gboolean dump_certificate (GckAttributes *attrs, const gchar *filename) { const GckAttribute *attr; GcrCertificate *cert; gchar *subject; gulong klass; if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) || klass != CKO_CERTIFICATE) return FALSE; attr = gck_attributes_find (attrs, CKA_VALUE); if (!attr) return FALSE; cert = gcr_simple_certificate_new_static (attr->value, attr->length); subject = gcr_certificate_get_subject_dn (cert); g_print ("%s: parsed certificate: %s\n", filename, subject); g_free (subject); g_object_unref (cert); return TRUE; } static void on_parser_parsed (GcrParser *parser, gpointer user_data) { GckAttributes *attrs; const gchar **pointer_filename = (const gchar**)user_data; attrs = gcr_parser_get_parsed_attributes (parser); g_return_if_fail (attrs); if (!dump_certificate (attrs, *pointer_filename)) g_print ("%s: parsed %s\n", *pointer_filename, gcr_parser_get_parsed_description (parser)); } int main(int argc, char *argv[]) { GcrParser *parser; GError *error = NULL; gchar *contents; gsize len; GDir *dir; const gchar *filename; GBytes *bytes; gchar *path; g_set_prgname ("frob-parser"); if (argc != 2) { g_printerr ("usage: frob-parser directory\n"); return 2; } dir = g_dir_open (argv[1], 0, &error); if (!dir) { g_printerr ("couldn't list directory: %s: %s\n", argv[1], error->message); g_clear_error (&error); return 1; } parser = gcr_parser_new (); g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &filename); for (;;) { filename = g_dir_read_name (dir); if (!filename) break; if (filename[0] == '.') continue; path = g_build_filename (argv[1], filename, NULL); g_file_get_contents (path, &contents, &len, &error); g_free (path); if (error) { g_printerr ("%s: couldn't read file: %s\n", filename, error->message); g_clear_error (&error); continue; } bytes = g_bytes_new_take (contents, len); gcr_parser_parse_bytes (parser, bytes, &error); g_bytes_unref (bytes); if (error) { g_warning ("%s: couldn't parse: %s\n", filename, error->message); g_clear_error (&error); } g_print ("%s: finished parsing\n", filename); } g_dir_close (dir); g_object_unref (parser); return 0; }