⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 login.c

📁 一次性口令认证系统SKEY的实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* committed to login turn off timeout */	alarm(0);#ifdef	QUOTA	if (quota(Q_SETUID, pwd->pw_uid, 0, 0) < 0 && errno != EINVAL) {		if (errno == EUSERS)			printf("%s.\n%s.\n",			   "Too many users logged on already",			   "Try again later");		else if (errno == EPROCLIM)			printf("You have too many processes running.\n");		else			perror("quota (Q_SETUID)");		sleep(5);		exit(0);	}#endif	time(&utmp.ut_time);	t = ttyslot();	if (t > 0 && (f = open("/etc/utmp", O_WRONLY)) >= 0) {		lseek(f, (long)(t*sizeof(utmp)), 0);		SCPYN(utmp.ut_line, tty);		write(f, (char *)&utmp, sizeof(utmp));		close(f);	}	if ((f = open("/usr/adm/wtmp", O_WRONLY|O_APPEND)) >= 0) {		write(f, (char *)&utmp, sizeof(utmp));		close(f);	}	quietlog = access(qlog, F_OK) == 0;	if ((f = open(lastlog, O_RDWR)) >= 0) {		struct lastlog ll;		lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);		if (read(f, (char *) &ll, sizeof ll) == sizeof ll &&		    ll.ll_time != 0 && !quietlog) {			printf("Last login: %.*s ",			    24-5, (char *)ctime(&ll.ll_time));			if (*ll.ll_host != '\0')				printf("from %.*s\n",				    sizeof (ll.ll_host), ll.ll_host);			else				printf("on %.*s\n",				    sizeof (ll.ll_line), ll.ll_line);		}		lseek(f, (long)pwd->pw_uid * sizeof (struct lastlog), 0);		time(&ll.ll_time);		SCPYN(ll.ll_line, tty);		SCPYN(ll.ll_host, utmp.ut_host);		write(f, (char *) &ll, sizeof ll);		close(f);	}	chown(ttyn, pwd->pw_uid, TTYGID(pwd->pw_gid));	if (!hflag && !rflag)					/* XXX */		ioctl(0, TIOCSWINSZ, &win);	chmod(ttyn, 0620);	setgid(pwd->pw_gid);	strncpy(name, utmp.ut_name, NMAX);	name[NMAX] = '\0';	initgroups(name, pwd->pw_gid);#ifdef	QUOTA	quota(Q_DOWARN, pwd->pw_uid, (dev_t)-1, 0);#endif	setuid(pwd->pw_uid);	/* destroy environment unless user has asked to preserve it */	if (!pflag)		environ = envinit;	setenv("HOME", pwd->pw_dir, 1);	setenv("SHELL", pwd->pw_shell, 1);	if (term[0] == '\0')		strncpy(term, stypeof(tty), sizeof(term));	setenv("TERM", term, 0);	setenv("USER", pwd->pw_name, 1);	setenv("PATH", ":/usr/ucb:/bin:/usr/bin", 0);	if ((namep = rindex(pwd->pw_shell, '/')) == NULL)		namep = pwd->pw_shell;	else		namep++;	strcat(minusnam, namep);	if (tty[sizeof("tty")-1] == 'd')		syslog(LOG_INFO, "DIALUP %s, %s", tty, pwd->pw_name);	if (pwd->pw_uid == 0)		if (utmp.ut_host[0])			syslog(LOG_NOTICE, "ROOT LOGIN %s FROM %.*s",			    tty, HMAX, utmp.ut_host);		else			syslog(LOG_NOTICE, "ROOT LOGIN %s", tty);	if (!quietlog) {		struct stat st;		showmotd();		strcat(maildir, pwd->pw_name);		if (stat(maildir, &st) == 0 && st.st_size != 0)			printf("You have %smail.\n",				(st.st_mtime > st.st_atime) ? "new " : "");	}	signal(SIGALRM, SIG_DFL);	signal(SIGQUIT, SIG_DFL);	signal(SIGINT, SIG_DFL);	signal(SIGTSTP, SIG_IGN);	execlp(pwd->pw_shell, minusnam, 0);	perror(pwd->pw_shell);	printf("No shell\n");	exit(0);}getloginname(up)	register struct utmp *up;{	register char *namep;	char c;	while (up->ut_name[0] == '\0') {		namep = up->ut_name;		printf("login: ");		while (1) {			c = getchar()  ;			if (feof(stdin))				exit(0);			if (c == EOF )				exit(0);			c = c & 0x7f ;			if( c  == '\n' || c == '\r') break;			if (c == ' ')				c = '_';			if (namep < up->ut_name+NMAX)				*namep++ = c;		}	}	strncpy(lusername, up->ut_name, NMAX);	lusername[NMAX] = 0;	if ((pwd = getpwnam(lusername)) == NULL)		pwd = &nouser;}timedout(){	printf("Login timed out after %d seconds\n", timeout);	exit(0);}int	stopmotd;catch(){	signal(SIGINT, SIG_IGN);	stopmotd++;}rootterm(tty)	char *tty;{	register struct ttyent *t;	if ((t = getttynam(tty)) != NULL) {		if (t->ty_status & TTY_SECURE)			return (1);	}	return (0);}showmotd(){	FILE *mf;	register c;	signal(SIGINT, catch);	if ((mf = fopen("/etc/motd", "r")) != NULL) {		while ((c = getc(mf)) != EOF && stopmotd == 0)			putchar(c);		fclose(mf);	}	signal(SIGINT, SIG_IGN);}#undef	UNKNOWN#define UNKNOWN "su"char *stypeof(ttyid)	char *ttyid;{	register struct ttyent *t;	if (ttyid == NULL || (t = getttynam(ttyid)) == NULL)		return (UNKNOWN);	return (t->ty_type);}doremotelogin(host)	char *host;{	int rc;	getstr(rusername, sizeof (rusername), "remuser");	getstr(lusername, sizeof (lusername), "locuser");	getstr(term, sizeof(term), "Terminal type");	if (getuid()) {		pwd = &nouser;		syslog(LOG_ERR, "getuid() failed");		return(-1);	}	pwd = getpwnam(lusername);	if (pwd == NULL) {		pwd = &nouser;		syslog(LOG_ERR, "getpwname() failed for user %s", lusername);		return(-1);	}	rc = ruserok(host, (pwd->pw_uid == 0), rusername, lusername);	if (rc == -1) {		syslog(LOG_ERR, "ruserok failed, host=%s, uid=%d, remote username=%s, local username=%s", host, pwd->pw_uid, rusername, lusername);	}	return rc;}getstr(buf, cnt, err)	char *buf;	int cnt;	char *err;{	char c;	do {		if (read(0, &c, 1) != 1)			exit(1);		if (--cnt < 0) {			printf("%s too long\r\n", err);			exit(1);		}		*buf++ = c;	} while (c != 0);}char	*speeds[] =    { "0", "50", "75", "110", "134", "150", "200", "300",      "600", "1200", "1800", "2400", "4800", "9600", "19200", "38400" };#define	NSPEEDS	(sizeof (speeds) / sizeof (speeds[0]))doremoteterm(term, tp)	char *term;	struct sgttyb *tp;{	register char *cp = index(term, '/'), **cpp;	char *speed;	if (cp) {		*cp++ = '\0';		speed = cp;		cp = index(speed, '/');		if (cp)			*cp++ = '\0';		for (cpp = speeds; cpp < &speeds[NSPEEDS]; cpp++)			if (strcmp(*cpp, speed) == 0) {				tp->sg_ispeed = tp->sg_ospeed = cpp-speeds;				break;			}	}	tp->sg_flags = ECHO|CRMOD|ANYP|XTABS;}tty_gid(default_gid)	int default_gid;{	struct group *getgrnam(), *gr;	int gid = default_gid;	gr = getgrnam(TTYGRPNAME);	if (gr != (struct group *) 0)		gid = gr->gr_gid;	endgrent();	return (gid);}/* Turn host into an IP address and then look it up in the authorization * database to determine if ordinary password logins are OK */authfile(host)char *host;{	static int isaddr();	long aton(),n;	struct hostent *hp;	FILE *fp;	char buf[128],**lp;	if(strlen(host) == 0){		/* Local login, okay */		return 1;	}	if(isaddr(host)){		n = aton(host);		return rdnets(n);	} else {		hp = gethostbyname(host);		if(hp == NULL){			printf("Unknown host %s\n",host);			return 0;		}		for(lp = hp->h_addr_list;*lp != NULL;lp++){			memcpy((char *)&n,*lp,sizeof(n));			n = ntohl(n);			if(rdnets(n))				return 1;		}		return 0;	}}intrdnets(host)long host;{	FILE *fp;	char buf[128],*cp;	long pattern,mask;	char *strtok();	int permit_it;	fp = fopen("/etc/skey.access","r");	if(fp == NULL)		return 0;	while(fgets(buf,sizeof(buf),fp),!feof(fp)){		if(buf[0] == '#')			continue;	/* Comment */		cp = strtok(buf," \t");		if(cp == NULL) 			continue;		/*two choices permit of deny*/		if( strncasecmp(cp, "permit", 4) == 0){			permit_it = 1;		}		else {			if( strncasecmp(cp, "deny" , 4) == 0){				permit_it = 0;			}		     	else{				continue; /* ignore this it is not permit/deny */			}		}		cp = strtok(NULL," \t");		if(cp == NULL)			continue;	/* Invalid line */		pattern = aton(cp);		cp = strtok(NULL," \t");		if(cp == NULL)			continue;	/* Invalid line */		mask = aton(cp);		if((host & mask) == pattern){			fclose(fp);			return permit_it;		}	}	fclose(fp);	return 0;}/* Return TRUE if string appears to be an IP address in dotted decimal; * return FALSE otherwise (i.e., if string is a domain name) */intisaddr(s)register char *s;{	char c;	if(s == NULL)		return 1;    /* Can't happen */				  	while((c = *s++) != '\0'){		if(c != '[' && c != ']' && !isdigit(c) && c != '.')			return 0;	}	return 1;}/* Convert Internet address in ascii dotted-decimal format (44.0.0.1) to * binary IP address */longaton(s)register char *s;{	long n;	register int i;	char *strchr();	n = 0;	if(s == NULL)		return 0;	for(i=24;i>=0;i -= 8){		/* Skip any leading stuff (e.g., spaces, '[') */		while(*s != '\0' && !isdigit(*s))			s++;		if(*s == '\0')			break;		n |= (long)atoi(s) << i;		if((s = strchr(s,'.')) == NULL)			break;		s++;	}	return n;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -