commit 648bb6f75a801e6d605fcd061f0b14fecc07a8be from: rsc date: Tue Feb 08 20:58:10 2005 UTC lucho changes commit - fa467fbe51e3aba23fce6639afd8939c046c8c2d commit + 648bb6f75a801e6d605fcd061f0b14fecc07a8be blob - 8842590a98d99c9b63ff6ed9110a66535a86505f blob + 2acc32f7990c17677e6188018132606e53f76ce1 --- src/libauth/auth_attr.c +++ src/libauth/auth_attr.c @@ -1,7 +1,6 @@ #include #include #include -#include #include "authlocal.h" Attr* blob - 298f5f1b214dfae2ad019c29101a7e60faacaa00 blob + b12d0fe5ba94c2585d1feaf084390dc64e02dc39 --- src/libauth/auth_challenge.c +++ src/libauth/auth_challenge.c @@ -24,18 +24,15 @@ auth_challenge(char *fmt, ...) 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: auth_freechal(c); free(p); 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){ werrstr("buffer too small for challenge"); goto Error; @@ -53,7 +50,7 @@ auth_response(Chalstate *c) AuthInfo *ai; ai = nil; - if(c->afd < 0){ + if(c->rpc == nil){ werrstr("auth_response: connection not open"); return nil; } @@ -94,9 +91,7 @@ auth_response(Chalstate *c) } Out: - close(c->afd); auth_freerpc(c->rpc); - c->afd = -1; c->rpc = nil; return ai; } @@ -106,12 +101,8 @@ auth_freechal(Chalstate *c) { if(c == nil) return; - - if(c->afd >= 0) - close(c->afd); if(c->rpc != nil) auth_freerpc(c->rpc); - memset(c, 0xBB, sizeof(*c)); free(c); } blob - 0ae28b1e44613ca66f746cbceb085396ae502c0b blob + 6c26d0ad6faefea72de0ccc5c3a8b30e2682ec12 --- src/libauth/auth_getkey.c +++ src/libauth/auth_getkey.c @@ -6,25 +6,15 @@ int auth_getkey(char *params) { char *name; - Dir *d; int pid; Waitmsg *w; /* start /factotum to query for a key */ - name = "/factotum"; - d = dirstat(name); - if(d == nil){ - name = "/boot/factotum"; - d = dirstat(name); - } - if(d == nil){ - werrstr("auth_getkey: no /factotum or /boot/factotum: didn't get key %s", params); + name = unsharp("#9/bin/factotum"); + if(name == nil || access(name, AEXEC) < 0){ + werrstr("auth_getkey: no $PLAN9/bin/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; - } switch(pid = fork()){ case -1: werrstr("can't fork for %s: %r", name); @@ -33,6 +23,7 @@ if(0) if(d->type != '/'){ execl(name, "getkey", "-g", params, nil); exits(0); default: + free(name); for(;;){ w = wait(); if(w == nil) blob - 4d66dcecbf0ea1a91f111dd54ea7cc6a243ca2d4 blob + 4a40b263c69625331936039fa33d46d953328b6b --- src/libauth/auth_getuserpasswd.c +++ src/libauth/auth_getuserpasswd.c @@ -27,7 +27,6 @@ auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...) { AuthRpc *rpc; char *f[3], *p, *params; - int fd; va_list arg; UserPasswd *up; @@ -35,10 +34,7 @@ auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...) rpc = nil; params = nil; - fd = open("/mnt/factotum/rpc", ORDWR); - if(fd < 0) - goto out; - rpc = auth_allocrpc(fd); + rpc = auth_allocrpc(); if(rpc == nil) goto out; quotefmtinstall(); /* just in case */ @@ -70,6 +66,5 @@ auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...) out: free(params); auth_freerpc(rpc); - close(fd); return up; } blob - 186031eb7724aa111f6619f537a433bd0a903e87 blob + 436c1b77f7c474c25c638833a084e377f5c3b95e --- src/libauth/auth_proxy.c +++ src/libauth/auth_proxy.c @@ -2,6 +2,7 @@ #include #include #include +#include <9pclient.h> #include "authlocal.h" enum { @@ -179,7 +180,6 @@ Error: AuthInfo* auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...) { - int afd; char *p; va_list arg; AuthInfo *ai; @@ -190,23 +190,104 @@ auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...) p = vsmprint(fmt, arg); va_end(arg); - afd = open("/mnt/factotum/rpc", ORDWR); - if(afd < 0){ - werrstr("opening /mnt/factotum/rpc: %r"); + rpc = auth_allocrpc(); + if(rpc == nil){ free(p); return nil; } - rpc = auth_allocrpc(afd); + ai = fauth_proxy(fd, rpc, getkey, p); + free(p); + auth_freerpc(rpc); + 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 = fauth_proxy(fd, rpc, getkey, p); + ai = fsfauth_proxy(fid, rpc, getkey, p); free(p); auth_freerpc(rpc); - close(afd); return ai; } blob - 910f06b2837962a1b2d693e43ed23aae9295e3c9 blob + d39facfd0ea03ee273729eed809f0e83a7cdb326 --- src/libauth/auth_respond.c +++ src/libauth/auth_respond.c @@ -28,17 +28,11 @@ auth_respond(void *chal, uint nchal, char *user, uint { char *p, *s; va_list arg; - int afd; AuthRpc *rpc; Attr *a; - if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0) + if((rpc = auth_allocrpc()) == nil) return -1; - - if((rpc = auth_allocrpc(afd)) == nil){ - close(afd); - return -1; - } quotefmtinstall(); /* just in case */ va_start(arg, fmt); @@ -50,7 +44,6 @@ auth_respond(void *chal, uint nchal, char *user, uint || dorpc(rpc, "write", chal, nchal, getkey) != ARok || dorpc(rpc, "read", nil, 0, getkey) != ARok){ free(p); - close(afd); auth_freerpc(rpc); return -1; } @@ -67,7 +60,6 @@ auth_respond(void *chal, uint nchal, char *user, uint user[0] = '\0'; _freeattr(a); - close(afd); auth_freerpc(rpc); return nresp; } blob - 4333a7381272672658776e2f6f7bd4d563088feb blob + ffe3b08e1f1ef1ccc63557448c6d01ff1d9a54df --- src/libauth/auth_rpc.c +++ src/libauth/auth_rpc.c @@ -1,6 +1,7 @@ #include #include #include +#include <9pclient.h> #include "authlocal.h" static struct { @@ -17,6 +18,24 @@ static struct { "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 classify(char *buf, uint n, AuthRpc *rpc) { @@ -40,20 +59,31 @@ classify(char *buf, uint n, AuthRpc *rpc) } AuthRpc* -auth_allocrpc(int afd) +auth_allocrpc(void) { AuthRpc *rpc; rpc = mallocz(sizeof(*rpc), 1); if(rpc == 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; } void auth_freerpc(AuthRpc *rpc) { + if(rpc->afd >= 0) + close(rpc->afd); + if(rpc->afid == nil) + fsclose(rpc->afid); free(rpc); } @@ -72,13 +102,13 @@ auth_rpc(AuthRpc *rpc, char *verb, void *a, int na) memmove(rpc->obuf, verb, l); rpc->obuf[l] = ' '; 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) werrstr("auth_rpc short write"); return ARrpcfailure; } - if((n=read(rpc->afd, rpc->ibuf, AuthRpcMax)) < 0) + if((n=rpcread(rpc, rpc->ibuf, AuthRpcMax)) < 0) return ARrpcfailure; rpc->ibuf[n] = '\0'; blob - afde46b90ed04295641227aff1ae2ed012c0181b blob + 75d820a4277fa206319176514ed3680c67a14a91 --- src/libauth/auth_wep.c +++ src/libauth/auth_wep.c @@ -11,7 +11,6 @@ auth_wep(char *dev, char *fmt, ...) { AuthRpc *rpc; char *params, *p; - int fd; va_list arg; int rv; @@ -22,11 +21,7 @@ auth_wep(char *dev, char *fmt, ...) return rv; } - fd = open("/mnt/factotum/rpc", ORDWR); - if(fd < 0) - return rv; - - rpc = auth_allocrpc(fd); + rpc = auth_allocrpc(); if(rpc != nil){ quotefmtinstall(); /* just in case */ va_start(arg, fmt); @@ -44,7 +39,5 @@ auth_wep(char *dev, char *fmt, ...) } auth_freerpc(rpc); } - close(fd); - return rv; } blob - 647835bc3c40ace9d8221eaf9edf4397ecc0defd blob + 2512e9c7182e49cac18662a5aade243b9a79b4f6 --- src/libauth/mkfile +++ src/libauth/mkfile @@ -4,19 +4,19 @@ PLAN9=../.. LIB=libauth.a OFILES=\ # amount.$O\ -# amount_getkey.$O\ + amount_getkey.$O\ attr.$O\ -# auth_attr.$O\ -# auth_challenge.$O\ + auth_attr.$O\ + auth_challenge.$O\ # auth_chuid.$O\ -# auth_getkey.$O\ -# auth_getuserpasswd.$O\ -# auth_proxy.$O\ -# auth_respond.$O\ -# auth_rpc.$O\ -# auth_userpasswd.$O\ -# auth_wep.$O\ -# login.$O\ + auth_getkey.$O\ + auth_getuserpasswd.$O\ + auth_proxy.$O\ + auth_respond.$O\ + auth_rpc.$O\ + auth_userpasswd.$O\ + auth_wep.$O\ + login.$O\ # newns.$O\ # noworld.$O\