[gnome-keyring/dbus-api] [dbus] Make property calls handle interfaces better.



commit 196280d7cfde3ab899a51f7173f15783fde95f91
Author: Stef Walter <stef memberwebs com>
Date:   Sun Aug 23 18:07:42 2009 +0000

    [dbus] Make property calls handle interfaces better.
    
    More relaxed checking of interface arguments to property
    calls. Null and empty interfaces match anything.

 daemon/dbus/gkd-dbus-util.c       |   14 ++++++++++++++
 daemon/dbus/gkd-dbus-util.h       |    2 ++
 daemon/dbus/gkd-secrets-objects.c |   34 ++++++++++++++++++++++++++--------
 daemon/dbus/gkd-secrets-service.c |   16 ++++++++++++----
 4 files changed, 54 insertions(+), 12 deletions(-)
---
diff --git a/daemon/dbus/gkd-dbus-util.c b/daemon/dbus/gkd-dbus-util.c
index 6a56c29..605d6f6 100644
--- a/daemon/dbus/gkd-dbus-util.c
+++ b/daemon/dbus/gkd-dbus-util.c
@@ -25,6 +25,8 @@
 
 #include "gkd-dbus-util.h"
 
+#include <string.h>
+
 GType
 gkd_dbus_connection_get_boxed_type (void)
 {
@@ -35,3 +37,15 @@ gkd_dbus_connection_get_boxed_type (void)
 		                                     (GBoxedFreeFunc)dbus_connection_unref);
 	return type;
 }
+
+gboolean
+gkd_dbus_interface_match (const gchar *interface, const gchar *match)
+{
+	g_return_val_if_fail (interface, FALSE);
+
+	/* Null or zero length matches anything */
+	if (!match || !match[0])
+		return TRUE;
+
+	return strcmp (interface, match) == 0;
+}
diff --git a/daemon/dbus/gkd-dbus-util.h b/daemon/dbus/gkd-dbus-util.h
index 7a86436..e7305a8 100644
--- a/daemon/dbus/gkd-dbus-util.h
+++ b/daemon/dbus/gkd-dbus-util.h
@@ -32,4 +32,6 @@
 
 GType      gkd_dbus_connection_get_boxed_type          (void) G_GNUC_CONST;
 
+gboolean   gkd_dbus_interface_match                    (const gchar *interface, const gchar *match);
+
 #endif /* GKD_DBUS_H */
diff --git a/daemon/dbus/gkd-secrets-objects.c b/daemon/dbus/gkd-secrets-objects.c
index b513952..f570491 100644
--- a/daemon/dbus/gkd-secrets-objects.c
+++ b/daemon/dbus/gkd-secrets-objects.c
@@ -21,6 +21,8 @@
 
 #include "config.h"
 
+#include "gkd-dbus-util.h"
+
 #include "gkd-secrets-service.h"
 #include "gkd-secrets-objects.h"
 #include "gkd-secrets-types.h"
@@ -504,10 +506,14 @@ item_property_get (GP11Object *object, DBusMessage *message)
 	const gchar *name;
 
 	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, 
-	                            DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID) ||
-	    !g_str_equal (interface, SECRETS_ITEM_INTERFACE))
+	                            DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID))
 		return NULL;
 
+	if (!gkd_dbus_interface_match (SECRETS_ITEM_INTERFACE, interface))
+		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED, 
+		                                      "Object does not have properties on interface '%s'", 
+		                                      interface);
+
 	return object_property_get (object, message, name);
 }
 
@@ -527,10 +533,14 @@ item_property_getall (GP11Object *object, DBusMessage *message)
 	DBusMessage *reply;
 	const gchar *interface;
 
-	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID) ||
-	    !g_str_equal (interface, SECRETS_ITEM_INTERFACE))
+	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID))
 		return NULL;
 
+	if (!gkd_dbus_interface_match (SECRETS_ITEM_INTERFACE, interface))
+		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED, 
+		                                      "Object does not have properties on interface '%s'", 
+		                                      interface);
+
 	attrs = gp11_object_get (object, &error,
 	                         CKA_LABEL,
 	                         CKA_G_LOCKED,
@@ -626,10 +636,14 @@ collection_property_get (GkdSecretsObjects *self, GP11Object *object, DBusMessag
 	const gchar *name;
 
 	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, 
-	                            DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID) ||
-	    !g_str_equal (interface, SECRETS_COLLECTION_INTERFACE))
+	                            DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID))
 		return NULL;
 
+	if (!gkd_dbus_interface_match (SECRETS_COLLECTION_INTERFACE, interface))
+		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED, 
+		                                      "Object does not have properties on interface '%s'", 
+		                                      interface);
+
 	/* Special case, the Items property */
 	if (g_str_equal (name, "Items")) {
 		reply = dbus_message_new_method_return (message);
@@ -660,10 +674,14 @@ collection_property_getall (GkdSecretsObjects *self, GP11Object *object, DBusMes
 	const gchar *name;
 	const gchar *interface;
 
-	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID) ||
-	    !g_str_equal (interface, SECRETS_COLLECTION_INTERFACE))
+	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID))
 		return NULL;
 
+	if (!gkd_dbus_interface_match (SECRETS_COLLECTION_INTERFACE, interface))
+		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED, 
+		                                      "Object does not have properties on interface '%s'", 
+		                                      interface);
+
 	attrs = gp11_object_get (object, &error,
 	                         CKA_LABEL,
 	                         CKA_G_LOCKED,
diff --git a/daemon/dbus/gkd-secrets-service.c b/daemon/dbus/gkd-secrets-service.c
index 75f91da..1b6d780 100644
--- a/daemon/dbus/gkd-secrets-service.c
+++ b/daemon/dbus/gkd-secrets-service.c
@@ -270,10 +270,14 @@ service_property_get (GkdSecretsService *self, DBusMessage *message)
 	const gchar *name;
 
 	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, 
-	                            DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID) ||
-	    !g_str_equal (interface, SECRETS_SERVICE_INTERFACE))
+	                            DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID))
 		return NULL;
 
+	if (!gkd_dbus_interface_match (SECRETS_SERVICE_INTERFACE, interface))
+		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED, 
+		                                      "Object does not have properties on interface '%s'", 
+		                                      interface);
+
 	/* The "Collections" property */
 	if (g_str_equal (name, "Collections")) {
 		reply = dbus_message_new_method_return (message);
@@ -305,10 +309,14 @@ service_property_getall (GkdSecretsService *self, DBusMessage *message)
 	const gchar *interface;
 	const gchar *name;
 
-	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID) ||
-	    !g_str_equal (interface, SECRETS_SERVICE_INTERFACE))
+	if (!dbus_message_get_args (message, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID))
 		return NULL;
 
+	if (!gkd_dbus_interface_match (SECRETS_SERVICE_INTERFACE, interface))
+		return dbus_message_new_error_printf (message, DBUS_ERROR_FAILED, 
+		                                      "Object does not have properties on interface '%s'", 
+		                                      interface);
+
 	reply = dbus_message_new_method_return (message);
 	dbus_message_iter_init_append (reply, &iter);
 	dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "{sv}", &array);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]