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