add pass proto
This commit is contained in:
parent
05abefb2a0
commit
fb7a39bc56
4 changed files with 39 additions and 90 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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\
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue