blob: b3cf6665f16a877f6e0899d81066a83c45a2c31a [file] [log] [blame]
rscbe8b3152004-06-17 03:27:35 +00001#include <u.h>
2#include <libc.h>
3#include <auth.h>
4#include <authsrv.h>
5#include "authlocal.h"
6
7enum {
rsccbeb0b22006-04-01 19:24:03 +00008 ARgiveup = 100
rscbe8b3152004-06-17 03:27:35 +00009};
10
11static int
12dorpc(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
26int
27auth_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;
rscbe8b3152004-06-17 03:27:35 +000031 AuthRpc *rpc;
32 Attr *a;
33
rsc648bb6f2005-02-08 20:58:10 +000034 if((rpc = auth_allocrpc()) == nil)
rscbe8b3152004-06-17 03:27:35 +000035 return -1;
rscbe8b3152004-06-17 03:27:35 +000036
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);
rscbe8b3152004-06-17 03:27:35 +000047 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);
rscbe8b3152004-06-17 03:27:35 +000063 auth_freerpc(rpc);
64 return nresp;
65}