Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 Jan 2010 11:29:51 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r202566 - head/lib/libpam/modules/pam_lastlog
Message-ID:  <201001181129.o0IBTpQl048143@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Mon Jan 18 11:29:51 2010
New Revision: 202566
URL: http://svn.freebsd.org/changeset/base/202566

Log:
  Let pam_lastlog use random ut_id's.
  
  By using random values for ut_id, not based on the TTY name, it is
  possible to run for example login(1) multiple times on the same TTY,
  without overwriting any previous records.
  
  The output of w(1) will then be as follows:
  
  | 12:26PM  up 2 days,  2:31, 5 users, load averages: 0.01, 0.03, 0.03
  | USER       TTY      FROM                      LOGIN@  IDLE WHAT
  | ed         pts/2    mekker.80386.nl          12:26PM     - w
  | root       pts/2    -                        12:26PM     - w
  | root       pts/2    -                        12:26PM     - w
  | root       pts/2    -                        12:26PM     - w
  
  Approved by:	des

Modified:
  head/lib/libpam/modules/pam_lastlog/Makefile
  head/lib/libpam/modules/pam_lastlog/pam_lastlog.c

Modified: head/lib/libpam/modules/pam_lastlog/Makefile
==============================================================================
--- head/lib/libpam/modules/pam_lastlog/Makefile	Mon Jan 18 11:08:47 2010	(r202565)
+++ head/lib/libpam/modules/pam_lastlog/Makefile	Mon Jan 18 11:29:51 2010	(r202566)
@@ -28,7 +28,4 @@ LIB=	pam_lastlog
 SRCS=	pam_lastlog.c
 MAN=	pam_lastlog.8
 
-DPADD=	${LIBULOG}
-LDADD=	-lulog
-
 .include <bsd.lib.mk>

Modified: head/lib/libpam/modules/pam_lastlog/pam_lastlog.c
==============================================================================
--- head/lib/libpam/modules/pam_lastlog/pam_lastlog.c	Mon Jan 18 11:08:47 2010	(r202565)
+++ head/lib/libpam/modules/pam_lastlog/pam_lastlog.c	Mon Jan 18 11:29:51 2010	(r202566)
@@ -46,9 +46,12 @@ __FBSDID("$FreeBSD$");
 
 #define _BSD_SOURCE
 
+#include <sys/time.h>
 #include <pwd.h>
+#include <stdlib.h>
+#include <string.h>
 #include <time.h>
-#include <ulog.h>
+#include <unistd.h>
 #include <utmpx.h>
 
 #define PAM_SM_SESSION
@@ -57,15 +60,18 @@ __FBSDID("$FreeBSD$");
 #include <security/pam_modules.h>
 #include <security/pam_mod_misc.h>
 
+#define	PAM_UTMPX_ID	"utmpx_id"
+
 PAM_EXTERN int
 pam_sm_open_session(pam_handle_t *pamh, int flags,
     int argc __unused, const char *argv[] __unused)
 {
 	struct passwd *pwd;
-	struct utmpx *utx;
+	struct utmpx *utx, utl;
 	time_t t;
 	const char *user;
 	const void *rhost, *tty;
+	char *id;
 	int pam_err;
 
 	pam_err = pam_get_user(pamh, &user, NULL);
@@ -109,7 +115,29 @@ pam_sm_open_session(pam_handle_t *pamh, 
 		}
 	}
 
-	ulog_login(tty, user, rhost);
+	id = malloc(sizeof utl.ut_id);
+	if (id == NULL) {
+		pam_err = PAM_SERVICE_ERR;
+		goto err;
+	}
+	arc4random_buf(id, sizeof utl.ut_id);
+
+	pam_err = pam_set_data(pamh, PAM_UTMPX_ID, id, openpam_free_data);
+	if (pam_err != PAM_SUCCESS) {
+		free(id);
+		goto err;
+	}
+
+	memset(&utl, 0, sizeof utl);
+	utl.ut_type = USER_PROCESS;
+	memcpy(utl.ut_id, id, sizeof utl.ut_id);
+	strncpy(utl.ut_user, user, sizeof utl.ut_user);
+	strncpy(utl.ut_line, tty, sizeof utl.ut_line);
+	if (rhost != NULL)
+		strncpy(utl.ut_host, rhost, sizeof utl.ut_host);
+	utl.ut_pid = getpid();
+	gettimeofday(&utl.ut_tv, NULL);
+	pututxline(&utl);
 
 	return (PAM_SUCCESS);
 
@@ -123,18 +151,21 @@ PAM_EXTERN int
 pam_sm_close_session(pam_handle_t *pamh, int flags __unused,
     int argc __unused, const char *argv[] __unused)
 {
-	const void *tty;
+	struct utmpx utl;
+	const void *id;
 	int pam_err;
 
-	pam_err = pam_get_item(pamh, PAM_TTY, (const void **)&tty);
+	pam_err = pam_get_data(pamh, PAM_UTMPX_ID, (const void **)&id);
 	if (pam_err != PAM_SUCCESS)
 		goto err;
-	if (tty == NULL) {
-		PAM_LOG("No PAM_TTY");
-		pam_err = PAM_SERVICE_ERR;
-		goto err;
-	}
-	ulog_logout(tty);
+
+	memset(&utl, 0, sizeof utl);
+	utl.ut_type = DEAD_PROCESS;
+	memcpy(utl.ut_id, id, sizeof utl.ut_id);
+	utl.ut_pid = getpid();
+	gettimeofday(&utl.ut_tv, NULL);
+	pututxline(&utl);
+
 	return (PAM_SUCCESS);
 
  err:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201001181129.o0IBTpQl048143>