diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2010-09-09 17:04:40 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2010-09-09 18:27:18 +0200 |
commit | ca06a2839668cd1d5a85257735afdf5ac87f6bb1 (patch) | |
tree | f5d9347396427e9feb1024e08a7ec34266db29d2 /gdbus/object.c | |
parent | ae3c3ba18ed0db38d088d656a06d3c3d36e37fed (diff) | |
download | connman-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.c | 46 |
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; } |