]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Merge mterrys changes to the PATH mangling for gdmflexiserver
authorRobert Ancell <robert.ancell@canonical.com>
Thu, 18 Aug 2011 00:11:39 +0000 (10:11 +1000)
committerRobert Ancell <robert.ancell@canonical.com>
Thu, 18 Aug 2011 00:11:39 +0000 (10:11 +1000)
1  2 
src/display.c
src/session.c

diff --combined src/display.c
index 0c30a6ee020eb5573a980ad61aea258dc1f36a32,e378eca68265ad79e08938b24395172153f49e24..a82a971479754304f4f8f6aeaae1247856e761aa
@@@ -1,7 -1,7 +1,7 @@@
  /*
   * Copyright (C) 2010-2011 Robert Ancell.
   * Author: Robert Ancell <robert.ancell@canonical.com>
 - * 
 + *
   * This program is free software: you can redistribute it and/or modify it under
   * the terms of the GNU General Public License as published by the Free Software
   * Foundation, either version 3 of the License, or (at your option) any later
@@@ -51,6 -51,9 +51,6 @@@ struct DisplayPrivat
      /* Display server */
      DisplayServer *display_server;
  
 -    /* User to run greeter as */
 -    gchar *greeter_user;
 -
      /* Greeter session */
      gchar *greeter_session;
  
  
      /* Session requested to log into */
      gchar *user_session;
 -  
 -    /* Directory to load X sessions from */
 -    gchar *xsessions_dir;
 -
 -    /* Directory to load X greeters from */
 -    gchar *xgreeters_dir;
  
      /* Program to run sessions through */
      gchar *session_wrapper;
  
      /* PAM service to authenticate against for automatic logins */
      gchar *pam_autologin_service;
 +  
 +    /* TRUE if a session should be started on greeter quit */
 +    gboolean start_session_on_greeter_quit;
  
      /* TRUE if in a user session */
      gboolean in_user_session;
 -  
 +
      /* TRUE if have emitted ready signal */
      gboolean indicated_ready;
 -  
 +
      /* Session process */
      Session *session;
  
  
      /* TRUE if start greeter if fail to login */
      gboolean start_greeter_if_fail;
 -  
 +
      /* Hint to select user in greeter */
      gchar *select_user_hint;
      gboolean select_guest_hint;
 -  
 +
      /* TRUE if allowed to log into guest account */
      gboolean allow_guest;
  
      /* TRUE if stopping the display (waiting for dispaly server, greeter and session to stop) */
 -    gboolean stopping;    
 +    gboolean stopping;
 +
 +    /* TRUE if stopped */
 +    gboolean stopped;
  };
  
  G_DEFINE_TYPE (Display, display, G_TYPE_OBJECT);
  static gboolean start_greeter_session (Display *display);
  static gboolean start_user_session (Display *display, PAMSession *authentication);
  
 -// FIXME: Should be a construct property
 -// FIXME: Move into seat.c
 -void
 -display_load_config (Display *display, const gchar *config_section)
 -{
 -    g_return_if_fail (display != NULL);
 -    
 -    display->priv->greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
 -
 -    if (config_section)
 -        display->priv->greeter_session = config_get_string (config_get_instance (), config_section, "greeter-session");
 -    if (!display->priv->greeter_session)
 -        display->priv->greeter_session = config_get_string (config_get_instance (), "SeatDefaults", "greeter-session");
 -    if (config_section && config_has_key (config_get_instance (), config_section, "greeter-hide-users"))
 -        display->priv->greeter_hide_users = config_get_boolean (config_get_instance (), config_section, "greeter-hide-users");
 -    else if (config_has_key (config_get_instance (), "SeatDefaults", "greeter-hide-users"))
 -        display->priv->greeter_hide_users = config_get_boolean (config_get_instance (), "SeatDefaults", "greeter-hide-users");
 -    if (config_section)
 -        display->priv->user_session = config_get_string (config_get_instance (), config_section, "user-session");
 -    if (!display->priv->user_session)
 -        display->priv->user_session = config_get_string (config_get_instance (), "SeatDefaults", "user-session");
 -    if (config_section)
 -        display->priv->xsessions_dir = config_get_string (config_get_instance (), config_section, "xsessions-directory");
 -    if (!display->priv->xsessions_dir)
 -        display->priv->xsessions_dir = config_get_string (config_get_instance (), "SeatDefaults", "xsessions-directory");
 -    if (config_section)
 -        display->priv->xgreeters_dir = config_get_string (config_get_instance (), config_section, "xgreeters-directory");
 -    if (!display->priv->xgreeters_dir)
 -        display->priv->xgreeters_dir = config_get_string (config_get_instance (), "SeatDefaults", "xgreeters-directory");
 -    if (config_section)
 -        display->priv->session_wrapper = config_get_string (config_get_instance (), config_section, "session-wrapper");
 -    if (!display->priv->session_wrapper)
 -        display->priv->session_wrapper = config_get_string (config_get_instance (), "SeatDefaults", "session-wrapper");
 -}
 -
  // FIXME: Should be a construct property
  void
  display_set_display_server (Display *display, DisplayServer *display_server)
