xref: /plan9/sys/src/9/port/auth.c (revision d1be6b086622eecc0da76db1fbd64349a5e85293)
1219b2ee8SDavid du Colombier #include	"u.h"
2219b2ee8SDavid du Colombier #include	"../port/lib.h"
3219b2ee8SDavid du Colombier #include	"mem.h"
4219b2ee8SDavid du Colombier #include	"dat.h"
5219b2ee8SDavid du Colombier #include	"fns.h"
6219b2ee8SDavid du Colombier #include	"../port/error.h"
7219b2ee8SDavid du Colombier 
89a747e4fSDavid du Colombier #include	<authsrv.h>
9219b2ee8SDavid du Colombier 
109a747e4fSDavid du Colombier char	*eve;
11219b2ee8SDavid du Colombier char	hostdomain[DOMLEN];
12219b2ee8SDavid du Colombier 
13219b2ee8SDavid du Colombier /*
14219b2ee8SDavid du Colombier  *  return true if current user is eve
15219b2ee8SDavid du Colombier  */
16219b2ee8SDavid du Colombier int
iseve(void)17219b2ee8SDavid du Colombier iseve(void)
18219b2ee8SDavid du Colombier {
197dd7cddfSDavid du Colombier 	return strcmp(eve, up->user) == 0;
20219b2ee8SDavid du Colombier }
21219b2ee8SDavid du Colombier 
22219b2ee8SDavid du Colombier long
sysfversion(ulong * arg)239a747e4fSDavid du Colombier sysfversion(ulong *arg)
24219b2ee8SDavid du Colombier {
259a747e4fSDavid du Colombier 	char *vers;
269a747e4fSDavid du Colombier 	uint arglen, m, msize;
27219b2ee8SDavid du Colombier 	Chan *c;
28219b2ee8SDavid du Colombier 
299a747e4fSDavid du Colombier 	msize = arg[1];
309a747e4fSDavid du Colombier 	vers = (char*)arg[2];
319a747e4fSDavid du Colombier 	arglen = arg[3];
329a747e4fSDavid du Colombier 	validaddr(arg[2], arglen, 1);
339a747e4fSDavid du Colombier 	/* check there's a NUL in the version string */
349a747e4fSDavid du Colombier 	if(arglen==0 || memchr(vers, 0, arglen)==0)
359a747e4fSDavid du Colombier 		error(Ebadarg);
369a747e4fSDavid du Colombier 	c = fdtochan(arg[0], ORDWR, 0, 1);
37219b2ee8SDavid du Colombier 	if(waserror()){
387dd7cddfSDavid du Colombier 		cclose(c);
39219b2ee8SDavid du Colombier 		nexterror();
40219b2ee8SDavid du Colombier 	}
41219b2ee8SDavid du Colombier 
429a747e4fSDavid du Colombier 	m = mntversion(c, vers, msize, arglen);
43219b2ee8SDavid du Colombier 
447dd7cddfSDavid du Colombier 	cclose(c);
45219b2ee8SDavid du Colombier 	poperror();
469a747e4fSDavid du Colombier 	return m;
479a747e4fSDavid du Colombier }
489a747e4fSDavid du Colombier 
499a747e4fSDavid du Colombier long
sys_fsession(ulong * arg)509a747e4fSDavid du Colombier sys_fsession(ulong *arg)
519a747e4fSDavid du Colombier {
529a747e4fSDavid du Colombier 	/* deprecated; backwards compatibility only */
539a747e4fSDavid du Colombier 
549a747e4fSDavid du Colombier 	if(arg[2] == 0)
559a747e4fSDavid du Colombier 		error(Ebadarg);
569a747e4fSDavid du Colombier 	validaddr(arg[1], arg[2], 1);
579a747e4fSDavid du Colombier 	((uchar*)arg[1])[0] = '\0';
58219b2ee8SDavid du Colombier 	return 0;
59219b2ee8SDavid du Colombier }
60219b2ee8SDavid du Colombier 
61219b2ee8SDavid du Colombier long
sysfauth(ulong * arg)62219b2ee8SDavid du Colombier sysfauth(ulong *arg)
63219b2ee8SDavid du Colombier {
649a747e4fSDavid du Colombier 	Chan *c, *ac;
659a747e4fSDavid du Colombier 	char *aname;
669a747e4fSDavid du Colombier 	int fd;
67219b2ee8SDavid du Colombier 
689a747e4fSDavid du Colombier 	validaddr(arg[1], 1, 0);
692db064f5SDavid du Colombier 	aname = validnamedup((char*)arg[1], 1);
702db064f5SDavid du Colombier 	if(waserror()){
712db064f5SDavid du Colombier 		free(aname);
722db064f5SDavid du Colombier 		nexterror();
732db064f5SDavid du Colombier 	}
749a747e4fSDavid du Colombier 	c = fdtochan(arg[0], ORDWR, 0, 1);
75219b2ee8SDavid du Colombier 	if(waserror()){
767dd7cddfSDavid du Colombier 		cclose(c);
77219b2ee8SDavid du Colombier 		nexterror();
78219b2ee8SDavid du Colombier 	}
79219b2ee8SDavid du Colombier 
809a747e4fSDavid du Colombier 	ac = mntauth(c, aname);
815d459b5aSDavid du Colombier 	/* at this point ac is responsible for keeping c alive */
825d459b5aSDavid du Colombier 	poperror();	/* c */
83*d1be6b08SDavid du Colombier 	cclose(c);
842db064f5SDavid du Colombier 	poperror();	/* aname */
85*d1be6b08SDavid du Colombier 	free(aname);
865d459b5aSDavid du Colombier 
879a747e4fSDavid du Colombier 	if(waserror()){
889a747e4fSDavid du Colombier 		cclose(ac);
899a747e4fSDavid du Colombier 		nexterror();
90219b2ee8SDavid du Colombier 	}
91219b2ee8SDavid du Colombier 
929a747e4fSDavid du Colombier 	fd = newfd(ac);
939a747e4fSDavid du Colombier 	if(fd < 0)
949a747e4fSDavid du Colombier 		error(Enofd);
959a747e4fSDavid du Colombier 	poperror();	/* ac */
96219b2ee8SDavid du Colombier 
979a747e4fSDavid du Colombier 	/* always mark it close on exec */
989a747e4fSDavid du Colombier 	ac->flag |= CCEXEC;
99219b2ee8SDavid du Colombier 
1009a747e4fSDavid du Colombier 	return fd;
101219b2ee8SDavid du Colombier }
102219b2ee8SDavid du Colombier 
103219b2ee8SDavid du Colombier /*
104219b2ee8SDavid du Colombier  *  called by devcons() for user device
105219b2ee8SDavid du Colombier  *
106219b2ee8SDavid du Colombier  *  anyone can become none
107219b2ee8SDavid du Colombier  */
108219b2ee8SDavid du Colombier long
userwrite(char * a,int n)109219b2ee8SDavid du Colombier userwrite(char *a, int n)
110219b2ee8SDavid du Colombier {
1119a747e4fSDavid du Colombier 	if(n!=4 || strncmp(a, "none", 4)!=0)
112219b2ee8SDavid du Colombier 		error(Eperm);
1139a747e4fSDavid du Colombier 	kstrdup(&up->user, "none");
1147dd7cddfSDavid du Colombier 	up->basepri = PriNormal;
115219b2ee8SDavid du Colombier 	return n;
116219b2ee8SDavid du Colombier }
117219b2ee8SDavid du Colombier 
118219b2ee8SDavid du Colombier /*
119219b2ee8SDavid du Colombier  *  called by devcons() for host owner/domain
120219b2ee8SDavid du Colombier  *
121219b2ee8SDavid du Colombier  *  writing hostowner also sets user
122219b2ee8SDavid du Colombier  */
123219b2ee8SDavid du Colombier long
hostownerwrite(char * a,int n)124219b2ee8SDavid du Colombier hostownerwrite(char *a, int n)
125219b2ee8SDavid du Colombier {
1269a747e4fSDavid du Colombier 	char buf[128];
127219b2ee8SDavid du Colombier 
128219b2ee8SDavid du Colombier 	if(!iseve())
129219b2ee8SDavid du Colombier 		error(Eperm);
1309a747e4fSDavid du Colombier 	if(n <= 0 || n >= sizeof buf)
131219b2ee8SDavid du Colombier 		error(Ebadarg);
1329a747e4fSDavid du Colombier 	memmove(buf, a, n);
1339a747e4fSDavid du Colombier 	buf[n] = 0;
1349a747e4fSDavid du Colombier 
1357dd7cddfSDavid du Colombier 	renameuser(eve, buf);
1369a747e4fSDavid du Colombier 	kstrdup(&eve, buf);
1379a747e4fSDavid du Colombier 	kstrdup(&up->user, buf);
1387dd7cddfSDavid du Colombier 	up->basepri = PriNormal;
139219b2ee8SDavid du Colombier 	return n;
140219b2ee8SDavid du Colombier }
141219b2ee8SDavid du Colombier 
142219b2ee8SDavid du Colombier long
hostdomainwrite(char * a,int n)143219b2ee8SDavid du Colombier hostdomainwrite(char *a, int n)
144219b2ee8SDavid du Colombier {
145219b2ee8SDavid du Colombier 	char buf[DOMLEN];
146219b2ee8SDavid du Colombier 
147219b2ee8SDavid du Colombier 	if(!iseve())
148219b2ee8SDavid du Colombier 		error(Eperm);
149219b2ee8SDavid du Colombier 	if(n >= DOMLEN)
150219b2ee8SDavid du Colombier 		error(Ebadarg);
151219b2ee8SDavid du Colombier 	memset(buf, 0, DOMLEN);
152219b2ee8SDavid du Colombier 	strncpy(buf, a, n);
153219b2ee8SDavid du Colombier 	if(buf[0] == 0)
154219b2ee8SDavid du Colombier 		error(Ebadarg);
155219b2ee8SDavid du Colombier 	memmove(hostdomain, buf, DOMLEN);
156219b2ee8SDavid du Colombier 	return n;
157219b2ee8SDavid du Colombier }
158