lucho changes

This commit is contained in:
rsc 2005-02-08 20:58:10 +00:00
parent fa467fbe51
commit 648bb6f75a
9 changed files with 147 additions and 75 deletions

View file

@ -1,7 +1,6 @@
#include <u.h> #include <u.h>
#include <libc.h> #include <libc.h>
#include <auth.h> #include <auth.h>
#include <authsrv.h>
#include "authlocal.h" #include "authlocal.h"
Attr* Attr*

View file

@ -24,18 +24,15 @@ auth_challenge(char *fmt, ...)
return nil; return nil;
} }
if((c->afd = open("/mnt/factotum/rpc", ORDWR)) < 0){ if((c->rpc=auth_allocrpc()) == nil
|| auth_rpc(c->rpc, "start", p, strlen(p)) != ARok
|| auth_rpc(c->rpc, "read", nil, 0) != ARok){
Error: Error:
auth_freechal(c); auth_freechal(c);
free(p); free(p);
return nil; return nil;
} }
if((c->rpc=auth_allocrpc(c->afd)) == nil
|| auth_rpc(c->rpc, "start", p, strlen(p)) != ARok
|| auth_rpc(c->rpc, "read", nil, 0) != ARok)
goto Error;
if(c->rpc->narg > sizeof(c->chal)-1){ if(c->rpc->narg > sizeof(c->chal)-1){
werrstr("buffer too small for challenge"); werrstr("buffer too small for challenge");
goto Error; goto Error;
@ -53,7 +50,7 @@ auth_response(Chalstate *c)
AuthInfo *ai; AuthInfo *ai;
ai = nil; ai = nil;
if(c->afd < 0){ if(c->rpc == nil){
werrstr("auth_response: connection not open"); werrstr("auth_response: connection not open");
return nil; return nil;
} }
@ -94,9 +91,7 @@ auth_response(Chalstate *c)
} }
Out: Out:
close(c->afd);
auth_freerpc(c->rpc); auth_freerpc(c->rpc);
c->afd = -1;
c->rpc = nil; c->rpc = nil;
return ai; return ai;
} }
@ -106,12 +101,8 @@ auth_freechal(Chalstate *c)
{ {
if(c == nil) if(c == nil)
return; return;
if(c->afd >= 0)
close(c->afd);
if(c->rpc != nil) if(c->rpc != nil)
auth_freerpc(c->rpc); auth_freerpc(c->rpc);
memset(c, 0xBB, sizeof(*c)); memset(c, 0xBB, sizeof(*c));
free(c); free(c);
} }

View file

