|
Tomas Bzatek |
9bb2af2 |
From d30630070b2e7f6173ea872f45bb47b70948e796 Mon Sep 17 00:00:00 2001
|
|
Tomas Bzatek |
9bb2af2 |
From: Stef Walter <stef@memberwebs.com>
|
|
Tomas Bzatek |
9bb2af2 |
Date: Sat, 20 Mar 2010 02:19:44 +0000
|
|
Tomas Bzatek |
9bb2af2 |
Subject: [secret-store] Don't save session keyring to disk.
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
There was a major problem where the session keyring was being saved
|
|
Tomas Bzatek |
9bb2af2 |
to disk, and since it had to master password, as a cleartext keyring
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
Mark the session keyring as transient so it doesn't even come near
|
|
Tomas Bzatek |
9bb2af2 |
the storage code. Also rework the collection storage code, so that
|
|
Tomas Bzatek |
9bb2af2 |
it properly handles various corner cases.
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
Fixes bug #612977
|
|
Tomas Bzatek |
9bb2af2 |
---
|
|
Tomas Bzatek |
9bb2af2 |
diff --git a/pkcs11/gck/gck-object.c b/pkcs11/gck/gck-object.c
|
|
Tomas Bzatek |
9bb2af2 |
index a568042..a2d03e2 100644
|
|
Tomas Bzatek |
9bb2af2 |
--- a/pkcs11/gck/gck-object.c
|
|
Tomas Bzatek |
9bb2af2 |
+++ b/pkcs11/gck/gck-object.c
|
|
Tomas Bzatek |
9bb2af2 |
@@ -41,7 +41,8 @@ enum {
|
|
Tomas Bzatek |
9bb2af2 |
PROP_MODULE,
|
|
Tomas Bzatek |
9bb2af2 |
PROP_MANAGER,
|
|
Tomas Bzatek |
9bb2af2 |
PROP_STORE,
|
|
Tomas Bzatek |
9bb2af2 |
- PROP_UNIQUE
|
|
Tomas Bzatek |
9bb2af2 |
+ PROP_UNIQUE,
|
|
Tomas Bzatek |
9bb2af2 |
+ PROP_TRANSIENT
|
|
Tomas Bzatek |
9bb2af2 |
};
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
enum {
|
|
Tomas Bzatek |
9bb2af2 |
@@ -201,6 +202,13 @@ find_credential (GckCredential *cred, GckObject *object, gpointer user_data)
|
|
Tomas Bzatek |
9bb2af2 |
return TRUE;
|
|
Tomas Bzatek |
9bb2af2 |
}
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
+static void
|
|
Tomas Bzatek |
9bb2af2 |
+mark_object_transient (GckObject *self)
|
|
Tomas Bzatek |
9bb2af2 |
+{
|
|
Tomas Bzatek |
9bb2af2 |
+ if (!self->pv->transient)
|
|
Tomas Bzatek |
9bb2af2 |
+ self->pv->transient = g_slice_new0 (GckObjectTransient);
|
|
Tomas Bzatek |
9bb2af2 |
+}
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
/* -----------------------------------------------------------------------------
|
|
Tomas Bzatek |
9bb2af2 |
* OBJECT
|
|
Tomas Bzatek |
9bb2af2 |
*/
|
|
Tomas Bzatek |
9bb2af2 |
@@ -337,7 +345,7 @@ gck_object_real_create_attributes (GckObject *self, GckSession *session,
|
|
Tomas Bzatek |
9bb2af2 |
CKA_G_DESTRUCT_IDLE, CKA_GNOME_TRANSIENT, G_MAXULONG);
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
if (transient) {
|
|
Tomas Bzatek |
9bb2af2 |
- self->pv->transient = g_slice_new0 (GckObjectTransient);
|
|
Tomas Bzatek |
9bb2af2 |
+ mark_object_transient (self);
|
|
Tomas Bzatek |
9bb2af2 |
self->pv->transient->timed_after = after;
|
|
Tomas Bzatek |
9bb2af2 |
self->pv->transient->timed_idle = idle;
|
|
Tomas Bzatek |
9bb2af2 |
}
|
|
Tomas Bzatek |
9bb2af2 |
@@ -481,6 +489,11 @@ gck_object_set_property (GObject *obj, guint prop_id, const GValue *value,
|
|
Tomas Bzatek |
9bb2af2 |
g_return_if_fail (!self->pv->unique);
|
|
Tomas Bzatek |
9bb2af2 |
self->pv->unique = g_value_dup_string (value);
|
|
Tomas Bzatek |
9bb2af2 |
break;
|
|
Tomas Bzatek |
9bb2af2 |
+ case PROP_TRANSIENT:
|
|
Tomas Bzatek |
9bb2af2 |
+ g_return_if_fail (!self->pv->transient);
|
|
Tomas Bzatek |
9bb2af2 |
+ if (g_value_get_boolean (value))
|
|
Tomas Bzatek |
9bb2af2 |
+ mark_object_transient (self);
|
|
Tomas Bzatek |
9bb2af2 |
+ break;
|
|
Tomas Bzatek |
9bb2af2 |
default:
|
|
Tomas Bzatek |
9bb2af2 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
|
|
Tomas Bzatek |
9bb2af2 |
break;
|
|
Tomas Bzatek |
9bb2af2 |
@@ -510,6 +523,9 @@ gck_object_get_property (GObject *obj, guint prop_id, GValue *value,
|
|
Tomas Bzatek |
9bb2af2 |
case PROP_UNIQUE:
|
|
Tomas Bzatek |
9bb2af2 |
g_value_set_string (value, gck_object_get_unique (self));
|
|
Tomas Bzatek |
9bb2af2 |
break;
|
|
Tomas Bzatek |
9bb2af2 |
+ case PROP_TRANSIENT:
|
|
Tomas Bzatek |
9bb2af2 |
+ g_value_set_boolean (value, gck_object_is_transient (self));
|
|
Tomas Bzatek |
9bb2af2 |
+ break;
|
|
Tomas Bzatek |
9bb2af2 |
default:
|
|
Tomas Bzatek |
9bb2af2 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
|
|
Tomas Bzatek |
9bb2af2 |
break;
|
|
Tomas Bzatek |
9bb2af2 |
@@ -556,7 +572,11 @@ gck_object_class_init (GckObjectClass *klass)
|
|
Tomas Bzatek |
9bb2af2 |
g_object_class_install_property (gobject_class, PROP_UNIQUE,
|
|
Tomas Bzatek |
9bb2af2 |
g_param_spec_string ("unique", "Unique Identifer", "Machine unique identifier",
|
|
Tomas Bzatek |
9bb2af2 |
NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
|
Tomas Bzatek |
9bb2af2 |
-
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
+ g_object_class_install_property (gobject_class, PROP_TRANSIENT,
|
|
Tomas Bzatek |
9bb2af2 |
+ g_param_spec_boolean ("transient", "Transient Object", "Transient Object",
|
|
Tomas Bzatek |
9bb2af2 |
+ FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
signals[EXPOSE_OBJECT] = g_signal_new ("expose-object", GCK_TYPE_OBJECT,
|
|
Tomas Bzatek |
9bb2af2 |
G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GckObjectClass, expose_object),
|
|
Tomas Bzatek |
9bb2af2 |
NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
|
|
Tomas Bzatek |
9bb2af2 |
diff --git a/pkcs11/secret-store/gck-secret-module.c b/pkcs11/secret-store/gck-secret-module.c
|
|
Tomas Bzatek |
9bb2af2 |
index 5b08008..c3cba91 100644
|
|
Tomas Bzatek |
9bb2af2 |
--- a/pkcs11/secret-store/gck-secret-module.c
|
|
Tomas Bzatek |
9bb2af2 |
+++ b/pkcs11/secret-store/gck-secret-module.c
|
|
Tomas Bzatek |
9bb2af2 |
@@ -42,10 +42,7 @@ struct _GckSecretModule {
|
|
Tomas Bzatek |
9bb2af2 |
GckFileTracker *tracker;
|
|
Tomas Bzatek |
9bb2af2 |
GHashTable *collections;
|
|
Tomas Bzatek |
9bb2af2 |
gchar *directory;
|
|
Tomas Bzatek |
9bb2af2 |
-
|
|
Tomas Bzatek |
9bb2af2 |
- /* Special 'session' keyring */
|
|
Tomas Bzatek |
9bb2af2 |
GckCredential *session_credential;
|
|
Tomas Bzatek |
9bb2af2 |
- GckSecretCollection *session_collection;
|
|
Tomas Bzatek |
9bb2af2 |
};
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
static const CK_SLOT_INFO gck_secret_module_slot_info = {
|
|
Tomas Bzatek |
9bb2af2 |
@@ -301,42 +298,52 @@ gck_secret_module_real_refresh_token (GckModule *base)
|
|
Tomas Bzatek |
9bb2af2 |
}
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
static void
|
|
Tomas Bzatek |
9bb2af2 |
+gck_secret_module_real_add_object (GckModule *module, GckTransaction *transaction,
|
|
Tomas Bzatek |
9bb2af2 |
+ GckObject *object)
|
|
Tomas Bzatek |
9bb2af2 |
+{
|
|
Tomas Bzatek |
9bb2af2 |
+ GckSecretModule *self = GCK_SECRET_MODULE (module);
|
|
Tomas Bzatek |
9bb2af2 |
+ GckSecretCollection *collection;
|
|
Tomas Bzatek |
9bb2af2 |
+ const gchar *identifier;
|
|
Tomas Bzatek |
9bb2af2 |
+ gchar *filename;
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
+ g_return_if_fail (!gck_transaction_get_failed (transaction));
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
+ if (GCK_IS_SECRET_COLLECTION (object)) {
|
|
Tomas Bzatek |
9bb2af2 |
+ collection = GCK_SECRET_COLLECTION (object);
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
+ /* Setup a filename for this collection */
|
|
Tomas Bzatek |
9bb2af2 |
+ identifier = gck_secret_object_get_identifier (GCK_SECRET_OBJECT (collection));
|
|
Tomas Bzatek |
9bb2af2 |
+ filename = identifier_to_new_filename (self, identifier);
|
|
Tomas Bzatek |
9bb2af2 |
+ gck_secret_collection_set_filename (collection, filename);
|
|
Tomas Bzatek |
9bb2af2 |
+ g_free (filename);
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
+ add_collection (self, transaction, collection);
|
|
Tomas Bzatek |
9bb2af2 |
+ }
|
|
Tomas Bzatek |
9bb2af2 |
+}
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
+static void
|
|
Tomas Bzatek |
9bb2af2 |
gck_secret_module_real_store_object (GckModule *module, GckTransaction *transaction,
|
|
Tomas Bzatek |
9bb2af2 |
GckObject *object)
|
|
Tomas Bzatek |
9bb2af2 |
{
|
|
Tomas Bzatek |
9bb2af2 |
GckSecretModule *self = GCK_SECRET_MODULE (module);
|
|
Tomas Bzatek |
9bb2af2 |
GckSecretCollection *collection = NULL;
|
|
Tomas Bzatek |
9bb2af2 |
- const gchar *identifier;
|
|
Tomas Bzatek |
9bb2af2 |
- gchar *filename;
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
- /* Storing an item */
|
|
Tomas Bzatek |
9bb2af2 |
+ /* Store the item's collection */
|
|
Tomas Bzatek |
9bb2af2 |
if (GCK_IS_SECRET_ITEM (object)) {
|
|
Tomas Bzatek |
9bb2af2 |
collection = gck_secret_item_get_collection (GCK_SECRET_ITEM (object));
|
|
Tomas Bzatek |
9bb2af2 |
g_return_if_fail (GCK_IS_SECRET_COLLECTION (collection));
|
|
Tomas Bzatek |
9bb2af2 |
+ gck_module_store_token_object (GCK_MODULE (self), transaction, GCK_OBJECT (collection));
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
/* Storing a collection */
|
|
Tomas Bzatek |
9bb2af2 |
} else if (GCK_IS_SECRET_COLLECTION (object)) {
|
|
Tomas Bzatek |
9bb2af2 |
collection = GCK_SECRET_COLLECTION (object);
|
|
Tomas Bzatek |
9bb2af2 |
- }
|
|
Tomas Bzatek |
9bb2af2 |
+ gck_secret_collection_save (collection, transaction);
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
/* No other kind of token object */
|
|
Tomas Bzatek |
9bb2af2 |
- if (collection == NULL) {
|
|
Tomas Bzatek |
9bb2af2 |
+ } else {
|
|
Tomas Bzatek |
9bb2af2 |
g_warning ("can't store object of type '%s' on secret token", G_OBJECT_TYPE_NAME (object));
|
|
Tomas Bzatek |
9bb2af2 |
gck_transaction_fail (transaction, CKR_GENERAL_ERROR);
|
|
Tomas Bzatek |
9bb2af2 |
- return;
|
|
Tomas Bzatek |
9bb2af2 |
- }
|
|
Tomas Bzatek |
9bb2af2 |
-
|
|
Tomas Bzatek |
9bb2af2 |
- /* Setup a filename for this collection */
|
|
Tomas Bzatek |
9bb2af2 |
- if (!gck_secret_collection_get_filename (collection)) {
|
|
Tomas Bzatek |
9bb2af2 |
- identifier = gck_secret_object_get_identifier (GCK_SECRET_OBJECT (collection));
|
|
Tomas Bzatek |
9bb2af2 |
- filename = identifier_to_new_filename (self, identifier);
|
|
Tomas Bzatek |
9bb2af2 |
- gck_secret_collection_set_filename (collection, filename);
|
|
Tomas Bzatek |
9bb2af2 |
- g_free (filename);
|
|
Tomas Bzatek |
9bb2af2 |
}
|
|
Tomas Bzatek |
9bb2af2 |
-
|
|
Tomas Bzatek |
9bb2af2 |
- gck_secret_collection_save (collection, transaction);
|
|
Tomas Bzatek |
9bb2af2 |
- if (!gck_transaction_get_failed (transaction))
|
|
Tomas Bzatek |
9bb2af2 |
- add_collection (self, transaction, collection);
|
|
Tomas Bzatek |
9bb2af2 |
}
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
static void
|
|
Tomas Bzatek |
9bb2af2 |
@@ -351,11 +358,6 @@ gck_secret_module_real_remove_object (GckModule *module, GckTransaction *transac
|
|
Tomas Bzatek |
9bb2af2 |
GCK_OBJECT (self->session_credential) == object)
|
|
Tomas Bzatek |
9bb2af2 |
return;
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
- /* Ignore the session keyring collection */
|
|
Tomas Bzatek |
9bb2af2 |
- if (self->session_collection != NULL &&
|
|
Tomas Bzatek |
9bb2af2 |
- GCK_OBJECT (self->session_collection) == object)
|
|
Tomas Bzatek |
9bb2af2 |
- return;
|
|
Tomas Bzatek |
9bb2af2 |
-
|
|
Tomas Bzatek |
9bb2af2 |
/* Removing an item */
|
|
Tomas Bzatek |
9bb2af2 |
if (GCK_IS_SECRET_ITEM (object)) {
|
|
Tomas Bzatek |
9bb2af2 |
collection = gck_secret_item_get_collection (GCK_SECRET_ITEM (object));
|
|
Tomas Bzatek |
9bb2af2 |
@@ -384,6 +386,7 @@ gck_secret_module_constructor (GType type, guint n_props, GObjectConstructParam
|
|
Tomas Bzatek |
9bb2af2 |
{
|
|
Tomas Bzatek |
9bb2af2 |
GckSecretModule *self = GCK_SECRET_MODULE (G_OBJECT_CLASS (gck_secret_module_parent_class)->constructor(type, n_props, props));
|
|
Tomas Bzatek |
9bb2af2 |
GckManager *manager;
|
|
Tomas Bzatek |
9bb2af2 |
+ GckObject *collection;
|
|
Tomas Bzatek |
9bb2af2 |
CK_RV rv;
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
g_return_val_if_fail (self, NULL);
|
|
Tomas Bzatek |
9bb2af2 |
@@ -401,22 +404,27 @@ gck_secret_module_constructor (GType type, guint n_props, GObjectConstructParam
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
manager = gck_module_get_manager (GCK_MODULE (self));
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
+ collection = g_object_new (GCK_TYPE_SECRET_COLLECTION,
|
|
Tomas Bzatek |
9bb2af2 |
+ "module", self,
|
|
Tomas Bzatek |
9bb2af2 |
+ "identifier", "session",
|
|
Tomas Bzatek |
9bb2af2 |
+ "manager", manager,
|
|
Tomas Bzatek |
9bb2af2 |
+ "transient", TRUE,
|
|
Tomas Bzatek |
9bb2af2 |
+ NULL);
|
|
Tomas Bzatek |
9bb2af2 |
+
|
|
Tomas Bzatek |
9bb2af2 |
/* Create the 'session' keyring, which is not stored to disk */
|
|
Tomas Bzatek |
9bb2af2 |
- self->session_collection = g_object_new (GCK_TYPE_SECRET_COLLECTION,
|
|
Tomas Bzatek |
9bb2af2 |
- "module", self,
|
|
Tomas Bzatek |
9bb2af2 |
- "identifier", "session",
|
|
Tomas Bzatek |
9bb2af2 |
- "manager", manager,
|
|
Tomas Bzatek |
9bb2af2 |
- NULL);
|
|
Tomas Bzatek |
9bb2af2 |
- gck_object_expose (GCK_OBJECT (self->session_collection), TRUE);
|
|
Tomas Bzatek |
9bb2af2 |
+ g_return_val_if_fail (gck_object_is_transient (collection), NULL);
|
|
Tomas Bzatek |
9bb2af2 |
+ gck_module_add_token_object (GCK_MODULE (self), NULL, collection);
|
|
Tomas Bzatek |
9bb2af2 |
+ gck_object_expose (collection, TRUE);
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
/* Unlock the 'session' keyring */
|
|
Tomas Bzatek |
9bb2af2 |
- rv = gck_credential_create (GCK_MODULE (self), manager, GCK_OBJECT (self->session_collection),
|
|
Tomas Bzatek |
9bb2af2 |
+ rv = gck_credential_create (GCK_MODULE (self), manager, GCK_OBJECT (collection),
|
|
Tomas Bzatek |
9bb2af2 |
NULL, 0, &self->session_credential);
|
|
Tomas Bzatek |
9bb2af2 |
if (rv == CKR_OK)
|
|
Tomas Bzatek |
9bb2af2 |
gck_object_expose (GCK_OBJECT (self->session_credential), TRUE);
|
|
Tomas Bzatek |
9bb2af2 |
else
|
|
Tomas Bzatek |
9bb2af2 |
g_warning ("couldn't unlock the 'session' keyring");
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
+ g_object_unref (collection);
|
|
Tomas Bzatek |
9bb2af2 |
return G_OBJECT (self);
|
|
Tomas Bzatek |
9bb2af2 |
}
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
@@ -438,10 +446,6 @@ gck_secret_module_dispose (GObject *obj)
|
|
Tomas Bzatek |
9bb2af2 |
g_object_unref (self->tracker);
|
|
Tomas Bzatek |
9bb2af2 |
self->tracker = NULL;
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
- if (self->session_collection)
|
|
Tomas Bzatek |
9bb2af2 |
- g_object_unref (self->session_collection);
|
|
Tomas Bzatek |
9bb2af2 |
- self->session_collection = NULL;
|
|
Tomas Bzatek |
9bb2af2 |
-
|
|
Tomas Bzatek |
9bb2af2 |
if (self->session_credential)
|
|
Tomas Bzatek |
9bb2af2 |
g_object_unref (self->session_credential);
|
|
Tomas Bzatek |
9bb2af2 |
self->session_credential = NULL;
|
|
Tomas Bzatek |
9bb2af2 |
@@ -465,7 +469,6 @@ gck_secret_module_finalize (GObject *obj)
|
|
Tomas Bzatek |
9bb2af2 |
self->directory = NULL;
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
g_assert (!self->session_credential);
|
|
Tomas Bzatek |
9bb2af2 |
- g_assert (!self->session_collection);
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
G_OBJECT_CLASS (gck_secret_module_parent_class)->finalize (obj);
|
|
Tomas Bzatek |
9bb2af2 |
}
|
|
Tomas Bzatek |
9bb2af2 |
@@ -484,8 +487,9 @@ gck_secret_module_class_init (GckSecretModuleClass *klass)
|
|
Tomas Bzatek |
9bb2af2 |
module_class->get_token_info = gck_secret_module_real_get_token_info;
|
|
Tomas Bzatek |
9bb2af2 |
module_class->parse_argument = gck_secret_module_real_parse_argument;
|
|
Tomas Bzatek |
9bb2af2 |
module_class->refresh_token = gck_secret_module_real_refresh_token;
|
|
Tomas Bzatek |
9bb2af2 |
- module_class->remove_token_object = gck_secret_module_real_remove_object;
|
|
Tomas Bzatek |
9bb2af2 |
+ module_class->add_token_object = gck_secret_module_real_add_object;
|
|
Tomas Bzatek |
9bb2af2 |
module_class->store_token_object = gck_secret_module_real_store_object;
|
|
Tomas Bzatek |
9bb2af2 |
+ module_class->remove_token_object = gck_secret_module_real_remove_object;
|
|
Tomas Bzatek |
9bb2af2 |
}
|
|
Tomas Bzatek |
9bb2af2 |
|
|
Tomas Bzatek |
9bb2af2 |
/* ---------------------------------------------------------------------------------------
|
|
Tomas Bzatek |
9bb2af2 |
--
|
|
Tomas Bzatek |
9bb2af2 |
cgit v0.8.3.1
|