summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daemon/gdm-session-worker.c126
1 files changed, 69 insertions, 57 deletions
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index fb01d906..1f05c829 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -1035,11 +1035,7 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
GError **error)
{
struct pam_conv pam_conversation;
-#ifdef PAM_XAUTHDATA
- struct pam_xauth_data *pam_xauth;
-#endif
int error_code;
- char *pam_tty;
g_assert (worker->priv->pam_handle == NULL);
@@ -1100,25 +1096,6 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
}
}
- /* set TTY */
- pam_tty = _get_tty_for_pam (x11_display_name, display_device);
- if (pam_tty != NULL && pam_tty[0] != '\0') {
- error_code = pam_set_item (worker->priv->pam_handle, PAM_TTY, pam_tty);
- }
-
- if (error_code != PAM_SUCCESS) {
- g_debug ("error informing authentication system of user's console %s: %s",
- pam_tty,
- pam_strerror (worker->priv->pam_handle, error_code));
- g_free (pam_tty);
- g_set_error (error,
- GDM_SESSION_WORKER_ERROR,
- GDM_SESSION_WORKER_ERROR_AUTHENTICATING,
- "%s", "");
- goto out;
- }
- g_free (pam_tty);
-
#ifdef WITH_SYSTEMD
/* set seat ID */
if (seat_id != NULL && seat_id[0] != '\0' && LOGIND_RUNNING()) {
@@ -1130,40 +1107,6 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
gdm_session_worker_set_environment_variable (worker, "XDG_SESSION_CLASS", "greeter");
}
-#ifdef PAM_XDISPLAY
- /* set XDISPLAY */
- error_code = pam_set_item (worker->priv->pam_handle, PAM_XDISPLAY, x11_display_name);
-
- if (error_code != PAM_SUCCESS) {
- g_debug ("error informing authentication system of display string %s: %s",
- x11_display_name,
- pam_strerror (worker->priv->pam_handle, error_code));
- g_set_error (error,
- GDM_SESSION_WORKER_ERROR,
- GDM_SESSION_WORKER_ERROR_AUTHENTICATING,
- "%s", "");
- goto out;
- }
-#endif
-#ifdef PAM_XAUTHDATA
- /* set XAUTHDATA */
- pam_xauth = _get_xauth_for_pam (x11_authority_file);
- error_code = pam_set_item (worker->priv->pam_handle, PAM_XAUTHDATA, pam_xauth);
- if (error_code != PAM_SUCCESS) {
- g_debug ("error informing authentication system of display string %s: %s",
- x11_display_name,
- pam_strerror (worker->priv->pam_handle, error_code));
- g_free (pam_xauth);
-
- g_set_error (error,
- GDM_SESSION_WORKER_ERROR,
- GDM_SESSION_WORKER_ERROR_AUTHENTICATING,
- "%s", "");
- goto out;
- }
- g_free (pam_xauth);
-#endif
-
g_debug ("GdmSessionWorker: state SETUP_COMPLETE");
worker->priv->state = GDM_SESSION_WORKER_STATE_SETUP_COMPLETE;
@@ -1970,6 +1913,73 @@ gdm_session_worker_start_session (GdmSessionWorker *worker,
}
static gboolean
+set_up_for_current_vt (GdmSessionWorker *worker,
+ GError **error)
+{
+#ifdef PAM_XAUTHDATA
+ struct pam_xauth_data *pam_xauth;
+#endif
+ int error_code;
+ char *pam_tty;
+
+ /* set TTY */
+ pam_tty = _get_tty_for_pam (worker->priv->x11_display_name, worker->priv->display_device);
+ if (pam_tty != NULL && pam_tty[0] != '\0') {
+ error_code = pam_set_item (worker->priv->pam_handle, PAM_TTY, pam_tty);
+ }
+
+ if (error_code != PAM_SUCCESS) {
+ g_debug ("error informing authentication system of user's console %s: %s",
+ pam_tty,
+ pam_strerror (worker->priv->pam_handle, error_code));
+ g_free (pam_tty);
+ g_set_error (error,
+ GDM_SESSION_WORKER_ERROR,
+ GDM_SESSION_WORKER_ERROR_AUTHENTICATING,
+ "%s", "");
+ goto out;
+ }
+ g_free (pam_tty);
+
+#ifdef PAM_XDISPLAY
+ /* set XDISPLAY */
+ error_code = pam_set_item (worker->priv->pam_handle, PAM_XDISPLAY, worker->priv->x11_display_name);
+
+ if (error_code != PAM_SUCCESS) {
+ g_debug ("error informing authentication system of display string %s: %s",
+ worker->priv->x11_display_name,
+ pam_strerror (worker->priv->pam_handle, error_code));
+ g_set_error (error,
+ GDM_SESSION_WORKER_ERROR,
+ GDM_SESSION_WORKER_ERROR_AUTHENTICATING,
+ "%s", "");
+ goto out;
+ }
+#endif
+#ifdef PAM_XAUTHDATA
+ /* set XAUTHDATA */
+ pam_xauth = _get_xauth_for_pam (worker->priv->x11_authority_file);
+ error_code = pam_set_item (worker->priv->pam_handle, PAM_XAUTHDATA, pam_xauth);
+ if (error_code != PAM_SUCCESS) {
+ g_debug ("error informing authentication system of display string %s: %s",
+ worker->priv->x11_display_name,
+ pam_strerror (worker->priv->pam_handle, error_code));
+ g_free (pam_xauth);
+
+ g_set_error (error,
+ GDM_SESSION_WORKER_ERROR,
+ GDM_SESSION_WORKER_ERROR_AUTHENTICATING,
+ "%s", "");
+ goto out;
+ }
+ g_free (pam_xauth);
+#endif
+ return TRUE;
+out:
+ return FALSE;
+}
+
+static gboolean
gdm_session_worker_open_session (GdmSessionWorker *worker,
GError **error)
{
@@ -1980,6 +1990,8 @@ gdm_session_worker_open_session (GdmSessionWorker *worker,
g_assert (worker->priv->state == GDM_SESSION_WORKER_STATE_ACCOUNT_DETAILS_SAVED);
g_assert (geteuid () == 0);
+ set_up_for_current_vt (worker, NULL);
+
flags = 0;
if (worker->priv->is_program_session) {