[gnome-shell] main: Make sure that --mode parameter is valid



commit a7a46bbe1cac8d3512679637cd75e53e9e98c121
Author: Florian MÃllner <fmuellner gnome org>
Date:   Fri May 18 23:57:04 2012 +0200

    main: Make sure that --mode parameter is valid
    
    Instead of falling back to a set of default values or crashing the
    window manager when an invalid mode is specified, check the value
    of the ShellGlobal:session-mode property before taking over as WM
    and make a clean exit if it cannot be resolved to an existent mode.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=676156

 js/ui/sessionMode.js       |    5 +++++
 src/main.c                 |    6 ++++++
 src/shell-global-private.h |    1 +
 src/shell-global.c         |   15 +++++++++++++++
 4 files changed, 27 insertions(+), 0 deletions(-)
---
diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js
index 0cc2c14..1ed5aaa 100644
--- a/js/ui/sessionMode.js
+++ b/js/ui/sessionMode.js
@@ -13,6 +13,11 @@ const _modes = {
     'user': { sessionType: Shell.SessionType.USER }
 };
 
+function modeExists(mode) {
+    let modes = Object.getOwnPropertyNames(_modes);
+    return modes.indexOf(mode) != -1;
+}
+
 const SessionMode = new Lang.Class({
     Name: 'SessionMode',
 
diff --git a/src/main.c b/src/main.c
index bd3b128..97ad90a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -335,6 +335,12 @@ main (int argc, char **argv)
 
   _shell_global_init ("session-mode", session_mode, NULL);
 
+  if (!_shell_global_has_valid_session_mode (shell_global_get ()))
+    {
+      g_printerr ("\"%s\" is not a valid mode.\n", session_mode);
+      exit(1);
+    }
+
   ecode = meta_run ();
 
   if (g_getenv ("GNOME_SHELL_ENABLE_CLEANUP"))
diff --git a/src/shell-global-private.h b/src/shell-global-private.h
index 62f7c26..45e204f 100644
--- a/src/shell-global-private.h
+++ b/src/shell-global-private.h
@@ -13,6 +13,7 @@ void _shell_global_set_plugin      (ShellGlobal  *global,
 
 GjsContext *_shell_global_get_gjs_context (ShellGlobal  *global);
 
+gboolean _shell_global_has_valid_session_mode (ShellGlobal *global);
 gboolean _shell_global_check_xdnd_event (ShellGlobal  *global,
                                          XEvent       *xev);
 
diff --git a/src/shell-global.c b/src/shell-global.c
index 0195019..bc5a5c1 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -597,6 +597,21 @@ shell_global_set_stage_input_mode (ShellGlobal         *global,
     }
 }
 
+gboolean
+_shell_global_has_valid_session_mode (ShellGlobal *global)
+{
+  char *script;
+  int status;
+
+  script = g_strdup_printf ("imports.ui.environment.init();"
+                            "imports.ui.sessionMode.modeExists('%s') || 1;",
+                            global->session_mode);
+  gjs_context_eval (global->js_context, script, -1, "<sessionMode.js>", &status, NULL);
+  g_free (script);
+
+  return status == 0;
+}
+
 /**
  * shell_global_set_cursor:
  * @global: A #ShellGlobal



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]