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" /* */ #define GDM_NOTIFY_ADD_GTK_MODULES "AddGtkModules" /* */ #define GDM_NOTIFY_GTK_MODULES_LIST "GtkModulesList" /* */ +#define GDM_NOTIFY_ALLOW_SHUTDOWN "AllowShutdown" /* */ +#define GDM_NOTIFY_SECURE_SHUTDOWN "SecureShutdown" /* */ /* 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~