diff options
Diffstat (limited to 'gck/gck-uri.c')
-rw-r--r-- | gck/gck-uri.c | 365 |
1 files changed, 0 insertions, 365 deletions
diff --git a/gck/gck-uri.c b/gck/gck-uri.c deleted file mode 100644 index 3d66c835..00000000 --- a/gck/gck-uri.c +++ /dev/null @@ -1,365 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* gck-uri.c - the GObject PKCS#11 wrapper library - - Copyright (C) 2010, Stefan Walter - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. - - Author: Stef Walter <stef@memberwebs.com> -*/ - -#include "config.h" - -#include "gck.h" -#include "gck-private.h" -#include "gck-marshal.h" - -#include <glib/gi18n-lib.h> - -#include <p11-kit/uri.h> - -#include <string.h> -#include <stdlib.h> - -/** - * SECTION:gck-uri - * @title: PKCS11 URIs - * @short_description: Parsing and building PKCS\#11 URIs. - * - * <ulink href='http://tools.ietf.org/html/draft-pechanec-pkcs11uri-03'>PKCS\#11 URIs</ulink> - * are a standard for referring to PKCS\#11 modules, tokens, or objects. What the - * PKCS\#11 URI refers to depends on the context in which it is used. - * - * A PKCS\#11 URI can always resolve to more than one object, token or module. A - * PKCS\#11 URI that refers to a token, would (when used in a context that expects - * objects) refer to all the token on that module. - * - * In most cases the parsing or building of URIs is handled elsewhere in the GCK - * library. For example to enumerate objects that match a PKCS\#11 URI use the - * gck_modules_enumerate_uri() function. - * - * To parse a PKCS\#11 URI use the gck_uri_parse() function passing in the type of - * context in which you're using the URI. To build a URI use the gck_uri_build() - * function. - **/ - -/** - * GckUriData: - * @any_unrecognized: whether any parts of the PKCS\#11 URI were unsupported or unrecognized. - * @module_info: information about the PKCS\#11 modules matching the URI. - * @token_info: information about the PKCS\#11 tokens matching the URI. - * @attributes: information about the PKCS\#11 objects matching the URI. - * - * Information about the contents of a PKCS\#11 URI. Various fields may be %NULL - * depending on the context that the URI was parsed for. - * - * Since PKCS\#11 URIs represent a set which results from the intersections of - * all of the URI parts, if @any_recognized is set to %TRUE then usually the URI - * should be treated as not matching anything. - */ - -/** - * GckUriFlags: - * @GCK_URI_FOR_MODULE: the URI will be used to match modules. - * @GCK_URI_FOR_TOKEN: the URI will be used to match tokens. - * @GCK_URI_FOR_OBJECT: the URI will be used to match objects. - * @GCK_URI_WITH_VERSION: the URI has specific version numbers for module and/or token - * @GCK_URI_FOR_ANY: parse all recognized components of the URI. - * - * Which parts of the PKCS\#11 URI will be parsed or formatted. These can be - * combined. - */ - -/** - * GCK_URI_FOR_MODULE_WITH_VERSION: - * - * The URI will match specific version of modules. To be used as a GckUriFlags argument. - */ - -/** - * GCK_URI_FOR_OBJECT_ON_TOKEN: - * - * The URI will match objects on a specific token. To be used as a GckUriFlags argument. - */ - -/** - * GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE: - * - * The token inserted into a device with a specific module. - */ - -/** - * GckUriError: - * @GCK_URI_BAD_SCHEME: invalid URI scheme - * @GCK_URI_BAD_ENCODING: bad URI encoding - * @GCK_URI_BAD_SYNTAX: bad URI syntax - * @GCK_URI_BAD_VERSION: bad URI version component - * @GCK_URI_NOT_FOUND: piece of the URI was not found - * - * Various error codes used with PKCS\#11 URIs - */ - -/** - * GCK_URI_ERROR: - * - * Error domain for URI errors. - */ - -/** - * GCK_URI_BAD_PREFIX: - * - * Use %GCK_URI_BAD_SCHEME instead. - * - * Deprecated: Since 3.2 - */ - -/** - * CKR_GCK_MODULE_PROBLEM: - * - * Use %GCK_ERROR_MODULE_PROBLEM instead. - * - * Deprecated: Since 3.4 - */ - -#define URI_PREFIX "pkcs11:" -#define N_URI_PREFIX 7 - -struct _GckUri { - gboolean any_unrecognized; - GckModuleInfo *module_info; - GckTokenInfo *token_info; - GckAttributes *attributes; -}; - -GQuark -gck_uri_get_error_quark (void) -{ - /* This is deprecated version */ - return gck_uri_get_error_quark (); -} - -GQuark -gck_uri_error_get_quark (void) -{ - static GQuark domain = 0; - static volatile gsize quark_inited = 0; - - if (g_once_init_enter (&quark_inited)) { - domain = g_quark_from_static_string ("gck-uri-error"); - g_once_init_leave (&quark_inited, 1); - } - - return domain; -} - -/** - * gck_uri_data_new: - * - * Allocate a new GckUriData structure. None of the fields - * will be set. - * - * Returns: (transfer full): a newly allocated GckUriData, free with - * gck_uri_data_free() - */ -GckUriData * -gck_uri_data_new (void) -{ - return g_slice_new0 (GckUriData); -} - -/** - * gck_uri_parse: - * @string: the URI to parse. - * @flags: the context in which the URI will be used. - * @error: a #GError, or %NULL. - * - * Parse a PKCS\#11 URI for use in a given context. - * - * The result will contain the fields that are relevant for - * the given context. See #GckUriData for more info. - * Other fields will be set to %NULL. - * - * Returns: (transfer full): a newly allocated #GckUriData; which should be - * freed with gck_uri_data_free() - */ -GckUriData* -gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error) -{ - GckUriData *uri_data = NULL; - CK_ATTRIBUTE_PTR attrs; - CK_ULONG i, n_attrs; - P11KitUri *p11_uri; - gint res; - - g_return_val_if_fail (string, FALSE); - g_return_val_if_fail (!error || !*error, FALSE); - - p11_uri = p11_kit_uri_new (); - if (!p11_uri) - g_error ("failed to allocate P11KitUri"); - - res = p11_kit_uri_parse (string, flags, p11_uri); - if (res != P11_KIT_URI_OK) { - p11_kit_uri_free (p11_uri); - switch (res) { - case P11_KIT_URI_NO_MEMORY: - g_error ("failed to allocate memory in p11_kit_uri_parse()"); - break; - case P11_KIT_URI_BAD_ENCODING: - g_set_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING, - _("The URI has invalid encoding.")); - break; - case P11_KIT_URI_BAD_SCHEME: - g_set_error_literal (error, GCK_URI_ERROR, GCK_URI_BAD_SCHEME, - _("The URI does not have the 'pkcs11' scheme.")); - break; - case P11_KIT_URI_BAD_SYNTAX: - g_set_error_literal (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX, - _("The URI has bad syntax.")); - break; - case P11_KIT_URI_BAD_VERSION: - g_set_error_literal (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX, - _("The URI has a bad version number.")); - break; - case P11_KIT_URI_NOT_FOUND: - g_assert_not_reached (); - break; - }; - return NULL; - } - - /* Convert it to a GckUri */ - uri_data = gck_uri_data_new (); - if (flags & GCK_URI_FOR_MODULE_WITH_VERSION) - uri_data->module_info = _gck_module_info_from_pkcs11 (p11_kit_uri_get_module_info (p11_uri)); - if (flags & GCK_URI_FOR_TOKEN) - uri_data->token_info = _gck_token_info_from_pkcs11 (p11_kit_uri_get_token_info (p11_uri)); - if (flags & GCK_URI_FOR_OBJECT) { - attrs = p11_kit_uri_get_attributes (p11_uri, &n_attrs); - uri_data->attributes = gck_attributes_new (); - for (i = 0; i < n_attrs; ++i) - gck_attributes_add (uri_data->attributes, (GckAttribute*)&attrs[i]); - } - uri_data->any_unrecognized = p11_kit_uri_any_unrecognized (p11_uri); - - p11_kit_uri_free (p11_uri); - return uri_data; -} - -/** - * gck_uri_build: - * @uri_data: the info to build the URI from. - * @flags: The context that the URI is for - * - * Build a PKCS\#11 URI. The various parts relevant to the flags - * specified will be used to build the URI. - * - * Return value: a newly allocated string containing a PKCS\#11 URI. - */ -gchar* -gck_uri_build (GckUriData *uri_data, GckUriFlags flags) -{ - GckAttribute *attr; - P11KitUri *p11_uri = 0; - gchar *string; - int res; - guint i; - - g_return_val_if_fail (uri_data != NULL, NULL); - - p11_uri = p11_kit_uri_new (); - - if ((flags & GCK_URI_FOR_MODULE_WITH_VERSION) && uri_data->module_info) - _gck_module_info_to_pkcs11 (uri_data->module_info, - p11_kit_uri_get_module_info (p11_uri)); - if ((flags & GCK_URI_FOR_TOKEN) && uri_data->token_info) - _gck_token_info_to_pkcs11 (uri_data->token_info, - p11_kit_uri_get_token_info (p11_uri)); - if ((flags & GCK_URI_FOR_OBJECT) && uri_data->attributes) { - for (i = 0; i < gck_attributes_count (uri_data->attributes); ++i) { - attr = gck_attributes_at (uri_data->attributes, i); - res = p11_kit_uri_set_attribute (p11_uri, (CK_ATTRIBUTE_PTR)attr); - if (res == P11_KIT_URI_NO_MEMORY) - g_error ("failed to allocate memory in p11_kit_uri_set_attribute()"); - else if (res != P11_KIT_URI_NOT_FOUND && res != P11_KIT_URI_OK) - g_return_val_if_reached (NULL); - } - } - - res = p11_kit_uri_format (p11_uri, flags & GCK_URI_FOR_ANY, &string); - if (res == P11_KIT_URI_NO_MEMORY) - g_error ("failed to allocate memory in p11_kit_uri_format()"); - else if (res != P11_KIT_URI_OK) - g_return_val_if_reached (NULL); - - p11_kit_uri_free (p11_uri); - return string; -} - -GType -gck_uri_data_get_type (void) -{ - static volatile gsize initialized = 0; - static GType type = 0; - if (g_once_init_enter (&initialized)) { - type = g_boxed_type_register_static ("GckUriData", - (GBoxedCopyFunc)gck_uri_data_copy, - (GBoxedFreeFunc)gck_uri_data_free); - g_once_init_leave (&initialized, 1); - } - return type; -} - -/** - * gck_uri_data_copy: - * @uri_data: URI data to copy - * - * Copy a #GckUriData - * - * Returns: (transfer full): newly allocated copy of the uri data - */ -GckUriData * -gck_uri_data_copy (GckUriData *uri_data) -{ - GckUriData *copy; - - copy = g_memdup (uri_data, sizeof (GckUriData)); - copy->attributes = gck_attributes_new (); - gck_attributes_add_all (copy->attributes, uri_data->attributes); - copy->module_info = gck_module_info_copy (copy->module_info); - copy->token_info = gck_token_info_copy (copy->token_info); - return copy; -} - -/** - * gck_uri_data_free: - * @uri_data: URI data to free. - * - * Free a #GckUriData. - */ -void -gck_uri_data_free (GckUriData *uri_data) -{ - if (uri_data) { - if (uri_data->attributes) - gck_attributes_unref (uri_data->attributes); - if (uri_data->module_info) - gck_module_info_free (uri_data->module_info); - if (uri_data->token_info) - gck_token_info_free (uri_data->token_info); - g_slice_free (GckUriData, uri_data); - } -} |