Blame


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