181 lines
6.9 KiB
Diff
181 lines
6.9 KiB
Diff
|
From 04bfd175f1284576d9ddf51e13f073dc50f18f83 Mon Sep 17 00:00:00 2001
|
||
|
From: Ray Strode <rstrode@redhat.com>
|
||
|
Date: Fri, 15 Jan 2010 12:52:50 -0500
|
||
|
Subject: [PATCH] Nag users when they try to log in as root
|
||
|
|
||
|
Root login does not work very well, in general.
|
||
|
PolicyKit, IRC, and other random things just don't
|
||
|
function right when run as root. This commit adds
|
||
|
a nag screen to warn the user that they might not
|
||
|
have a good experience.
|
||
|
|
||
|
https://bugzilla.gnome.org/show_bug.cgi?id=607094
|
||
|
---
|
||
|
data/gnome-session.schemas.in.in | 11 ++++++
|
||
|
gnome-session/gsm-manager.c | 22 +++++++++++++
|
||
|
gnome-session/gsm-util.c | 64 ++++++++++++++++++++++++++++++++++++++
|
||
|
gnome-session/gsm-util.h | 3 ++
|
||
|
4 files changed, 100 insertions(+), 0 deletions(-)
|
||
|
|
||
|
diff --git a/data/gnome-session.schemas.in.in b/data/gnome-session.schemas.in.in
|
||
|
index 2cd5e2d..146319f 100644
|
||
|
--- a/data/gnome-session.schemas.in.in
|
||
|
+++ b/data/gnome-session.schemas.in.in
|
||
|
@@ -3,6 +3,17 @@
|
||
|
<schemalist>
|
||
|
|
||
|
<schema>
|
||
|
+ <key>/schemas/apps/gnome-session/options/show_root_warning</key>
|
||
|
+ <applyto>/apps/gnome-session/options/show_root_warning</applyto>
|
||
|
+ <owner>gnome</owner>
|
||
|
+ <type>bool</type>
|
||
|
+ <default>true</default>
|
||
|
+ <locale name="C">
|
||
|
+ <short>Warn user against running gnome-session from root account</short>
|
||
|
+ <long>If a user tries to login as root, show a dialog telling them it's a bad idea</long>
|
||
|
+ </locale>
|
||
|
+ </schema>
|
||
|
+ <schema>
|
||
|
<key>/schemas/apps/gnome-session/options/show_splash_screen</key>
|
||
|
<applyto>/apps/gnome-session/options/show_splash_screen</applyto>
|
||
|
<owner>gnome</owner>
|
||
|
diff --git a/gnome-session/gsm-manager.c b/gnome-session/gsm-manager.c
|
||
|
index 49fefe6..6fbd312 100644
|
||
|
--- a/gnome-session/gsm-manager.c
|
||
|
+++ b/gnome-session/gsm-manager.c
|
||
|
@@ -85,6 +85,8 @@
|
||
|
|
||
|
#define KEY_SLEEP_LOCK "/apps/gnome-screensaver/lock_enabled"
|
||
|
|
||
|
+#define KEY_SHOW_ROOT_WARNING "/apps/gnome-session/options/show_root_warning"
|
||
|
+
|
||
|
#define IS_STRING_EMPTY(x) ((x)==NULL||(x)[0]=='\0')
|
||
|
|
||
|
typedef enum
|
||
|
@@ -467,6 +469,26 @@ end_phase (GsmManager *manager)
|
||
|
manager->priv->phase_timeout_id = 0;
|
||
|
}
|
||
|
|
||
|
+ /* If we just finished the phase before the phase where applications
|
||
|
+ * are started, then nag the user if they're root. We could do it earlier,
|
||
|
+ * but that would mean showing a bare dialog with nothing around it
|
||
|
+ * (and potentially without decorations, font settings loaded, etc). We
|
||
|
+ * could do it later, but that would be mean things loading around it and
|
||
|
+ * covering it up, etc.
|
||
|
+ */
|
||
|
+ if (manager->priv->phase + 1 == GSM_MANAGER_PHASE_APPLICATION) {
|
||
|
+ if (getuid () == 0) {
|
||
|
+ gsm_util_nag_message (KEY_SHOW_ROOT_WARNING, FALSE,
|
||
|
+ _("You are currently trying to run as the "
|
||
|
+ "root super user. The super user is a "
|
||
|
+ "specialized account that is not designed "
|
||
|
+ "to run a normal user session. Various programs "
|
||
|
+ "will not function properly, and actions "
|
||
|
+ "performed under this account can cause unrecoverable "
|
||
|
+ "damage to the operating system."));
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
switch (manager->priv->phase) {
|
||
|
case GSM_MANAGER_PHASE_STARTUP:
|
||
|
case GSM_MANAGER_PHASE_INITIALIZATION:
|
||
|
diff --git a/gnome-session/gsm-util.c b/gnome-session/gsm-util.c
|
||
|
index d139b95..b60d994 100644
|
||
|
--- a/gnome-session/gsm-util.c
|
||
|
+++ b/gnome-session/gsm-util.c
|
||
|
@@ -35,6 +35,7 @@
|
||
|
#include <dbus/dbus-glib.h>
|
||
|
|
||
|
#include "gsm-util.h"
|
||
|
+#include "gsm-gconf.h"
|
||
|
|
||
|
static gchar *_saved_session_dir = NULL;
|
||
|
|
||
|
@@ -373,6 +374,69 @@ gsm_util_init_error (gboolean fatal,
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
+ * gsm_util_nag_message:
|
||
|
+ * @key: gconf configuration key to save user's "don't nag me" state
|
||
|
+ * @nag_only_once: Initial state of the "don't nag me" checkbox
|
||
|
+ * @format: printf-style error message format
|
||
|
+ * @...: error message args
|
||
|
+ *
|
||
|
+ * Displays a nag message to the user along with a check button that says something
|
||
|
+ * like "Don't show this again". If @nag_only_once is %TRUE, the check button will
|
||
|
+ * default to checked. The state of the dialog is stored as a boolean at the
|
||
|
+ * gconf path specified by @key
|
||
|
+ *
|
||
|
+ * This should be called for informative messages that the user may or may
|
||
|
+ * not care about.
|
||
|
+ **/
|
||
|
+void
|
||
|
+gsm_util_nag_message (const char *key,
|
||
|
+ gboolean nag_only_once,
|
||
|
+ const char *format, ...)
|
||
|
+{
|
||
|
+ GtkWidget *dialog;
|
||
|
+ GtkWidget *content_area;
|
||
|
+ GtkWidget *check_button;
|
||
|
+ char *msg;
|
||
|
+ va_list args;
|
||
|
+ GConfClient *client;
|
||
|
+ gboolean should_nag;
|
||
|
+
|
||
|
+ client = gconf_client_get_default ();
|
||
|
+ should_nag = gconf_client_get_bool (client, key, NULL);
|
||
|
+
|
||
|
+ if (!should_nag) {
|
||
|
+ goto out;
|
||
|
+ }
|
||
|
+
|
||
|
+ va_start (args, format);
|
||
|
+ msg = g_strdup_vprintf (format, args);
|
||
|
+ va_end (args);
|
||
|
+
|
||
|
+ dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_ERROR,
|
||
|
+ GTK_BUTTONS_CLOSE, "%s", msg);
|
||
|
+
|
||
|
+ g_free (msg);
|
||
|
+
|
||
|
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
|
||
|
+ check_button = gtk_check_button_new_with_label (_("Do not show me this again"));
|
||
|
+
|
||
|
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_button), nag_only_once != FALSE);
|
||
|
+ gtk_widget_show (check_button);
|
||
|
+
|
||
|
+ gtk_container_add (GTK_CONTAINER (content_area), check_button);
|
||
|
+
|
||
|
+ gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
|
||
|
+ gtk_dialog_run (GTK_DIALOG (dialog));
|
||
|
+
|
||
|
+ should_nag = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_button)) == FALSE;
|
||
|
+ gconf_client_set_bool (client, key, should_nag != FALSE, NULL);
|
||
|
+ gtk_widget_destroy (dialog);
|
||
|
+
|
||
|
+out:
|
||
|
+ g_object_unref (client);
|
||
|
+}
|
||
|
+
|
||
|
+/**
|
||
|
* gsm_util_generate_startup_id:
|
||
|
*
|
||
|
* Generates a new SM client ID.
|
||
|
diff --git a/gnome-session/gsm-util.h b/gnome-session/gsm-util.h
|
||
|
index b67a4ab..f7318a7 100644
|
||
|
--- a/gnome-session/gsm-util.h
|
||
|
+++ b/gnome-session/gsm-util.h
|
||
|
@@ -41,6 +41,9 @@ gboolean gsm_util_text_is_blank (const char *str);
|
||
|
|
||
|
void gsm_util_init_error (gboolean fatal,
|
||
|
const char *format, ...);
|
||
|
+void gsm_util_nag_message (const char *key,
|
||
|
+ gboolean nag_only_once,
|
||
|
+ const char *format, ...);
|
||
|
|
||
|
char * gsm_util_generate_startup_id (void);
|
||
|
|
||
|
--
|
||
|
1.6.5.3
|
||
|
|