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-10 16:41:14.000000000 -0400
@@ -2313,6 +2313,35 @@ 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);
+
+        if (manager->priv->phase != GSM_MANAGER_PHASE_RUNNING) {
+                *shutdown_available = FALSE;
+                return TRUE;
+        }
+
+        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 @@
       </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>
