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