diff -up gnome-session-2.24.0/gnome-session/gsm-consolekit.c.add-can-shutdown-api gnome-session-2.24.0/gnome-session/gsm-consolekit.c --- gnome-session-2.24.0/gnome-session/gsm-consolekit.c.add-can-shutdown-api 2008-09-22 17:21:08.000000000 -0400 +++ gnome-session-2.24.0/gnome-session/gsm-consolekit.c 2008-10-10 17:43:35.000000000 -0400 @@ -825,20 +826,78 @@ gsm_consolekit_can_switch_user (GsmConso 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 +916,11 @@ gsm_consolekit_can_stop (GsmConsolekit * 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; diff -up gnome-session-2.24.0/gnome-session/gsm-manager.c.add-can-shutdown-api gnome-session-2.24.0/gnome-session/gsm-manager.c --- gnome-session-2.24.0/gnome-session/gsm-manager.c.add-can-shutdown-api 2008-09-22 17:21:08.000000000 -0400 +++ gnome-session-2.24.0/gnome-session/gsm-manager.c 2008-10-15 11:33:18.000000000 -0400 @@ -2313,6 +2313,30 @@ gsm_manager_shutdown (GsmManager *manage } 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) diff -up gnome-session-2.24.0/gnome-session/gsm-manager.h.add-can-shutdown-api gnome-session-2.24.0/gnome-session/gsm-manager.h --- gnome-session-2.24.0/gnome-session/gsm-manager.h.add-can-shutdown-api 2008-09-22 17:21:08.000000000 -0400 +++ gnome-session-2.24.0/gnome-session/gsm-manager.h 2008-10-10 16:41:14.000000000 -0400 @@ -151,6 +151,10 @@ gboolean gsm_manager_is_inhib 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); diff -up gnome-session-2.24.0/gnome-session/org.gnome.SessionManager.xml.add-can-shutdown-api gnome-session-2.24.0/gnome-session/org.gnome.SessionManager.xml --- gnome-session-2.24.0/gnome-session/org.gnome.SessionManager.xml.add-can-shutdown-api 2008-09-22 17:21:08.000000000 -0400 +++ gnome-session-2.24.0/gnome-session/org.gnome.SessionManager.xml 2008-10-10 16:41:14.000000000 -0400 @@ -252,6 +252,20 @@ + + + + True if shutdown is available to the user, false otherwise + + + + + Allows the caller to determine whether or not it's okay to show + a shutdown option in the UI + + + +