File gdm-2.8.0.7-halt-needs-root.patch of Package gdm

diff -upr gdm-2.16.1-pre/daemon/gdm.c gdm-2.16.1-post/daemon/gdm.c
--- gdm-2.16.1-pre/daemon/gdm.c	2006-09-11 15:36:16.000000000 -0500
+++ gdm-2.16.1-post/daemon/gdm.c	2006-11-07 19:19:53.000000000 -0600
@@ -2347,6 +2347,9 @@ gdm_handle_message (GdmConnection *conn,
 			return;
 		d = gdm_display_lookup (slave_pid);
 
+		if (!gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN))
+			return;
+
 		gdm_info (_("Master suspending..."));
 
 		sysmenu = gdm_get_value_bool_per_display (d->name, GDM_KEY_SYSTEM_MENU);
@@ -3242,21 +3245,24 @@ gdm_handle_user_message (GdmConnection *
 		if (logout_action == GDM_LOGOUT_ACTION_NONE)
 			logout_action = safe_logout_action;
 
-		if (sysmenu && disp->attached &&
+		if (sysmenu && disp->attached && gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+		    !gdm_get_value_bool (GDM_KEY_SECURE_SHUTDOWN) &&
 		    ! ve_string_empty (gdm_get_value_string (GDM_KEY_HALT))) {
 			g_string_append_printf (msg, "%s%s", sep, GDM_SUP_LOGOUT_ACTION_HALT);
 			if (logout_action == GDM_LOGOUT_ACTION_HALT)
 				g_string_append (msg, "!");
 			sep = ";";
 		}
-		if (sysmenu && disp->attached &&
+		if (sysmenu && disp->attached && gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+		    !gdm_get_value_bool (GDM_KEY_SECURE_SHUTDOWN) &&
 		    ! ve_string_empty (gdm_get_value_string (GDM_KEY_REBOOT))) {
 			g_string_append_printf (msg, "%s%s", sep, GDM_SUP_LOGOUT_ACTION_REBOOT);
 			if (logout_action == GDM_LOGOUT_ACTION_REBOOT)
 				g_string_append (msg, "!");
 			sep = ";";
 		}
-		if (sysmenu && disp->attached &&
+		if (sysmenu && disp->attached && gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+		    !gdm_get_value_bool (GDM_KEY_SECURE_SHUTDOWN) &&
 		    ! ve_string_empty (gdm_get_value_string (GDM_KEY_SUSPEND))) {
 			g_string_append_printf (msg, "%s%s", sep, GDM_SUP_LOGOUT_ACTION_SUSPEND);
 			if (logout_action == GDM_LOGOUT_ACTION_SUSPEND)
@@ -3292,21 +3298,24 @@ gdm_handle_user_message (GdmConnection *
 			disp->logout_action = GDM_LOGOUT_ACTION_NONE;
 			was_ok = TRUE;
 		} else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_HALT) == 0) {
-			if (sysmenu && disp->attached &&
+			if (sysmenu && disp->attached && gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+			    !gdm_get_value_bool (GDM_KEY_SECURE_SHUTDOWN) &&
 			    ! ve_string_empty (gdm_get_value_string (GDM_KEY_HALT))) {
 				disp->logout_action =
 					GDM_LOGOUT_ACTION_HALT;
 				was_ok = TRUE;
 			}
 		} else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_REBOOT) == 0) {
-			if (sysmenu && disp->attached &&
+			if (sysmenu && disp->attached && gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+			    !gdm_get_value_bool (GDM_KEY_SECURE_SHUTDOWN) &&
 			    ! ve_string_empty (gdm_get_value_string (GDM_KEY_REBOOT))) {
 				disp->logout_action =
 					GDM_LOGOUT_ACTION_REBOOT;
 				was_ok = TRUE;
 			}
 		} else if (strcmp (action, GDM_SUP_LOGOUT_ACTION_SUSPEND) == 0) {
-			if (sysmenu && disp->attached &&
+			if (sysmenu && disp->attached && gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+			    !gdm_get_value_bool (GDM_KEY_SECURE_SHUTDOWN) &&
 			    ! ve_string_empty (gdm_get_value_string (GDM_KEY_SUSPEND))) {
 				disp->logout_action =
 					GDM_LOGOUT_ACTION_SUSPEND;
diff -upr gdm-2.16.1-pre/daemon/gdmconfig.c gdm-2.16.1-post/daemon/gdmconfig.c
--- gdm-2.16.1-pre/daemon/gdmconfig.c	2006-07-17 13:43:51.000000000 -0500
+++ gdm-2.16.1-post/daemon/gdmconfig.c	2006-11-07 23:19:19.000000000 -0600
@@ -251,6 +251,8 @@ static gboolean GdmGraphicalThemeRand;
 static gboolean GdmBroadcast;
 static gboolean GdmAllowAdd;
 static gboolean GdmRestartBackgroundProgram;
+static gboolean GdmAllowShutdown;
+static gboolean GdmSecureShutdown;
 
 /**
  * gdm_config_add_hash
@@ -418,6 +420,8 @@ gdm_config_init (void)
    gdm_config_add_hash (GDM_KEY_SOUND_ON_LOGIN, &GdmSoundOnLogin, &bool_type);
    gdm_config_add_hash (GDM_KEY_RESTART_BACKGROUND_PROGRAM,
       &GdmRestartBackgroundProgram, &bool_type);
+   gdm_config_add_hash (GDM_KEY_ALLOW_SHUTDOWN, &GdmAllowShutdown, &bool_type);
+   gdm_config_add_hash (GDM_KEY_SECURE_SHUTDOWN, &GdmSecureShutdown, &bool_type);
 
    /* string values */
    gdm_config_add_hash (GDM_KEY_PATH, &GdmPath, &string_type);
@@ -1277,6 +1281,10 @@ _gdm_set_value_bool (gchar *key, gboolea
         notify_displays_int (GDM_NOTIFY_ADD_GTK_MODULES, *setting);
      else if (is_key (key, GDM_KEY_TIMED_LOGIN_ENABLE))
         notify_displays_int (GDM_NOTIFY_TIMED_LOGIN_ENABLE, *setting);
+     else if (is_key (key, GDM_KEY_ALLOW_SHUTDOWN))
+        notify_displays_int (GDM_NOTIFY_ALLOW_SHUTDOWN, *setting);
+     else if (is_key (key, GDM_KEY_SECURE_SHUTDOWN))
+        notify_displays_int (GDM_NOTIFY_SECURE_SHUTDOWN, *setting);
    }
 
    if (*setting)
diff -upr gdm-2.16.1-pre/daemon/gdm.h gdm-2.16.1-post/daemon/gdm.h
--- gdm-2.16.1-pre/daemon/gdm.h	2006-11-07 18:31:11.000000000 -0600
+++ gdm-2.16.1-post/daemon/gdm.h	2006-11-07 20:04:54.000000000 -0600
@@ -123,6 +123,8 @@ enum {
 /* Different login interruptions */
 #define GDM_INTERRUPT_TIMED_LOGIN 'T'
 #define GDM_INTERRUPT_CONFIGURE   'C'
+#define GDM_INTERRUPT_HALT        'K'
+#define GDM_INTERRUPT_REBOOT      'B'
 #define GDM_INTERRUPT_SUSPEND     'S'
 #define GDM_INTERRUPT_SELECT_USER 'U'
 #define GDM_INTERRUPT_LOGIN_SOUND 'L'
@@ -418,6 +420,9 @@ enum {
 #define GDM_KEY_SHOW_XTERM_FAILSAFE "greeter/ShowXtermFailsafeSession=true"
 #define GDM_KEY_SHOW_LAST_SESSION "greeter/ShowLastSession=true"
 
+#define GDM_KEY_ALLOW_SHUTDOWN "security/AllowShutdown=true"
+#define GDM_KEY_SECURE_SHUTDOWN "security/SecureShutdown=false"
+
 #define GDM_SESSION_FAILSAFE_GNOME "GDM_Failsafe.GNOME"
 #define GDM_SESSION_FAILSAFE_XTERM "GDM_Failsafe.XTERM"
 
@@ -733,6 +738,8 @@ void		gdm_final_cleanup	(void);
 #define GDM_NOTIFY_SOUND_ON_LOGIN_FAILURE_FILE "SoundOnLoginFailureFile" /* <sound file> */
 #define GDM_NOTIFY_ADD_GTK_MODULES "AddGtkModules" /* <true/false as int> */
 #define GDM_NOTIFY_GTK_MODULES_LIST "GtkModulesList" /* <modules list> */
+#define GDM_NOTIFY_ALLOW_SHUTDOWN "AllowShutdown" /* <true/false as int> */
+#define GDM_NOTIFY_SECURE_SHUTDOWN "SecureShutdown" /* <true/false as int> */
 
 /* commands, seel GDM_SLAVE_NOTIFY_COMMAND */
 #define GDM_NOTIFY_DIRTY_SERVERS "DIRTY_SERVERS"
diff -upr gdm-2.16.1-pre/daemon/slave.c gdm-2.16.1-post/daemon/slave.c
--- gdm-2.16.1-pre/daemon/slave.c	2006-11-07 18:31:11.000000000 -0600
+++ gdm-2.16.1-post/daemon/slave.c	2006-11-07 19:56:06.000000000 -0600
@@ -101,6 +101,8 @@ static gboolean do_timed_login = FALSE; 
 					   login the timed login */
 static gboolean do_configurator = FALSE; /* if this is true, login as root
 					  * and start the configurator */
+static gboolean do_system_halt = FALSE;
+static gboolean do_system_reboot = FALSE;
 static gboolean do_cancel = FALSE; /* if this is true, go back to 
                                       username entry & unselect face
                                       browser (if present) */
@@ -1893,6 +1895,97 @@ play_login_sound (const char *sound_file
 	return TRUE;
 }
 
+static gboolean
+get_root_auth (const gchar *message, struct passwd **pwent)
+{
+	gboolean oldAllowRoot;
+
+	/* clear any error */
+	gdm_slave_greeter_ctl_no_ret (GDM_ERRBOX, "");
+	gdm_slave_greeter_ctl_no_ret (GDM_MSG, message);
+
+	/* we always allow root for this */
+	oldAllowRoot = gdm_get_value_bool (GDM_KEY_ALLOW_ROOT);
+	gdm_set_value_bool (GDM_KEY_ALLOW_ROOT, TRUE);
+
+	*pwent = getpwuid (0);
+	if G_UNLIKELY (*pwent == NULL) {
+		/* what? no "root" ?? */
+		gdm_slave_greeter_ctl_no_ret (GDM_RESET, "");
+		gdm_set_value_bool (GDM_KEY_ALLOW_ROOT, oldAllowRoot);
+		return FALSE;  /* continue */
+	}
+
+	gdm_slave_greeter_ctl_no_ret (GDM_SETLOGIN, (*pwent)->pw_name);
+	login = gdm_verify_user (d,
+				 (*pwent)->pw_name,
+				 d->name,
+				 d->attached);
+	gdm_set_value_bool (GDM_KEY_ALLOW_ROOT, oldAllowRoot);
+
+	/* Clear message */
+	gdm_slave_greeter_ctl_no_ret (GDM_MSG, "");
+
+	if G_UNLIKELY (do_restart_greeter) {
+		g_free (login);
+		login = NULL;
+		do_restart_greeter = FALSE;
+		restart_the_greeter ();
+		return FALSE;  /* continue */
+	}
+
+	check_notifies_now ();
+
+	/* The wanker can't remember his password */
+	if (login == NULL) {
+		gdm_debug ("gdm_slave_wait_for_login: No login/Bad login");
+		gdm_slave_greeter_ctl_no_ret (GDM_RESET, "");
+		return FALSE;  /* continue */
+	}
+
+	/* Wipe the login */
+	g_free (login);
+	login = NULL;
+
+	/* Note that this can still fall through to
+	 * the timed login if the user doesn't type in the
+	 * password fast enough and there is timed login
+	 * enabled */
+	if (do_timed_login) {
+		return FALSE;  /* break; */
+	}
+
+	/* The user is a wanker */
+	if G_UNLIKELY (do_configurator || do_system_halt || do_system_reboot) {
+		do_configurator = FALSE;
+		do_system_halt = FALSE;
+		do_system_reboot = FALSE;
+		gdm_slave_greeter_ctl_no_ret (GDM_RESET, "");
+		return FALSE;  /* continue */
+	}
+
+	/* Now running as root */
+
+	/* Get the root pwent */
+	*pwent = getpwuid (0);
+
+	if G_UNLIKELY (*pwent == NULL) {
+		/* What?  No "root" ??  This is not possible
+		 * since we logged in, but I'm paranoid */
+		gdm_slave_greeter_ctl_no_ret (GDM_RESET, "");
+		return FALSE;  /* continue */
+	}
+
+	d->logged_in = TRUE;
+	logged_in_uid = 0;
+	logged_in_gid = 0;
+	gdm_slave_send_num (GDM_SOP_LOGGED_IN, TRUE);
+	/* Note: nobody really logged in */
+	gdm_slave_send_string (GDM_SOP_LOGIN, "");
+
+	return TRUE;
+}
+
 static void
 gdm_slave_wait_for_login (void)
 {
@@ -1949,88 +2042,13 @@ gdm_slave_wait_for_login (void)
 			do_configurator = FALSE;
 			g_free (login);
 			login = NULL;
-			/* clear any error */
-			gdm_slave_greeter_ctl_no_ret (GDM_ERRBOX, "");
-			gdm_slave_greeter_ctl_no_ret
-				(GDM_MSG,
-				 _("You must authenticate as root to run configuration."));
-
-			/* we always allow root for this */
-			oldAllowRoot = gdm_get_value_bool (GDM_KEY_ALLOW_ROOT);
-			gdm_set_value_bool (GDM_KEY_ALLOW_ROOT, TRUE);
-
-			pwent = getpwuid (0);
-			if G_UNLIKELY (pwent == NULL) {
-				/* what? no "root" ?? */
-				gdm_slave_greeter_ctl_no_ret (GDM_RESET, "");
-				continue;
-			}
 
-			gdm_slave_greeter_ctl_no_ret (GDM_SETLOGIN, pwent->pw_name);
-			login = gdm_verify_user (d,
-						 pwent->pw_name,
-						 d->name,
-						 d->attached);
-			gdm_set_value_bool (GDM_KEY_ALLOW_ROOT, oldAllowRoot);
-
-			/* Clear message */
-			gdm_slave_greeter_ctl_no_ret (GDM_MSG, "");
-
-			if G_UNLIKELY (do_restart_greeter) {
-				g_free (login);
-				login = NULL;
-				do_restart_greeter = FALSE;
-				restart_the_greeter ();
+			if (!get_root_auth (_("You must authenticate as root to run configuration."), &pwent)) {
+				if (do_timed_login)
+					break;
 				continue;
 			}
 
-			check_notifies_now ();
-
-			/* The wanker can't remember his password */
-			if (login == NULL) {
-				gdm_debug ("gdm_slave_wait_for_login: No login/Bad login");
-				gdm_slave_greeter_ctl_no_ret (GDM_RESET, "");
-				continue;
-			}
-
-			/* Wipe the login */
-			g_free (login);
-			login = NULL;
-
-			/* Note that this can still fall through to
-			 * the timed login if the user doesn't type in the
-			 * password fast enough and there is timed login
-			 * enabled */
-			if (do_timed_login) {
-				break;
-			}
-
-			/* The user is a wanker */
-			if G_UNLIKELY (do_configurator) {
-				do_configurator = FALSE;
-				gdm_slave_greeter_ctl_no_ret (GDM_RESET, "");
-				continue;
-			}
-
-			/* Now running as root */
-
-			/* Get the root pwent */
-			pwent = getpwuid (0);
-
-			if G_UNLIKELY (pwent == NULL) {
-				/* What?  No "root" ??  This is not possible
-				 * since we logged in, but I'm paranoid */
-				gdm_slave_greeter_ctl_no_ret (GDM_RESET, "");
-				continue;
-			}
-
-			d->logged_in = TRUE;
-			logged_in_uid = 0;
-			logged_in_gid = 0;
-			gdm_slave_send_num (GDM_SOP_LOGGED_IN, TRUE);
-			/* Note: nobody really logged in */
-			gdm_slave_send_string (GDM_SOP_LOGIN, "");
-
 			/* Disable the login screen, we don't want people to
 			 * log in in the meantime */
 			gdm_slave_greeter_ctl_no_ret (GDM_DISABLE, "");
@@ -2069,6 +2087,49 @@ gdm_slave_wait_for_login (void)
 			continue;
 		}
 
+		if (do_system_halt) {
+			struct passwd *pwent;
+
+			do_system_halt = FALSE;
+			g_free (login);
+			login = NULL;
+
+			if (!gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN))
+				continue;
+
+			if (!gdm_get_value_bool (GDM_KEY_SECURE_SHUTDOWN) ||
+			    get_root_auth (_("You must authenticate as root to shut down."), &pwent)) {
+				exit_code_to_use = DISPLAY_HALT;
+				term_quit ();
+			} else if (do_timed_login) {
+				break;
+			}
+
+			continue;
+		}
+
+		if (do_system_reboot) {
+			struct passwd *pwent;
+
+			do_system_reboot = FALSE;
+			g_free (login);
+			login = NULL;
+
+			if (!gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN))
+				continue;
+
+			if (!gdm_get_value_bool (GDM_KEY_SECURE_SHUTDOWN) ||
+			    get_root_auth (_("You must authenticate as root to restart the computer."), &pwent)) {
+				exit_code_to_use = DISPLAY_REBOOT;
+				term_quit ();
+			} else if (do_timed_login) {
+				break;
+			}
+
+			continue;
+		}
+
+
 		/* The user timed out into a timed login during the
 		 * conversation */
 		if (do_timed_login) {
@@ -4943,9 +5004,20 @@ check_for_interruption (const char *msg)
 				do_configurator = TRUE;
 			}
 			break;
+		case GDM_INTERRUPT_HALT:
+			if (d->attached) {
+				do_system_halt = TRUE;
+			}
+			break;
+		case GDM_INTERRUPT_REBOOT:
+			if (d->attached) {
+				do_system_reboot = TRUE;
+			}
+			break;
 		case GDM_INTERRUPT_SUSPEND:
 			if (d->attached &&
 			    gdm_get_value_bool_per_display (d->name, GDM_KEY_SYSTEM_MENU) &&
+			    gdm_get_value_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
 			    ! ve_string_empty (gdm_get_value_string (GDM_KEY_SUSPEND))) {
 			    	gchar *msg = g_strdup_printf ("%s %ld", 
 					GDM_SOP_SUSPEND_MACHINE,
@@ -5358,6 +5430,8 @@ gdm_slave_action_pending (void)
 {
 	if (do_timed_login ||
 	    do_configurator ||
+	    do_system_halt ||
+	    do_system_reboot ||
 	    do_restart_greeter ||
 	    do_cancel)
 		return FALSE;
@@ -5629,6 +5703,12 @@ gdm_slave_handle_notify (const char *msg
 				remanage_asap = TRUE;
 			}
 		}
+	} else if (sscanf (msg, GDM_NOTIFY_ALLOW_SHUTDOWN " %d", &val) == 1) {
+		gdm_set_value_bool (GDM_KEY_ALLOW_SHUTDOWN, val);
+		if (d->greetpid > 1)
+			kill (d->greetpid, SIGHUP);
+	} else if (sscanf (msg, GDM_NOTIFY_SECURE_SHUTDOWN " %d", &val) == 1) {
+		gdm_set_value_bool (GDM_KEY_SECURE_SHUTDOWN, val);
 	}
 }
 
diff -upr gdm-2.16.1-pre/gui/gdmlogin.c gdm-2.16.1-post/gui/gdmlogin.c
--- gdm-2.16.1-pre/gui/gdmlogin.c	2006-07-21 12:56:26.000000000 -0500
+++ gdm-2.16.1-post/gui/gdmlogin.c	2006-11-07 21:19:38.000000000 -0600
@@ -658,14 +658,20 @@ gdm_run_gdmconfig (GtkWidget *w, gpointe
 static void
 gdm_login_restart_handler (void)
 {
-	if (gdm_wm_warn_dialog (
-	    _("Are you sure you want to restart the computer?"), "",
-	    _("_Restart"), NULL, TRUE) == GTK_RESPONSE_YES) {
+	if (!gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN))
+		return;
 
-		closelog ();
+	if (!gdm_config_get_bool (GDM_KEY_SECURE_SHUTDOWN)) {
+		if (gdm_wm_warn_dialog (_("Are you sure you want to restart the computer?"), "",
+					_("_Restart"), NULL, TRUE) == GTK_RESPONSE_YES) {
+			closelog ();
 
-		gdm_kill_thingies ();
-		_exit (DISPLAY_REBOOT);
+			gdm_kill_thingies ();
+			_exit (DISPLAY_REBOOT);
+		}
+	} else {
+		printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_REBOOT);
+		fflush (stdout);
 	}
 }
 
@@ -673,14 +679,20 @@ gdm_login_restart_handler (void)
 static void
 gdm_login_halt_handler (void)
 {
-	if (gdm_wm_warn_dialog (
-	    _("Are you sure you want to Shut Down the computer?"), "",
-	    _("Shut _Down"), NULL, TRUE) == GTK_RESPONSE_YES) {
+	if (!gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN))
+		return;
 
-		closelog ();
+	if (!gdm_config_get_bool (GDM_KEY_SECURE_SHUTDOWN)) {
+		if (gdm_wm_warn_dialog (_("Are you sure you want to Shut Down the computer?"), "",
+					_("Shut _Down"), NULL, TRUE) == GTK_RESPONSE_YES) {
+			closelog ();
 
-		gdm_kill_thingies ();
-		_exit (DISPLAY_HALT);
+			gdm_kill_thingies ();
+			_exit (DISPLAY_HALT);
+		}
+	} else {
+		printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_HALT);
+		fflush (stdout);
 	}
 }
 
@@ -696,11 +708,17 @@ gdm_login_use_chooser_handler (void)
 static void
 gdm_login_suspend_handler (void)
 {
-	if (gdm_wm_warn_dialog (
-	    _("Are you sure you want to suspend the computer?"), "",
-	    _("_Suspend"), NULL, TRUE) == GTK_RESPONSE_YES) {
+	if (!gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN))
+		return;
 
-		/* suspend interruption */
+	if (!gdm_config_get_bool (GDM_KEY_SECURE_SHUTDOWN)) {
+		if (gdm_wm_warn_dialog (_("Are you sure you want to suspend the computer?"), "",
+					_("_Suspend"), NULL, TRUE) == GTK_RESPONSE_YES) {
+			/* suspend interruption */
+			printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_SUSPEND);
+			fflush (stdout);
+		}
+	} else {
 		printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_SUSPEND);
 		fflush (stdout);
 	}
@@ -2369,7 +2387,8 @@ gdm_login_gui_init (void)
 		got_anything = TRUE;
 	}
 
-	if (gdm_working_command_exists (gdm_config_get_string (GDM_KEY_REBOOT))) {
+	if (gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+	    gdm_working_command_exists (gdm_config_get_string (GDM_KEY_REBOOT))) {
 		item = gtk_menu_item_new_with_mnemonic (_("_Restart"));
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
 		g_signal_connect (G_OBJECT (item), "activate",
@@ -2379,7 +2398,8 @@ gdm_login_gui_init (void)
 		got_anything = TRUE;
 	}
 	
-	if (gdm_working_command_exists (gdm_config_get_string (GDM_KEY_HALT))) {
+	if (gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+	    gdm_working_command_exists (gdm_config_get_string (GDM_KEY_HALT))) {
 		item = gtk_menu_item_new_with_mnemonic (_("Shut _Down"));
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
 		g_signal_connect (G_OBJECT (item), "activate",
@@ -2389,7 +2409,8 @@ gdm_login_gui_init (void)
 		got_anything = TRUE;
 	}
 
-	if (gdm_working_command_exists (gdm_config_get_string (GDM_KEY_SUSPEND))) {
+	if (gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN) &&
+	    gdm_working_command_exists (gdm_config_get_string (GDM_KEY_SUSPEND))) {
 		item = gtk_menu_item_new_with_mnemonic (_("_Suspend"));
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
 		g_signal_connect (G_OBJECT (item), "activate",
Only in gdm-2.16.1-post/gui: gdmlogin.c~
diff -upr gdm-2.16.1-pre/gui/gdmsetup.c gdm-2.16.1-post/gui/gdmsetup.c
--- gdm-2.16.1-pre/gui/gdmsetup.c	2006-11-07 18:31:11.000000000 -0600
+++ gdm-2.16.1-post/gui/gdmsetup.c	2006-11-07 21:23:24.000000000 -0600
@@ -1670,9 +1670,6 @@ setup_intspin (const char *name,
 	g_object_set_data_full (G_OBJECT (spin),
 				"key", g_strdup (key),
 				(GDestroyNotify) g_free);
-	g_object_set_data_full (G_OBJECT (toggle),
-				"notify_key", g_strdup (key),
-				(GDestroyNotify) g_free);
 
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), val);
 
Only in gdm-2.16.1-post/gui: gdmsetup.c~
diff -upr gdm-2.16.1-pre/gui/greeter/greeter_item.c gdm-2.16.1-post/gui/greeter/greeter_item.c
--- gdm-2.16.1-pre/gui/greeter/greeter_item.c	2006-11-07 18:31:11.000000000 -0600
+++ gdm-2.16.1-post/gui/greeter/greeter_item.c	2006-11-07 21:28:38.000000000 -0600
@@ -196,15 +196,15 @@ greeter_item_is_visible (GreeterItemInfo
       strcmp (info->show_type, "system") == 0)
 	  return FALSE;
 
-  if (( ! sysmenu || ! GdmHaltFound) &&
+  if (( ! sysmenu || ! GdmHaltFound || !gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN)) &&
       (info->show_type != NULL &&
        strcmp (info->show_type, "halt") == 0))
 	  return FALSE;
-  if (( ! sysmenu || ! GdmRebootFound) &&
+  if (( ! sysmenu || ! GdmRebootFound || !gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN)) &&
       (info->show_type != NULL &&
        strcmp (info->show_type, "reboot") == 0))
 	  return FALSE;
-  if (( ! sysmenu || ! GdmSuspendFound) &&
+  if (( ! sysmenu || ! GdmSuspendFound || !gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN)) &&
       (info->show_type != NULL &&
        strcmp (info->show_type, "suspend") == 0))
 	  return FALSE;
Only in gdm-2.16.1-post/gui/greeter: greeter_item.c~
diff -upr gdm-2.16.1-pre/gui/greeter/greeter_system.c gdm-2.16.1-post/gui/greeter/greeter_system.c
--- gdm-2.16.1-pre/gui/greeter/greeter_system.c	2006-08-02 21:32:39.000000000 -0500
+++ gdm-2.16.1-post/gui/greeter/greeter_system.c	2006-11-07 21:26:35.000000000 -0600
@@ -68,61 +68,63 @@ bin_exists (const char *command)
  * cannot depend on callback data being passed in.
  */
 static void
-query_greeter_restart_handler (void)
+greeter_restart_handler (void)
 {
-	if (gdm_wm_warn_dialog (_("Are you sure you want to restart the computer?"), "",
-			     _("_Restart"), NULL, TRUE) == GTK_RESPONSE_YES) {
-		closelog ();
+	if (!gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN))
+		return;
+
+	if (!gdm_config_get_bool (GDM_KEY_SECURE_SHUTDOWN)) {
+		if (gdm_wm_warn_dialog (_("Are you sure you want to restart the computer?"), "",
+					_("_Restart"), NULL, TRUE) == GTK_RESPONSE_YES) {
+			closelog ();
 		
-		_exit (DISPLAY_REBOOT);
+			_exit (DISPLAY_REBOOT);
+		}
+	} else {
+		printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_REBOOT);
+		fflush (stdout);
 	}
 }
 
 static void
-query_greeter_halt_handler (void)
+greeter_halt_handler (void)
 {
-	if (gdm_wm_warn_dialog (_("Are you sure you want to Shut Down the computer?"), "",
-			     _("Shut _Down"), NULL, TRUE) == GTK_RESPONSE_YES) {
-		closelog ();
+	if (!gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN))
+		return;
 
-		_exit (DISPLAY_HALT);
+	if (!gdm_config_get_bool (GDM_KEY_SECURE_SHUTDOWN)) {
+		if (gdm_wm_warn_dialog (_("Are you sure you want to Shut Down the computer?"), "",
+					_("Shut _Down"), NULL, TRUE) == GTK_RESPONSE_YES) {
+			closelog ();
+
+			_exit (DISPLAY_HALT);
+		}
+	} else {
+		printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_HALT);
+		fflush (stdout);
 	}
 }
 
 static void
-query_greeter_suspend_handler (void)
+greeter_suspend_handler (void)
 {
-	if (gdm_wm_warn_dialog (_("Are you sure you want to suspend the computer?"), "",
-			     _("_Suspend"), NULL, TRUE) == GTK_RESPONSE_YES) {
-		/* suspend interruption */
+	if (!gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN))
+		return;
+
+	if (!gdm_config_get_bool (GDM_KEY_SECURE_SHUTDOWN)) {
+		if (gdm_wm_warn_dialog (_("Are you sure you want to suspend the computer?"), "",
+					_("_Suspend"), NULL, TRUE) == GTK_RESPONSE_YES) {
+			/* suspend interruption */
+			printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_SUSPEND);
+			fflush (stdout);
+		}
+	} else {
 		printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_SUSPEND);
 		fflush (stdout);
 	}
 }
 
 static void
-greeter_restart_handler (void)
-{
-	closelog ();
-	_exit (DISPLAY_REBOOT);
-}
-
-
-static void
-greeter_halt_handler (void)
-{
-	closelog ();
-	_exit (DISPLAY_HALT);
-}
-
-static void
-greeter_suspend_handler (void)
-{
-	printf ("%c%c%c\n", STX, BEL, GDM_INTERRUPT_SUSPEND);
-	fflush (stdout);
-}
-
-static void
 greeter_config_handler (void)
 {
         greeter_item_ulist_disable ();
@@ -174,36 +176,36 @@ greeter_system_append_system_menu (GtkWi
 				  NULL);
 	}
 
-	if (GdmRebootFound || GdmHaltFound || GdmSuspendFound) {
+	if (gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN) && (GdmRebootFound || GdmHaltFound || GdmSuspendFound)) {
 		sep = gtk_separator_menu_item_new ();
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), sep);
 		gtk_widget_show (sep);
 	}
 
-	if (GdmRebootFound) {
+	if (gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN) && GdmRebootFound) {
 		w = gtk_menu_item_new_with_mnemonic (_("_Restart"));
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), w);
 		gtk_widget_show (GTK_WIDGET (w));
 		g_signal_connect (G_OBJECT (w), "activate",
-				  G_CALLBACK (query_greeter_restart_handler),
+				  G_CALLBACK (greeter_restart_handler),
 				  NULL);
 	}
 
-	if (GdmHaltFound) {
+	if (gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN) && GdmHaltFound) {
 		w = gtk_menu_item_new_with_mnemonic (_("Shut _Down"));
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), w);
 		gtk_widget_show (GTK_WIDGET (w));
 		g_signal_connect (G_OBJECT (w), "activate",
-				  G_CALLBACK (query_greeter_halt_handler),
+				  G_CALLBACK (greeter_halt_handler),
 				  NULL);
 	}
 
