Commit Diff


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,
 };