Add support for GDBus security action and flags
authorMarcel Holtmann <marcel@holtmann.org>
Thu, 9 Sep 2010 14:39:46 +0000 (16:39 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Thu, 9 Sep 2010 16:27:18 +0000 (18:27 +0200)
gdbus/gdbus.h
gdbus/object.c

index 553918c..d902f8e 100644 (file)
@@ -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;
 
index 48530f2..725c0bb 100644 (file)
@@ -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;
        }