add pass proto

This commit is contained in:
rsc 2005-02-13 18:32:56 +00:00
parent 05abefb2a0
commit fb7a39bc56
4 changed files with 39 additions and 90 deletions

View file

@ -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;

View file

@ -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\

View file

@ -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;
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");
}
static Role passroles[] = {
"client", passproto,
0
};
Proto pass =
{
.name= "pass",
.init= passinit,
.write= passwrite,
.read= passread,
.close= passclose,
.addkey= replacekey,
.keyprompt= "user? !password?",
"pass",
passroles,
"user? !password?",
nil,
nil,
};

View file

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