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