diff -up gdm-2.21.10/gui/simple-greeter/gdm-greeter-login-window.c.ck-multi gdm-2.21.10/gui/simple-greeter/gdm-greeter-login-window.c --- gdm-2.21.10/gui/simple-greeter/gdm-greeter-login-window.c.ck-multi 2008-04-05 20:39:49.000000000 -0400 +++ gdm-2.21.10/gui/simple-greeter/gdm-greeter-login-window.c 2008-04-05 20:42:23.000000000 -0400 @@ -1036,20 +1036,41 @@ static PolKitAction * get_action_from_error (GError *error) { PolKitAction *action; - const char *paction; + char *paction; + char *p; action = polkit_action_new (); paction = NULL; if (g_str_has_prefix (error->message, "Not privileged for action: ")) { - paction = error->message + strlen ("Not privileged for action: "); + paction = g_strdup (error->message + strlen ("Not privileged for action: ")); + p = strchr (paction, ' '); + if (p) + *p = '\0'; } g_debug ("GdmGreeterLoginWindow: Requesting priv for '%s'", paction); polkit_action_set_action_id (action, paction); + g_free (paction); + return action; } + +static PolKitResult +get_result_from_error (GError *error) +{ + PolKitResult result = POLKIT_RESULT_UNKNOWN; + const char *p; + + p = strrchr (error->message, ' '); + if (p) { + p++; + polkit_result_from_string_representation (p, &result); + } + + return result; +} #endif static void @@ -1076,11 +1097,40 @@ do_system_restart (GdmGreeterLoginWindow if (dbus_g_error_has_name (error, "org.freedesktop.ConsoleKit.Manager.NotPrivileged")) { PolKitAction *action; + PolKitAction *action2; + PolKitResult result; + GtkWidget *dialog; guint xid; pid_t pid; + result = get_result_from_error (error); action = get_action_from_error (error); + if (result == POLKIT_RESULT_NO) { + action2 = polkit_action_new (); + polkit_action_set_action_id (action2, + "org.freedesktop.consolekit.system.restart-multiple-users"); + dialog = gtk_message_dialog_new (GTK_WINDOW (login_window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _("Failed to restart computer")); + if (polkit_action_equal (action, action2)) { + gtk_message_dialog_format_secondary_text (dialog, + _("You are not allowed to restart the computer " + "because multiple users are logged in")); + } + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + polkit_action_unref (action); + polkit_action_unref (action2); + + g_error_free (error); + + return; + } + xid = 0; pid = getpid (); @@ -1128,14 +1178,41 @@ do_system_stop (GdmGreeterLoginWindow *l if (dbus_g_error_has_name (error, "org.freedesktop.ConsoleKit.Manager.NotPrivileged")) { PolKitAction *action; + PolKitAction *action2; + PolKitResult result; + GtkWidget *dialog; guint xid; pid_t pid; xid = 0; pid = getpid (); + result = get_result_from_error (error); action = get_action_from_error (error); + if (result == POLKIT_RESULT_NO) { + action2 = polkit_action_new (); + polkit_action_set_action_id (action2, + "org.freedesktop.consolekit.system.stop-multiple-users"); + dialog = gtk_message_dialog_new (GTK_WINDOW (login_window), + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _("Failed to stop computer")); + if (polkit_action_equal (action, action2)) { + gtk_message_dialog_format_secondary_text (dialog, + _("You are not allowed to stop the computer " + "because multiple users are logged in")); + } + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (dialog); + + polkit_action_unref (action); + polkit_action_unref (action2); + + return; + } + g_error_free (error); error = NULL; res = polkit_gnome_auth_obtain (action,