xref: /plan9/sys/src/cmd/auth/secstore/util.c (revision 252470cd51076298c1cb81e1aabee4494f47f284)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
311c9ee8bSDavid du Colombier #include <mp.h>
411c9ee8bSDavid du Colombier #include <libsec.h>
511c9ee8bSDavid du Colombier #include "SConn.h"
611c9ee8bSDavid du Colombier #include "secstore.h"
79a747e4fSDavid du Colombier 
89a747e4fSDavid du Colombier void *
emalloc(ulong n)99a747e4fSDavid du Colombier emalloc(ulong n)
109a747e4fSDavid du Colombier {
119a747e4fSDavid du Colombier 	void *p = malloc(n);
12*252470cdSDavid du Colombier 
139a747e4fSDavid du Colombier 	if(p == nil)
149a747e4fSDavid du Colombier 		sysfatal("emalloc");
159a747e4fSDavid du Colombier 	memset(p, 0, n);
169a747e4fSDavid du Colombier 	return p;
179a747e4fSDavid du Colombier }
189a747e4fSDavid du Colombier 
199a747e4fSDavid du Colombier void *
erealloc(void * p,ulong n)209a747e4fSDavid du Colombier erealloc(void *p, ulong n)
219a747e4fSDavid du Colombier {
229a747e4fSDavid du Colombier 	if ((p = realloc(p, n)) == nil)
239a747e4fSDavid du Colombier 		sysfatal("erealloc");
249a747e4fSDavid du Colombier 	return p;
259a747e4fSDavid du Colombier }
269a747e4fSDavid du Colombier 
279a747e4fSDavid du Colombier char *
estrdup(char * s)289a747e4fSDavid du Colombier estrdup(char *s)
299a747e4fSDavid du Colombier {
309a747e4fSDavid du Colombier 	if ((s = strdup(s)) == nil)
319a747e4fSDavid du Colombier 		sysfatal("estrdup");
329a747e4fSDavid du Colombier 	return s;
339a747e4fSDavid du Colombier }
349a747e4fSDavid du Colombier 
35b27b55e2SDavid du Colombier char*
getpassm(char * prompt)36c65b13b8SDavid du Colombier getpassm(char *prompt)
379a747e4fSDavid du Colombier {
38b27b55e2SDavid du Colombier 	char *p, line[4096];
399a747e4fSDavid du Colombier 	int n, nr;
40*252470cdSDavid du Colombier 	static int cons, consctl; /* closing & reopening fails in ssh environment */
419a747e4fSDavid du Colombier 
42*252470cdSDavid du Colombier 	if(cons == 0){			/* first time? */
439a747e4fSDavid du Colombier 		cons = open("/dev/cons", ORDWR);
44d854de59SDavid du Colombier 		if(cons < 0)
45d854de59SDavid du Colombier 			sysfatal("couldn't open cons");
469a747e4fSDavid du Colombier 		consctl = open("/dev/consctl", OWRITE);
47d854de59SDavid du Colombier 		if(consctl < 0)
48d854de59SDavid du Colombier 			sysfatal("couldn't set raw mode via consctl");
499a747e4fSDavid du Colombier 	}
509a747e4fSDavid du Colombier 	fprint(consctl, "rawon");
519a747e4fSDavid du Colombier 	fprint(cons, "%s", prompt);
529a747e4fSDavid du Colombier 	nr = 0;
539a747e4fSDavid du Colombier 	p = line;
549a747e4fSDavid du Colombier 	for(;;){
559a747e4fSDavid du Colombier 		n = read(cons, p, 1);
569a747e4fSDavid du Colombier 		if(n < 0){
579a747e4fSDavid du Colombier 			fprint(consctl, "rawoff");
589a747e4fSDavid du Colombier 			fprint(cons, "\n");
59b27b55e2SDavid du Colombier 			return nil;
609a747e4fSDavid du Colombier 		}
615d459b5aSDavid du Colombier 		if(n == 0 || *p == '\n' || *p == '\r' || *p == 0x7f){
629a747e4fSDavid du Colombier 			*p = '\0';
639a747e4fSDavid du Colombier 			fprint(consctl, "rawoff");
649a747e4fSDavid du Colombier 			fprint(cons, "\n");
65b27b55e2SDavid du Colombier 			p = strdup(line);
66b27b55e2SDavid du Colombier 			memset(line, 0, nr);
67b27b55e2SDavid du Colombier 			return p;
689a747e4fSDavid du Colombier 		}
699a747e4fSDavid du Colombier 		if(*p == '\b'){
709a747e4fSDavid du Colombier 			if(nr > 0){
719a747e4fSDavid du Colombier 				nr--;
729a747e4fSDavid du Colombier 				p--;
739a747e4fSDavid du Colombier 			}
74*252470cdSDavid du Colombier 		}else if(*p == ('u' & 037)){		/* cntrl-u */
759a747e4fSDavid du Colombier 			fprint(cons, "\n%s", prompt);
769a747e4fSDavid du Colombier 			nr = 0;
779a747e4fSDavid du Colombier 			p = line;
789a747e4fSDavid du Colombier 		}else{
799a747e4fSDavid du Colombier 			nr++;
809a747e4fSDavid du Colombier 			p++;
819a747e4fSDavid du Colombier 		}
82b27b55e2SDavid du Colombier 		if(nr+1 == sizeof line){
839a747e4fSDavid du Colombier 			fprint(cons, "line too long; try again\n%s", prompt);
849a747e4fSDavid du Colombier 			nr = 0;
859a747e4fSDavid du Colombier 			p = line;
869a747e4fSDavid du Colombier 		}
879a747e4fSDavid du Colombier 	}
889a747e4fSDavid du Colombier }
8911c9ee8bSDavid du Colombier 
90*252470cdSDavid du Colombier static char *
illegal(char * f)91*252470cdSDavid du Colombier illegal(char *f)
92*252470cdSDavid du Colombier {
93*252470cdSDavid du Colombier 	syslog(0, LOG, "illegal name: %s", f);
94*252470cdSDavid du Colombier 	return nil;
95*252470cdSDavid du Colombier }
96*252470cdSDavid du Colombier 
9711c9ee8bSDavid du Colombier char *
validatefile(char * f)9811c9ee8bSDavid du Colombier validatefile(char *f)
9911c9ee8bSDavid du Colombier {
100*252470cdSDavid du Colombier 	char *p;
10111c9ee8bSDavid du Colombier 
102*252470cdSDavid du Colombier 	if(f == nil || *f == '\0')
10311c9ee8bSDavid du Colombier 		return nil;
104*252470cdSDavid du Colombier 	if(strcmp(f, "..") == 0 || strlen(f) >= 250)
105*252470cdSDavid du Colombier 		return illegal(f);
106*252470cdSDavid du Colombier 	for(p = f; *p; p++)
107*252470cdSDavid du Colombier 		if(*p < 040 || *p == '/')
108*252470cdSDavid du Colombier 			return illegal(f);
10911c9ee8bSDavid du Colombier 	return f;
11011c9ee8bSDavid du Colombier }
111