xref: /plan9/sys/src/cmd/auth/factotum/pass.c (revision 260f7b65f27bafa63b361ec761042c0d76ce7e36)
19a747e4fSDavid du Colombier /*
29a747e4fSDavid du Colombier  * This is just a repository for a password.
39a747e4fSDavid du Colombier  * We don't want to encourage this, there's
49a747e4fSDavid du Colombier  * no server side.
59a747e4fSDavid du Colombier  */
69a747e4fSDavid du Colombier 
79a747e4fSDavid du Colombier #include "dat.h"
89a747e4fSDavid du Colombier 
99a747e4fSDavid du Colombier typedef struct State State;
109a747e4fSDavid du Colombier struct State
119a747e4fSDavid du Colombier {
129a747e4fSDavid du Colombier 	Key *key;
139a747e4fSDavid du Colombier };
149a747e4fSDavid du Colombier 
159a747e4fSDavid du Colombier enum
169a747e4fSDavid du Colombier {
179a747e4fSDavid du Colombier 	HavePass,
189a747e4fSDavid du Colombier 	Maxphase,
199a747e4fSDavid du Colombier };
209a747e4fSDavid du Colombier 
219a747e4fSDavid du Colombier static char *phasenames[Maxphase] =
229a747e4fSDavid du Colombier {
239a747e4fSDavid du Colombier [HavePass]	"HavePass",
249a747e4fSDavid du Colombier };
259a747e4fSDavid du Colombier 
269a747e4fSDavid du Colombier static int
passinit(Proto * p,Fsstate * fss)279a747e4fSDavid du Colombier passinit(Proto *p, Fsstate *fss)
289a747e4fSDavid du Colombier {
299a747e4fSDavid du Colombier 	int ret;
309a747e4fSDavid du Colombier 	Key *k;
31*260f7b65SDavid du Colombier 	Keyinfo ki;
329a747e4fSDavid du Colombier 	State *s;
339a747e4fSDavid du Colombier 
34*260f7b65SDavid du Colombier 	ret = findkey(&k, mkkeyinfo(&ki, fss, nil), "%s", p->keyprompt);
359a747e4fSDavid du Colombier 	if(ret != RpcOk)
369a747e4fSDavid du Colombier 		return ret;
379a747e4fSDavid du Colombier 	setattrs(fss->attr, k->attr);
389a747e4fSDavid du Colombier 	s = emalloc(sizeof(*s));
399a747e4fSDavid du Colombier 	s->key = k;
409a747e4fSDavid du Colombier 	fss->ps = s;
419a747e4fSDavid du Colombier 	fss->phase = HavePass;
429a747e4fSDavid du Colombier 	return RpcOk;
439a747e4fSDavid du Colombier }
449a747e4fSDavid du Colombier 
459a747e4fSDavid du Colombier static void
passclose(Fsstate * fss)469a747e4fSDavid du Colombier passclose(Fsstate *fss)
479a747e4fSDavid du Colombier {
489a747e4fSDavid du Colombier 	State *s;
499a747e4fSDavid du Colombier 
509a747e4fSDavid du Colombier 	s = fss->ps;
519a747e4fSDavid du Colombier 	if(s->key)
529a747e4fSDavid du Colombier 		closekey(s->key);
539a747e4fSDavid du Colombier 	free(s);
549a747e4fSDavid du Colombier }
559a747e4fSDavid du Colombier 
569a747e4fSDavid du Colombier static int
passread(Fsstate * fss,void * va,uint * n)579a747e4fSDavid du Colombier passread(Fsstate *fss, void *va, uint *n)
589a747e4fSDavid du Colombier {
599a747e4fSDavid du Colombier 	int m;
609a747e4fSDavid du Colombier 	char buf[500];
619a747e4fSDavid du Colombier 	char *pass, *user;
629a747e4fSDavid du Colombier 	State *s;
639a747e4fSDavid du Colombier 
649a747e4fSDavid du Colombier 	s = fss->ps;
659a747e4fSDavid du Colombier 	switch(fss->phase){
669a747e4fSDavid du Colombier 	default:
679a747e4fSDavid du Colombier 		return phaseerror(fss, "read");
689a747e4fSDavid du Colombier 
699a747e4fSDavid du Colombier 	case HavePass:
702ebbfa15SDavid du Colombier 		user = _strfindattr(s->key->attr, "user");
712ebbfa15SDavid du Colombier 		pass = _strfindattr(s->key->privattr, "!password");
729a747e4fSDavid du Colombier 		if(user==nil || pass==nil)
739a747e4fSDavid du Colombier 			return failure(fss, "passread cannot happen");
749a747e4fSDavid du Colombier 		snprint(buf, sizeof buf, "%q %q", user, pass);
759a747e4fSDavid du Colombier 		m = strlen(buf);
769a747e4fSDavid du Colombier 		if(m > *n)
779a747e4fSDavid du Colombier 			return toosmall(fss, m);
789a747e4fSDavid du Colombier 		*n = m;
799a747e4fSDavid du Colombier 		memmove(va, buf, m);
809a747e4fSDavid du Colombier 		return RpcOk;
819a747e4fSDavid du Colombier 	}
829a747e4fSDavid du Colombier }
839a747e4fSDavid du Colombier 
849a747e4fSDavid du Colombier static int
passwrite(Fsstate * fss,void *,uint)859a747e4fSDavid du Colombier passwrite(Fsstate *fss, void*, uint)
869a747e4fSDavid du Colombier {
879a747e4fSDavid du Colombier 	return phaseerror(fss, "write");
889a747e4fSDavid du Colombier }
899a747e4fSDavid du Colombier 
909a747e4fSDavid du Colombier Proto pass =
919a747e4fSDavid du Colombier {
929a747e4fSDavid du Colombier .name=		"pass",
939a747e4fSDavid du Colombier .init=		passinit,
949a747e4fSDavid du Colombier .write=		passwrite,
959a747e4fSDavid du Colombier .read=		passread,
969a747e4fSDavid du Colombier .close=		passclose,
979a747e4fSDavid du Colombier .addkey=		replacekey,
989a747e4fSDavid du Colombier .keyprompt=	"user? !password?",
999a747e4fSDavid du Colombier };
100