commit - 05abefb2a0866dde7721be1f5c57fd35a5bd140f
commit + fb7a39bc56092ecd2a52d8b6fc403eda6b905ba1
blob - 85fbe5d86fb8a0aeef5769727443d7c74e603724
blob + d426f86f96087e419e29ad20261a21818b7cd1a8
--- src/cmd/auth/factotum/ctl.c
+++ src/cmd/auth/factotum/ctl.c
{
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;
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
PROTO=\
apop.$O\
chap.$O\
+ dsa.$O\
p9any.$O\
p9sk1.$O\
+ pass.$O\
rsa.$O\
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
* 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
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[] = {
&p9any,
&p9sk1,
&p9sk2,
+ &pass,
&rsa,
nil,
};