gnome-session r5149 - in trunk: . gnome-session
- From: halfline svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-session r5149 - in trunk: . gnome-session
- Date: Tue, 11 Nov 2008 15:38:02 +0000 (UTC)
Author: halfline
Date: Tue Nov 11 15:38:02 2008
New Revision: 5149
URL: http://svn.gnome.org/viewvc/gnome-session?rev=5149&view=rev
Log:
2008-11-11 Ray Strode <rstrode redhat com>
* gnome-session/org.gnome.SessionManager.xml (CanShutdown)
* gnome-session/gsm-manager.[ch] (gsm_manager_can_shutdown):
Add new dbus api to say whether shutdown dialog is available.
(bug 536915)
* gnome-session/gsm-consolekit.c
(gsm_consolekit_can_do_action): new function to query
policykit to determine whether the current session is
authorized to shutdown/reboot/etc.
Modified:
trunk/ChangeLog
trunk/gnome-session/gsm-consolekit.c
trunk/gnome-session/gsm-manager.c
trunk/gnome-session/gsm-manager.h
trunk/gnome-session/org.gnome.SessionManager.xml
Modified: trunk/gnome-session/gsm-consolekit.c
==============================================================================
--- trunk/gnome-session/gsm-consolekit.c (original)
+++ trunk/gnome-session/gsm-consolekit.c Tue Nov 11 15:38:02 2008
@@ -825,20 +825,78 @@
return ret;
}
+#ifdef HAVE_POLKIT_GNOME
+static gboolean
+gsm_consolekit_can_do_action (GsmConsolekit *manager,
+ const char *action_id)
+{
+ PolKitGnomeContext *gnome_context;
+ PolKitAction *action;
+ PolKitCaller *caller;
+ DBusError dbus_error;
+ PolKitError *error;
+ PolKitResult result;
+
+ gnome_context = polkit_gnome_context_get (NULL);
+
+ if (gnome_context == NULL) {
+ return FALSE;
+ }
+
+ if (gnome_context->pk_tracker == NULL) {
+ return FALSE;
+ }
+
+ dbus_error_init (&dbus_error);
+ caller = polkit_tracker_get_caller_from_pid (gnome_context->pk_tracker,
+ getpid (),
+ &dbus_error);
+ dbus_error_free (&dbus_error);
+
+ if (caller == NULL) {
+ return FALSE;
+ }
+
+ action = polkit_action_new ();
+ if (!polkit_action_set_action_id (action, action_id)) {
+ polkit_action_unref (action);
+ polkit_caller_unref (caller);
+ return FALSE;
+ }
+
+ result = POLKIT_RESULT_UNKNOWN;
+ error = NULL;
+ result = polkit_context_is_caller_authorized (gnome_context->pk_context,
+ action, caller, FALSE,
+ &error);
+ if (polkit_error_is_set (error)) {
+ polkit_error_free (error);
+ }
+ polkit_action_unref (action);
+ polkit_caller_unref (caller);
+
+ return result != POLKIT_RESULT_NO && result != POLKIT_RESULT_UNKNOWN;
+}
+#endif
+
gboolean
gsm_consolekit_can_restart (GsmConsolekit *manager)
{
#ifdef HAVE_POLKIT_GNOME
gboolean res;
GError *error;
+
error = NULL;
res = gsm_consolekit_ensure_ck_connection (manager, &error);
if (!res) {
g_warning ("Could not connect to ConsoleKit: %s",
error->message);
g_error_free (error);
+ return FALSE;
}
- return res;
+
+ return gsm_consolekit_can_do_action (manager, "org.freedesktop.consolekit.system.restart") ||
+ gsm_consolekit_can_do_action (manager, "org.freedesktop.consolekit.system.restart-multiple-users");
#else
g_debug ("GsmConsolekit: built without PolicyKit-gnome support - cannot restart system");
return FALSE;
@@ -857,8 +915,11 @@
g_warning ("Could not connect to ConsoleKit: %s",
error->message);
g_error_free (error);
+ return FALSE;
}
- return res;
+
+ return gsm_consolekit_can_do_action (manager, "org.freedesktop.consolekit.system.stop") ||
+ gsm_consolekit_can_do_action (manager, "org.freedesktop.consolekit.system.stop-multiple-users");
#else
g_debug ("GsmConsolekit: built without PolicyKit-gnome support - cannot stop system");
return FALSE;
Modified: trunk/gnome-session/gsm-manager.c
==============================================================================
--- trunk/gnome-session/gsm-manager.c (original)
+++ trunk/gnome-session/gsm-manager.c Tue Nov 11 15:38:02 2008
@@ -2313,6 +2313,30 @@
}
gboolean
+gsm_manager_can_shutdown (GsmManager *manager,
+ gboolean *shutdown_available,
+ GError **error)
+{
+ GsmConsolekit *consolekit;
+ GsmPowerManager *power_manager;
+
+ g_debug ("GsmManager: CanShutdown called");
+
+ g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE);
+
+ consolekit = gsm_get_consolekit ();
+ power_manager = gsm_get_power_manager ();
+ *shutdown_available = gsm_consolekit_can_stop (consolekit)
+ || gsm_consolekit_can_restart (consolekit)
+ || gsm_power_manager_can_suspend (power_manager)
+ || gsm_power_manager_can_hibernate (power_manager);
+ g_object_unref (consolekit);
+ g_object_unref (power_manager);
+
+ return TRUE;
+}
+
+gboolean
gsm_manager_logout (GsmManager *manager,
guint logout_mode,
GError **error)
Modified: trunk/gnome-session/gsm-manager.h
==============================================================================
--- trunk/gnome-session/gsm-manager.h (original)
+++ trunk/gnome-session/gsm-manager.h Tue Nov 11 15:38:02 2008
@@ -151,6 +151,10 @@
gboolean gsm_manager_shutdown (GsmManager *manager,
GError **error);
+
+gboolean gsm_manager_can_shutdown (GsmManager *manager,
+ gboolean *shutdown_available,
+ GError **error);
gboolean gsm_manager_logout (GsmManager *manager,
guint logout_mode,
GError **error);
Modified: trunk/gnome-session/org.gnome.SessionManager.xml
==============================================================================
--- trunk/gnome-session/org.gnome.SessionManager.xml (original)
+++ trunk/gnome-session/org.gnome.SessionManager.xml Tue Nov 11 15:38:02 2008
@@ -252,6 +252,20 @@
</doc:doc>
</method>
+ <method name="CanShutdown">
+ <arg name="is_available" direction="out" type="b">
+ <doc:doc>
+ <doc:summary>True if shutdown is available to the user, false otherwise</doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>Allows the caller to determine whether or not it's okay to show
+ a shutdown option in the UI</doc:para>
+ </doc:description>
+ </doc:doc>
+ </method>
+
<method name="Logout">
<arg name="mode" type="u" direction="in">
<doc:doc>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]