[libsecret/wip/dueno/backend: 6/6] secret-password: Port to SecretBackend interface
- From: Daiki Ueno <dueno src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsecret/wip/dueno/backend: 6/6] secret-password: Port to SecretBackend interface
- Date: Tue, 23 Jul 2019 15:22:33 +0000 (UTC)
commit 1eaade8e0569fec96368f9f746a16e842d84cf67
Author: Daiki Ueno <dueno src gnome org>
Date: Mon Jul 1 15:51:33 2019 +0200
secret-password: Port to SecretBackend interface
libsecret/secret-password.c | 382 +++++++++++++++++++++++++++++++++++++++++---
1 file changed, 361 insertions(+), 21 deletions(-)
---
diff --git a/libsecret/secret-password.c b/libsecret/secret-password.c
index 632ed2d..efa010f 100644
--- a/libsecret/secret-password.c
+++ b/libsecret/secret-password.c
@@ -18,6 +18,7 @@
#include "secret-password.h"
#include "secret-private.h"
#include "secret-retrievable.h"
+#include "secret-backend.h"
#include "secret-value.h"
#include <egg/egg-secure-memory.h>
@@ -102,6 +103,77 @@ secret_password_store (const SecretSchema *schema,
g_hash_table_unref (attributes);
}
+typedef struct {
+ const SecretSchema *schema;
+ GHashTable *attributes;
+ gchar *collection;
+ gchar *label;
+ SecretValue *value;
+} StoreClosure;
+
+static void
+store_closure_free (gpointer data)
+{
+ StoreClosure *store = data;
+ _secret_schema_unref_if_nonstatic (store->schema);
+ g_hash_table_unref (store->attributes);
+ g_free (store->collection);
+ g_free (store->label);
+ secret_value_unref (store->value);
+ g_slice_free (StoreClosure, store);
+}
+
+static void
+on_store (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GTask *task = G_TASK (user_data);
+ SecretBackend *backend = SECRET_BACKEND (source);
+ SecretBackendInterface *iface;
+ GError *error = NULL;
+
+ iface = SECRET_BACKEND_GET_IFACE (backend);
+ g_return_if_fail (iface->store_finish != NULL);
+
+ if (!iface->store_finish (backend, result, &error)) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+}
+
+static void
+on_store_backend (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GTask *task = G_TASK (user_data);
+ StoreClosure *store = g_task_get_task_data (task);
+ SecretBackend *backend;
+ SecretBackendInterface *iface;
+ GError *error = NULL;
+
+ backend = secret_backend_get_finish (result, &error);
+ if (backend == NULL) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ iface = SECRET_BACKEND_GET_IFACE (backend);
+ g_return_if_fail (iface->store != NULL);
+
+ iface->store (backend, store->schema, store->attributes,
+ store->collection, store->label, store->value,
+ g_task_get_cancellable (task),
+ on_store,
+ task);
+}
+
/**
* secret_password_storev: (rename-to secret_password_store)
* @schema: (nullable): the schema for attributes
@@ -136,7 +208,8 @@ secret_password_storev (const SecretSchema *schema,
GAsyncReadyCallback callback,
gpointer user_data)
{
- SecretValue *value;
+ StoreClosure *store;
+ GTask *task;
g_return_if_fail (label != NULL);
g_return_if_fail (password != NULL);
@@ -147,12 +220,18 @@ secret_password_storev (const SecretSchema *schema,
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
return;
- value = secret_value_new (password, -1, "text/plain");
-
- secret_service_store (NULL, schema, attributes, collection,
- label, value, cancellable, callback, user_data);
-
- secret_value_unref (value);
+ task = g_task_new (NULL, cancellable, callback, user_data);
+ store = g_slice_new0 (StoreClosure);
+ store->schema = _secret_schema_ref_if_nonstatic (schema);
+ store->attributes = g_hash_table_ref (attributes);
+ store->collection = g_strdup (collection);
+ store->label = g_strdup (label);
+ store->value = secret_value_new (password, -1, "text/plain");
+ g_task_set_task_data (task, store, store_closure_free);
+
+ secret_backend_get (SECRET_BACKEND_OPEN_SESSION,
+ cancellable,
+ on_store_backend, task);
}
/**
@@ -237,6 +316,9 @@ secret_password_storev_binary (const SecretSchema *schema,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ StoreClosure *store;
+ GTask *task;
+
g_return_if_fail (label != NULL);
g_return_if_fail (value != NULL);
g_return_if_fail (attributes != NULL);
@@ -246,8 +328,18 @@ secret_password_storev_binary (const SecretSchema *schema,
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, FALSE))
return;
- secret_service_store (NULL, schema, attributes, collection,
- label, value, cancellable, callback, user_data);
+ task = g_task_new (NULL, cancellable, callback, user_data);
+ store = g_slice_new0 (StoreClosure);
+ store->schema = _secret_schema_ref_if_nonstatic (schema);
+ store->attributes = g_hash_table_ref (attributes);
+ store->collection = g_strdup (collection);
+ store->label = g_strdup (label);
+ store->value = secret_value_ref (value);
+ g_task_set_task_data (task, store, store_closure_free);
+
+ secret_backend_get (SECRET_BACKEND_OPEN_SESSION,
+ cancellable,
+ on_store_backend, task);
}
/**
@@ -264,7 +356,9 @@ secret_password_store_finish (GAsyncResult *result,
GError **error)
{
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- return secret_service_store_finish (NULL, result, error);
+ g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE);
+
+ return g_task_propagate_boolean (G_TASK (result), error);
}
/**
@@ -556,6 +650,75 @@ secret_password_lookup (const SecretSchema *schema,
g_hash_table_unref (attributes);
}
+typedef struct {
+ const SecretSchema *schema;
+ GHashTable *attributes;
+} LookupClosure;
+
+static void
+lookup_closure_free (gpointer data)
+{
+ LookupClosure *closure = data;
+ _secret_schema_unref_if_nonstatic (closure->schema);
+ g_hash_table_unref (closure->attributes);
+ g_slice_free (LookupClosure, closure);
+}
+
+static void
+on_lookup (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GTask *task = G_TASK (user_data);
+ SecretBackend *backend = SECRET_BACKEND (source);
+ SecretBackendInterface *iface;
+ SecretValue *value;
+ GError *error = NULL;
+
+ iface = SECRET_BACKEND_GET_IFACE (backend);
+ g_return_if_fail (iface->store_finish != NULL);
+
+ value = iface->lookup_finish (backend, result, &error);
+ if (error) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ if (value)
+ g_task_return_pointer (task, value, secret_value_unref);
+ else
+ g_task_return_pointer (task, NULL, NULL);
+ g_object_unref (task);
+}
+
+static void
+on_lookup_backend (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GTask *task = G_TASK (user_data);
+ LookupClosure *lookup = g_task_get_task_data (task);
+ SecretBackend *backend;
+ SecretBackendInterface *iface;
+ GError *error = NULL;
+
+ backend = secret_backend_get_finish (result, &error);
+ if (backend == NULL) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ iface = SECRET_BACKEND_GET_IFACE (backend);
+ g_return_if_fail (iface->store != NULL);
+
+ iface->lookup (backend, lookup->schema, lookup->attributes,
+ g_task_get_cancellable (task),
+ on_lookup,
+ task);
+}
+
/**
* secret_password_lookupv: (rename-to secret_password_lookup)
* @schema: (nullable): the schema for attributes
@@ -579,6 +742,9 @@ secret_password_lookupv (const SecretSchema *schema,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ LookupClosure *lookup;
+ GTask *task;
+
g_return_if_fail (attributes != NULL);
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
@@ -586,8 +752,15 @@ secret_password_lookupv (const SecretSchema *schema,
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
return;
- secret_service_lookup (NULL, schema, attributes,
- cancellable, callback, user_data);
+ task = g_task_new (NULL, cancellable, callback, user_data);
+ lookup = g_slice_new0 (LookupClosure);
+ lookup->schema = _secret_schema_ref_if_nonstatic (schema);
+ lookup->attributes = g_hash_table_ref (attributes);
+ g_task_set_task_data (task, lookup, lookup_closure_free);
+
+ secret_backend_get (SECRET_BACKEND_OPEN_SESSION,
+ cancellable,
+ on_lookup_backend, task);
}
/**
@@ -607,8 +780,9 @@ secret_password_lookup_nonpageable_finish (GAsyncResult *result,
SecretValue *value;
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+ g_return_val_if_fail (g_task_is_valid (result, NULL), NULL);
- value = secret_service_lookup_finish (NULL, result, error);
+ value = g_task_propagate_pointer (G_TASK (result), error);
if (value == NULL)
return NULL;
@@ -632,8 +806,9 @@ secret_password_lookup_binary_finish (GAsyncResult *result,
GError **error)
{
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+ g_return_val_if_fail (g_task_is_valid (result, NULL), NULL);
- return secret_service_lookup_finish (NULL, result, error);
+ return g_task_propagate_pointer (G_TASK (result), error);
}
/**
@@ -653,8 +828,9 @@ secret_password_lookup_finish (GAsyncResult *result,
SecretValue *value;
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+ g_return_val_if_fail (g_task_is_valid (result, NULL), NULL);
- value = secret_service_lookup_finish (NULL, result, error);
+ value = g_task_propagate_pointer (G_TASK (result), error);
if (value == NULL)
return NULL;
@@ -1018,6 +1194,72 @@ secret_password_clear (const SecretSchema *schema,
g_hash_table_unref (attributes);
}
+typedef struct {
+ const SecretSchema *schema;
+ GHashTable *attributes;
+} ClearClosure;
+
+static void
+clear_closure_free (gpointer data)
+{
+ ClearClosure *closure = data;
+ _secret_schema_unref_if_nonstatic (closure->schema);
+ g_hash_table_unref (closure->attributes);
+ g_slice_free (ClearClosure, closure);
+}
+
+static void
+on_clear (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GTask *task = G_TASK (user_data);
+ SecretBackend *backend = SECRET_BACKEND (source);
+ SecretBackendInterface *iface;
+ GError *error = NULL;
+
+ iface = SECRET_BACKEND_GET_IFACE (backend);
+ g_return_if_fail (iface->clear_finish != NULL);
+
+ if (!iface->clear_finish (backend, result, &error)) {
+ if (error)
+ g_task_return_error (task, error);
+ else
+ g_task_return_boolean (task, FALSE);
+ g_object_unref (task);
+ return;
+ }
+
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+}
+
+static void
+on_clear_backend (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GTask *task = G_TASK (user_data);
+ ClearClosure *clear = g_task_get_task_data (task);
+ SecretBackend *backend;
+ SecretBackendInterface *iface;
+ GError *error = NULL;
+
+ backend = secret_backend_get_finish (result, &error);
+ if (backend == NULL) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ iface = SECRET_BACKEND_GET_IFACE (backend);
+ g_return_if_fail (iface->clear != NULL);
+
+ iface->clear (backend, clear->schema, clear->attributes,
+ g_task_get_cancellable (task),
+ on_clear,
+ task);
+}
/**
* secret_password_clearv: (rename-to secret_password_clear)
@@ -1042,6 +1284,9 @@ secret_password_clearv (const SecretSchema *schema,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ ClearClosure *clear;
+ GTask *task;
+
g_return_if_fail (attributes != NULL);
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
@@ -1049,8 +1294,15 @@ secret_password_clearv (const SecretSchema *schema,
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
return;
- secret_service_clear (NULL, schema, attributes,
- cancellable, callback, user_data);
+ task = g_task_new (NULL, cancellable, callback, user_data);
+ clear = g_slice_new0 (ClearClosure);
+ clear->schema = _secret_schema_ref_if_nonstatic (schema);
+ clear->attributes = g_hash_table_ref (attributes);
+ g_task_set_task_data (task, clear, clear_closure_free);
+
+ secret_backend_get (SECRET_SERVICE_NONE,
+ cancellable,
+ on_clear_backend, task);
}
/**
@@ -1068,7 +1320,9 @@ secret_password_clear_finish (GAsyncResult *result,
GError **error)
{
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- return secret_service_clear_finish (NULL, result, error);
+ g_return_val_if_fail (g_task_is_valid (result, NULL), FALSE);
+
+ return g_task_propagate_boolean (G_TASK (result), error);
}
/**
@@ -1221,6 +1475,80 @@ secret_password_search (const SecretSchema *schema,
g_hash_table_unref (attributes);
}
+typedef struct {
+ const SecretSchema *schema;
+ GHashTable *attributes;
+ SecretSearchFlags flags;
+} SearchClosure;
+
+static void
+search_closure_free (gpointer data)
+{
+ SearchClosure *closure = data;
+ _secret_schema_unref_if_nonstatic (closure->schema);
+ g_hash_table_unref (closure->attributes);
+ g_slice_free (SearchClosure, closure);
+}
+
+static void
+object_list_free (gpointer data)
+{
+ GList *list = data;
+ g_list_free_full (list, g_object_unref);
+}
+
+static void
+on_search (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GTask *task = G_TASK (user_data);
+ SecretBackend *backend = SECRET_BACKEND (source);
+ SecretBackendInterface *iface;
+ GError *error = NULL;
+ GList *items;
+
+ iface = SECRET_BACKEND_GET_IFACE (backend);
+ g_return_if_fail (iface->search_finish != NULL);
+
+ items = iface->search_finish (backend, result, &error);
+ if (error) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ g_task_return_pointer (task, items, object_list_free);
+}
+
+static void
+on_search_backend (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GTask *task = G_TASK (user_data);
+ SearchClosure *search = g_task_get_task_data (task);
+ SecretBackend *backend;
+ SecretBackendInterface *iface;
+ GError *error = NULL;
+
+ backend = secret_backend_get_finish (result, &error);
+ if (backend == NULL) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ iface = SECRET_BACKEND_GET_IFACE (backend);
+ g_return_if_fail (iface->search != NULL);
+
+ iface->search (backend,
+ search->schema, search->attributes, search->flags,
+ g_task_get_cancellable (task),
+ on_search,
+ task);
+}
+
/**
* secret_password_searchv: (rename-to secret_password_search)
* @schema: (nullable): the schema for attributes
@@ -1246,6 +1574,9 @@ secret_password_searchv (const SecretSchema *schema,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ SearchClosure *search;
+ GTask *task;
+
g_return_if_fail (attributes != NULL);
g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
@@ -1253,8 +1584,16 @@ secret_password_searchv (const SecretSchema *schema,
if (schema != NULL && !_secret_attributes_validate (schema, attributes, G_STRFUNC, TRUE))
return;
- secret_service_search (NULL, schema, attributes, flags,
- cancellable, callback, user_data);
+ task = g_task_new (NULL, cancellable, callback, user_data);
+ search = g_slice_new0 (SearchClosure);
+ search->schema = _secret_schema_ref_if_nonstatic (schema);
+ search->attributes = g_hash_table_ref (attributes);
+ search->flags = flags;
+ g_task_set_task_data (task, search, search_closure_free);
+
+ secret_backend_get (SECRET_SERVICE_NONE,
+ cancellable,
+ on_search_backend, task);
}
/**
@@ -1274,8 +1613,9 @@ secret_password_search_finish (GAsyncResult *result,
GError **error)
{
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+ g_return_val_if_fail (g_task_is_valid (result, NULL), NULL);
- return secret_service_search_finish (NULL, result, error);
+ return g_task_propagate_pointer (G_TASK (result), error);
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]