xref: /plan9-contrib/sys/src/9k/port/sysauth.c (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
1*9ef1f84bSDavid du Colombier #include	"u.h"
2*9ef1f84bSDavid du Colombier #include	"../port/lib.h"
3*9ef1f84bSDavid du Colombier #include	"mem.h"
4*9ef1f84bSDavid du Colombier #include	"dat.h"
5*9ef1f84bSDavid du Colombier #include	"fns.h"
6*9ef1f84bSDavid du Colombier #include	"../port/error.h"
7*9ef1f84bSDavid du Colombier 
8*9ef1f84bSDavid du Colombier #include	<authsrv.h>
9*9ef1f84bSDavid du Colombier 
10*9ef1f84bSDavid du Colombier char	*eve;
11*9ef1f84bSDavid du Colombier char	hostdomain[DOMLEN];
12*9ef1f84bSDavid du Colombier 
13*9ef1f84bSDavid du Colombier /*
14*9ef1f84bSDavid du Colombier  *  return true if current user is eve
15*9ef1f84bSDavid du Colombier  */
16*9ef1f84bSDavid du Colombier int
iseve(void)17*9ef1f84bSDavid du Colombier iseve(void)
18*9ef1f84bSDavid du Colombier {
19*9ef1f84bSDavid du Colombier 	return strcmp(eve, up->user) == 0;
20*9ef1f84bSDavid du Colombier }
21*9ef1f84bSDavid du Colombier 
22*9ef1f84bSDavid du Colombier void
sysfversion(Ar0 * ar0,va_list list)23*9ef1f84bSDavid du Colombier sysfversion(Ar0* ar0, va_list list)
24*9ef1f84bSDavid du Colombier {
25*9ef1f84bSDavid du Colombier 	Chan *c;
26*9ef1f84bSDavid du Colombier 	char *version;
27*9ef1f84bSDavid du Colombier 	int fd;
28*9ef1f84bSDavid du Colombier 	u32int msize;
29*9ef1f84bSDavid du Colombier 	usize nversion;
30*9ef1f84bSDavid du Colombier 
31*9ef1f84bSDavid du Colombier 	/*
32*9ef1f84bSDavid du Colombier 	 * int fversion(int fd, int bufsize, char *version, int nversion);
33*9ef1f84bSDavid du Colombier 	 * should be
34*9ef1f84bSDavid du Colombier 	 * usize fversion(int fd, u32int msize, char *version, usize nversion);
35*9ef1f84bSDavid du Colombier 	 */
36*9ef1f84bSDavid du Colombier 	fd = va_arg(list, int);
37*9ef1f84bSDavid du Colombier 	msize = va_arg(list, u32int);
38*9ef1f84bSDavid du Colombier 	version = va_arg(list, char*);
39*9ef1f84bSDavid du Colombier 	nversion = va_arg(list, usize);
40*9ef1f84bSDavid du Colombier 	version = validaddr(version, nversion, 1);
41*9ef1f84bSDavid du Colombier 	/* check there's a NUL in the version string */
42*9ef1f84bSDavid du Colombier 	if(nversion == 0 || memchr(version, 0, nversion) == nil)
43*9ef1f84bSDavid du Colombier 		error(Ebadarg);
44*9ef1f84bSDavid du Colombier 
45*9ef1f84bSDavid du Colombier 	c = fdtochan(fd, ORDWR, 0, 1);
46*9ef1f84bSDavid du Colombier 	if(waserror()){
47*9ef1f84bSDavid du Colombier 		cclose(c);
48*9ef1f84bSDavid du Colombier 		nexterror();
49*9ef1f84bSDavid du Colombier 	}
50*9ef1f84bSDavid du Colombier 
51*9ef1f84bSDavid du Colombier 	ar0->u = mntversion(c, msize, version, nversion);
52*9ef1f84bSDavid du Colombier 
53*9ef1f84bSDavid du Colombier 	cclose(c);
54*9ef1f84bSDavid du Colombier 	poperror();
55*9ef1f84bSDavid du Colombier }
56*9ef1f84bSDavid du Colombier 
57*9ef1f84bSDavid du Colombier void
sys_fsession(Ar0 * ar0,va_list list)58*9ef1f84bSDavid du Colombier sys_fsession(Ar0* ar0, va_list list)
59*9ef1f84bSDavid du Colombier {
60*9ef1f84bSDavid du Colombier 	int fd;
61*9ef1f84bSDavid du Colombier 	char *trbuf;
62*9ef1f84bSDavid du Colombier 
63*9ef1f84bSDavid du Colombier 	/*
64*9ef1f84bSDavid du Colombier 	 * int fsession(int fd, char trbuf[TICKREQLEN]);
65*9ef1f84bSDavid du Colombier 	 *
66*9ef1f84bSDavid du Colombier 	 * Deprecated; backwards compatibility only.
67*9ef1f84bSDavid du Colombier 	 */
68*9ef1f84bSDavid du Colombier 	fd = va_arg(list, int);
69*9ef1f84bSDavid du Colombier 	trbuf = va_arg(list, char*);
70*9ef1f84bSDavid du Colombier 
71*9ef1f84bSDavid du Colombier 	USED(fd);
72*9ef1f84bSDavid du Colombier 	trbuf = validaddr(trbuf, 1, 1);
73*9ef1f84bSDavid du Colombier 	*trbuf = '\0';
74*9ef1f84bSDavid du Colombier 
75*9ef1f84bSDavid du Colombier 	ar0->i = 0;
76*9ef1f84bSDavid du Colombier }
77*9ef1f84bSDavid du Colombier 
78*9ef1f84bSDavid du Colombier void
sysfauth(Ar0 * ar0,va_list list)79*9ef1f84bSDavid du Colombier sysfauth(Ar0* ar0, va_list list)
80*9ef1f84bSDavid du Colombier {
81*9ef1f84bSDavid du Colombier 	Chan *c, *ac;
82*9ef1f84bSDavid du Colombier 	char *aname;
83*9ef1f84bSDavid du Colombier 	int fd;
84*9ef1f84bSDavid du Colombier 
85*9ef1f84bSDavid du Colombier 	/*
86*9ef1f84bSDavid du Colombier 	 * int fauth(int fd, char *aname);
87*9ef1f84bSDavid du Colombier 	 */
88*9ef1f84bSDavid du Colombier 	fd = va_arg(list, int);
89*9ef1f84bSDavid du Colombier 	aname = va_arg(list, char*);
90*9ef1f84bSDavid du Colombier 
91*9ef1f84bSDavid du Colombier 	aname = validaddr(aname, 1, 0);
92*9ef1f84bSDavid du Colombier 	aname = validnamedup(aname, 1);
93*9ef1f84bSDavid du Colombier 	if(waserror()){
94*9ef1f84bSDavid du Colombier 		free(aname);
95*9ef1f84bSDavid du Colombier 		nexterror();
96*9ef1f84bSDavid du Colombier 	}
97*9ef1f84bSDavid du Colombier 	c = fdtochan(fd, ORDWR, 0, 1);
98*9ef1f84bSDavid du Colombier 	if(waserror()){
99*9ef1f84bSDavid du Colombier 		cclose(c);
100*9ef1f84bSDavid du Colombier 		nexterror();
101*9ef1f84bSDavid du Colombier 	}
102*9ef1f84bSDavid du Colombier 
103*9ef1f84bSDavid du Colombier 	ac = mntauth(c, aname);
104*9ef1f84bSDavid du Colombier 	/* at this point ac is responsible for keeping c alive */
105*9ef1f84bSDavid du Colombier 	cclose(c);
106*9ef1f84bSDavid du Colombier 	poperror();	/* c */
107*9ef1f84bSDavid du Colombier 	free(aname);
108*9ef1f84bSDavid du Colombier 	poperror();	/* aname */
109*9ef1f84bSDavid du Colombier 
110*9ef1f84bSDavid du Colombier 	if(waserror()){
111*9ef1f84bSDavid du Colombier 		cclose(ac);
112*9ef1f84bSDavid du Colombier 		nexterror();
113*9ef1f84bSDavid du Colombier 	}
114*9ef1f84bSDavid du Colombier 
115*9ef1f84bSDavid du Colombier 	fd = newfd(ac);
116*9ef1f84bSDavid du Colombier 	if(fd < 0)
117*9ef1f84bSDavid du Colombier 		error(Enofd);
118*9ef1f84bSDavid du Colombier 	poperror();	/* ac */
119*9ef1f84bSDavid du Colombier 
120*9ef1f84bSDavid du Colombier 	/* always mark it close on exec */
121*9ef1f84bSDavid du Colombier 	ac->flag |= CCEXEC;
122*9ef1f84bSDavid du Colombier 
123*9ef1f84bSDavid du Colombier 	ar0->i = fd;
124*9ef1f84bSDavid du Colombier }
125*9ef1f84bSDavid du Colombier 
126*9ef1f84bSDavid du Colombier /*
127*9ef1f84bSDavid du Colombier  *  called by devcons() for user device
128*9ef1f84bSDavid du Colombier  *
129*9ef1f84bSDavid du Colombier  *  anyone can become none
130*9ef1f84bSDavid du Colombier  */
131*9ef1f84bSDavid du Colombier long
userwrite(char * a,long n)132*9ef1f84bSDavid du Colombier userwrite(char* a, long n)
133*9ef1f84bSDavid du Colombier {
134*9ef1f84bSDavid du Colombier 	if(n != 4 || strncmp(a, "none", 4) != 0)
135*9ef1f84bSDavid du Colombier 		error(Eperm);
136*9ef1f84bSDavid du Colombier 	kstrdup(&up->user, "none");
137*9ef1f84bSDavid du Colombier 	up->basepri = PriNormal;
138*9ef1f84bSDavid du Colombier 
139*9ef1f84bSDavid du Colombier 	return n;
140*9ef1f84bSDavid du Colombier }
141*9ef1f84bSDavid du Colombier 
142*9ef1f84bSDavid du Colombier /*
143*9ef1f84bSDavid du Colombier  *  called by devcons() for host owner/domain
144*9ef1f84bSDavid du Colombier  *
145*9ef1f84bSDavid du Colombier  *  writing hostowner also sets user
146*9ef1f84bSDavid du Colombier  */
147*9ef1f84bSDavid du Colombier long
hostownerwrite(char * a,long n)148*9ef1f84bSDavid du Colombier hostownerwrite(char* a, long n)
149*9ef1f84bSDavid du Colombier {
150*9ef1f84bSDavid du Colombier 	char buf[128];
151*9ef1f84bSDavid du Colombier 
152*9ef1f84bSDavid du Colombier 	if(!iseve())
153*9ef1f84bSDavid du Colombier 		error(Eperm);
154*9ef1f84bSDavid du Colombier 	if(n <= 0 || n >= sizeof buf)
155*9ef1f84bSDavid du Colombier 		error(Ebadarg);
156*9ef1f84bSDavid du Colombier 	memmove(buf, a, n);
157*9ef1f84bSDavid du Colombier 	buf[n] = 0;
158*9ef1f84bSDavid du Colombier 
159*9ef1f84bSDavid du Colombier 	renameuser(eve, buf);
160*9ef1f84bSDavid du Colombier 	kstrdup(&eve, buf);
161*9ef1f84bSDavid du Colombier 	kstrdup(&up->user, buf);
162*9ef1f84bSDavid du Colombier 	up->basepri = PriNormal;
163*9ef1f84bSDavid du Colombier 
164*9ef1f84bSDavid du Colombier 	return n;
165*9ef1f84bSDavid du Colombier }
166*9ef1f84bSDavid du Colombier 
167*9ef1f84bSDavid du Colombier long
hostdomainwrite(char * a,long n)168*9ef1f84bSDavid du Colombier hostdomainwrite(char* a, long n)
169*9ef1f84bSDavid du Colombier {
170*9ef1f84bSDavid du Colombier 	char buf[DOMLEN];
171*9ef1f84bSDavid du Colombier 
172*9ef1f84bSDavid du Colombier 	if(!iseve())
173*9ef1f84bSDavid du Colombier 		error(Eperm);
174*9ef1f84bSDavid du Colombier 	if(n >= DOMLEN)
175*9ef1f84bSDavid du Colombier 		error(Ebadarg);
176*9ef1f84bSDavid du Colombier 	memset(buf, 0, DOMLEN);
177*9ef1f84bSDavid du Colombier 	strncpy(buf, a, n);
178*9ef1f84bSDavid du Colombier 	if(buf[0] == 0)
179*9ef1f84bSDavid du Colombier 		error(Ebadarg);
180*9ef1f84bSDavid du Colombier 	memmove(hostdomain, buf, DOMLEN);
181*9ef1f84bSDavid du Colombier 
182*9ef1f84bSDavid du Colombier 	return n;
183*9ef1f84bSDavid du Colombier }
184