@ -6,23 +6,13 @@ int
auth_getkey(char *params) auth_getkey(char *params)
{ {
char *name; char *name;
Dir *d;
int pid; int pid;
Waitmsg *w; Waitmsg *w;
/* start /factotum to query for a key */ /* start /factotum to query for a key */
name = "/factotum"; name = unsharp("#9/bin/factotum");
d = dirstat(name); if(name == nil || access(name, AEXEC) < 0){
if(d == nil){ werrstr("auth_getkey: no $PLAN9/bin/factotum: didn't get key %s", params);
name = "/boot/factotum";
d = dirstat(name);
}
if(d == nil){
werrstr("auth_getkey: no /factotum or /boot/factotum: didn't get key %s", params);
return -1;
}
if(0) if(d->type != '/'){
werrstr("auth_getkey: /factotum may be bad: didn't get key %s", params);
return -1; return -1;
} }
switch(pid = fork()){ switch(pid = fork()){
@ -33,6 +23,7 @@ if(0) if(d->type != '/'){
execl(name, "getkey", "-g", params, nil); execl(name, "getkey", "-g", params, nil);
exits(0); exits(0);
default: default:
free(name);
for(;;){ for(;;){
w = wait(); w = wait();
if(w == nil) if(w == nil)

View file

@ -27,7 +27,6 @@ auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...)
{ {
AuthRpc *rpc; AuthRpc *rpc;
char *f[3], *p, *params; char *f[3], *p, *params;
int fd;
va_list arg; va_list arg;
UserPasswd *up; UserPasswd *up;
@ -35,10 +34,7 @@ auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...)
rpc = nil; rpc = nil;
params = nil; params = nil;
fd = open("/mnt/factotum/rpc", ORDWR); rpc = auth_allocrpc();
if(fd < 0)
goto out;
rpc = auth_allocrpc(fd);
if(rpc == nil) if(rpc == nil)
goto out; goto out;
quotefmtinstall(); /* just in case */ quotefmtinstall(); /* just in case */
@ -70,6 +66,5 @@ auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...)
out: out:
free(params); free(params);
auth_freerpc(rpc); auth_freerpc(rpc);
close(fd);
return up; return up;
} }

View file

@ -2,6 +2,7 @@
#include <libc.h> #include <libc.h>
#include <fcall.h> #include <fcall.h>
#include <auth.h> #include <auth.h>
#include <9pclient.h>
#include "authlocal.h" #include "authlocal.h"
enum { enum {
@ -179,7 +180,6 @@ Error:
AuthInfo* AuthInfo*
auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...) auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...)
{ {
int afd;
char *p; char *p;
va_list arg; va_list arg;
AuthInfo *ai; AuthInfo *ai;
@ -190,14 +190,7 @@ auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...)
p = vsmprint(fmt, arg); p = vsmprint(fmt, arg);
va_end(arg); va_end(arg);
afd = open("/mnt/factotum/rpc", ORDWR); rpc = auth_allocrpc();
if(afd < 0){
werrstr("opening /mnt/factotum/rpc: %r");
free(p);
return nil;
}
rpc = auth_allocrpc(afd);
if(rpc == nil){ if(rpc == nil){
free(p); free(p);
return nil; return nil;
@ -206,7 +199,95 @@ auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...)
ai = fauth_proxy(fd, rpc, getkey, p); ai = fauth_proxy(fd, rpc, getkey, p);
free(p); free(p);
auth_freerpc(rpc); auth_freerpc(rpc);
close(afd); return ai;
}
/*
* this just proxies what the factotum tells it to.
*/
AuthInfo*
fsfauth_proxy(CFid *fid, AuthRpc *rpc, AuthGetkey *getkey, char *params)
{
char *buf;
int m, n, ret;
AuthInfo *a;
char oerr[ERRMAX];
rerrstr(oerr, sizeof oerr);
werrstr("UNKNOWN AUTH ERROR");
if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok){
werrstr("fauth_proxy start: %r");
return nil;
}
buf = malloc(AuthRpcMax);
if(buf == nil)
return nil;
for(;;){
switch(dorpc(rpc, "read", nil, 0, getkey)){
case ARdone:
free(buf);
a = auth_getinfo(rpc);
errstr(oerr, sizeof oerr); /* no error, restore whatever was there */
return a;
case ARok:
if(fswrite(fid, rpc->arg, rpc->narg) != rpc->narg){
werrstr("auth_proxy write fid: %r");
goto Error;
}
break;
case ARphase:
n = 0;
memset(buf, 0, AuthRpcMax);
while((ret = dorpc(rpc, "write", buf, n, getkey)) == ARtoosmall){
if(atoi(rpc->arg) > AuthRpcMax)
break;
m = fsread(fid, buf+n, atoi(rpc->arg)-n);
if(m <= 0){
if(m == 0)
werrstr("auth_proxy short read: %s", buf);
goto Error;
}
n += m;
}
if(ret != ARok){
werrstr("auth_proxy rpc write: %s: %r", buf);
goto Error;
}
break;
default:
werrstr("auth_proxy rpc: %r");
goto Error;
}
}
Error:
free(buf);
return nil;
}
AuthInfo*
fsauth_proxy(CFid *fid, AuthGetkey *getkey, char *fmt, ...)
{
char *p;
va_list arg;
AuthInfo *ai;
AuthRpc *rpc;
quotefmtinstall(); /* just in case */
va_start(arg, fmt);
p = vsmprint(fmt, arg);
va_end(arg);
rpc = auth_allocrpc();
if(rpc == nil){
free(p);
return nil;
}
ai = fsfauth_proxy(fid, rpc, getkey, p);
free(p);
auth_freerpc(rpc);
return ai; return ai;
} }

View file

@ -28,18 +28,12 @@ auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nr
{ {
char *p, *s; char *p, *s;
va_list arg; va_list arg;
int afd;
AuthRpc *rpc; AuthRpc *rpc;
Attr *a; Attr *a;
if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0) if((rpc = auth_allocrpc()) == nil)
return -1; return -1;
if((rpc = auth_allocrpc(afd)) == nil){
close(afd);
return -1;
}
quotefmtinstall(); /* just in case */ quotefmtinstall(); /* just in case */
va_start(arg, fmt); va_start(arg, fmt);
p = vsmprint(fmt, arg); p = vsmprint(fmt, arg);
@ -50,7 +44,6 @@ auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nr
|| dorpc(rpc, "write", chal, nchal, getkey) != ARok || dorpc(rpc, "write", chal, nchal, getkey) != ARok
|| dorpc(rpc, "read", nil, 0, getkey) != ARok){ || dorpc(rpc, "read", nil, 0, getkey) != ARok){
free(p); free(p);
close(afd);
auth_freerpc(rpc); auth_freerpc(rpc);
return -1; return -1;
} }
@ -67,7 +60,6 @@ auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nr
user[0] = '\0'; user[0] = '\0';
_freeattr(a); _freeattr(a);
close(afd);
auth_freerpc(rpc); auth_freerpc(rpc);
return nresp; return nresp;
} }

View file

