summaryrefslogtreecommitdiff
path: root/daemon/gdm-session-worker.c
diff options
context:
space:
mode:
authorTim Lunn <tim@feathertop.org>2016-04-11 23:18:10 +1000
committerTim Lunn <tim@feathertop.org>2016-04-13 13:38:19 +1000
commitc870d47dd828506857f0997a3af3468fc12fc85b (patch)
tree15bb154cca07dd18a211d7a1bb77fe187cd1f7ea /daemon/gdm-session-worker.c
parent33ebc63fd0b12886ffe994f37c7fa8eb1200f3e6 (diff)
downloadgdm-c870d47dd828506857f0997a3af3468fc12fc85b.tar.gz
gdm-session: set PAM_TTY when initialising pam
Temporarily set this to the VT that the login screen is currently active on so that pam modules that require this information early can have access to it. Debian/Ubuntu use this to detect if the login is coming from a local tty. PAM_TTY will get reset to the users VT right before the user session is opened. https://bugzilla.gnome.org/show_bug.cgi?id=764669
Diffstat (limited to 'daemon/gdm-session-worker.c')
-rw-r--r--daemon/gdm-session-worker.c40
1 files changed, 33 insertions, 7 deletions
diff --git a/daemon/gdm-session-worker.c b/daemon/gdm-session-worker.c
index f2581ae0..b97c688a 100644
--- a/daemon/gdm-session-worker.c
+++ b/daemon/gdm-session-worker.c
@@ -963,6 +963,32 @@ _get_xauth_for_pam (const char *x11_authority_file)
#endif
static gboolean
+ensure_login_vt (GdmSessionWorker *worker)
+{
+ int fd;
+ struct vt_stat vt_state = { 0 };
+ gboolean got_login_vt = FALSE;
+
+ fd = open ("/dev/tty0", O_RDWR | O_NOCTTY);
+
+ if (fd < 0) {
+ g_debug ("GdmSessionWorker: couldn't open VT master: %m");
+ return FALSE;
+ }
+
+ if (ioctl (fd, VT_GETSTATE, &vt_state) < 0) {
+ g_debug ("GdmSessionWorker: couldn't get current VT: %m");
+ goto out;
+ }
+
+ worker->priv->login_vt = vt_state.v_active;
+ got_login_vt = TRUE;
+out:
+ close (fd);
+ return got_login_vt;
+}
+
+static gboolean
gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
const char *service,
const char *username,
@@ -976,6 +1002,7 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
{
struct pam_conv pam_conversation;
int error_code;
+ char tty_string[256];
g_assert (worker->priv->pam_handle == NULL);
@@ -1048,6 +1075,12 @@ gdm_session_worker_initialize_pam (GdmSessionWorker *worker,
g_debug ("GdmSessionWorker: state SETUP_COMPLETE");
worker->priv->state = GDM_SESSION_WORKER_STATE_SETUP_COMPLETE;
+ /* Temporarily set PAM_TTY with the currently active VT (login screen)
+ PAM_TTY will be reset with the users VT right before the user session is opened */
+ ensure_login_vt (worker);
+ g_snprintf (tty_string, 256, "/dev/tty%d", worker->priv->login_vt);
+ pam_set_item (worker->priv->pam_handle, PAM_TTY, tty_string);
+
out:
if (error_code != PAM_SUCCESS) {
gdm_session_worker_uninitialize_pam (worker, error_code);
@@ -2020,7 +2053,6 @@ set_up_for_new_vt (GdmSessionWorker *worker)
{
int fd;
char vt_string[256], tty_string[256];
- struct vt_stat vt_state = { 0 };
int session_vt = 0;
fd = open ("/dev/tty0", O_RDWR | O_NOCTTY);
@@ -2030,11 +2062,6 @@ set_up_for_new_vt (GdmSessionWorker *worker)
return FALSE;
}
- if (ioctl (fd, VT_GETSTATE, &vt_state) < 0) {
- g_debug ("GdmSessionWorker: couldn't get current VT: %m");
- goto fail;
- }
-
if (worker->priv->display_is_initial) {
session_vt = atoi (GDM_INITIAL_VT);
} else {
@@ -2044,7 +2071,6 @@ set_up_for_new_vt (GdmSessionWorker *worker)
}
}
- worker->priv->login_vt = vt_state.v_active;
worker->priv->session_vt = session_vt;
close (fd);