214 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* pass.c
 | |
|  *
 | |
|  * This file is part of httpd.
 | |
|  *
 | |
|  * 07/07/1996 Initial Release	Michael Temari <Michael@TemWare.Com>
 | |
|  * 12/29/2002 			Michael Temari <Michael@TemWare.Com>
 | |
|  *
 | |
|  */
 | |
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include <stdio.h>
 | |
| #include <string.h>
 | |
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| #include <time.h>
 | |
| #include <pwd.h>
 | |
| #ifdef _MINIX
 | |
| #include <minix/minlib.h>
 | |
| #endif
 | |
| 
 | |
| #define	STD_PASSWD_FILE	"/etc/passwd"
 | |
| 
 | |
| #include "pass.h"
 | |
| 
 | |
| static char buffer[1024];
 | |
| static char *pwduser;
 | |
| static char *pwdpass;
 | |
| static char *pwde[4];
 | |
| 
 | |
| _PROTOTYPE(static int getuser, (char *pwdfile, char *user));
 | |
| 
 | |
| static int getuser(pwdfile, user)
 | |
| char *pwdfile;
 | |
| char *user;
 | |
| {
 | |
| FILE *fp;
 | |
| char *p;
 | |
| int i;
 | |
| 
 | |
|    if((fp = fopen(pwdfile, "r")) == (FILE *)NULL)
 | |
| 	return(-1);
 | |
| 
 | |
|    for(i = 0; i < 4; i ++) pwde[i] = "";
 | |
| 
 | |
|    while(1) {
 | |
| 	if(fgets(buffer, sizeof(buffer), fp) == (char *)NULL) {
 | |
| 		fclose(fp);
 | |
| 		return(-1);
 | |
| 	}
 | |
| 	p = buffer;
 | |
| 	pwduser = p;
 | |
| 	while(*p && *p != ':') p++;
 | |
| 	if(*p != ':') continue;
 | |
| 	*p++ = '\0';
 | |
| 	if(strcmp(pwduser, user)) continue;
 | |
| 	pwdpass = p;
 | |
| 	while(*p && *p != ':' && *p != '\r' && *p != '\n') p++;
 | |
| 	if(*p == ':')
 | |
| 		*p++ = '\0';
 | |
| 	else {
 | |
| 		if(*p) *p = '\0';
 | |
| 		fclose(fp);
 | |
| 	}
 | |
| 	for(i = 0; i < 4; i++) {
 | |
| 		pwde[i] = p;
 | |
| 		while(*p && *p != ':' && *p != '\r' && *p != '\n') p++;
 | |
| 		if(*p == ':')
 | |
| 			*p++ = '\0';
 | |
| 		else {
 | |
| 			if(*p) *p = '\0';
 | |
| 			break;
 | |
| 		}
 | |
| 	}
 | |
| 	fclose(fp);
 | |
| 
 | |
| 	return(0);
 | |
|    }
 | |
| }
 | |
| 
 | |
| int passfile(pwdfile)
 | |
| char *pwdfile;
 | |
| {
 | |
| FILE *fp;
 | |
| 
 | |
|    if(!strcmp(pwdfile, STD_PASSWD_FILE))
 | |
| 	return(0);
 | |
| 
 | |
|    if((fp = fopen(pwdfile, "r")) == (FILE *)NULL)
 | |
| 	return(-1);
 | |
| 
 | |
|    fclose(fp);
 | |
| 
 | |
|    return(0);
 | |
| }
 | |
| 
 | |
| int passuser(pwdfile, user)
 | |
| char *pwdfile;
 | |
| char *user;
 | |
| {
 | |
|    if(!strcmp(pwdfile, STD_PASSWD_FILE))
 | |
| 	if(getpwnam(user) == (struct passwd *)NULL)
 | |
| 		return(-1);
 | |
| 	else
 | |
| 		return(0);
 | |
| 
 | |
|    return(getuser(pwdfile, user));
 | |
| }
 | |
| 
 | |
| int passnone(pwdfile, user)
 | |
| char *pwdfile;
 | |
| char *user;
 | |
