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);