#include <sys/cdefs.h>
#ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/lib/libpam/modules/pam_securetty/pam_securetty.c,v 1.13 2004/02/10 10:13:21 des Exp $");
#else
__RCSID("$NetBSD: pam_securetty.c,v 1.7 2006/11/03 18:55:40 christos Exp $");
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
#include <ttyent.h>
#include <string.h>
#include <syslog.h>
#define PAM_SM_ACCOUNT
#include <security/pam_appl.h>
#include <security/pam_modules.h>
#include <security/pam_mod_misc.h>
#define TTY_PREFIX "/dev/"
PAM_EXTERN int
pam_sm_acct_mgmt(pam_handle_t *pamh __unused, int flags __unused,
int argc __unused, const char *argv[] __unused)
{
struct passwd *pwd, pwres;
struct ttyent *ty;
const char *user;
const void *tty;
const void *hostname;
int pam_err;
char pwbuf[1024];
struct syslog_data data = SYSLOG_DATA_INIT;
pam_err = pam_get_user(pamh, &user, NULL);
if (pam_err != PAM_SUCCESS)
return (pam_err);
if (user == NULL ||
getpwnam_r(user, &pwres, pwbuf, sizeof(pwbuf), &pwd) != 0 ||
pwd == NULL)
return (PAM_SERVICE_ERR);
PAM_LOG("Got user: %s", user);
if (pwd->pw_uid != 0)
return (PAM_SUCCESS);
pam_err = pam_get_item(pamh, PAM_TTY, &tty);
if (pam_err != PAM_SUCCESS)
return (pam_err);
PAM_LOG("Got TTY: %s", (const char *)tty);
if (tty != NULL && strncmp(TTY_PREFIX, tty, sizeof(TTY_PREFIX)) == 0) {
PAM_LOG("WARNING: PAM_TTY starts with " TTY_PREFIX);
tty = (const char *)tty + sizeof(TTY_PREFIX) - 1;
}
if (tty != NULL && (ty = getttynam(tty)) != NULL &&
(ty->ty_status & TTY_SECURE) != 0)
return (PAM_SUCCESS);
pam_err = pam_get_item(pamh, PAM_RHOST, &hostname);
if (pam_err != PAM_SUCCESS)
hostname = NULL;
openlog_r("pam_securetty", LOG_PID, LOG_AUTHPRIV, &data);
if (hostname)
syslog_r(LOG_NOTICE, &data,
"LOGIN %s REFUSED FROM %s ON TTY %s",
pwd->pw_name, (const char *)hostname,
(const char *)tty);
else
syslog_r(LOG_NOTICE, &data,
"LOGIN %s REFUSED ON TTY %s",
pwd->pw_name, (const char *)tty);
closelog_r(&data);
PAM_VERBOSE_ERROR("Not on secure TTY");
return (PAM_AUTH_ERR);
}
PAM_MODULE_ENTRY("pam_securetty");