xref: /plan9-contrib/sys/src/cmd/unix/drawterm/libauth/auth_respond.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <auth.h>
4*8ccd4a63SDavid du Colombier #include <authsrv.h>
5*8ccd4a63SDavid du Colombier #include "authlocal.h"
6*8ccd4a63SDavid du Colombier 
7*8ccd4a63SDavid du Colombier enum {
8*8ccd4a63SDavid du Colombier 	ARgiveup = 100,
9*8ccd4a63SDavid du Colombier };
10*8ccd4a63SDavid du Colombier 
11*8ccd4a63SDavid du Colombier static int
12*8ccd4a63SDavid du Colombier dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
13*8ccd4a63SDavid du Colombier {
14*8ccd4a63SDavid du Colombier 	int ret;
15*8ccd4a63SDavid du Colombier 
16*8ccd4a63SDavid du Colombier 	for(;;){
17*8ccd4a63SDavid du Colombier 		if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey)
18*8ccd4a63SDavid du Colombier 			return ret;
19*8ccd4a63SDavid du Colombier 		if(getkey == nil)
20*8ccd4a63SDavid du Colombier 			return ARgiveup;	/* don't know how */
21*8ccd4a63SDavid du Colombier 		if((*getkey)(rpc->arg) < 0)
22*8ccd4a63SDavid du Colombier 			return ARgiveup;	/* user punted */
23*8ccd4a63SDavid du Colombier 	}
24*8ccd4a63SDavid du Colombier }
25*8ccd4a63SDavid du Colombier 
26*8ccd4a63SDavid du Colombier int
27*8ccd4a63SDavid du Colombier auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nresp, AuthGetkey *getkey, char *fmt, ...)
28*8ccd4a63SDavid du Colombier {
29*8ccd4a63SDavid du Colombier 	char *p, *s;
30*8ccd4a63SDavid du Colombier 	va_list arg;
31*8ccd4a63SDavid du Colombier 	int afd;
32*8ccd4a63SDavid du Colombier 	AuthRpc *rpc;
33*8ccd4a63SDavid du Colombier 	Attr *a;
34*8ccd4a63SDavid du Colombier 
35*8ccd4a63SDavid du Colombier 	if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0)
36*8ccd4a63SDavid du Colombier 		return -1;
37*8ccd4a63SDavid du Colombier 
38*8ccd4a63SDavid du Colombier 	if((rpc = auth_allocrpc(afd)) == nil){
39*8ccd4a63SDavid du Colombier 		close(afd);
40*8ccd4a63SDavid du Colombier 		return -1;
41*8ccd4a63SDavid du Colombier 	}
42*8ccd4a63SDavid du Colombier 
43*8ccd4a63SDavid du Colombier 	quotefmtinstall();	/* just in case */
44*8ccd4a63SDavid du Colombier 	va_start(arg, fmt);
45*8ccd4a63SDavid du Colombier 	p = vsmprint(fmt, arg);
46*8ccd4a63SDavid du Colombier 	va_end(arg);
47*8ccd4a63SDavid du Colombier 
48*8ccd4a63SDavid du Colombier 	if(p==nil
49*8ccd4a63SDavid du Colombier 	|| dorpc(rpc, "start", p, strlen(p), getkey) != ARok
50*8ccd4a63SDavid du Colombier 	|| dorpc(rpc, "write", chal, nchal, getkey) != ARok
51*8ccd4a63SDavid du Colombier 	|| dorpc(rpc, "read", nil, 0, getkey) != ARok){
52*8ccd4a63SDavid du Colombier 		free(p);
53*8ccd4a63SDavid du Colombier 		close(afd);
54*8ccd4a63SDavid du Colombier 		auth_freerpc(rpc);
55*8ccd4a63SDavid du Colombier 		return -1;
56*8ccd4a63SDavid du Colombier 	}
57*8ccd4a63SDavid du Colombier 	free(p);
58*8ccd4a63SDavid du Colombier 
59*8ccd4a63SDavid du Colombier 	if(rpc->narg < nresp)
60*8ccd4a63SDavid du Colombier 		nresp = rpc->narg;
61*8ccd4a63SDavid du Colombier 	memmove(resp, rpc->arg, nresp);
62*8ccd4a63SDavid du Colombier 
63*8ccd4a63SDavid du Colombier 	if((a = auth_attr(rpc)) != nil
64*8ccd4a63SDavid du Colombier 	&& (s = _strfindattr(a, "user")) != nil && strlen(s) < nuser)
65*8ccd4a63SDavid du Colombier 		strcpy(user, s);
66*8ccd4a63SDavid du Colombier 	else if(nuser > 0)
67*8ccd4a63SDavid du Colombier 		user[0] = '\0';
68*8ccd4a63SDavid du Colombier 
69*8ccd4a63SDavid du Colombier 	_freeattr(a);
70*8ccd4a63SDavid du Colombier 	close(afd);
71*8ccd4a63SDavid du Colombier 	auth_freerpc(rpc);
72*8ccd4a63SDavid du Colombier 	return nresp;
73*8ccd4a63SDavid du Colombier }
74