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 be8b315d 2004-06-17 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 int afd;
32 be8b315d 2004-06-17 devnull AuthRpc *rpc;
33 be8b315d 2004-06-17 devnull Attr *a;
34 be8b315d 2004-06-17 devnull
35 be8b315d 2004-06-17 devnull if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0)
36 be8b315d 2004-06-17 devnull return -1;
37 be8b315d 2004-06-17 devnull
38 be8b315d 2004-06-17 devnull if((rpc = auth_allocrpc(afd)) == nil){
39 be8b315d 2004-06-17 devnull close(afd);
40 be8b315d 2004-06-17 devnull return -1;
41 be8b315d 2004-06-17 devnull }
42 be8b315d 2004-06-17 devnull
43 be8b315d 2004-06-17 devnull quotefmtinstall(); /* just in case */
44 be8b315d 2004-06-17 devnull va_start(arg, fmt);
45 be8b315d 2004-06-17 devnull p = vsmprint(fmt, arg);
46 be8b315d 2004-06-17 devnull va_end(arg);
47 be8b315d 2004-06-17 devnull
48 be8b315d 2004-06-17 devnull if(p==nil
49 be8b315d 2004-06-17 devnull || dorpc(rpc, "start", p, strlen(p), getkey) != ARok
50 be8b315d 2004-06-17 devnull || dorpc(rpc, "write", chal, nchal, getkey) != ARok
51 be8b315d 2004-06-17 devnull || dorpc(rpc, "read", nil, 0, getkey) != ARok){
52 be8b315d 2004-06-17 devnull free(p);
53 be8b315d 2004-06-17 devnull close(afd);
54 be8b315d 2004-06-17 devnull auth_freerpc(rpc);
55 be8b315d 2004-06-17 devnull return -1;
56 be8b315d 2004-06-17 devnull }
57 be8b315d 2004-06-17 devnull free(p);
58 be8b315d 2004-06-17 devnull
59 be8b315d 2004-06-17 devnull if(rpc->narg < nresp)
60 be8b315d 2004-06-17 devnull nresp = rpc->narg;
61 be8b315d 2004-06-17 devnull memmove(resp, rpc->arg, nresp);
62 be8b315d 2004-06-17 devnull
63 be8b315d 2004-06-17 devnull if((a = auth_attr(rpc)) != nil
64 be8b315d 2004-06-17 devnull && (s = _strfindattr(a, "user")) != nil && strlen(s) < nuser)
65 be8b315d 2004-06-17 devnull strcpy(user, s);
66 be8b315d 2004-06-17 devnull else if(nuser > 0)
67 be8b315d 2004-06-17 devnull user[0] = '\0';
68 be8b315d 2004-06-17 devnull
69 be8b315d 2004-06-17 devnull _freeattr(a);
70 be8b315d 2004-06-17 devnull close(afd);
71 be8b315d 2004-06-17 devnull auth_freerpc(rpc);
72 be8b315d 2004-06-17 devnull return nresp;
73 be8b315d 2004-06-17 devnull }