@ -1,6 +1,7 @@
#include <u.h> #include <u.h>
#include <libc.h> #include <libc.h>
#include <auth.h> #include <auth.h>
#include <9pclient.h>
#include "authlocal.h" #include "authlocal.h"
static struct { static struct {
@ -17,6 +18,24 @@ static struct {
"error", ARerror, "error", ARerror,
}; };
static long
rpcread(AuthRpc *rpc, void *buf, int buflen)
{
if (rpc->afd >= 0)
return read(rpc->afd, buf, buflen);
else
return fsread(rpc->afid, buf, buflen);
}
static long
rpcwrite(AuthRpc *rpc, void *buf, int buflen)
{
if (rpc->afd >= 0)
return write(rpc->afd, buf, buflen);
else
return fswrite(rpc->afid, buf, buflen);
}
static int static int
classify(char *buf, uint n, AuthRpc *rpc) classify(char *buf, uint n, AuthRpc *rpc)
{ {
@ -40,20 +59,31 @@ classify(char *buf, uint n, AuthRpc *rpc)
} }
AuthRpc* AuthRpc*
auth_allocrpc(int afd) auth_allocrpc(void)
{ {
AuthRpc *rpc; AuthRpc *rpc;
rpc = mallocz(sizeof(*rpc), 1); rpc = mallocz(sizeof(*rpc), 1);
if(rpc == nil) if(rpc == nil)
return nil; return nil;
rpc->afd = afd; rpc->afd = open("/mnt/factotum/rpc", ORDWR);
if(rpc->afd < 0){
rpc->afid = nsopen("factotum", nil, "factotum/rpc", ORDWR);
if(rpc->afid == nil){
free(rpc);
return nil;
}
}
return rpc; return rpc;
} }
void void
auth_freerpc(AuthRpc *rpc) auth_freerpc(AuthRpc *rpc)
{ {
if(rpc->afd >= 0)
close(rpc->afd);
if(rpc->afid == nil)
fsclose(rpc->afid);
free(rpc); free(rpc);
} }
@ -72,13 +102,13 @@ auth_rpc(AuthRpc *rpc, char *verb, void *a, int na)
memmove(rpc->obuf, verb, l); memmove(rpc->obuf, verb, l);
rpc->obuf[l] = ' '; rpc->obuf[l] = ' ';
memmove(rpc->obuf+l+1, a, na); memmove(rpc->obuf+l+1, a, na);
if((n=write(rpc->afd, rpc->obuf, l+1+na)) != l+1+na){ if((n=rpcwrite(rpc, rpc->obuf, l+1+na)) != l+1+na){
if(n >= 0) if(n >= 0)
werrstr("auth_rpc short write"); werrstr("auth_rpc short write");
return ARrpcfailure; return ARrpcfailure;
} }
if((n=read(rpc->afd, rpc->ibuf, AuthRpcMax)) < 0) if((n=rpcread(rpc, rpc->ibuf, AuthRpcMax)) < 0)
return ARrpcfailure; return ARrpcfailure;
rpc->ibuf[n] = '\0'; rpc->ibuf[n] = '\0';

View file

@ -11,7 +11,6 @@ auth_wep(char *dev, char *fmt, ...)
{ {
AuthRpc *rpc; AuthRpc *rpc;
char *params, *p; char *params, *p;
int fd;
va_list arg; va_list arg;
int rv; int rv;
@ -22,11 +21,7 @@ auth_wep(char *dev, char *fmt, ...)
return rv; return rv;
} }
fd = open("/mnt/factotum/rpc", ORDWR); rpc = auth_allocrpc();
if(fd < 0)
return rv;
rpc = auth_allocrpc(fd);
if(rpc != nil){ if(rpc != nil){
quotefmtinstall(); /* just in case */ quotefmtinstall(); /* just in case */
va_start(arg, fmt); va_start(arg, fmt);
@ -44,7 +39,5 @@ auth_wep(char *dev, char *fmt, ...)
} }
auth_freerpc(rpc); auth_freerpc(rpc);
} }
close(fd);
return rv; return rv;
} }

View file

@ -4,19 +4,19 @@ PLAN9=../..
LIB=libauth.a LIB=libauth.a
OFILES=\ OFILES=\
# amount.$O\ # amount.$O\
# amount_getkey.$O\ amount_getkey.$O\
attr.$O\ attr.$O\
# auth_attr.$O\ auth_attr.$O\
# auth_challenge.$O\ auth_challenge.$O\
# auth_chuid.$O\ # auth_chuid.$O\
# auth_getkey.$O\ auth_getkey.$O\
# auth_getuserpasswd.$O\ auth_getuserpasswd.$O\
# auth_proxy.$O\ auth_proxy.$O\
# auth_respond.$O\ auth_respond.$O\
# auth_rpc.$O\ auth_rpc.$O\
# auth_userpasswd.$O\ auth_userpasswd.$O\
# auth_wep.$O\ auth_wep.$O\
# login.$O\ login.$O\
# newns.$O\ # newns.$O\
# noworld.$O\ # noworld.$O\