[gnome-keyring/wip/cosimoc/gdbus-fixes: 4/11] dbus: rewrite default alias in message filter



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]