[gdm] pam: pass XDG_SEAT env var into PAM to inform PAM modules about seat id



commit 69a8b09c993669e324c785be463136313be2cdb4
Author: Lennart Poettering <lennart poettering net>
Date:   Wed Jul 27 01:31:16 2011 +0200

    pam: pass XDG_SEAT env var into PAM to inform PAM modules about seat id
    
    This optionally replaces the current CK session registration logic with
    support for passing seat information to pam_systemd (and hence rely on
    pam_systemd's session registration).
    
    With this patch applied we can register sessions in systemd and in CK
    with the same binary.

 daemon/Makefile.am          |    1 +
 daemon/gdm-session-worker.c |   34 ++++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 0 deletions(-)
---
diff --git a/daemon/Makefile.am b/daemon/Makefile.am
index b228fea..8f8eedf 100644
--- a/daemon/Makefile.am
+++ b/daemon/Makefile.am
@@ -296,6 +296,7 @@ gdm_session_worker_LDFLAGS =			\
 gdm_session_worker_LDADD = 			\
 	$(top_builddir)/common/libgdmcommon.la	\
 	$(DAEMON_LIBS)				\
+	$(SYSTEMD_LIBS) 			\
 	$(NULL)
 
 sbin_PROGRAMS = 			\
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index 1fe0aaf..acf820c 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -46,7 +46,13 @@
 
 #include <X11/Xauth.h>
 
+#ifdef WITH_SYSTEMD
+#include <systemd/sd-daemon.h>
+#endif
+
+#ifdef WITH_CONSOLE_KIT
 #include "ck-connector.h"
+#endif
 
 #include "gdm-common.h"
 #include "gdm-log.h"
@@ -107,7 +113,9 @@ struct GdmSessionWorkerPrivate
 
         int               exit_code;
 
+#ifdef WITH_CONSOLE_KIT
         CkConnector      *ckc;
+#endif
         pam_handle_t     *pam_handle;
 
         GPid              child_pid;
@@ -151,8 +159,13 @@ static void     gdm_session_worker_class_init   (GdmSessionWorkerClass *klass);
 static void     gdm_session_worker_init         (GdmSessionWorker      *session_worker);
 static void     gdm_session_worker_finalize     (GObject               *object);
 
+static void     gdm_session_worker_set_environment_variable (GdmSessionWorker *worker,
+                                                             const char       *key,
+                                                             const char       *value);
+
 static void     queue_state_change              (GdmSessionWorker      *worker);
 
+
 typedef int (* GdmSessionWorkerPamNewMessagesFunc) (int,
                                                     const struct pam_message **,
                                                     struct pam_response **,
@@ -171,6 +184,7 @@ gdm_session_worker_error_quark (void)
         return error_quark;
 }
 
+#ifdef WITH_CONSOLE_KIT
 static gboolean
 open_ck_session (GdmSessionWorker  *worker)
 {
@@ -257,6 +271,7 @@ open_ck_session (GdmSessionWorker  *worker)
  out:
         return ret;
 }
+#endif
 
 /* adapted from glib script_execute */
 static void
@@ -1057,6 +1072,7 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
                                    const char       *x11_display_name,
                                    const char       *x11_authority_file,
                                    const char       *display_device,
+                                   const char       *seat_id,
                                    GError          **error)
 {
         struct pam_conv        pam_conversation;
@@ -1138,6 +1154,13 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
                 goto out;
         }
 
+#ifdef WITH_SYSTEMD
+        /* set seat ID */
+        if (seat_id != NULL && seat_id[0] != '\0' && sd_booted() > 0) {
+                gdm_session_worker_set_environment_variable (worker, "XDG_SEAT", seat_id);
+        }
+#endif
+
 #ifdef PAM_XDISPLAY
         /* set XDISPLAY */
         error_code = pam_set_item (worker->priv->pam_handle, PAM_XDISPLAY, x11_display_name);
@@ -1571,6 +1594,13 @@ register_ck_session (GdmSessionWorker *worker)
         const char *session_cookie;
         gboolean    res;
 
+#ifdef WITH_SYSTEMD
+        if (sd_booted() > 0) {
+                return;
+        }
+#endif
+
+#ifdef WITH_CONSOLE_KIT
         session_cookie = NULL;
         res = open_ck_session (worker);
         if (res) {
@@ -1581,6 +1611,7 @@ register_ck_session (GdmSessionWorker *worker)
                                                              "XDG_SESSION_COOKIE",
                                                              session_cookie);
         }
+#endif
 }
 
 static void
@@ -1611,11 +1642,13 @@ session_worker_child_watch (GPid              pid,
                                       num);
         }
 
+#ifdef WITH_CONSOLE_KIT
         if (worker->priv->ckc != NULL) {
                 ck_connector_close_session (worker->priv->ckc, NULL);
                 ck_connector_unref (worker->priv->ckc);
                 worker->priv->ckc = NULL;
         }
+#endif
 
         gdm_session_worker_uninitialize_pam (worker, PAM_SUCCESS);
 
@@ -2140,6 +2173,7 @@ do_setup (GdmSessionWorker *worker)
                                                  worker->priv->x11_display_name,
                                                  worker->priv->x11_authority_file,
                                                  worker->priv->display_device,
+                                                 worker->priv->display_seat_id,
                                                  &error);
         if (! res) {
                 if (g_error_matches (error,



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