| {
 | |
| struct passwd *pwd;
 | |
| 
 | |
|    if(!strcmp(pwdfile, STD_PASSWD_FILE))
 | |
| 	if((pwd = getpwnam(user)) == (struct passwd *)NULL)
 | |
| 		return(-1);
 | |
| 	else
 | |
| 		if(!strcmp(pwd->pw_passwd, crypt("", pwd->pw_passwd)))
 | |
| 			return(-1);
 | |
| 		else
 | |
| 			return(0);
 | |
| 
 | |
|    if(getuser(pwdfile, user))
 | |
| 	return(-1);
 | |
| 
 | |
|    if(!strcmp(pwdpass, crypt("", pwdpass)))
 | |
| 	return(-1);
 | |
|    else
 | |
| 	return(0);
 | |
| }
 | |
| 
 | |
| int passpass(pwdfile, user, pass)
 | |
| char *pwdfile;
 | |
| char *user;
 | |
| char *pass;
 | |
| {
 | |
| struct passwd *pwd;
 | |
| 
 | |
|    if(!strcmp(pwdfile, STD_PASSWD_FILE))
 | |
| 	if((pwd = getpwnam(user)) == (struct passwd *)NULL)
 | |
| 		return(-1);
 | |
| 	else
 | |
| 		if(strcmp(pwd->pw_passwd, crypt(pass, pwd->pw_passwd)))
 | |
| 			return(-1);
 | |
| 		else
 | |
| 			return(0);
 | |
| 
 | |
|    if(getuser(pwdfile, user))
 | |
| 	return(-1);
 | |
| 
 | |
|    if(strcmp(pwdpass, crypt(pass, pwdpass)))
 | |
| 	return(-1);
 | |
|    else
 | |
| 	return(0);
 | |
| }
 | |
| 
 | |
| int passadd(pwdfile, user, pass, e1, e2, e3, e4)
 | |
| char *pwdfile;
 | |
| char *user;
 | |
| char *pass;
 | |
| char *e1;
 | |
| char *e2;
 | |
| char *e3;
 | |
| char *e4;
 | |
| {
 | |
| FILE *fp;
 | |
| time_t salt;
 | |
| char sl[2];
 | |
| int cn;
 | |
| char *ee1;
 | |
| char *ee2;
 | |
| char *ee3;
 | |
| char *ee4;
 | |
| 
 | |
| 
 | |
|    if(pwdfile == (char *)NULL ||
 | |
| 	 user == (char *)NULL ||
 | |
| 	 pass == (char *)NULL)
 | |
| 	return(PASS_ERROR);
 | |
| 
 | |
|    if(!strcmp(pwdfile, STD_PASSWD_FILE))
 | |
| 	return(PASS_ERROR);
 | |
| 
 | |
|    if(!getuser(pwdfile, user))
 | |
| 	return(PASS_USEREXISTS);
 | |
| 
 | |
|    time(&salt);
 | |
|    sl[0] = (salt & 077) + '.';
 | |
|    sl[1] = ((salt >> 6) & 077) + '.';
 | |
|    for (cn = 0; cn < 2; cn++) {
 | |
| 	if (sl[cn] > '9') sl[cn] += 7;
 | |
| 	if (sl[cn] > 'Z') sl[cn] += 6;
 | |
|    }
 | |
| 
 | |
|    if(e1 == (char *)NULL) ee1 = ""; else ee1 = e1;
 | |
|    if(e2 == (char *)NULL) ee2 = ""; else ee2 = e2;
 | |
|    if(e3 == (char *)NULL) ee3 = ""; else ee3 = e3;
 | |
|    if(e4 == (char *)NULL) ee4 = ""; else ee4 = e4;
 | |
| 
 | |
|    /* XXX need to add locking mechanics to add new user */
 | |
| 
 | |
|    if((fp = fopen(pwdfile, "a")) == (FILE *)NULL)
 | |
| 	return(PASS_ERROR);
 | |
| 
 | |
|    fprintf(fp, "%s:%s:%s:%s:%s:%s\n", user, crypt(pass, sl), ee1, ee2, ee3, ee4);
 | |
| 
 | |
|    fclose(fp);
 | |
| 
 | |
|    /* XXX need to add unlocking mechanics to add new user */
 | |
| 
 | |
|    return(PASS_GOOD);
 | |
| }
 | 
