|
|
1.1 ! root 1: static char *sccsid = "@(#)passwd.c 4.1 (Berkeley) 10/1/80"; ! 2: /* ! 3: * enter a password in the password file ! 4: * this program should be suid with owner ! 5: * with an owner with write permission on /etc/passwd ! 6: */ ! 7: #include <stdio.h> ! 8: #include <signal.h> ! 9: #include <pwd.h> ! 10: ! 11: char passwd[] = "/etc/passwd"; ! 12: char temp[] = "/etc/ptmp"; ! 13: struct passwd *pwd; ! 14: struct passwd *getpwent(); ! 15: int endpwent(); ! 16: char *strcpy(); ! 17: char *crypt(); ! 18: char *getpass(); ! 19: char *getlogin(); ! 20: char *pw; ! 21: char pwbuf[10]; ! 22: char buf[BUFSIZ]; ! 23: ! 24: main(argc, argv) ! 25: char *argv[]; ! 26: { ! 27: char *p; ! 28: int i; ! 29: char saltc[2]; ! 30: long salt; ! 31: int u,fi,fo; ! 32: int insist; ! 33: int ok, flags; ! 34: int c; ! 35: int pwlen; ! 36: FILE *tf; ! 37: char *uname; ! 38: ! 39: insist = 0; ! 40: if(argc < 2) { ! 41: if ((uname = getlogin()) == NULL) { ! 42: printf ("Usage: passwd user\n"); ! 43: goto bex; ! 44: } else { ! 45: printf("Changing password for %s\n", uname); ! 46: } ! 47: } else { ! 48: uname = argv[1]; ! 49: } ! 50: while(((pwd=getpwent()) != NULL)&&(strcmp(pwd->pw_name,uname)!=0)); ! 51: u = getuid(); ! 52: if((pwd==NULL) || (u!=0 && u != pwd->pw_uid)) ! 53: { ! 54: printf("Permission denied.\n"); ! 55: goto bex; ! 56: } ! 57: endpwent(); ! 58: if (pwd->pw_passwd[0] && u != 0) { ! 59: strcpy(pwbuf, getpass("Old password:")); ! 60: pw = crypt(pwbuf, pwd->pw_passwd); ! 61: if(strcmp(pw, pwd->pw_passwd) != 0) { ! 62: printf("Sorry.\n"); ! 63: goto bex; ! 64: } ! 65: } ! 66: tryagn: ! 67: strcpy(pwbuf, getpass("New password:")); ! 68: pwlen = strlen(pwbuf); ! 69: if (pwlen == 0) { ! 70: printf("Password unchanged.\n"); ! 71: goto bex; ! 72: } ! 73: ok = 0; ! 74: flags = 0; ! 75: p = pwbuf; ! 76: while(c = *p++){ ! 77: if(c>='a' && c<='z') flags |= 2; ! 78: else if(c>='A' && c<='Z') flags |= 4; ! 79: else if(c>='0' && c<='9') flags |= 1; ! 80: else flags |= 8; ! 81: } ! 82: if(flags >=7 && pwlen>= 4) ok = 1; ! 83: if(((flags==2)||(flags==4)) && pwlen>=6) ok = 1; ! 84: if(((flags==3)||(flags==5)||(flags==6))&&pwlen>=5) ok = 1; ! 85: ! 86: if((ok==0) && (insist<2)){ ! 87: if(flags==1) ! 88: printf("Please use at least one non-numeric character.\n"); ! 89: else ! 90: printf("Please use a longer password.\n"); ! 91: insist++; ! 92: goto tryagn; ! 93: } ! 94: ! 95: if (strcmp(pwbuf,getpass("Retype new password:")) != 0) { ! 96: printf ("Mismatch - password unchanged.\n"); ! 97: goto bex; ! 98: } ! 99: ! 100: time(&salt); ! 101: salt += getpid(); ! 102: ! 103: saltc[0] = salt & 077; ! 104: saltc[1] = (salt>>6) & 077; ! 105: for(i=0;i<2;i++){ ! 106: c = saltc[i] + '.'; ! 107: if(c>'9') c += 7; ! 108: if(c>'Z') c += 6; ! 109: saltc[i] = c; ! 110: } ! 111: pw = crypt(pwbuf, saltc); ! 112: signal(SIGHUP, SIG_IGN); ! 113: signal(SIGINT, SIG_IGN); ! 114: signal(SIGQUIT, SIG_IGN); ! 115: ! 116: if(access(temp, 0) >= 0) { ! 117: printf("Temporary file busy -- try again\n"); ! 118: goto bex; ! 119: } ! 120: signal(SIGTSTP, SIG_IGN); ! 121: close(creat(temp,0600)); ! 122: if((tf=fopen(temp,"w")) == NULL) { ! 123: printf("Cannot create temporary file\n"); ! 124: goto bex; ! 125: } ! 126: ! 127: /* ! 128: * copy passwd to temp, replacing matching lines ! 129: * with new password. ! 130: */ ! 131: ! 132: while((pwd=getpwent()) != NULL) { ! 133: if(strcmp(pwd->pw_name,uname) == 0) { ! 134: u = getuid(); ! 135: if(u != 0 && u != pwd->pw_uid) { ! 136: printf("Permission denied.\n"); ! 137: goto out; ! 138: } ! 139: pwd->pw_passwd = pw; ! 140: if (pwd->pw_gecos[0] == '*') ! 141: pwd->pw_gecos++; ! 142: } ! 143: fprintf(tf,"%s:%s:%d:%d:%s:%s:%s\n", ! 144: pwd->pw_name, ! 145: pwd->pw_passwd, ! 146: pwd->pw_uid, ! 147: pwd->pw_gid, ! 148: pwd->pw_gecos, ! 149: pwd->pw_dir, ! 150: pwd->pw_shell); ! 151: } ! 152: endpwent(); ! 153: fclose(tf); ! 154: ! 155: /* ! 156: * copy temp back to passwd file ! 157: */ ! 158: ! 159: if((fi=open(temp,0)) < 0) { ! 160: printf("Temp file disappeared!\n"); ! 161: goto out; ! 162: } ! 163: if((fo=creat(passwd, 0644)) < 0) { ! 164: printf("Cannot recreat passwd file.\n"); ! 165: goto out; ! 166: } ! 167: while((u=read(fi,buf,sizeof(buf))) > 0) write(fo,buf,u); ! 168: ! 169: out: ! 170: unlink(temp); ! 171: ! 172: bex: ! 173: exit(1); ! 174: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.