1*8ccd4a63SDavid du Colombier #include <u.h> 2*8ccd4a63SDavid du Colombier #include <libc.h> 3*8ccd4a63SDavid du Colombier #include <auth.h> 4*8ccd4a63SDavid du Colombier #include <authsrv.h> 5*8ccd4a63SDavid du Colombier #include "authlocal.h" 6*8ccd4a63SDavid du Colombier 7*8ccd4a63SDavid du Colombier enum { 8*8ccd4a63SDavid du Colombier ARgiveup = 100, 9*8ccd4a63SDavid du Colombier }; 10*8ccd4a63SDavid du Colombier 11*8ccd4a63SDavid du Colombier static int 12*8ccd4a63SDavid du Colombier dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey) 13*8ccd4a63SDavid du Colombier { 14*8ccd4a63SDavid du Colombier int ret; 15*8ccd4a63SDavid du Colombier 16*8ccd4a63SDavid du Colombier for(;;){ 17*8ccd4a63SDavid du Colombier if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey) 18*8ccd4a63SDavid du Colombier return ret; 19*8ccd4a63SDavid du Colombier if(getkey == nil) 20*8ccd4a63SDavid du Colombier return ARgiveup; /* don't know how */ 21*8ccd4a63SDavid du Colombier if((*getkey)(rpc->arg) < 0) 22*8ccd4a63SDavid du Colombier return ARgiveup; /* user punted */ 23*8ccd4a63SDavid du Colombier } 24*8ccd4a63SDavid du Colombier } 25*8ccd4a63SDavid du Colombier 26*8ccd4a63SDavid du Colombier int 27*8ccd4a63SDavid du Colombier auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nresp, AuthGetkey *getkey, char *fmt, ...) 28*8ccd4a63SDavid du Colombier { 29*8ccd4a63SDavid du Colombier char *p, *s; 30*8ccd4a63SDavid du Colombier va_list arg; 31*8ccd4a63SDavid du Colombier int afd; 32*8ccd4a63SDavid du Colombier AuthRpc *rpc; 33*8ccd4a63SDavid du Colombier Attr *a; 34*8ccd4a63SDavid du Colombier 35*8ccd4a63SDavid du Colombier if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0) 36*8ccd4a63SDavid du Colombier return -1; 37*8ccd4a63SDavid du Colombier 38*8ccd4a63SDavid du Colombier if((rpc = auth_allocrpc(afd)) == nil){ 39*8ccd4a63SDavid du Colombier close(afd); 40*8ccd4a63SDavid du Colombier return -1; 41*8ccd4a63SDavid du Colombier } 42*8ccd4a63SDavid du Colombier 43*8ccd4a63SDavid du Colombier quotefmtinstall(); /* just in case */ 44*8ccd4a63SDavid du Colombier va_start(arg, fmt); 45*8ccd4a63SDavid du Colombier p = vsmprint(fmt, arg); 46*8ccd4a63SDavid du Colombier va_end(arg); 47*8ccd4a63SDavid du Colombier 48*8ccd4a63SDavid du Colombier if(p==nil 49*8ccd4a63SDavid du Colombier || dorpc(rpc, "start", p, strlen(p), getkey) != ARok 50*8ccd4a63SDavid du Colombier || dorpc(rpc, "write", chal, nchal, getkey) != ARok 51*8ccd4a63SDavid du Colombier || dorpc(rpc, "read", nil, 0, getkey) != ARok){ 52*8ccd4a63SDavid du Colombier free(p); 53*8ccd4a63SDavid du Colombier close(afd); 54*8ccd4a63SDavid du Colombier auth_freerpc(rpc); 55*8ccd4a63SDavid du Colombier return -1; 56*8ccd4a63SDavid du Colombier } 57*8ccd4a63SDavid du Colombier free(p); 58*8ccd4a63SDavid du Colombier 59*8ccd4a63SDavid du Colombier if(rpc->narg < nresp) 60*8ccd4a63SDavid du Colombier nresp = rpc->narg; 61*8ccd4a63SDavid du Colombier memmove(resp, rpc->arg, nresp); 62*8ccd4a63SDavid du Colombier 63*8ccd4a63SDavid du Colombier if((a = auth_attr(rpc)) != nil 64*8ccd4a63SDavid du Colombier && (s = _strfindattr(a, "user")) != nil && strlen(s) < nuser) 65*8ccd4a63SDavid du Colombier strcpy(user, s); 66*8ccd4a63SDavid du Colombier else if(nuser > 0) 67*8ccd4a63SDavid du Colombier user[0] = '\0'; 68*8ccd4a63SDavid du Colombier 69*8ccd4a63SDavid du Colombier _freeattr(a); 70*8ccd4a63SDavid du Colombier close(afd); 71*8ccd4a63SDavid du Colombier auth_freerpc(rpc); 72*8ccd4a63SDavid du Colombier return nresp; 73*8ccd4a63SDavid du Colombier } 74