diff options
author | Lennart Poettering <lennart@poettering.net> | 2011-07-27 01:31:16 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-02-07 22:57:11 +0100 |
commit | 69a8b09c993669e324c785be463136313be2cdb4 (patch) | |
tree | be996b92485829933c25ffc1a87965361945d079 | |
parent | 54abef19f0b338d7c57c4629f6ca2cf441bcb553 (diff) | |
download | gdm-69a8b09c993669e324c785be463136313be2cdb4.tar.gz |
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.
-rw-r--r-- | daemon/Makefile.am | 1 | ||||
-rw-r--r-- | daemon/gdm-session-worker.c | 34 |
2 files changed, 35 insertions, 0 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am index b228feaf..8f8eedfe 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 1fe0aaf5..acf820cb 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, |