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 "authlocal.h"
5 be8b315d 2004-06-17 devnull
6 be8b315d 2004-06-17 devnull enum {
7 cbeb0b26 2006-04-01 devnull ARgiveup = 100
8 be8b315d 2004-06-17 devnull };
9 be8b315d 2004-06-17 devnull
10 be8b315d 2004-06-17 devnull static int
11 be8b315d 2004-06-17 devnull dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
12 be8b315d 2004-06-17 devnull {
13 be8b315d 2004-06-17 devnull int ret;
14 be8b315d 2004-06-17 devnull
15 be8b315d 2004-06-17 devnull for(;;){
16 be8b315d 2004-06-17 devnull if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey)
17 be8b315d 2004-06-17 devnull return ret;
18 be8b315d 2004-06-17 devnull if(getkey == nil)
19 be8b315d 2004-06-17 devnull return ARgiveup; /* don't know how */
20 be8b315d 2004-06-17 devnull if((*getkey)(rpc->arg) < 0)
21 be8b315d 2004-06-17 devnull return ARgiveup; /* user punted */
22 be8b315d 2004-06-17 devnull }
23 be8b315d 2004-06-17 devnull }
24 be8b315d 2004-06-17 devnull
25 be8b315d 2004-06-17 devnull UserPasswd*
26 be8b315d 2004-06-17 devnull auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...)
27 be8b315d 2004-06-17 devnull {
28 be8b315d 2004-06-17 devnull AuthRpc *rpc;
29 be8b315d 2004-06-17 devnull char *f[3], *p, *params;
30 be8b315d 2004-06-17 devnull va_list arg;
31 be8b315d 2004-06-17 devnull UserPasswd *up;
32 be8b315d 2004-06-17 devnull
33 be8b315d 2004-06-17 devnull up = nil;
34 be8b315d 2004-06-17 devnull rpc = nil;
35 be8b315d 2004-06-17 devnull params = nil;
36 be8b315d 2004-06-17 devnull
37 648bb6f7 2005-02-08 devnull rpc = auth_allocrpc();
38 be8b315d 2004-06-17 devnull if(rpc == nil)
39 be8b315d 2004-06-17 devnull goto out;
40 be8b315d 2004-06-17 devnull quotefmtinstall(); /* just in case */
41 be8b315d 2004-06-17 devnull va_start(arg, fmt);
42 be8b315d 2004-06-17 devnull params = vsmprint(fmt, arg);
43 be8b315d 2004-06-17 devnull va_end(arg);
44 be8b315d 2004-06-17 devnull if(params == nil)
45 be8b315d 2004-06-17 devnull goto out;
46 be8b315d 2004-06-17 devnull
47 be8b315d 2004-06-17 devnull if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok
48 be8b315d 2004-06-17 devnull || dorpc(rpc, "read", nil, 0, getkey) != ARok)
49 be8b315d 2004-06-17 devnull goto out;
50 be8b315d 2004-06-17 devnull
51 be8b315d 2004-06-17 devnull rpc->arg[rpc->narg] = '\0';
52 be8b315d 2004-06-17 devnull if(tokenize(rpc->arg, f, 2) != 2){
53 be8b315d 2004-06-17 devnull werrstr("bad answer from factotum");
54 be8b315d 2004-06-17 devnull goto out;
55 be8b315d 2004-06-17 devnull }
56 be8b315d 2004-06-17 devnull up = malloc(sizeof(*up)+rpc->narg+1);
57 be8b315d 2004-06-17 devnull if(up == nil)
58 be8b315d 2004-06-17 devnull goto out;
59 be8b315d 2004-06-17 devnull p = (char*)&up[1];
60 be8b315d 2004-06-17 devnull strcpy(p, f[0]);
61 be8b315d 2004-06-17 devnull up->user = p;
62 be8b315d 2004-06-17 devnull p += strlen(p)+1;
63 be8b315d 2004-06-17 devnull strcpy(p, f[1]);
64 be8b315d 2004-06-17 devnull up->passwd = p;
65 be8b315d 2004-06-17 devnull
66 be8b315d 2004-06-17 devnull out:
67 be8b315d 2004-06-17 devnull free(params);
68 be8b315d 2004-06-17 devnull auth_freerpc(rpc);
69 be8b315d 2004-06-17 devnull return up;
70 be8b315d 2004-06-17 devnull }