1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <authsrv.h>
4*5979f962SDavid du Colombier #include <bio.h>
59a747e4fSDavid du Colombier #include "authcmdlib.h"
6219b2ee8SDavid du Colombier
7219b2ee8SDavid du Colombier void
getpass(char * key,char * pass,int check,int confirm)880ee5cbfSDavid du Colombier getpass(char *key, char *pass, int check, int confirm)
9219b2ee8SDavid du Colombier {
107dd7cddfSDavid du Colombier char rpass[32], npass[32];
11219b2ee8SDavid du Colombier char *err;
12219b2ee8SDavid du Colombier
137dd7cddfSDavid du Colombier if(pass == nil)
147dd7cddfSDavid du Colombier pass = npass;
157dd7cddfSDavid du Colombier
167dd7cddfSDavid du Colombier for(;;){
177dd7cddfSDavid du Colombier readln("Password: ", pass, sizeof npass, 1);
1880ee5cbfSDavid du Colombier if(confirm){
19219b2ee8SDavid du Colombier readln("Confirm password: ", rpass, sizeof rpass, 1);
207dd7cddfSDavid du Colombier if(strcmp(pass, rpass) != 0){
217dd7cddfSDavid du Colombier print("mismatch, try again\n");
227dd7cddfSDavid du Colombier continue;
237dd7cddfSDavid du Colombier }
2480ee5cbfSDavid du Colombier }
257dd7cddfSDavid du Colombier if(!passtokey(key, pass)){
267dd7cddfSDavid du Colombier print("bad password, try again\n");
277dd7cddfSDavid du Colombier continue;
287dd7cddfSDavid du Colombier }
29219b2ee8SDavid du Colombier if(check)
307dd7cddfSDavid du Colombier if(err = okpasswd(pass)){
317dd7cddfSDavid du Colombier print("%s, try again\n", err);
327dd7cddfSDavid du Colombier continue;
337dd7cddfSDavid du Colombier }
347dd7cddfSDavid du Colombier break;
357dd7cddfSDavid du Colombier }
367dd7cddfSDavid du Colombier }
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier int
getsecret(int passvalid,char * p9pass)397dd7cddfSDavid du Colombier getsecret(int passvalid, char *p9pass)
407dd7cddfSDavid du Colombier {
417dd7cddfSDavid du Colombier char answer[32];
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier readln("assign Inferno/POP secret? (y/n) ", answer, sizeof answer, 0);
447dd7cddfSDavid du Colombier if(*answer != 'y' && *answer != 'Y')
457dd7cddfSDavid du Colombier return 0;
467dd7cddfSDavid du Colombier
477dd7cddfSDavid du Colombier if(passvalid){
487dd7cddfSDavid du Colombier readln("make it the same as the plan 9 password? (y/n) ",
497dd7cddfSDavid du Colombier answer, sizeof answer, 0);
507dd7cddfSDavid du Colombier if(*answer == 'y' || *answer == 'Y')
517dd7cddfSDavid du Colombier return 1;
527dd7cddfSDavid du Colombier }
537dd7cddfSDavid du Colombier
547dd7cddfSDavid du Colombier for(;;){
557dd7cddfSDavid du Colombier readln("Secret(0 to 256 characters): ", p9pass,
567dd7cddfSDavid du Colombier sizeof answer, 1);
577dd7cddfSDavid du Colombier readln("Confirm: ", answer, sizeof answer, 1);
587dd7cddfSDavid du Colombier if(strcmp(p9pass, answer) == 0)
597dd7cddfSDavid du Colombier break;
607dd7cddfSDavid du Colombier print("mismatch, try again\n");
617dd7cddfSDavid du Colombier }
627dd7cddfSDavid du Colombier return 1;
63219b2ee8SDavid du Colombier }
64219b2ee8SDavid du Colombier
65219b2ee8SDavid du Colombier void
readln(char * prompt,char * line,int len,int raw)66219b2ee8SDavid du Colombier readln(char *prompt, char *line, int len, int raw)
67219b2ee8SDavid du Colombier {
68219b2ee8SDavid du Colombier char *p;
697dd7cddfSDavid du Colombier int fdin, fdout, ctl, n, nr;
70219b2ee8SDavid du Colombier
717dd7cddfSDavid du Colombier fdin = open("/dev/cons", OREAD);
727dd7cddfSDavid du Colombier fdout = open("/dev/cons", OWRITE);
737dd7cddfSDavid du Colombier fprint(fdout, "%s", prompt);
74219b2ee8SDavid du Colombier if(raw){
75219b2ee8SDavid du Colombier ctl = open("/dev/consctl", OWRITE);
76219b2ee8SDavid du Colombier if(ctl < 0)
77219b2ee8SDavid du Colombier error("couldn't set raw mode");
78219b2ee8SDavid du Colombier write(ctl, "rawon", 5);
79219b2ee8SDavid du Colombier } else
80219b2ee8SDavid du Colombier ctl = -1;
81219b2ee8SDavid du Colombier nr = 0;
82219b2ee8SDavid du Colombier p = line;
83219b2ee8SDavid du Colombier for(;;){
847dd7cddfSDavid du Colombier n = read(fdin, p, 1);
85219b2ee8SDavid du Colombier if(n < 0){
86219b2ee8SDavid du Colombier close(ctl);
87219b2ee8SDavid du Colombier error("can't read cons\n");
88219b2ee8SDavid du Colombier }
89219b2ee8SDavid du Colombier if(*p == 0x7f)
90219b2ee8SDavid du Colombier exits(0);
91219b2ee8SDavid du Colombier if(n == 0 || *p == '\n' || *p == '\r'){
92219b2ee8SDavid du Colombier *p = '\0';
937dd7cddfSDavid du Colombier if(raw){
947dd7cddfSDavid du Colombier write(ctl, "rawoff", 6);
957dd7cddfSDavid du Colombier write(fdout, "\n", 1);
967dd7cddfSDavid du Colombier }
97219b2ee8SDavid du Colombier close(ctl);
98219b2ee8SDavid du Colombier return;
99219b2ee8SDavid du Colombier }
100219b2ee8SDavid du Colombier if(*p == '\b'){
101219b2ee8SDavid du Colombier if(nr > 0){
102219b2ee8SDavid du Colombier nr--;
103219b2ee8SDavid du Colombier p--;
104219b2ee8SDavid du Colombier }
105219b2ee8SDavid du Colombier }else{
106219b2ee8SDavid du Colombier nr++;
107219b2ee8SDavid du Colombier p++;
108219b2ee8SDavid du Colombier }
109219b2ee8SDavid du Colombier if(nr == len){
1107dd7cddfSDavid du Colombier fprint(fdout, "line too long; try again\n");
111219b2ee8SDavid du Colombier nr = 0;
112219b2ee8SDavid du Colombier p = line;
113219b2ee8SDavid du Colombier }
114219b2ee8SDavid du Colombier }
115219b2ee8SDavid du Colombier }
116