summaryrefslogtreecommitdiff
path: root/gdbus/object.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2010-09-09 17:04:40 +0200
committerMarcel Holtmann <marcel@holtmann.org>2010-09-09 18:27:18 +0200
commitca06a2839668cd1d5a85257735afdf5ac87f6bb1 (patch)
treef5d9347396427e9feb1024e08a7ec34266db29d2 /gdbus/object.c
parentae3c3ba18ed0db38d088d656a06d3c3d36e37fed (diff)
downloadconnman-ca06a2839668cd1d5a85257735afdf5ac87f6bb1.tar.gz
connman-ca06a2839668cd1d5a85257735afdf5ac87f6bb1.tar.bz2
connman-ca06a2839668cd1d5a85257735afdf5ac87f6bb1.zip
Add support for builtin GDBus security using PolicyKit
Diffstat (limited to 'gdbus/object.c')
-rw-r--r--gdbus/object.c46
1 files changed, 45 insertions, 1 deletions
diff --git a/gdbus/object.c b/gdbus/object.c
index 725c0bbb..cc3c5da8 100644
--- a/gdbus/object.c
+++ b/gdbus/object.c
@@ -312,6 +312,46 @@ void g_dbus_pending_error(DBusConnection *connection,
va_end(args);
}
+int polkit_check_authorization(DBusConnection *conn,
+ const char *action, gboolean interaction,
+ void (*function) (dbus_bool_t authorized,
+ void *user_data),
+ void *user_data, int timeout);
+
+struct builtin_security_data {
+ DBusConnection *conn;
+ GDBusPendingReply pending;
+};
+
+static void builtin_security_result(dbus_bool_t authorized, void *user_data)
+{
+ struct builtin_security_data *data = user_data;
+
+ if (authorized == TRUE)
+ g_dbus_pending_success(data->conn, data->pending);
+ else
+ g_dbus_pending_error(data->conn, data->pending,
+ DBUS_ERROR_AUTH_FAILED, NULL);
+
+ g_free(data);
+}
+
+static void builtin_security_function(DBusConnection *conn,
+ const char *action,
+ gboolean interaction,
+ GDBusPendingReply pending)
+{
+ struct builtin_security_data *data;
+
+ data = g_new0(struct builtin_security_data, 1);
+ data->conn = conn;
+ data->pending = pending;
+
+ if (polkit_check_authorization(conn, action, interaction,
+ builtin_security_result, data, 30000) < 0)
+ g_dbus_pending_error(conn, pending, NULL, NULL);
+}
+
static gboolean check_privilege(DBusConnection *conn, DBusMessage *msg,
const GDBusMethodTable *method, void *iface_user_data)
{
@@ -338,9 +378,13 @@ static gboolean check_privilege(DBusConnection *conn, DBusMessage *msg,
else
interaction = FALSE;
- if (security->function)
+ if (!(security->flags & G_DBUS_SECURITY_FLAG_BUILTIN) &&
+ security->function)
security->function(conn, security->action,
interaction, secdata->pending);
+ else
+ builtin_security_function(conn, security->action,
+ interaction, secdata->pending);
return TRUE;
}