[gnome-keyring/dbus-api] [dbus] Make property calls handle interfaces better.
- From: Stefan Walter <stefw src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gnome-keyring/dbus-api] [dbus] Make property calls handle interfaces better.
- Date: Sun, 23 Aug 2009 18:08:37 +0000 (UTC)
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]