1 #include <u.h> 2 #include <libc.h> 3 #include <authsrv.h> 4 #include <bio.h> 5 #include "authcmdlib.h" 6 7 void 8 getpass(char *key, char *pass, int check, int confirm) 9 { 10 char rpass[32], npass[32]; 11 char *err; 12 13 if(pass == nil) 14 pass = npass; 15 16 for(;;){ 17 readln("Password: ", pass, sizeof npass, 1); 18 if(confirm){ 19 readln("Confirm password: ", rpass, sizeof rpass, 1); 20 if(strcmp(pass, rpass) != 0){ 21 print("mismatch, try again\n"); 22 continue; 23 } 24 } 25 if(!passtokey(key, pass)){ 26 print("bad password, try again\n"); 27 continue; 28 } 29 if(check) 30 if(err = okpasswd(pass)){ 31 print("%s, try again\n", err); 32 continue; 33 } 34 break; 35 } 36 } 37 38 int 39 getsecret(int passvalid, char *p9pass) 40 { 41 char answer[32]; 42 43 readln("assign Inferno/POP secret? (y/n) ", answer, sizeof answer, 0); 44 if(*answer != 'y' && *answer != 'Y') 45 return 0; 46 47 if(passvalid){ 48 readln("make it the same as the plan 9 password? (y/n) ", 49 answer, sizeof answer, 0); 50 if(*answer == 'y' || *answer == 'Y') 51 return 1; 52 } 53 54 for(;;){ 55 readln("Secret(0 to 256 characters): ", p9pass, 56 sizeof answer, 1); 57 readln("Confirm: ", answer, sizeof answer, 1); 58 if(strcmp(p9pass, answer) == 0) 59 break; 60 print("mismatch, try again\n"); 61 } 62 return 1; 63 } 64 65 void 66 readln(char *prompt, char *line, int len, int raw) 67 { 68 char *p; 69 int fdin, fdout, ctl, n, nr; 70 71 fdin = open("/dev/cons", OREAD); 72 fdout = open("/dev/cons", OWRITE); 73 fprint(fdout, "%s", prompt); 74 if(raw){ 75 ctl = open("/dev/consctl", OWRITE); 76 if(ctl < 0) 77 error("couldn't set raw mode"); 78 write(ctl, "rawon", 5); 79 } else 80 ctl = -1; 81 nr = 0; 82 p = line; 83 for(;;){ 84 n = read(fdin, p, 1); 85 if(n < 0){ 86 close(ctl); 87 error("can't read cons\n"); 88 } 89 if(*p == 0x7f) 90 exits(0); 91 if(n == 0 || *p == '\n' || *p == '\r'){ 92 *p = '\0'; 93 if(raw){ 94 write(ctl, "rawoff", 6); 95 write(fdout, "\n", 1); 96 } 97 close(ctl); 98 return; 99 } 100 if(*p == '\b'){ 101 if(nr > 0){ 102 nr--; 103 p--; 104 } 105 }else{ 106 nr++; 107 p++; 108 } 109 if(nr == len){ 110 fprint(fdout, "line too long; try again\n"); 111 nr = 0; 112 p = line; 113 } 114 } 115 } 116