From e173173a1f2b966fea6b0e0863b919e446a0a2c2 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Thu, 9 Sep 2010 16:39:46 +0200 Subject: [PATCH] Add support for GDBus security action and flags --- gdbus/gdbus.h | 10 ++++++++++ gdbus/object.c | 14 +++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gdbus/gdbus.h b/gdbus/gdbus.h index 553918c0..d902f8e7 100644 --- a/gdbus/gdbus.h +++ b/gdbus/gdbus.h @@ -58,6 +58,8 @@ typedef DBusMessage * (* GDBusMethodFunction) (DBusConnection *connection, typedef guint32 GDBusPendingReply; typedef void (* GDBusSecurityFunction) (DBusConnection *connection, + const char *action, + gboolean interaction, GDBusPendingReply pending); typedef enum { @@ -74,6 +76,12 @@ typedef enum { G_DBUS_PROPERTY_FLAG_DEPRECATED = (1 << 0), } GDBusPropertyFlags; +typedef enum { + G_DBUS_SECURITY_FLAG_DEPRECATED = (1 << 0), + G_DBUS_SECURITY_FLAG_BUILTIN = (1 << 1), + G_DBUS_SECURITY_FLAG_ALLOW_INTERACTION = (1 << 2), +} GDBusSecurityFlags; + typedef struct { const char *name; const char *signature; @@ -97,6 +105,8 @@ typedef struct { typedef struct { unsigned int privilege; + const char *action; + GDBusSecurityFlags flags; GDBusSecurityFunction function; } GDBusSecurityTable; diff --git a/gdbus/object.c b/gdbus/object.c index 48530f2a..725c0bbb 100644 --- a/gdbus/object.c +++ b/gdbus/object.c @@ -317,9 +317,10 @@ static gboolean check_privilege(DBusConnection *conn, DBusMessage *msg, { const GDBusSecurityTable *security; - for (security = security_table; security && security->function && - security->privilege; security++) { + for (security = security_table; security && security->privilege; + security++) { struct security_data *secdata; + gboolean interaction; if (security->privilege != method->privilege) continue; @@ -332,7 +333,14 @@ static gboolean check_privilege(DBusConnection *conn, DBusMessage *msg, pending_security = g_slist_prepend(pending_security, secdata); - security->function(conn, secdata->pending); + if (security->flags & G_DBUS_SECURITY_FLAG_ALLOW_INTERACTION) + interaction = TRUE; + else + interaction = FALSE; + + if (security->function) + security->function(conn, security->action, + interaction, secdata->pending); return TRUE; }