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:26:37 +0200 |
commit | f02dd45e0b5d13989eca1f763bd8e4eca3521b5f (patch) | |
tree | 81ebc6c7ea5cf2c98e5c3dde772b07e346959050 /gdbus/object.c | |
parent | e173173a1f2b966fea6b0e0863b919e446a0a2c2 (diff) | |
download | ofono-f02dd45e0b5d13989eca1f763bd8e4eca3521b5f.tar.bz2 |
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; } |