From owner-svn-src-all@FreeBSD.ORG Mon Jan 18 11:29:52 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 23241106566C; Mon, 18 Jan 2010 11:29:52 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 129138FC16; Mon, 18 Jan 2010 11:29:52 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o0IBTpJO048146; Mon, 18 Jan 2010 11:29:51 GMT (envelope-from ed@svn.freebsd.org) Received: (from ed@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o0IBTpQl048143; Mon, 18 Jan 2010 11:29:51 GMT (envelope-from ed@svn.freebsd.org) Message-Id: <201001181129.o0IBTpQl048143@svn.freebsd.org> From: Ed Schouten Date: Mon, 18 Jan 2010 11:29:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r202566 - head/lib/libpam/modules/pam_lastlog X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 18 Jan 2010 11:29:52 -0000 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 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 #include +#include +#include #include -#include +#include #include #define PAM_SM_SESSION @@ -57,15 +60,18 @@ __FBSDID("$FreeBSD$"); #include #include +#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: