[PATCH 04/49] login: remove non-PAM code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If you need non-PAM login(1) then use shadow-utils or busybox.

Signed-off-by: Karel Zak <kzak@xxxxxxxxxx>
---
 login-utils/.gitignore  |    1 -
 login-utils/Makefile.am |   11 +-
 login-utils/checktty.c  |  585 -----------------------------------------------
 login-utils/login.c     |  240 +-------------------
 4 files changed, 6 insertions(+), 831 deletions(-)
 delete mode 100644 login-utils/checktty.c

diff --git a/login-utils/.gitignore b/login-utils/.gitignore
index 4d01927..31af9d4 100644
--- a/login-utils/.gitignore
+++ b/login-utils/.gitignore
@@ -1,4 +1,3 @@
-checktty_test
 islocal_test
 chfn
 chsh
diff --git a/login-utils/Makefile.am b/login-utils/Makefile.am
index f009f2d..7866f7b 100644
--- a/login-utils/Makefile.am
+++ b/login-utils/Makefile.am
@@ -42,14 +42,7 @@ chfn_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
 chsh_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
 newgrp_LDFLAGS = $(SUID_LDFLAGS) $(AM_LDFLAGS)
 
-if HAVE_PAM
 login_ldadd_common += -lpam -lpam_misc
-else
-if NEED_LIBCRYPT
-login_ldadd_common += -lcrypt
-endif
-login_SOURCES += checktty.c
-endif #! HAVE_PAM
 
 if NEED_LIBCRYPT
 newgrp_LDADD += -lcrypt
@@ -72,9 +65,7 @@ install-exec-hook::
 
 endif
 
-noinst_PROGRAMS = checktty_test islocal_test
-checktty_test_SOURCES = checktty.c login.h
-checktty_test_CPPFLAGS = -DMAIN_TEST_CHECKTTY $(AM_CPPFLAGS)
+noinst_PROGRAMS = islocal_test
 islocal_test_SOURCES = islocal.c
 islocal_test_CPPFLAGS = -DMAIN_TEST_ISLOCAL $(AM_CPPFLAGS)
 
diff --git a/login-utils/checktty.c b/login-utils/checktty.c
deleted file mode 100644
index 14f3ee1..0000000
--- a/login-utils/checktty.c
+++ /dev/null
@@ -1,585 +0,0 @@
-/* checktty.c - linked into login, checks user against /etc/usertty
-   Created 25-Aug-95 by Peter Orbaek <poe@xxxxxxxxxxxx>
-   Fixed by JDS June 1996 to clear lists and close files
-
-   1999-02-22 Arkadiusz Mi�kiewicz <misiek@xxxxxxxxxx>
-   - added Native Language Support
-
-*/
-
-#include <sys/param.h>
-
-#include <pwd.h>
-#include <grp.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <time.h>
-#include <sys/stat.h>
-#include <netdb.h>
-#include <syslog.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <ctype.h>
-#include <limits.h>
-#include <netinet/in.h>
-#include "nls.h"
-
-#include <sys/sysmacros.h>
-#ifdef HAVE_LINUX_MAJOR_H
-#include <linux/major.h>
-#endif
-
-#include "pathnames.h"
-#include "login.h"
-#include "strutils.h"
-
-#ifndef TTY_MAJOR
-#define TTY_MAJOR 4
-#endif
-
-static gid_t mygroups[NGROUPS_MAX];
-static int   num_groups;
-
-#define NAMELEN 128
-
-/* linked list of names */
-struct grplist {
-    struct grplist *next;
-    char name[NAMELEN];
-};
-        
-enum State { StateUsers, StateGroups, StateClasses };
-
-#define CLASSNAMELEN 32
-
-struct ttyclass {
-    struct grplist *first;
-    struct ttyclass *next;
-    char classname[CLASSNAMELEN];
-};
-
-struct ttyclass *ttyclasses = NULL;
-
-static int
-am_in_group(char *group)
-{
-	struct group *g;
-	gid_t *ge;
-	
-	g = getgrnam(group);
-	if (g) {
-		for (ge = mygroups; ge < mygroups + num_groups; ge++) {
-			if (g->gr_gid== *ge) return 1;
-		}
-	}
-    	return 0;
-}
-
-static void
-find_groups()
-{
-	num_groups = getgroups(NGROUPS_MAX, mygroups);
-}
-
-static struct ttyclass *
-new_class(char *class)
-{
-    struct ttyclass *tc;
-
-    tc = (struct ttyclass *)malloc(sizeof(struct ttyclass));
-    if (tc == NULL) {
-	printf(_("login: memory low, login may fail\n"));
-	syslog(LOG_WARNING, _("can't malloc for ttyclass"));
-	return NULL;
-    }
-
-    tc->next = ttyclasses;
-    tc->first = NULL;
-    xstrncpy(tc->classname, class, CLASSNAMELEN);
-    ttyclasses = tc;
-    return tc;
-}
-
-static void
-add_to_class(struct ttyclass *tc, char *tty)
-{
-    struct grplist *ge;
-
-    if (tc == NULL) return;
-
-    ge = (struct grplist *)malloc(sizeof(struct grplist));
-    if (ge == NULL) {
-	printf(_("login: memory low, login may fail\n"));
-	syslog(LOG_WARNING, _("can't malloc for grplist"));
-	return;
-    }
-
-    ge->next = tc->first;
-    xstrncpy(ge->name, tty, NAMELEN);
-    tc->first = ge;
-}
-
-
-/* return true if tty is a pty. Very linux dependent */
-static int
-isapty(const char *tty)
-{
-#ifdef __linux__
-    char devname[100];
-    struct stat stb;
-
-    /* avoid snprintf - old systems do not have it */
-    if (strlen(tty) + 6 > sizeof(devname))
-	    return 0;
-    sprintf(devname, "/dev/%s", tty);
-
-    if((stat(devname, &stb) >= 0) && S_ISCHR(stb.st_mode)) {
-	    int majordev = major(stb.st_rdev);
-
-	    /* this is for linux versions before 1.3: use major 4 */
-	    if(majordev == TTY_MAJOR && minor(stb.st_rdev) >= 192)
-		    return 1;
-
-#if defined(PTY_SLAVE_MAJOR)
-	    /* this is for linux 1.3 and newer: use major 3 */
-	    if(majordev == PTY_SLAVE_MAJOR)
-		    return 1;
-#endif
-
-#if defined(UNIX98_PTY_SLAVE_MAJOR) && defined(UNIX98_PTY_MAJOR_COUNT)
-	    /* this is for linux 2.1.116 and newer: use majors 136-143 */
-	    if(majordev >= UNIX98_PTY_SLAVE_MAJOR &&
-	       majordev < UNIX98_PTY_SLAVE_MAJOR + UNIX98_PTY_MAJOR_COUNT)
-		    return 1;
-#endif
-
-    }
-#endif	/* __linux__ */
-    return 0;
-}
-
-
-/* IPv4 -- pattern is x.x.x.x/y.y.y.y (net/mask)*/
-static int
-hnmatch_ip4(const char *pat)
-{
-	int x1, x2, x3, x4, y1, y2, y3, y4;
-	unsigned long p, mask, a;
-	unsigned char *ha;
-
-	/* pattern is an IP QUAD address and a mask x.x.x.x/y.y.y.y */
-	if (sscanf(pat, "%d.%d.%d.%d/%d.%d.%d.%d",
-			&x1, &x2, &x3, &x4, &y1, &y2, &y3, &y4) < 8)
-		return 0;
-
-	p = (((unsigned long)x1<<24)+((unsigned long)x2<<16)
-	     +((unsigned long)x3<<8)+((unsigned long)x4));
-	mask = (((unsigned long)y1<<24)+((unsigned long)y2<<16)
-		+((unsigned long)y3<<8)+((unsigned long)y4));
-
-	if (hostaddress[0] == 0)
-		return 0;
-
-	ha = (unsigned char *)hostaddress;
-	a = (((unsigned long)ha[0]<<24)+((unsigned long)ha[1]<<16)
-	     +((unsigned long)ha[2]<<8)+((unsigned long)ha[3]));
-	return ((p & mask) == (a & mask));
-}
-
-/* IPv6 -- pattern is [hex:hex:....]/number ([net]/mask) */
-static int
-hnmatch_ip6(const char *pat)
-{
-	char *patnet;
-	char *patmask;
-	struct in6_addr addr;
-	struct addrinfo hints, *res;
-	struct sockaddr_in6 net;
-	int mask_len, i = 0;
-	char *p;
-
-	if (pat == NULL || *pat != '[')
-		return 0;
-
-	memcpy(&addr, hostaddress, sizeof(addr));
-
-	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = AF_INET6;
-	hints.ai_socktype = SOCK_STREAM;
-	hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST;
-
-	patnet = strdup(pat);
-
-	/* match IPv6 address against [netnumber]/prefixlen */
-	if (!(p = strchr(patnet, ']')))
-		goto mismatch;
-
-	*p++ = '\0';
-
-	if (! (*p == '/' && isdigit((unsigned char) *(p + 1))))
-		goto mismatch;
-
-	patmask = p + 1;
-
-	/* prepare net address */
-	if (getaddrinfo(patnet + 1, NULL, &hints, &res) != 0)
-		goto mismatch;
-
-	memcpy(&net, res->ai_addr, sizeof(net));
-	freeaddrinfo(res);
-
-	/* convert mask to number */
-	if ((mask_len = atoi(patmask)) < 0 || mask_len > 128)
-		goto mismatch;
-
-	/* compare */
-	while (mask_len > 0) {
-		if (mask_len < 32) {
-			uint32_t mask = htonl(~(0xffffffff >> mask_len));
-
-			if ((*(uint32_t *)&addr.s6_addr[i] & mask) !=
-			    (*(uint32_t *)&net.sin6_addr.s6_addr[i] & mask))
-				goto mismatch;
-			break;
-		}
-		if (*(uint32_t *)&addr.s6_addr[i] !=
-		    *(uint32_t *)&net.sin6_addr.s6_addr[i])
-			goto mismatch;
-		i += 4;
-		mask_len -= 32;
-	}
-
-	free(patnet);
-	return 1;
-
-mismatch:
-	free(patnet);
-	return 0;
-}
-
-/* match the hostname hn against the pattern pat */
-static int
-hnmatch(const char *hn, const char *pat)
-{
-
-	if ((hn == NULL) && (strcmp(pat, "localhost") == 0))
-		return 1;
-	if ((hn == NULL) || *hn == '\0')
-		return 0;
-
-	if (*pat >= '0' && *pat <= '9')
-		return hostfamily == AF_INET ? hnmatch_ip4(pat) : 0;
-	else if (*pat == '[')
-		return hostfamily == AF_INET6 ? hnmatch_ip6(pat) : 0;
-	else {
-		/* pattern is a suffix of a FQDN */
-		int 	n = strlen(pat),
-			m = strlen(hn);
-
-		if (n > m)
-			return 0;
-		return (strcasecmp(pat, hn + m - n) == 0);
-	}
-}
-
-#ifdef MAIN_TEST_CHECKTTY
-
-char	hostaddress[16];
-sa_family_t hostfamily;
-char	*hostname;
-
-void sleepexit(int eval __attribute__ ((__unused__)))
-{
-	/* dummy for this test */
-}
-
-void badlogin(const char *s __attribute__ ((__unused__)))
-{
-	/* dummy for this test */
-}
-
-int
-main(int argc __attribute__ ((__unused__)),
-     char **argv __attribute__ ((__unused__)))
-{
-	struct addrinfo hints, *info = NULL;
-	struct addrexp {
-		const char *range;
-		const char *ip;
-	} alist[] = {
-		{ "130.225.16.0/255.255.254.0",	"130.225.16.1" },
-		{ "130.225.16.0/255.255.254.0",	"10.20.30.1" },
-		{ "130.225.0.0/255.254.0.0",	"130.225.16.1" },
-		{ "130.225.0.0/255.254.0.0",	"130.225.17.1" },
-		{ "130.225.0.0/255.254.0.0",	"150.160.170.180" },
-		{ "[3ffe:505:2:1::]/64",	"3ffe:505:2:1::" },
-		{ "[3ffe:505:2:1::]/64",	"3ffe:505:2:2::" },
-		{ "[3ffe:505:2:1::]/64",	"3ffe:505:2:1:ffff:ffff::" },
-		{ NULL, NULL }
-	}, *item;
-
-	memset(&hints, 0, sizeof(hints));
-	hints.ai_family = AF_UNSPEC;
-	hints.ai_flags = AI_NUMERICHOST |  AI_PASSIVE | AI_ADDRCONFIG;
-	hints.ai_socktype = SOCK_STREAM;
-
-	for (item = alist; item->range; item++) {
-
-		printf("hnmatch() on %-30s <-- %-15s: ", item->range, item->ip);
-
-		if (getaddrinfo(item->ip, NULL, &hints, &info)==0 && info) {
-			if (info->ai_family == AF_INET)	{
-			    struct sockaddr_in *sa =
-					(struct sockaddr_in *) info->ai_addr;
-			    memcpy(hostaddress, &(sa->sin_addr),
-					sizeof(sa->sin_addr));
-			}
-			else if (info->ai_family == AF_INET6) {
-			    struct sockaddr_in6 *sa =
-					(struct sockaddr_in6 *) info->ai_addr;
-			    memcpy(hostaddress, &(sa->sin6_addr),
-					sizeof(sa->sin6_addr));
-			}
-			hostfamily = info->ai_family;
-			freeaddrinfo(info);
-			printf("%s\n", hnmatch("dummy", item->range) ?
-						"match" : "mismatch");
-		}
-		else
-			printf("getaddrinfo() failed\n");
-
-	}
-	return EXIT_SUCCESS;
-}
-#endif /* MAIN_TEST_CHECKTTY */
-
-static char *wdays[] = { "sun", "mon", "tue", "wed", "thu", "fri", "sat" };
-
-/* example timespecs:
-
-   mon:tue:wed:8-17
-
-   meaning monday, tuesday or wednesday between 8:00 and 17:59
-
-   4:5:13:fri
-
-   meaning fridays from 4:00 to 5:59 and from 13:00 to 13:59
-*/
-static int
-timeok(struct tm *t, char *spec)
-{
-    char *p, *q;
-    int dayok = 0;
-    int hourok = 0;
-    int h, h2;
-    char *sp;
-
-    sp = spec;
-    while ((p = strsep(&sp, ":"))) {
-	if (*p >= '0' && *p <= '9') {
-	    h = atoi(p);
-	    if (h == t->tm_hour) hourok = 1;
-	    if ((q = strchr(p, '-')) && (q[1] >= '0' && q[1] <= '9')) {
-		h2 = atoi(q+1);
-		if (h <= t->tm_hour && t->tm_hour <= h2) hourok = 1;
-	    }
-	} else if (strcasecmp(wdays[t->tm_wday], p) == 0) {
-	    dayok = 1;
-	}
-    }
-
-    return (dayok && hourok);
-}
-
-/* return true if tty equals class or is in the class defined by class.
-   Also return true if hostname matches the hostname pattern, class
-   or a pattern in the class named by class. */
-static int
-in_class(const char *tty, char *class)
-{
-    struct ttyclass *tc;
-    struct grplist *ge;
-    time_t t;
-    char *p;
-    char timespec[256];
-    struct tm *tm;
-    char *n;
-
-    time(&t);
-    tm = localtime(&t);
-
-    if (class[0] == '[') {
-	if ((p = strchr(class, ']'))) {
-	    *p = 0;
-	    xstrncpy(timespec, class+1, sizeof(timespec));
-	    *p = ']';
-	    if(!timeok(tm, timespec)) return 0;
-	    class = p+1;
-	}
-	/* really ought to warn about syntax error */
-    }
-
-    if (strcmp(tty, class) == 0) return 1;
-
-    if ((class[0] == '@') && isapty(tty)
-	&& hnmatch(hostname, class+1)) return 1;
-
-    for (tc = ttyclasses; tc; tc = tc->next) {
-	if (strcmp(tc->classname, class) == 0) {
-	    for (ge = tc->first; ge; ge = ge->next) {
-
-		n = ge->name;
-		if (n[0] == '[') {
-		    if ((p = strchr(n, ']'))) {
-			*p = 0;
-			xstrncpy(timespec, n+1, sizeof(timespec));
-			*p = ']';
-			if(!timeok(tm, timespec)) continue;
-			n = p+1;
-		    }
-		    /* really ought to warn about syntax error */
-		}
-
-		if (strcmp(n, tty) == 0) return 1;
-
-		if ((n[0] == '@') && isapty(tty)
-		    && hnmatch(hostname, n+1)) return 1;
-	    }
-	    return 0;
-	}
-    }
-    return 0;
-}
-
-/* start JDS - SBA */
-static void 
-free_group(struct grplist *ge)
-{
-    if (ge) {
-	memset(ge->name, 0, NAMELEN);
-	free_group(ge->next);
-	free(ge->next);
-	ge->next = NULL;
-    }
-}
-
-static void 
-free_class(struct ttyclass *tc)
-{
-    if (tc) {
-	memset(tc->classname, 0, CLASSNAMELEN);
-	free_group(tc->first);
-	tc->first = NULL;
-	free_class(tc->next);
-	free(tc->next);
-	tc->next = NULL;
-    }
-}
-
-static void 
-free_all(void)
-{
-    free_class(ttyclasses);
-    ttyclasses = NULL;
-}
-/* end JDS - SBA */
-
-void
-checktty(const char *user, const char *tty, struct passwd *pwd)
-{
-    FILE *f;
-    char buf[256], defaultbuf[256];
-    char *ptr;
-    enum State state = StateUsers;
-    int found_match = 0;
-
-    /* no /etc/usertty, default to allow access */
-    if (!(f = fopen(_PATH_USERTTY, "r"))) return;
-
-    if (pwd == NULL) {
-	fclose(f);
-	return;  /* misspelled username handled elsewhere */
-    }
-
-    find_groups();
-
-    defaultbuf[0] = 0;
-    while(fgets(buf, 255, f)) {
-
-	/* strip comments */
-	for(ptr = buf; ptr < buf + 256; ptr++) 
-	  if(*ptr == '#') *ptr = 0;
-
-	if (buf[0] == '*') {
-	    xstrncpy(defaultbuf, buf, 256);
-	    continue;
-	}
-
-	if (strncmp("GROUPS", buf, 6) == 0) {
-	    state = StateGroups;
-	    continue;
-	} else if (strncmp("USERS", buf, 5) == 0) {
-	    state = StateUsers;
-	    continue;
-	} else if (strncmp("CLASSES", buf, 7) == 0) {
-	    state = StateClasses;
-	    continue;
-	}
-
-	strtok(buf, " \t");
-	if((state == StateUsers && (strncmp(user, buf, 8) == 0))
-	   || (state == StateGroups && am_in_group(buf))) {
-	    found_match = 1;  /* we found a line matching the user */
-	    while((ptr = strtok(NULL, "\t\n "))) {
-		if (in_class(tty, ptr)) {
-		    fclose(f);
-		    free_all(); /* JDS */
-		    return;
-		}
-	    }
-	} else if (state == StateClasses) {
-	    /* define a new tty/host class */
-	    struct ttyclass *tc = new_class(buf);
-
-	    while ((ptr = strtok(NULL, "\t\n "))) {
-		add_to_class(tc, ptr);
-	    }
-	}
-    }
-    fclose(f);
-
-    /* user is not explicitly mentioned in /etc/usertty, if there was
-       a default rule, use that */
-    if (defaultbuf[0]) {
-	strtok(defaultbuf, " \t");
-	while((ptr = strtok(NULL, "\t\n "))) {
-	    if (in_class(tty, ptr)) {
-		free_all(); /* JDS */
-		return;
-	    }
-	}
-
-	/* there was a default rule, but user didn't match, reject! */
-	printf(_("Login on %s from %s denied by default.\n"), tty, hostname);
-	badlogin(user);
-	sleepexit(EXIT_FAILURE);
-    }
-
-    if (found_match) {
-	/* if we get here, /etc/usertty exists, there's a line
-	   matching our username, but it doesn't contain the
-	   name of the tty where the user is trying to log in.
-	   So deny access! */
-
-	printf(_("Login on %s from %s denied.\n"), tty, hostname);
-	badlogin(user);
-	sleepexit(EXIT_FAILURE);
-    }
-
-    /* users not matched in /etc/usertty are by default allowed access
-       on all tty's */
-    free_all(); /* JDS */
-}
diff --git a/login-utils/login.c b/login-utils/login.c
index bcac52d..a7d6b02 100644
--- a/login-utils/login.c
+++ b/login-utils/login.c
@@ -64,21 +64,19 @@
 #include "xalloc.h"
 #include "c.h"
 
-#ifdef HAVE_SECURITY_PAM_MISC_H
-#  include <security/pam_appl.h>
-#  include <security/pam_misc.h>
-#  define PAM_MAX_LOGIN_TRIES	3
-#  define PAM_FAIL_CHECK if (retcode != PAM_SUCCESS) { \
+#include <security/pam_appl.h>
+#include <security/pam_misc.h>
+#define PAM_MAX_LOGIN_TRIES	3
+#define PAM_FAIL_CHECK if (retcode != PAM_SUCCESS) { \
        fprintf(stderr,"\n%s\n",pam_strerror(pamh, retcode)); \
        syslog(LOG_ERR,"%s",pam_strerror(pamh, retcode)); \
        pam_end(pamh, retcode); exit(EXIT_FAILURE); \
    }
-#  define PAM_END { \
+#define PAM_END { \
 	pam_setcred(pamh, PAM_DELETE_CRED); \
 	retcode = pam_close_session(pamh,0); \
 	pam_end(pamh,retcode); \
 }
-#endif
 
 #include <lastlog.h>
 
@@ -116,9 +114,7 @@ int     timeout = 60;
 
 struct passwd *pwd;
 
-#ifdef HAVE_SECURITY_PAM_MISC_H
 static struct passwd pwdcopy;
-#endif
 char    hostaddress[16];	/* used in checktty.c */
 sa_family_t hostfamily;		/* used in checktty.c */
 char	*hostname;		/* idem */
@@ -200,7 +196,6 @@ consoletty(int fd) {
 }
 #endif
 
-#ifdef HAVE_SECURITY_PAM_MISC_H
 /*
  * Log failed login attempts in _PATH_BTMP if that exists.
  * Must be called only with username the name of an actual user.
@@ -266,8 +261,6 @@ sig_handler(int signal)
 		kill(-child_pid, SIGHUP); /* because the shell often ignores SIGTERM */
 }
 
-#endif	/* HAVE_SECURITY_PAM_MISC_H */
-
 #ifdef HAVE_LIBAUDIT
 static void
 logaudit(const char *tty, const char *username, const char *hostname,
@@ -291,7 +284,6 @@ logaudit(const char *tty, const char *username, const char *hostname,
 # define logaudit(tty, username, hostname, pwd, status)
 #endif /* HAVE_LIBAUDIT */
 
-#ifdef HAVE_SECURITY_PAM_MISC_H
 /* encapsulate stupid "void **" pam_get_item() API */
 int
 get_pam_username(pam_handle_t *pamh, char **name)
@@ -302,7 +294,6 @@ get_pam_username(pam_handle_t *pamh, char **name)
 	*name = (char *) item;
 	return rc;
 }
-#endif
 
 /*
  * We need to check effective UID/GID. For example $HOME could be on root
@@ -335,15 +326,10 @@ main(int argc, char **argv)
     char *childArgv[10];
     char *buff;
     int childArgc = 0;
-#ifdef HAVE_SECURITY_PAM_MISC_H
     int retcode;
     pam_handle_t *pamh = NULL;
     struct pam_conv conv = { misc_conv, NULL };
     struct sigaction sa, oldsa_hup, oldsa_term;
-#else
-    int ask;
-    char *salt, *pp;
-#endif
 #ifdef LOGIN_CHOWN_VCS
     char vcsn[20], vcsan[20];
 #endif
@@ -435,10 +421,6 @@ main(int argc, char **argv)
     argc -= optind;
     argv += optind;
 
-#ifndef HAVE_SECURITY_PAM_MISC_H
-    ask = *argv ? 0 : 1;		/* Do we need ask for login name? */
-#endif
-
     if (*argv) {
 	char *p = *argv;
 	username = strdup(p);
@@ -509,7 +491,6 @@ main(int argc, char **argv)
 
     openlog("login", LOG_ODELAY, LOG_AUTHPRIV);
 
-#ifdef HAVE_SECURITY_PAM_MISC_H
     /*
      * username is initialized to NULL
      * and if specified on the command line it is set.
@@ -676,118 +657,6 @@ main(int argc, char **argv)
 	    pam_close_session(pamh, 0);
     PAM_FAIL_CHECK;
 
-#else /* ! HAVE_SECURITY_PAM_MISC_H */
-
-    for (cnt = 0;; ask = 1) {
-
-	if (ask) {
-	    fflag = 0;
-	    getloginname();
-	}
-
-	/* Dirty patch to fix a gigantic security hole when using
-	   yellow pages. This problem should be solved by the
-	   libraries, and not by programs, but this must be fixed
-	   urgently! If the first char of the username is '+', we
-	   avoid login success.
-	   Feb 95 <alvaro@xxxxxxxxxxxx> */
-
-	if (username[0] == '+') {
-	    puts(_("Illegal username"));
-	    badlogin(username);
-	    sleepexit(EXIT_FAILURE);
-	}
-
-	/* (void)strcpy(tbuf, username); why was this here? */
-	if ((pwd = getpwnam(username))) {
-#  ifdef SHADOW_PWD
-	    struct spwd *sp;
-
-	    if ((sp = getspnam(username)))
-	      pwd->pw_passwd = sp->sp_pwdp;
-#  endif
-	    salt = pwd->pw_passwd;
-	} else
-	  salt = "xx";
-
-	if (pwd) {
-	    initgroups(username, pwd->pw_gid);
-	    checktty(username, tty_name, pwd); /* in checktty.c */
-	}
-
-	/* if user not super-user, check for disabled logins */
-	if (pwd == NULL || pwd->pw_uid)
-	  checknologin();
-
-	/*
-	 * Disallow automatic login to root; if not invoked by
-	 * root, disallow if the uid's differ.
-	 */
-	if (fflag && pwd) {
-	    int uid = getuid();
-
-	    passwd_req = pwd->pw_uid == 0 ||
-	      (uid && uid != pwd->pw_uid);
-	}
-
-	/*
-	 * If trying to log in as root, but with insecure terminal,
-	 * refuse the login attempt.
-	 */
-	if (pwd && pwd->pw_uid == 0 && !rootterm(tty_name)) {
-	    warnx(_("%s login refused on this terminal."),
-		    pwd->pw_name);
-
-	    if (hostname)
-	      syslog(LOG_NOTICE,
-		     _("LOGIN %s REFUSED FROM %s ON TTY %s"),
-		     pwd->pw_name, hostname, tty_name);
-	    else
-	      syslog(LOG_NOTICE,
-		     _("LOGIN %s REFUSED ON TTY %s"),
-		     pwd->pw_name, tty_name);
-	    logaudit(tty_name, pwd->pw_name, hostname, pwd, 0);
-	    continue;
-	}
-
-	/*
-	 * If no pre-authentication and a password exists
-	 * for this user, prompt for one and verify it.
-	 */
-	if (!passwd_req || (pwd && !*pwd->pw_passwd))
-	  break;
-
-	setpriority(PRIO_PROCESS, 0, -4);
-	pp = getpass(_("Password: "));
-
-#  ifdef CRYPTOCARD
-	if (strncmp(pp, "CRYPTO", 6) == 0) {
-	    if (pwd && cryptocard()) break;
-	}
-#  endif /* CRYPTOCARD */
-
-	p = crypt(pp, salt);
-	setpriority(PRIO_PROCESS, 0, 0);
-
-	memset(pp, 0, strlen(pp));
-
-	if (pwd && !strcmp(p, pwd->pw_passwd))
-	  break;
-
-	printf(_("Login incorrect\n"));
-	badlogin(username); /* log ALL bad logins */
-	failures++;
-
-	/* we allow 10 tries, but after 3 we start backing off */
-	if (++cnt > 3) {
-	    if (cnt >= 10) {
-		sleepexit(EXIT_FAILURE);
-	    }
-	    sleep((unsigned int)((cnt - 3) * 5));
-	}
-    }
-#endif /* !HAVE_SECURITY_PAM_MISC_H */
-
     /* committed to login -- turn off timeout */
     alarm((unsigned int)0);
 
@@ -979,7 +848,6 @@ Michael Riepe <michael@xxxxxxxxxxxxxxxxxxxx>
        */
     setenv("LOGNAME", pwd->pw_name, 1);
 
-#ifdef HAVE_SECURITY_PAM_MISC_H
     {
 	int i;
 	char ** env = pam_getenvlist(pamh);
@@ -991,7 +859,6 @@ Michael Riepe <michael@xxxxxxxxxxxxxxxxxxxx>
 	    }
 	}
     }
