xref: /plan9/sys/src/cmd/unix/drawterm/libauth/auth_respond.c (revision ec59a3ddbfceee0efe34584c2c9981a5e5ff1ec4)
18ccd4a63SDavid du Colombier #include <u.h>
28ccd4a63SDavid du Colombier #include <libc.h>
38ccd4a63SDavid du Colombier #include <auth.h>
48ccd4a63SDavid du Colombier #include <authsrv.h>
58ccd4a63SDavid du Colombier #include "authlocal.h"
68ccd4a63SDavid du Colombier 
78ccd4a63SDavid du Colombier enum {
88ccd4a63SDavid du Colombier 	ARgiveup = 100,
98ccd4a63SDavid du Colombier };
108ccd4a63SDavid du Colombier 
118ccd4a63SDavid du Colombier static int
dorpc(AuthRpc * rpc,char * verb,char * val,int len,AuthGetkey * getkey)128ccd4a63SDavid du Colombier dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
138ccd4a63SDavid du Colombier {
148ccd4a63SDavid du Colombier 	int ret;
158ccd4a63SDavid du Colombier 
168ccd4a63SDavid du Colombier 	for(;;){
178ccd4a63SDavid du Colombier 		if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey)
188ccd4a63SDavid du Colombier 			return ret;
19*ec59a3ddSDavid du Colombier 		if(getkey == 0)
208ccd4a63SDavid du Colombier 			return ARgiveup;	/* don't know how */
218ccd4a63SDavid du Colombier 		if((*getkey)(rpc->arg) < 0)
228ccd4a63SDavid du Colombier 			return ARgiveup;	/* user punted */
238ccd4a63SDavid du Colombier 	}
248ccd4a63SDavid du Colombier }
258ccd4a63SDavid du Colombier 
268ccd4a63SDavid du Colombier int
auth_respond(void * chal,uint nchal,char * user,uint nuser,void * resp,uint nresp,AuthGetkey * getkey,char * fmt,...)278ccd4a63SDavid du Colombier auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nresp, AuthGetkey *getkey, char *fmt, ...)
288ccd4a63SDavid du Colombier {
298ccd4a63SDavid du Colombier 	char *p, *s;
308ccd4a63SDavid du Colombier 	va_list arg;
318ccd4a63SDavid du Colombier 	int afd;
328ccd4a63SDavid du Colombier 	AuthRpc *rpc;
338ccd4a63SDavid du Colombier 	Attr *a;
348ccd4a63SDavid du Colombier 
358ccd4a63SDavid du Colombier 	if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0)
368ccd4a63SDavid du Colombier 		return -1;
378ccd4a63SDavid du Colombier 
388ccd4a63SDavid du Colombier 	if((rpc = auth_allocrpc(afd)) == nil){
398ccd4a63SDavid du Colombier 		close(afd);
408ccd4a63SDavid du Colombier 		return -1;
418ccd4a63SDavid du Colombier 	}
428ccd4a63SDavid du Colombier 
438ccd4a63SDavid du Colombier 	quotefmtinstall();	/* just in case */
448ccd4a63SDavid du Colombier 	va_start(arg, fmt);
458ccd4a63SDavid du Colombier 	p = vsmprint(fmt, arg);
468ccd4a63SDavid du Colombier 	va_end(arg);
478ccd4a63SDavid du Colombier 
488ccd4a63SDavid du Colombier 	if(p==nil
498ccd4a63SDavid du Colombier 	|| dorpc(rpc, "start", p, strlen(p), getkey) != ARok
508ccd4a63SDavid du Colombier 	|| dorpc(rpc, "write", chal, nchal, getkey) != ARok
518ccd4a63SDavid du Colombier 	|| dorpc(rpc, "read", nil, 0, getkey) != ARok){
528ccd4a63SDavid du Colombier 		free(p);
538ccd4a63SDavid du Colombier 		close(afd);
548ccd4a63SDavid du Colombier 		auth_freerpc(rpc);
558ccd4a63SDavid du Colombier 		return -1;
568ccd4a63SDavid du Colombier 	}
578ccd4a63SDavid du Colombier 	free(p);
588ccd4a63SDavid du Colombier 
598ccd4a63SDavid du Colombier 	if(rpc->narg < nresp)
608ccd4a63SDavid du Colombier 		nresp = rpc->narg;
618ccd4a63SDavid du Colombier 	memmove(resp, rpc->arg, nresp);
628ccd4a63SDavid du Colombier 
638ccd4a63SDavid du Colombier 	if((a = auth_attr(rpc)) != nil
648ccd4a63SDavid du Colombier 	&& (s = _strfindattr(a, "user")) != nil && strlen(s) < nuser)
658ccd4a63SDavid du Colombier 		strcpy(user, s);
668ccd4a63SDavid du Colombier 	else if(nuser > 0)
678ccd4a63SDavid du Colombier 		user[0] = '\0';
688ccd4a63SDavid du Colombier 
698ccd4a63SDavid du Colombier 	_freeattr(a);
708ccd4a63SDavid du Colombier 	close(afd);
718ccd4a63SDavid du Colombier 	auth_freerpc(rpc);
728ccd4a63SDavid du Colombier 	return nresp;
738ccd4a63SDavid du Colombier }
74