@@@ -145,22 -183,6 +145,22 @@@ display_get_session (Display *display
      return display->priv->session;
  }
  
 +void
 +display_set_greeter_session (Display *display, const gchar *greeter_session)
 +{
 +    g_return_if_fail (display != NULL);
 +    g_free (display->priv->greeter_session);
 +    display->priv->greeter_session = g_strdup (greeter_session);
 +}
 +
 +void
 +display_set_session_wrapper (Display *display, const gchar *session_wrapper)
 +{
 +    g_return_if_fail (display != NULL);
 +    g_free (display->priv->session_wrapper);
 +    display->priv->session_wrapper = g_strdup (session_wrapper);
 +}
 +
  void
  display_set_allow_guest (Display *display, gboolean allow_guest)
  {
@@@ -187,19 -209,15 +187,19 @@@ display_set_select_user_hint (Display *
      display->priv->select_guest_hint = is_guest;
  }
  
 +void
 +display_set_hide_users_hint (Display *display, gboolean hide_users)
 +{
 +    g_return_if_fail (display != NULL);
 +    display->priv->greeter_hide_users = hide_users;
 +}
 +
  void
  display_set_user_session (Display *display, const gchar *session_name)
  {
      g_return_if_fail (display != NULL);
 -    if (session_name)
 -    {
 -        g_free (display->priv->user_session);
 -        display->priv->user_session = g_strdup (session_name);
 -    }
 +    g_free (display->priv->user_session);
 +    display->priv->user_session = g_strdup (session_name);
  }
  
  static gboolean
@@@ -245,7 -263,7 +245,7 @@@ start_ck_session (Display *display, con
                                             NULL,
                                             "org.freedesktop.ConsoleKit",
                                             "/org/freedesktop/ConsoleKit/Manager",
 -                                           "org.freedesktop.ConsoleKit.Manager", 
 +                                           "org.freedesktop.ConsoleKit.Manager",
                                             NULL, &error);
      if (!proxy)
          g_warning ("Unable to get connection to ConsoleKit: %s", error->message);
@@@ -319,7 -337,7 +319,7 @@@ end_ck_session (const gchar *cookie
                                             NULL,
                                             "org.freedesktop.ConsoleKit",
                                             "/org/freedesktop/ConsoleKit/Manager",
 -                                           "org.freedesktop.ConsoleKit.Manager", 
 +                                           "org.freedesktop.ConsoleKit.Manager",
                                             NULL, NULL);
      result = g_dbus_proxy_call_sync (proxy,
                                       "CloseSession",
@@@ -366,11 -384,9 +366,11 @@@ static voi
  check_stopped (Display *display)
  {
      if (display->priv->stopping &&
 +        !display->priv->stopped &&
          display->priv->display_server == NULL &&
          display->priv->session == NULL)
      {
 +        display->priv->stopped = TRUE;
          g_debug ("Display stopped");
          g_signal_emit (display, signals[STOPPED], 0);
      }
@@@ -411,7 -427,7 +411,7 @@@ autologin_authentication_result_cb (PAM
      }
  
      if (!started_session)
 -       display_stop (display);
 +        display_stop (display);
  }
  
  static gboolean
@@@ -492,22 -508,19 +492,22 @@@ greeter_session_stopped_cb (Session *se
      if (!display->priv->display_server)
          return;
  
 -    /* Start the session for the authenticated user */  
 -    if (greeter_get_guest_authenticated (display->priv->greeter))
 +    /* Start the session for the authenticated user */
 +    if (display->priv->start_session_on_greeter_quit)
      {
 -        started_session = autologin_guest (display, FALSE);
 -        if (!started_session)
 -            g_debug ("Failed to start guest session");
 -    }
 -    else
 -    {
 -        display->priv->in_user_session = TRUE;
 -        started_session = start_user_session (display, greeter_get_authentication (display->priv->greeter));
 -        if (!started_session)
 -            g_debug ("Failed to start user session");
 +        if (greeter_get_guest_authenticated (display->priv->greeter))
 +        {
 +            started_session = autologin_guest (display, FALSE);
 +            if (!started_session)
 +                g_debug ("Failed to start guest session");
 +        }
 +        else
 +        {
 +            display->priv->in_user_session = TRUE;
 +            started_session = start_user_session (display, greeter_get_authentication (display->priv->greeter));
 +            if (!started_session)
 +                g_debug ("Failed to start user session");
 +        }
      }
  
      g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
@@@ -536,7 -549,6 +536,6 @@@ static Session 
  create_session (Display *display, PAMSession *authentication, const gchar *session_name, gboolean is_greeter, const gchar *log_filename)
  {
      gchar *sessions_dir, *filename, *path, *command = NULL;
-     const gchar *orig_path;
      GKeyFile *session_desktop_file;
      Session *session;
      gchar *cookie;
  
      // FIXME: This is X specific, move into xsession.c
      if (is_greeter)
 -        sessions_dir = display->priv->xgreeters_dir;
 +        sessions_dir = config_get_string (config_get_instance (), "LightDM", "xgreeters-directory");
      else
 -        sessions_dir = display->priv->xsessions_dir;    
 -
 +        sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
      filename = g_strdup_printf ("%s.desktop", session_name);
      path = g_build_filename (sessions_dir, filename, NULL);
 +    g_free (sessions_dir);
      g_free (filename);
  
      session_desktop_file = g_key_file_new ();
      process_set_env (PROCESS (session), "DESKTOP_SESSION", session_name); // FIXME: Apparently deprecated?
      process_set_env (PROCESS (session), "GDMSESSION", session_name); // FIXME: Not cross-desktop
  
-     /* Insert our own utility directory to PATH
-      * This is to provide gdmflexiserver which provides backwards compatibility with GDM.
-      * This can be removed when this is no longer required.
-      */
-     orig_path = process_get_env (PROCESS (session), "PATH");
-     if (orig_path)
-     {
-         path = g_strdup_printf ("%s:%s", PKGLIBEXEC_DIR, orig_path);
-         process_set_env (PROCESS (session), "PATH", path);
-         g_free (path);
-     }
      process_set_log_file (PROCESS (session), log_filename);
  
      /* Open ConsoleKit session */
          process_set_env (PROCESS (session), "LIGHTDM_TEST_HOME_DIR", g_getenv ("LIGHTDM_TEST_HOME_DIR"));
          process_set_env (PROCESS (session), "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
      }
 - 
 +
      return session;
  }
  
@@@ -678,8 -678,7 +665,8 @@@ greeter_start_session_cb (Greeter *gree
  
      /* Stop the greeter, the session will start when the greeter has quit */
      g_debug ("Stopping greeter");
 -    session_stop (display->priv->session);  
 +    display->priv->start_session_on_greeter_quit = TRUE;
 +    session_stop (display->priv->session);
  
      return TRUE;
  }
@@@ -696,23 -695,19 +683,23 @@@ start_greeter_session (Display *display
  
      if (getuid () != 0)
          user = user_get_current ();
 -    else if (display->priv->greeter_user)
 +    else
      {
 -        user = user_get_by_name (display->priv->greeter_user);
 -        if (!user)
 +        gchar *greeter_user;
 +
 +        greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
 +        if (!greeter_user)
          {
 -            g_debug ("Unable to start greeter, user %s does not exist", display->priv->greeter_user);
 +            g_warning ("Greeter must not be run as root");
              return FALSE;
          }
 -    }
 -    else
 -    {
 -        g_warning ("Greeter must not be run as root");
 -        return FALSE;
 +
 +        user = user_get_by_name (greeter_user);
 +        if (!user)
 +            g_debug ("Unable to start greeter, user %s does not exist", greeter_user);
 +        g_free (greeter_user);
 +        if (!user)
 +            return FALSE;
      }
      display->priv->in_user_session = FALSE;
  
          if (display->priv->autologin_user)
              greeter_set_hint (display->priv->greeter, "autologin-user", display->priv->autologin_user);
          else if (display->priv->autologin_guest)
 -            greeter_set_hint (display->priv->greeter, "autologin-guest", "true");        
 +            greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
      }
      if (display->priv->select_user_hint)
          greeter_set_hint (display->priv->greeter, "select-user", display->priv->select_user_hint);
@@@ -789,7 -784,7 +776,7 @@@ start_user_session (Display *display, P
      gboolean result = FALSE;
  
      g_debug ("Starting user session");
 -  
 +
      user = pam_session_get_user (authentication);
  
      /* Load the users login settings (~/.dmrc) */
@@@ -930,7 -925,7 +917,7 @@@ display_unlock (Display *display
                                             NULL,
                                             "org.freedesktop.ConsoleKit",
                                             "/org/freedesktop/ConsoleKit/Manager",
 -                                           "org.freedesktop.ConsoleKit.Manager", 
 +                                           "org.freedesktop.ConsoleKit.Manager",
                                             NULL, &error);
      if (!proxy)
          g_warning ("Unable to get connection to ConsoleKit: %s", error->message);
                                             NULL,
                                             "org.freedesktop.ConsoleKit",
                                             session_path,
 -                                           "org.freedesktop.ConsoleKit.Session", 
 +                                           "org.freedesktop.ConsoleKit.Session",
                                             NULL, &error);
      if (!proxy)
          g_warning ("Unable to get connection to ConsoleKit session: %s", error->message);
@@@ -1034,9 -1029,12 +1021,9 @@@ display_finalize (GObject *object
  
      if (self->priv->display_server)
          g_object_unref (self->priv->display_server);
 -    g_free (self->priv->greeter_user);
      g_free (self->priv->greeter_session);
      if (self->priv->greeter)
          g_object_unref (self->priv->greeter);
 -    g_free (self->priv->xsessions_dir);
 -    g_free (self->priv->xgreeters_dir);
      g_free (self->priv->session_wrapper);
      g_free (self->priv->pam_service);
      g_free (self->priv->pam_autologin_service);
diff --combined src/session.c
index c8d7ca2dd8854c00c2e4fb70d675553cf6224bd2,7e3a9b487928970fa0c19e44360206aecac58e02..9e9bfad15cf4add1db780991bebd94b8508188fa
@@@ -19,6 -19,7 +19,6 @@@
  #include <grp.h>
  
  #include "session.h"
 -#include "configuration.h"
  
  struct SessionPrivate
  {
@@@ -161,6 -162,7 +161,7 @@@ session_real_start (Session *session
      gboolean result;
      User *user;
      gchar *absolute_command;
+     const gchar *orig_path;
      GError *error = NULL;
  
      g_return_val_if_fail (session->priv->authentication != NULL, FALSE);
      process_set_env (PROCESS (session), "SHELL", user_get_shell (user));
      set_env_from_authentication (session, session->priv->authentication);
  
+     /* Insert our own utility directory to PATH
+      * This is to provide gdmflexiserver which provides backwards compatibility with GDM.
+      * Must be done after set_env_from_authentication because that often sets PATH.
+      * This can be removed when this is no longer required.
+      */
+     orig_path = process_get_env (PROCESS (session), "PATH");
+     if (orig_path)
+     {
+         gchar *path = g_strdup_printf ("%s:%s", PKGLIBEXEC_DIR, orig_path);
+         process_set_env (PROCESS (session), "PATH", path);
+         g_free (path);
+     }
      if (session->priv->cookie)
          process_set_env (PROCESS (session), "XDG_SESSION_COOKIE", session->priv->cookie);