-#endif
 
     setproctitle("login", username);
 
@@ -1045,8 +912,6 @@ Michael Riepe <michael@xxxxxxxxxxxxxxxxxxxx>
     signal(SIGQUIT, SIG_DFL);
     signal(SIGTSTP, SIG_IGN);
 
-#ifdef HAVE_SECURITY_PAM_MISC_H
-
     memset(&sa, 0, sizeof(sa));
     sa.sa_handler = SIG_IGN;
     sigaction(SIGINT, &sa, NULL);
@@ -1126,7 +991,6 @@ Michael Riepe <michael@xxxxxxxxxxxxxxxxxxxx>
      */
     if (ioctl(0, TIOCSCTTY, 1))
 	    syslog(LOG_ERR, _("TIOCSCTTY failed: %m"));
-#endif
     signal(SIGINT, SIG_DFL);
 
     /* discard permissions last so can't get killed and drop core */
@@ -1176,50 +1040,6 @@ Michael Riepe <michael@xxxxxxxxxxxxxxxxxxxx>
     exit(EXIT_SUCCESS);
 }
 
-#ifndef HAVE_SECURITY_PAM_MISC_H
-static void
-getloginname(void) {
-    int ch, cnt, cnt2;
-    char *p;
-    static char nbuf[UT_NAMESIZE + 1];
-
-    cnt2 = 0;
-    for (;;) {
-	cnt = 0;
-	printf(_("\n%s login: "), thishost); fflush(stdout);
-	for (p = nbuf; (ch = getchar()) != '\n'; ) {
-	    if (ch == EOF) {
-		badlogin("EOF");
-		exit(EXIT_FAILURE);
-	    }
-	    if (p < nbuf + UT_NAMESIZE)
-	      *p++ = ch;
-
-	    cnt++;
-	    if (cnt > UT_NAMESIZE + 20) {
-		badlogin(_("NAME too long"));
-		errx(EXIT_FAILURE, _("login name much too long."));
-	    }
-	}
-	if (p > nbuf) {
-	  if (nbuf[0] == '-')
-	     warnx(_("login names may not start with '-'."));
-	  else {
-	      *p = '\0';
-	      username = nbuf;
-	      break;
-	  }
-	}
-
-	cnt2++;
-	if (cnt2 > 50) {
-	    badlogin(_("EXCESSIVE linefeeds"));
-	    errx(EXIT_FAILURE, _("too many bare linefeeds."));
-	}
-    }
-}
-#endif
-
 /*
  * Robert Ambrose writes:
  * A couple of my users have a problem with login processes hanging around
@@ -1252,38 +1072,6 @@ timedout(int sig __attribute__((__unused__))) {
 	timedout2(0);
 }
 
-#ifndef HAVE_SECURITY_PAM_MISC_H
-int
-rootterm(char * ttyn)
-{
-    int fd;
-    char buf[100],*p;
-    int cnt, more = 0;
-
-    fd = open(_PATH_SECURETTY, O_RDONLY);
-    if(fd < 0) return 1;
-
-    /* read each line in /etc/securetty, if a line matches our ttyline
-       then root is allowed to login on this tty, and we should return
-       true. */
-    for(;;) {
-	p = buf; cnt = 100;
-	while(--cnt >= 0 && (more = read(fd, p, 1)) == 1 && *p != '\n') p++;
-	if(more && *p == '\n') {
-	    *p = '\0';
-	    if(!strcmp(buf, ttyn)) {
-		close(fd);
-		return 1;
-	    } else
-	      continue;
-	} else {
-	    close(fd);
-	    return 0;
-	}
-    }
-}
-#endif /* !HAVE_SECURITY_PAM_MISC_H */
-
 jmp_buf motdinterrupt;
 
 void
@@ -1310,24 +1098,6 @@ sigint(int sig  __attribute__((__unused__))) {
     longjmp(motdinterrupt, 1);
 }
 
-#ifndef HAVE_SECURITY_PAM_MISC_H			/* PAM takes care of this */
-void
-checknologin(void) {
-    int fd, nchars;
-    char tbuf[8192];
-
-    if ((fd = open(_PATH_NOLOGIN, O_RDONLY, 0)) >= 0) {
-	while ((nchars = read(fd, tbuf, sizeof(tbuf))) > 0) {
-	  if (write(fileno(stdout), tbuf, nchars)) {
-		;	/* glibc warn_unused_result */
-	  }
-	}
-	close(fd);
-	sleepexit(EXIT_SUCCESS);
-    }
-}
-#endif
-
 void
 dolastlog(int quiet) {
     struct lastlog ll;
-- 
1.7.6.4

--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux