[gnome-keyring/wip/cosimoc/gdbus-fixes: 4/11] dbus: rewrite default alias in message filter
- From: Cosimo Cecchi <cosimoc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-keyring/wip/cosimoc/gdbus-fixes: 4/11] dbus: rewrite default alias in message filter
- Date: Sat, 29 Aug 2015 16:55:05 +0000 (UTC)
commit 29633784624cbbbace70e10f72d452049d204c28
Author: Cosimo Cecchi <cosimoc gnome org>
Date: Sat Aug 29 09:24:33 2015 -0700
dbus: rewrite default alias in message filter
Instead of trying to parse the default alias when receiving every
method, rewrite it directly in our message filter.
This fixes a regression from the GDBus port where requests for the
default collection weren't being handled.
daemon/dbus/gkd-secret-objects.c | 42 ++++----------------------
daemon/dbus/gkd-secret-service.c | 60 ++++++++++++++++++++++++++++++++++++-
2 files changed, 64 insertions(+), 38 deletions(-)
---
diff --git a/daemon/dbus/gkd-secret-objects.c b/daemon/dbus/gkd-secret-objects.c
index c2c4431..1c7bde1 100644
--- a/daemon/dbus/gkd-secret-objects.c
+++ b/daemon/dbus/gkd-secret-objects.c
@@ -410,36 +410,6 @@ G_DEFINE_TYPE (GkdSecretObjects, gkd_secret_objects, G_TYPE_OBJECT);
* INTERNAL
*/
-static gboolean
-parse_object_path (GkdSecretObjects *self, const gchar *path, gchar **collection, gchar **item)
-{
- const gchar *replace;
-
- g_assert (self);
- g_assert (path);
- g_assert (collection);
-
- if (!gkd_secret_util_parse_path (path, collection, item))
- return FALSE;
-
- if (g_str_has_prefix (path, SECRET_ALIAS_PREFIX)) {
- replace = gkd_secret_service_get_alias (self->service, *collection);
- if (!replace) {
- g_free (*collection);
- *collection = NULL;
- if (item) {
- g_free (*item);
- *item = NULL;
- }
- return FALSE;
- }
- g_free (*collection);
- *collection = g_strdup (replace);
- }
-
- return TRUE;
-}
-
static GckObject *
secret_objects_lookup_gck_object_for_path (GkdSecretObjects *self,
const gchar *sender,
@@ -456,7 +426,7 @@ secret_objects_lookup_gck_object_for_path (GkdSecretObjects *self,
g_return_val_if_fail (path, FALSE);
- if (!parse_object_path (self, path, &c_ident, &i_ident) || !c_ident)
+ if (!gkd_secret_util_parse_path (path, &c_ident, &i_ident) || !c_ident)
goto out;
/* The session we're using to access the object */
@@ -845,7 +815,7 @@ collection_method_create_item (GkdExportedCollection *skeleton,
goto cleanup;
}
- if (!parse_object_path (self, base, &identifier, NULL))
+ if (!gkd_secret_util_parse_path (base, &identifier, NULL))
g_return_val_if_reached (FALSE);
g_return_val_if_fail (identifier, FALSE);
@@ -1094,7 +1064,7 @@ gkd_secret_objects_lookup_collection (GkdSecretObjects *self, const gchar *calle
g_return_val_if_fail (GKD_SECRET_IS_OBJECTS (self), NULL);
g_return_val_if_fail (path, NULL);
- if (!parse_object_path (self, path, &identifier, NULL))
+ if (!gkd_secret_util_parse_path (path, &identifier, NULL))
return NULL;
/* The session we're using to access the object */
@@ -1139,7 +1109,7 @@ gkd_secret_objects_lookup_item (GkdSecretObjects *self, const gchar *caller,
g_return_val_if_fail (caller, NULL);
g_return_val_if_fail (path, NULL);
- if (!parse_object_path (self, path, &collection, &identifier))
+ if (!gkd_secret_util_parse_path (path, &collection, &identifier))
return NULL;
/* The session we're using to access the object */
@@ -1208,7 +1178,7 @@ gkd_secret_objects_foreach_item (GkdSecretObjects *self,
session = gkd_secret_service_get_pkcs11_session (self->service, caller);
}
- if (!parse_object_path (self, base, &identifier, NULL))
+ if (!gkd_secret_util_parse_path (base, &identifier, NULL))
g_return_if_reached ();
gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY);
@@ -1323,7 +1293,7 @@ gkd_secret_objects_handle_search_items (GkdSecretObjects *self,
}
if (base != NULL) {
- if (!parse_object_path (self, base, &identifier, NULL))
+ if (!gkd_secret_util_parse_path (base, &identifier, NULL))
g_return_val_if_reached (FALSE);
gck_builder_add_string (&builder, CKA_G_COLLECTION, identifier);
g_free (identifier);
diff --git a/daemon/dbus/gkd-secret-service.c b/daemon/dbus/gkd-secret-service.c
index b1fb59c..bb4764d 100644
--- a/daemon/dbus/gkd-secret-service.c
+++ b/daemon/dbus/gkd-secret-service.c
@@ -333,6 +333,59 @@ ensure_client_for_sender (gpointer user_data)
}
static GDBusMessage *
+rewrite_default_alias (GkdSecretService *self,
+ GDBusMessage *message)
+{
+ const char *path = g_dbus_message_get_path (message);
+ const char *replace;
+ char *collection = NULL, *item = NULL;
+ char *collection_path, *item_path;
+ GDBusMessage *rewritten;
+ GError *error = NULL;
+
+ if (path == NULL)
+ return message;
+
+ if (!g_str_has_prefix (path, SECRET_ALIAS_PREFIX))
+ return message;
+
+ if (!gkd_secret_util_parse_path (path, &collection, &item))
+ return message;
+
+ replace = gkd_secret_service_get_alias (self, collection);
+ if (!replace) {
+ g_free (item);
+ g_free (collection);
+ return message;
+ }
+
+ rewritten = g_dbus_message_copy (message, &error);
+ if (error != NULL) {
+ g_error_free (error);
+ return message;
+ }
+
+ collection_path = gkd_secret_util_build_path (SECRET_COLLECTION_PREFIX,
+ replace, -1);
+
+ if (item != NULL) {
+ item_path = gkd_secret_util_build_path (collection_path,
+ item, -1);
+ g_dbus_message_set_path (rewritten, item_path);
+ g_free (item_path);
+ } else {
+ g_dbus_message_set_path (rewritten, collection_path);
+ }
+
+ g_free (collection_path);
+ g_free (item);
+ g_free (collection);
+ g_object_unref (message);
+
+ return rewritten;
+}
+
+static GDBusMessage *
service_message_filter (GDBusConnection *connection,
GDBusMessage *message,
gboolean incoming,
@@ -340,13 +393,16 @@ service_message_filter (GDBusConnection *connection,
{
GkdSecretService *self = user_data;
MessageFilterData *data;
+ GDBusMessage *filtered;
if (!incoming)
return message;
+ filtered = rewrite_default_alias (self, message);
+
data = g_slice_new0 (MessageFilterData);
data->service = g_object_ref (self);
- data->message = g_object_ref (message);
+ data->message = g_object_ref (filtered);
/* We use G_PRIORITY_HIGH to make sure this timeout is
* scheduled before the actual method call.
@@ -354,7 +410,7 @@ service_message_filter (GDBusConnection *connection,
g_idle_add_full (G_PRIORITY_HIGH, ensure_client_for_sender,
data, NULL);
- return message;
+ return filtered;
}
/* -----------------------------------------------------------------------------
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]