File lightdm-desktop-session-env-pam.patch of Package lightdm

# HG changeset patch
# Parent cd6e0c1fd5632551b248be13bfebae8cd621114b
pass a DESKTOP_SESSION environment variable with the name of the selected session into the PAM environment

diff --git a/src/display.c b/src/display.c
--- a/src/display.c
+++ b/src/display.c
@@ -490,6 +490,8 @@ create_session (Display *display, PAMSes
     session_set_authentication (session, authentication);
     session_set_command (session, command);
     g_free (command);
+    if (!is_greeter)
+        session_set_user_session_name (session, session_name);
 
     session_set_env (session, "DESKTOP_SESSION", session_name); // FIXME: Apparently deprecated?
     session_set_env (session, "GDMSESSION", session_name); // FIXME: Not cross-desktop
diff --git a/src/pam-session.c b/src/pam-session.c
--- a/src/pam-session.c
+++ b/src/pam-session.c
@@ -133,7 +133,7 @@ pam_session_set_item (PAMSession *sessio
 }
 
 gboolean
-pam_session_open (PAMSession *session)
+pam_session_open (PAMSession *session, const gchar *session_name)
 {
     int result = PAM_SUCCESS;
 
@@ -143,6 +143,14 @@ pam_session_open (PAMSession *session)
 
     if (!passwd_file && getuid () == 0)
     {
+        gchar *desktop_session;
+
+        if (session_name && (desktop_session = g_strdup_printf ("DESKTOP_SESSION=%s", session_name)))
+        {
+            pam_putenv (session->priv->pam_handle, desktop_session);
+            g_free (desktop_session);
+        }
+
         result = pam_open_session (session->priv->pam_handle, 0);
         g_debug ("pam_open_session(%p, 0) -> %d (%s)",
                  session->priv->pam_handle,
diff --git a/src/pam-session.h b/src/pam-session.h
--- a/src/pam-session.h
+++ b/src/pam-session.h
@@ -53,7 +53,7 @@ gboolean pam_session_get_is_authenticate
 
 gboolean pam_session_set_item (PAMSession *session, int item_type, const gchar *value);
 
-gboolean pam_session_open (PAMSession *session);
+gboolean pam_session_open (PAMSession *session, const gchar *session_name);
 
 gboolean pam_session_setup (PAMSession *session);
 
diff --git a/src/session.c b/src/session.c
--- a/src/session.c
+++ b/src/session.c
@@ -32,6 +32,9 @@ struct SessionPrivate
     /* Authentication for this session */
     PAMSession *authentication;
 
+    /* Name of the user session */
+    gchar *user_session_name;
+
     /* Command to run for this session */
     gchar *command;
 
@@ -98,6 +101,21 @@ session_get_is_greeter (Session *session
     return session->priv->is_greeter;
 }
 
+session_set_user_session_name (Session *session, const gchar *user_session_name)
+{
+    g_return_if_fail (session != NULL);
+
+    g_free (session->priv->user_session_name);
+    session->priv->user_session_name = g_strdup (user_session_name);
+}
+
+const gchar *
+session_get_user_session_name (Session *session)
+{
+    g_return_val_if_fail (session != NULL, NULL);
+    return session->priv->user_session_name;
+}
+
 void
 session_set_command (Session *session, const gchar *command)
 {
@@ -277,7 +295,7 @@ session_real_start (Session *session)
     process_set_command (PROCESS (session), absolute_command);
     g_free (absolute_command);
 
-    pam_session_open (session->priv->authentication);
+    pam_session_open (session->priv->authentication, session->priv->user_session_name);
 
     /* Open ConsoleKit session */
     if (getuid () == 0)
diff --git a/src/session.h b/src/session.h
--- a/src/session.h
+++ b/src/session.h
@@ -64,6 +64,10 @@ void session_set_env (Session *process, 
 
 const gchar *session_get_env (Session *session, const gchar *name);
 
+void session_set_user_session_name (Session *session, const gchar *user_session_name);
+
+const gchar *session_get_user_session_name (Session *session);
+
 void session_set_console_kit_parameter (Session *session, const gchar *name, GVariant *value);
 
 const gchar *session_get_console_kit_cookie (Session *session);
openSUSE Build Service is sponsored by