Annotation of embedaddon/thttpd/extras/thttpdpasswd.c, revision 1.1
1.1 ! misho 1: /*
! 2: * thttpdpasswd.c: simple program for manipulating password file for NCSA httpd
! 3: *
! 4: * Rob McCool
! 5: */
! 6:
! 7: /* Modified 29aug97 by Jef Poskanzer to accept new password on stdin,
! 8: ** if stdin is a pipe or file. This is necessary for use from CGI.
! 9: */
! 10:
! 11: #include <sys/types.h>
! 12: #include <stdio.h>
! 13: #include <string.h>
! 14: #include <signal.h>
! 15: #include <stdlib.h>
! 16: #include <time.h>
! 17: #include <unistd.h>
! 18:
! 19: extern char *crypt(const char *key, const char *setting);
! 20:
! 21: #define LF 10
! 22: #define CR 13
! 23:
! 24: #define MAX_STRING_LEN 256
! 25:
! 26: int tfd;
! 27: char temp_template[] = "/tmp/htp.XXXXXX";
! 28:
! 29: void interrupted(int);
! 30:
! 31: static char * strd(char *s) {
! 32: char *d;
! 33:
! 34: d=(char *)malloc(strlen(s) + 1);
! 35: strcpy(d,s);
! 36: return(d);
! 37: }
! 38:
! 39: static void getword(char *word, char *line, char stop) {
! 40: int x = 0,y;
! 41:
! 42: for(x=0;((line[x]) && (line[x] != stop));x++)
! 43: word[x] = line[x];
! 44:
! 45: word[x] = '\0';
! 46: if(line[x]) ++x;
! 47: y=0;
! 48:
! 49: while((line[y++] = line[x++]));
! 50: }
! 51:
! 52: static int getline(char *s, int n, FILE *f) {
! 53: register int i=0;
! 54:
! 55: while(1) {
! 56: s[i] = (char)fgetc(f);
! 57:
! 58: if(s[i] == CR)
! 59: s[i] = fgetc(f);
! 60:
! 61: if((s[i] == 0x4) || (s[i] == LF) || (i == (n-1))) {
! 62: s[i] = '\0';
! 63: return (feof(f) ? 1 : 0);
! 64: }
! 65: ++i;
! 66: }
! 67: }
! 68:
! 69: static void putline(FILE *f,char *l) {
! 70: int x;
! 71:
! 72: for(x=0;l[x];x++) fputc(l[x],f);
! 73: fputc('\n',f);
! 74: }
! 75:
! 76:
! 77: /* From local_passwd.c (C) Regents of Univ. of California blah blah */
! 78: static unsigned char itoa64[] = /* 0 ... 63 => ascii - 64 */
! 79: "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
! 80:
! 81: static void to64(register char *s, register long v, register int n) {
! 82: while (--n >= 0) {
! 83: *s++ = itoa64[v&0x3f];
! 84: v >>= 6;
! 85: }
! 86: }
! 87:
! 88: #ifdef MPE
! 89: /* MPE lacks getpass() and a way to suppress stdin echo. So for now, just
! 90: issue the prompt and read the results with echo. (Ugh). */
! 91:
! 92: char *getpass(const char *prompt) {
! 93:
! 94: static char password[81];
! 95:
! 96: fputs(prompt,stderr);
! 97: gets((char *)&password);
! 98:
! 99: if (strlen((char *)&password) > 8) {
! 100: password[8]='\0';
! 101: }
! 102:
! 103: return (char *)&password;
! 104: }
! 105: #endif
! 106:
! 107: static void
! 108: add_password( char* user, FILE* f )
! 109: {
! 110: char pass[100];
! 111: char* pw;
! 112: char* cpw;
! 113: char salt[3];
! 114:
! 115: if ( ! isatty( fileno( stdin ) ) )
! 116: {
! 117: (void) fgets( pass, sizeof(pass), stdin );
! 118: if ( pass[strlen(pass) - 1] == '\n' )
! 119: pass[strlen(pass) - 1] = '\0';
! 120: pw = pass;
! 121: }
! 122: else
! 123: {
! 124: pw = strd( (char*) getpass( "New password:" ) );
! 125: if ( strcmp( pw, (char*) getpass( "Re-type new password:" ) ) != 0 )
! 126: {
! 127: (void) fprintf( stderr, "They don't match, sorry.\n" );
! 128: if ( tfd != -1 )
! 129: unlink( temp_template );
! 130: exit( 1 );
! 131: }
! 132: }
! 133: (void) srandom( (int) time( (time_t*) 0 ) );
! 134: to64( &salt[0], random(), 2 );
! 135: cpw = crypt( pw, salt );
! 136: (void) fprintf( f, "%s:%s\n", user, cpw );
! 137: }
! 138:
! 139: static void usage(void) {
! 140: fprintf(stderr,"Usage: thttpdpasswd [-c] passwordfile username\n");
! 141: fprintf(stderr,"The -c flag creates a new file.\n");
! 142: exit(1);
! 143: }
! 144:
! 145: void interrupted(int signo) {
! 146: fprintf(stderr,"Interrupted.\n");
! 147: if(tfd != -1) unlink(temp_template);
! 148: exit(1);
! 149: }
! 150:
! 151: int main(int argc, char *argv[]) {
! 152: FILE *tfp,*f;
! 153: char user[MAX_STRING_LEN];
! 154: char line[MAX_STRING_LEN];
! 155: char l[MAX_STRING_LEN];
! 156: char w[MAX_STRING_LEN];
! 157: char command[MAX_STRING_LEN];
! 158: int found;
! 159:
! 160: tfd = -1;
! 161: signal(SIGINT,(void (*)(int))interrupted);
! 162: if(argc == 4) {
! 163: if(strcmp(argv[1],"-c"))
! 164: usage();
! 165: if(!(tfp = fopen(argv[2],"w"))) {
! 166: fprintf(stderr,"Could not open passwd file %s for writing.\n",
! 167: argv[2]);
! 168: perror("fopen");
! 169: exit(1);
! 170: }
! 171: printf("Adding password for %s.\n",argv[3]);
! 172: add_password(argv[3],tfp);
! 173: fclose(tfp);
! 174: exit(0);
! 175: } else if(argc != 3) usage();
! 176:
! 177: tfd = mkstemp(temp_template);
! 178: if(!(tfp = fdopen(tfd,"w"))) {
! 179: fprintf(stderr,"Could not open temp file.\n");
! 180: exit(1);
! 181: }
! 182:
! 183: if(!(f = fopen(argv[1],"r"))) {
! 184: fprintf(stderr,
! 185: "Could not open passwd file %s for reading.\n",argv[1]);
! 186: fprintf(stderr,"Use -c option to create new one.\n");
! 187: exit(1);
! 188: }
! 189: strcpy(user,argv[2]);
! 190:
! 191: found = 0;
! 192: while(!(getline(line,MAX_STRING_LEN,f))) {
! 193: if(found || (line[0] == '#') || (!line[0])) {
! 194: putline(tfp,line);
! 195: continue;
! 196: }
! 197: strcpy(l,line);
! 198: getword(w,l,':');
! 199: if(strcmp(user,w)) {
! 200: putline(tfp,line);
! 201: continue;
! 202: }
! 203: else {
! 204: printf("Changing password for user %s\n",user);
! 205: add_password(user,tfp);
! 206: found = 1;
! 207: }
! 208: }
! 209: if(!found) {
! 210: printf("Adding user %s\n",user);
! 211: add_password(user,tfp);
! 212: }
! 213: fclose(f);
! 214: fclose(tfp);
! 215: sprintf(command,"cp %s %s",temp_template,argv[1]);
! 216: system(command);
! 217: unlink(temp_template);
! 218: exit(0);
! 219: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>