commit fb7a39bc56092ecd2a52d8b6fc403eda6b905ba1 from: rsc date: Sun Feb 13 18:32:56 2005 UTC add pass proto commit - 05abefb2a0866dde7721be1f5c57fd35a5bd140f commit + fb7a39bc56092ecd2a52d8b6fc403eda6b905ba1 blob - 85fbe5d86fb8a0aeef5769727443d7c74e603724 blob + d426f86f96087e419e29ad20261a21818b7cd1a8 --- src/cmd/auth/factotum/ctl.c +++ src/cmd/auth/factotum/ctl.c @@ -36,7 +36,7 @@ ctlwrite(char *a) { char *p; int i, nmatch, ret; - Attr *attr, **l, **lpriv, **lprotos, *pa, *priv, *protos; + Attr *attr, *kpa, **l, **lpriv, **lprotos, *pa, *priv, *protos; Key *k; Proto *proto; @@ -107,17 +107,22 @@ ctlwrite(char *a) ret = -1; continue; } - if(proto->checkkey == nil){ - werrstr("proto %s does not accept keys", proto->name); - ret = -1; - continue; + if(proto->keyprompt){ + kpa = parseattr(proto->keyprompt); + if(!matchattr(kpa, attr, priv)){ + freeattr(kpa); + werrstr("missing attributes -- want %s", proto->keyprompt); + ret = -1; + continue; + } + freeattr(kpa); } k = emalloc(sizeof(Key)); k->attr = mkattr(AttrNameval, "proto", proto->name, copyattr(attr)); k->privattr = copyattr(priv); k->ref = 1; k->proto = proto; - if((*proto->checkkey)(k) < 0){ + if(proto->checkkey && (*proto->checkkey)(k) < 0){ ret = -1; keyclose(k); continue; blob - 7c716021f32a308b36bb452c687649c513c5a323 blob + d6d58af97be642cb557767b199ec3d937401371f --- src/cmd/auth/factotum/mkfile +++ src/cmd/auth/factotum/mkfile @@ -4,8 +4,10 @@ TARG=factotum PROTO=\ apop.$O\ chap.$O\ + dsa.$O\ p9any.$O\ p9sk1.$O\ + pass.$O\ rsa.$O\ OFILES=\ @@ -14,7 +16,6 @@ OFILES=\ confirm.$O\ conv.$O\ ctl.$O\ - dsa.$O\ fs.$O\ key.$O\ log.$O\ blob - b3d4cb6ad2c87b9b7755d314e63f41bebde4c72a blob + 9c6c73413acffa45783703f3e6fc132e40f3abbe --- src/cmd/auth/factotum/pass.c +++ src/cmd/auth/factotum/pass.c @@ -2,99 +2,40 @@ * This is just a repository for a password. * We don't want to encourage this, there's * no server side. + * + * Client: + * start proto=pass ... + * read password */ +#include "std.h" #include "dat.h" -typedef struct State State; -struct State -{ - Key *key; -}; - -enum -{ - HavePass, - Maxphase, -}; - -static char *phasenames[Maxphase] = -{ -[HavePass] "HavePass", -}; - static int -passinit(Proto *p, Fsstate *fss) +passproto(Conv *c) { - int ask; Key *k; - State *s; - - k = findkey(fss, Kuser, &ask, 0, fss->attr, "%s", p->keyprompt); - if(k == nil){ - if(ask) - return RpcNeedkey; - return failure(fss, nil); - } - setattrs(fss->attr, k->attr); - s = emalloc(sizeof(*s)); - s->key = k; - fss->ps = s; - return RpcOk; + + k = keyfetch(c, "%A", c->attr); + if(k == nil) + return -1; + c->state = "write"; + convprint(c, "%q %q", + strfindattr(k->attr, "user"), + strfindattr(k->privattr, "!password")); + return 0; } -static void -passclose(Fsstate *fss) -{ - State *s; +static Role passroles[] = { + "client", passproto, + 0 +}; - s = fss->ps; - if(s->key) - closekey(s->key); - free(s); -} - -static int -passread(Fsstate *fss, void *va, uint *n) -{ - int m; - char buf[500]; - char *pass, *user; - State *s; - - s = fss->ps; - switch(fss->phase){ - default: - return phaseerror(fss, "read"); - - case HavePass: - user = strfindattr(s->key->attr, "user"); - pass = strfindattr(s->key->privattr, "!password"); - if(user==nil || pass==nil) - return failure(fss, "passread cannot happen"); - snprint(buf, sizeof buf, "%q %q", user, pass); - m = strlen(buf); - if(m > *n) - return toosmall(fss, m); - *n = m; - memmove(va, buf, m); - return RpcOk; - } -} - -static int -passwrite(Fsstate *fss, void*, uint) -{ - return phaseerror(fss, "write"); -} - Proto pass = { -.name= "pass", -.init= passinit, -.write= passwrite, -.read= passread, -.close= passclose, -.addkey= replacekey, -.keyprompt= "user? !password?", + "pass", + passroles, + "user? !password?", + nil, + nil, }; blob - a455bd0a12b6b925ba6e2e58f3ec4c006d3e0403 blob + 5a65e5cd8ffae1c8575c8aa549616f7c255612af --- src/cmd/auth/factotum/proto.c +++ src/cmd/auth/factotum/proto.c @@ -9,6 +9,7 @@ extern Proto mschap; /* chap.c */ extern Proto p9any; /* p9any.c */ extern Proto p9sk1; /* p9sk1.c */ extern Proto p9sk2; /* p9sk2.c */ +extern Proto pass; /* pass.c */ extern Proto rsa; /* rsa.c */ Proto *prototab[] = { @@ -18,6 +19,7 @@ Proto *prototab[] = { &p9any, &p9sk1, &p9sk2, + &pass, &rsa, nil, };