[gdm] pam: pass XDG_SEAT env var into PAM to inform PAM modules about seat id
- From: Lennart Poettering <lpoetter src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm] pam: pass XDG_SEAT env var into PAM to inform PAM modules about seat id
- Date: Tue, 7 Feb 2012 22:33:34 +0000 (UTC)
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]