xref: /plan9/sys/src/cmd/auth/lib/readln.c (revision 5979f96214a33481f1724725761f2ef3585d2237)
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