-	if (GdmSuspendFound) {
+	if (gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN) && GdmSuspendFound) {
 		w = gtk_menu_item_new_with_mnemonic (_("Sus_pend"));
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), w);
 		gtk_widget_show (GTK_WIDGET (w));
 		g_signal_connect (G_OBJECT (w), "activate",
-				  G_CALLBACK (query_greeter_suspend_handler),
+				  G_CALLBACK (greeter_suspend_handler),
 				  NULL);
 	}
 }
@@ -281,7 +283,7 @@ greeter_system_handler (GreeterItemInfo 
 		      vbox,
 		      TRUE, TRUE, 0);
 
-  if (GdmHaltFound) {
+  if (GdmHaltFound && gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN)) {
 	  if (group_radio != NULL)
 		  radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio));
 	  halt_radio = gtk_radio_button_new_with_mnemonic (radio_group,
@@ -299,7 +301,7 @@ greeter_system_handler (GreeterItemInfo 
 	  gtk_widget_show (halt_radio);
   }
 
-  if (GdmRebootFound) {
+  if (GdmRebootFound && gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN)) {
 	  if (group_radio != NULL)
 		  radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio));
 	  restart_radio = gtk_radio_button_new_with_mnemonic (radio_group,
@@ -316,7 +318,7 @@ greeter_system_handler (GreeterItemInfo 
 	  gtk_widget_show (restart_radio);
   }
 
-  if (GdmSuspendFound) {
+  if (GdmSuspendFound && gdm_config_get_bool (GDM_KEY_ALLOW_SHUTDOWN)) {
 	  if (group_radio != NULL)
 		  radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (group_radio));
 	  suspend_radio = gtk_radio_button_new_with_mnemonic (radio_group,
@@ -414,13 +416,13 @@ void
 greeter_item_system_setup (void)
 {
   greeter_item_register_action_callback ("reboot_button",
-					 (ActionFunc)query_greeter_restart_handler,
+					 (ActionFunc)greeter_restart_handler,
 					 NULL);
   greeter_item_register_action_callback ("halt_button",
-					 (ActionFunc)query_greeter_halt_handler,
+					 (ActionFunc)greeter_halt_handler,
 					 NULL);
   greeter_item_register_action_callback ("suspend_button",
-					 (ActionFunc)query_greeter_suspend_handler,
+					 (ActionFunc)greeter_suspend_handler,
 					 NULL);
   greeter_item_register_action_callback ("system_button",
 					 (ActionFunc)greeter_system_handler,
Only in gdm-2.16.1-post/gui/greeter: greeter_system.c~
openSUSE Build Service is sponsored by