summaryrefslogtreecommitdiffstats
path: root/lib/libpam
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2010-01-18 11:29:51 +0000
committered <ed@FreeBSD.org>2010-01-18 11:29:51 +0000
commitc41b2252ccd4119c8949a3e822f337fd0bdd2946 (patch)
treed4d5973826ca4459a3742f4fa093282148478f45 /lib/libpam
parent0e8ff0b44b03d067ce8eeced828cd2a8fd69b33f (diff)
downloadFreeBSD-src-c41b2252ccd4119c8949a3e822f337fd0bdd2946.zip
FreeBSD-src-c41b2252ccd4119c8949a3e822f337fd0bdd2946.tar.gz
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
Diffstat (limited to 'lib/libpam')
-rw-r--r--lib/libpam/modules/pam_lastlog/Makefile3
-rw-r--r--lib/libpam/modules/pam_lastlog/pam_lastlog.c53
2 files changed, 42 insertions, 14 deletions
diff --git a/lib/libpam/modules/pam_lastlog/Makefile b/lib/libpam/modules/pam_lastlog/Makefile
index 616c113..9f0e07f 100644
--- a/lib/libpam/modules/pam_lastlog/Makefile
+++ b/lib/libpam/modules/pam_lastlog/Makefile
@@ -28,7 +28,4 @@ LIB= pam_lastlog
SRCS= pam_lastlog.c
MAN= pam_lastlog.8
-DPADD= ${LIBULOG}
-LDADD= -lulog
-
.include <bsd.lib.mk>
diff --git a/lib/libpam/modules/pam_lastlog/pam_lastlog.c b/lib/libpam/modules/pam_lastlog/pam_lastlog.c
index 3c81a59..14e47b80 100644
--- a/lib/libpam/modules/pam_lastlog/pam_lastlog.c
+++ b/lib/libpam/modules/pam_lastlog/pam_lastlog.c
@@ -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, int flags,
}
}
- 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:
OpenPOWER on IntegriCloud