]> CyberLeo.Net >> Repos - FreeBSD/releng/10.3.git/blob - tools/regression/mac/mac_bsdextended/test_matches.sh
- Copy stable/10@296371 to releng/10.3 in preparation for 10.3-RC1
[FreeBSD/releng/10.3.git] / tools / regression / mac / mac_bsdextended / test_matches.sh
1 #!/bin/sh
2 #
3 # $FreeBSD$
4 #
5
6 uidrange="60000:100000"
7 gidrange="60000:100000"
8 uidinrange="nobody"
9 uidoutrange="daemon"
10 gidinrange="nobody" # We expect $uidinrange in this group
11 gidoutrange="daemon" # We expect $uidinrange in this group
12
13 test_num=1
14 pass()
15 {
16         echo "ok $test_num # $@"
17         : $(( test_num += 1 ))
18 }
19
20 fail()
21 {
22         echo "not ok $test_num # $@"
23         : $(( test_num += 1 ))
24 }
25
26 #
27 # Setup
28 #
29
30 : ${TMPDIR=/tmp}
31 if [ $(id -u) -ne 0 ]; then
32         echo "1..0 # SKIP test must be run as root"
33         exit 0
34 fi
35 if ! sysctl -N security.mac.bsdextended >/dev/null 2>&1; then
36         echo "1..0 # SKIP mac_bsdextended(4) support isn't available"
37         exit 0
38 fi
39 if ! playground=$(mktemp -d $TMPDIR/tmp.XXXXXXX); then
40         echo "1..0 # SKIP failed to create temporary directory"
41         exit 0
42 fi
43 trap "rmdir $playground" EXIT INT TERM
44 if ! mdmfs -s 25m md $playground; then
45         echo "1..0 # SKIP failed to mount md device"
46         exit 0
47 fi
48 chmod a+rwx $playground
49 md_device=$(mount -p | grep "$playground" | awk '{ gsub(/^\/dev\//, "", $1); print $1 }')
50 trap "umount -f $playground; mdconfig -d -u $md_device; rmdir $playground" EXIT INT TERM
51 if [ -z "$md_device" ]; then
52         mount -p | grep $playground
53         echo "1..0 # SKIP md device not properly attached to the system"
54 fi
55
56 ugidfw remove 1
57
58 file1=$playground/test-$uidinrange
59 file2=$playground/test-$uidoutrange
60 cat > $playground/test-script.sh <<'EOF'
61 #!/bin/sh
62 : > $1
63 EOF
64 if [ $? -ne 0 ]; then
65         echo "1..0 # SKIP failed to create test script"
66         exit 0
67 fi
68 echo "1..30"
69
70 command1="sh $playground/test-script.sh $file1"
71 command2="sh $playground/test-script.sh $file2"
72
73 desc="$uidinrange file"
74 if su -m $uidinrange -c "$command1"; then
75         pass $desc
76 else
77         fail $desc
78 fi
79
80 chown "$uidinrange":"$gidinrange" $file1
81 chmod a+w $file1
82
83 desc="$uidoutrange file"
84 if $command2; then
85         pass $desc
86 else
87         fail $desc
88 fi
89
90 chown "$uidoutrange":"$gidoutrange" $file2
91 chmod a+w $file2
92
93 #
94 # No rules
95 #
96 desc="no rules $uidinrange"
97 if su -fm $uidinrange -c "$command1"; then
98         pass $desc
99 else
100         fail $desc
101 fi
102
103 desc="no rules $uidoutrange"
104 if su -fm $uidoutrange -c "$command1"; then
105         pass $desc
106 else
107         fail $desc
108 fi
109
110 #
111 # Subject Match on uid
112 #
113 ugidfw set 1 subject uid $uidrange object mode rasx
114 desc="subject uid in range"
115 if su -fm $uidinrange -c "$command1"; then
116         fail $desc
117 else
118         pass $desc
119 fi
120
121 desc="subject uid out range"
122 if su -fm $uidoutrange -c "$command1"; then
123         pass $desc
124 else
125         fail $desc
126 fi
127
128 #
129 # Subject Match on gid
130 #
131 ugidfw set 1 subject gid $gidrange object mode rasx
132
133 desc="subject gid in range"
134 if su -fm $uidinrange -c "$command1"; then
135         fail $desc
136 else
137         pass $desc
138 fi
139
140 desc="subject gid out range"
141 if su -fm $uidoutrange -c "$command1"; then
142         pass $desc
143 else
144         fail $desc
145 fi
146
147 #
148 # Subject Match on jail
149 #
150 rm -f $playground/test-jail
151
152 desc="subject matching jailid"
153 jailid=`jail -i / localhost 127.0.0.1 /usr/sbin/daemon -f /bin/sh -c "(sleep 5; touch $playground/test-jail) &"`
154 ugidfw set 1 subject jailid $jailid object mode rasx
155 sleep 10
156
157 if [ -f $playground/test-jail ]; then
158         fail "TODO $desc: this testcase fails (see bug # 205481)"
159 else
160         pass $desc
161 fi
162
163 rm -f $playground/test-jail
164 desc="subject nonmatching jailid"
165 jailid=`jail -i / localhost 127.0.0.1 /usr/sbin/daemon -f /bin/sh -c "(sleep 5; touch $playground/test-jail) &"`
166 sleep 10
167 if [ -f $playground/test-jail ]; then
168         pass $desc
169 else
170         fail $desc
171 fi
172
173 #
174 # Object uid
175 #
176 ugidfw set 1 subject object uid $uidrange mode rasx
177
178 desc="object uid in range"
179 if su -fm $uidinrange -c "$command1"; then
180         fail $desc
181 else
182         pass $desc
183 fi
184
185 desc="object uid out range"
186 if su -fm $uidinrange -c "$command2"; then
187         pass $desc
188 else
189         fail $desc
190 fi
191 ugidfw set 1 subject object uid $uidrange mode rasx
192
193 desc="object uid in range (different subject)"
194 if su -fm $uidoutrange -c "$command1"; then
195         fail $desc
196 else
197         pass $desc
198 fi
199
200 desc="object uid out range (different subject)"
201 if su -fm $uidoutrange -c "$command2"; then
202         pass $desc
203 else
204         fail $desc
205 fi
206
207 #
208 # Object gid
209 #
210 ugidfw set 1 subject object gid $uidrange mode rasx
211
212 desc="object gid in range"
213 if su -fm $uidinrange -c "$command1"; then
214         fail $desc
215 else
216         pass $desc
217 fi
218
219 desc="object gid out range"
220 if su -fm $uidinrange -c "$command2"; then
221         pass $desc
222 else
223         fail $desc
224 fi
225 desc="object gid in range (different subject)"
226 if su -fm $uidoutrange -c "$command1"; then
227         fail $desc
228 else
229         pass $desc
230 fi
231
232 desc="object gid out range (different subject)"
233 if su -fm $uidoutrange -c "$command2"; then
234         pass $desc
235 else
236         fail $desc
237 fi
238
239 #
240 # Object filesys
241 #
242 ugidfw set 1 subject uid $uidrange object filesys / mode rasx
243 desc="object out of filesys"
244 if su -fm $uidinrange -c "$command1"; then
245         pass $desc
246 else
247         fail $desc
248 fi
249
250 ugidfw set 1 subject uid $uidrange object filesys $playground mode rasx
251 desc="object in filesys"
252 if su -fm $uidinrange -c "$command1"; then
253         fail $desc
254 else
255         pass $desc
256 fi
257
258 #
259 # Object suid
260 #
261 ugidfw set 1 subject uid $uidrange object suid mode rasx
262 desc="object notsuid"
263 if su -fm $uidinrange -c "$command1"; then
264         pass $desc
265 else
266         fail $desc
267 fi
268
269 chmod u+s $file1
270 desc="object suid"
271 if su -fm $uidinrange -c "$command1"; then
272         fail $desc
273 else
274         pass $desc
275 fi
276 chmod u-s $file1
277
278 #
279 # Object sgid
280 #
281 ugidfw set 1 subject uid $uidrange object sgid mode rasx
282 desc="object notsgid"
283 if su -fm $uidinrange -c "$command1"; then
284         pass $desc
285 else
286         fail $desc
287 fi
288
289 chmod g+s $file1
290 desc="object sgid"
291 if su -fm $uidinrange -c "$command1"; then
292         fail $desc
293 else
294         pass $desc
295 fi
296 chmod g-s $file1
297
298 #
299 # Object uid matches subject
300 #
301 ugidfw set 1 subject uid $uidrange object uid_of_subject mode rasx
302
303 desc="object uid notmatches subject"
304 if su -fm $uidinrange -c "$command2"; then
305         pass $desc
306 else
307         fail $desc
308 fi
309
310 desc="object uid matches subject"
311 if su -fm $uidinrange -c "$command1"; then
312         fail $desc
313 else
314         pass $desc
315 fi
316
317 #
318 # Object gid matches subject
319 #
320 ugidfw set 1 subject uid $uidrange object gid_of_subject mode rasx
321
322 desc="object gid notmatches subject"
323 if su -fm $uidinrange -c "$command2"; then
324         pass $desc
325 else
326         fail $desc
327 fi
328
329 desc="object gid matches subject"
330 if su -fm $uidinrange -c "$command1"; then
331         fail $desc
332 else
333         pass $desc
334 fi
335
336 #
337 # Object type
338 #
339 desc="object not type"
340 ugidfw set 1 subject uid $uidrange object type dbclsp mode rasx
341 if su -fm $uidinrange -c "$command1"; then
342         pass $desc
343 else
344         fail $desc
345 fi
346
347 desc="object type"
348 ugidfw set 1 subject uid $uidrange object type r mode rasx
349 if su -fm $uidinrange -c "$command1"; then
350         fail $desc
351 else
352         pass $desc
353 fi