lucho changes
This commit is contained in:
parent
fa467fbe51
commit
648bb6f75a
9 changed files with 147 additions and 75 deletions
|
|
@ -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*
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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\
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue