From a196df57dfe4685746a2e960259fa65821f46b78 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Mon, 8 Feb 2010 18:08:55 +0100 Subject: [PATCH 3/3] Check PolicyKit in client's can_{suspend,hibernate} properties Check for PK privileges in UpClient's can_{suspend,hibernate} properties, so that clients like gnome-session or gnome-power-manager hide the related actions if the admin or OEM disabled suspend/hibernate through a PolicyKit .pkla file like $ cat /etc/polkit-1/localauthority/50-local.d/disable-suspend.pkla [Disable suspend] Identity=unix-user:* Action=org.freedesktop.upower.suspend ResultActive=no ResultAny=no https://bugs.freedesktop.org/show_bug.cgi?id=26473 --- devkit-power-gobject/dkp-client.c | 16 ++++++++++++++-- libupower-glib/up-client.c | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/devkit-power-gobject/dkp-client.c b/devkit-power-gobject/dkp-client.c index 044f2e5..3b26a0e 100644 --- a/devkit-power-gobject/dkp-client.c +++ b/devkit-power-gobject/dkp-client.c @@ -232,6 +232,7 @@ static void dkp_client_ensure_properties (DkpClient *client) { gboolean ret; + gboolean allowed = FALSE; GError *error; GHashTable *props; GValue *value; @@ -267,7 +268,13 @@ dkp_client_ensure_properties (DkpClient *client) g_warning ("No 'CanSuspend' property"); goto out; } - ret = g_value_get_boolean (value); + + ret = dbus_g_proxy_call (client->priv->proxy, "SuspendAllowed", &error, + G_TYPE_INVALID, G_TYPE_BOOLEAN, &allowed, G_TYPE_INVALID); + if (!ret) + goto out; + + ret = g_value_get_boolean (value) && allowed; if (ret != client->priv->can_suspend) { client->priv->can_suspend = ret; g_object_notify (G_OBJECT(client), "can-suspend"); @@ -278,7 +285,12 @@ dkp_client_ensure_properties (DkpClient *client) g_warning ("No 'CanHibernate' property"); goto out; } - ret = g_value_get_boolean (value); + ret = dbus_g_proxy_call (client->priv->proxy, "HibernateAllowed", &error, + G_TYPE_INVALID, G_TYPE_BOOLEAN, &allowed, G_TYPE_INVALID); + if (!ret) + goto out; + + ret = g_value_get_boolean (value) && allowed; if (ret != client->priv->can_hibernate) { client->priv->can_hibernate = ret; g_object_notify (G_OBJECT(client), "can-hibernate"); diff --git a/libupower-glib/up-client.c b/libupower-glib/up-client.c index e0727eb..12201cd 100644 --- a/libupower-glib/up-client.c +++ b/libupower-glib/up-client.c @@ -297,6 +297,7 @@ gboolean up_client_get_properties_sync (UpClient *client, GCancellable *cancellable, GError **error) { gboolean ret = TRUE; + gboolean allowed = FALSE; GHashTable *props; GValue *value; @@ -328,7 +329,13 @@ up_client_get_properties_sync (UpClient *client, GCancellable *cancellable, GErr g_warning ("No 'CanSuspend' property"); goto out; } - ret = g_value_get_boolean (value); + + ret = dbus_g_proxy_call (client->priv->proxy, "SuspendAllowed", error, + G_TYPE_INVALID, G_TYPE_BOOLEAN, &allowed, G_TYPE_INVALID); + if (!ret) + goto out; + + ret = g_value_get_boolean (value) && allowed; if (ret != client->priv->can_suspend) { client->priv->can_suspend = ret; g_object_notify (G_OBJECT(client), "can-suspend"); @@ -339,7 +346,12 @@ up_client_get_properties_sync (UpClient *client, GCancellable *cancellable, GErr g_warning ("No 'CanHibernate' property"); goto out; } - ret = g_value_get_boolean (value); + ret = dbus_g_proxy_call (client->priv->proxy, "HibernateAllowed", error, + G_TYPE_INVALID, G_TYPE_BOOLEAN, &allowed, G_TYPE_INVALID); + if (!ret) + goto out; + + ret = g_value_get_boolean (value) && allowed; if (ret != client->priv->can_hibernate) { client->priv->can_hibernate = ret; g_object_notify (G_OBJECT(client), "can-hibernate"); -- 1.6.5