xref: /freebsd/tests/sys/acl/tools-nfs4-psarc.test (revision 49b49cda41feabe3439f7318e8bf40e3896c7bf4)
1# Copyright (c) 2008, 2009 Edward Tomasz Napierała <trasz@FreeBSD.org>
2# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions
6# are met:
7# 1. Redistributions of source code must retain the above copyright
8#    notice, this list of conditions and the following disclaimer.
9# 2. Redistributions in binary form must reproduce the above copyright
10#    notice, this list of conditions and the following disclaimer in the
11#    documentation and/or other materials provided with the distribution.
12#
13# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23# SUCH DAMAGE.
24#
25# $FreeBSD$
26#
27
28# This is a tools-level test for NFSv4 ACL functionality with PSARC/2010/029
29# semantics.  Run it as root using ACL-enabled kernel:
30#
31# /usr/src/tools/regression/acltools/run /usr/src/tools/regression/acltools/tools-nfs4-psarc.test
32#
33# WARNING: Creates files in unsafe way.
34
35$ whoami
36> root
37$ umask 022
38
39# Smoke test for getfacl(1).
40$ touch xxx
41$ getfacl xxx
42> # file: xxx
43> # owner: root
44> # group: wheel
45>             owner@:rw-p--aARWcCos:-------:allow
46>             group@:r-----a-R-c--s:-------:allow
47>          everyone@:r-----a-R-c--s:-------:allow
48
49$ getfacl -q xxx
50>             owner@:rw-p--aARWcCos:-------:allow
51>             group@:r-----a-R-c--s:-------:allow
52>          everyone@:r-----a-R-c--s:-------:allow
53
54# Check verbose mode formatting.
55$ getfacl -v xxx
56> # file: xxx
57> # owner: root
58> # group: wheel
59>             owner@:read_data/write_data/append_data/read_attributes/write_attributes/read_xattr/write_xattr/read_acl/write_acl/write_owner/synchronize::allow
60>             group@:read_data/read_attributes/read_xattr/read_acl/synchronize::allow
61>          everyone@:read_data/read_attributes/read_xattr/read_acl/synchronize::allow
62
63# Test setfacl -a.
64$ setfacl -a2 u:0:write_acl:allow,g:1:read_acl:deny xxx
65$ getfacl -n xxx
66> # file: xxx
67> # owner: root
68> # group: wheel
69>             owner@:rw-p--aARWcCos:-------:allow
70>             group@:r-----a-R-c--s:-------:allow
71>             user:0:-----------C--:-------:allow
72>            group:1:----------c---:-------:deny
73>          everyone@:r-----a-R-c--s:-------:allow
74
75# Test user and group name resolving.
76$ rm xxx
77$ touch xxx
78$ setfacl -a2 u:root:write_acl:allow,g:daemon:read_acl:deny xxx
79$ getfacl xxx
80> # file: xxx
81> # owner: root
82> # group: wheel
83>             owner@:rw-p--aARWcCos:-------:allow
84>             group@:r-----a-R-c--s:-------:allow
85>          user:root:-----------C--:-------:allow
86>       group:daemon:----------c---:-------:deny
87>          everyone@:r-----a-R-c--s:-------:allow
88
89# Check whether ls correctly marks files with "+".
90$ ls -l xxx | cut -d' ' -f1
91> -rw-r--r--+
92
93# Test removing entries by number.
94$ setfacl -x 1 xxx
95$ getfacl -n xxx
96> # file: xxx
97> # owner: root
98> # group: wheel
99>             owner@:rw-p--aARWcCos:-------:allow
100>             user:0:-----------C--:-------:allow
101>            group:1:----------c---:-------:deny
102>          everyone@:r-----a-R-c--s:-------:allow
103
104# Test setfacl -m.
105$ setfacl -a0 everyone@:rwx:deny xxx
106$ setfacl -a0 everyone@:rwx:deny xxx
107$ setfacl -a0 everyone@:rwx:deny xxx
108$ setfacl -m everyone@::deny xxx
109$ getfacl -n xxx
110> # file: xxx
111> # owner: root
112> # group: wheel
113>          everyone@:--------------:-------:deny
114>          everyone@:--------------:-------:deny
115>          everyone@:--------------:-------:deny
116>             owner@:rw-p--aARWcCos:-------:allow
117>             user:0:-----------C--:-------:allow
118>            group:1:----------c---:-------:deny
119>          everyone@:r-----a-R-c--s:-------:allow
120
121# Test getfacl -i.
122$ getfacl -i xxx
123> # file: xxx
124> # owner: root
125> # group: wheel
126>          everyone@:--------------:-------:deny
127>          everyone@:--------------:-------:deny
128>          everyone@:--------------:-------:deny
129>             owner@:rw-p--aARWcCos:-------:allow
130>          user:root:-----------C--:-------:allow:0
131>       group:daemon:----------c---:-------:deny:1
132>          everyone@:r-----a-R-c--s:-------:allow
133
134# Make sure cp without any flags does not copy copy the ACL.
135$ cp xxx yyy
136$ ls -l yyy | cut -d' ' -f1
137> -rw-r--r--
138
139# Make sure it does with the "-p" flag.
140$ rm yyy
141$ cp -p xxx yyy
142$ getfacl -n yyy
143> # file: yyy
144> # owner: root
145> # group: wheel
146>          everyone@:--------------:-------:deny
147>          everyone@:--------------:-------:deny
148>          everyone@:--------------:-------:deny
149>             owner@:rw-p--aARWcCos:-------:allow
150>             user:0:-----------C--:-------:allow
151>            group:1:----------c---:-------:deny
152>          everyone@:r-----a-R-c--s:-------:allow
153
154$ rm yyy
155
156# Test removing entries by...  by example?
157$ setfacl -x everyone@::deny xxx
158$ getfacl -n xxx
159> # file: xxx
160> # owner: root
161> # group: wheel
162>             owner@:rw-p--aARWcCos:-------:allow
163>             user:0:-----------C--:-------:allow
164>            group:1:----------c---:-------:deny
165>          everyone@:r-----a-R-c--s:-------:allow
166
167# Test setfacl -b.
168$ setfacl -b xxx
169$ getfacl -n xxx
170> # file: xxx
171> # owner: root
172> # group: wheel
173>             owner@:rw-p--aARWcCos:-------:allow
174>             group@:r-----a-R-c--s:-------:allow
175>          everyone@:r-----a-R-c--s:-------:allow
176
177$ ls -l xxx | cut -d' ' -f1
178> -rw-r--r--
179
180# Check setfacl(1) and getfacl(1) with multiple files.
181$ touch xxx yyy zzz
182
183$ ls -l xxx yyy zzz | cut -d' ' -f1
184> -rw-r--r--
185> -rw-r--r--
186> -rw-r--r--
187
188$ setfacl -m u:42:x:allow,g:43:w:allow nnn xxx yyy zzz
189> setfacl: nnn: stat() failed: No such file or directory
190
191$ ls -l nnn xxx yyy zzz | cut -d' ' -f1
192> ls: nnn: No such file or directory
193> -rw-r--r--+
194> -rw-r--r--+
195> -rw-r--r--+
196
197$ getfacl -nq nnn xxx yyy zzz
198> getfacl: nnn: stat() failed: No such file or directory
199>            user:42:--x-----------:-------:allow
200>           group:43:-w------------:-------:allow
201>             owner@:rw-p--aARWcCos:-------:allow
202>             group@:r-----a-R-c--s:-------:allow
203>          everyone@:r-----a-R-c--s:-------:allow
204>
205>            user:42:--x-----------:-------:allow
206>           group:43:-w------------:-------:allow
207>             owner@:rw-p--aARWcCos:-------:allow
208>             group@:r-----a-R-c--s:-------:allow
209>          everyone@:r-----a-R-c--s:-------:allow
210>
211>            user:42:--x-----------:-------:allow
212>           group:43:-w------------:-------:allow
213>             owner@:rw-p--aARWcCos:-------:allow
214>             group@:r-----a-R-c--s:-------:allow
215>          everyone@:r-----a-R-c--s:-------:allow
216
217$ setfacl -b nnn xxx yyy zzz
218> setfacl: nnn: stat() failed: No such file or directory
219
220$ ls -l nnn xxx yyy zzz | cut -d' ' -f1
221> ls: nnn: No such file or directory
222> -rw-r--r--
223> -rw-r--r--
224> -rw-r--r--
225
226$ rm xxx yyy zzz
227
228# Test applying mode to an ACL.
229$ touch xxx
230$ setfacl -a0 user:42:r:allow,user:43:w:deny,user:43:w:allow,user:44:x:allow -x everyone@::allow xxx
231$ chmod 600 xxx
232$ getfacl -n xxx
233> # file: xxx
234> # owner: root
235> # group: wheel
236>             owner@:rw-p--aARWcCos:-------:allow
237>             group@:------a-R-c--s:-------:allow
238>          everyone@:------a-R-c--s:-------:allow
239
240$ ls -l xxx | cut -d' ' -f1
241> -rw-------
242
243$ rm xxx
244$ touch xxx
245$ chown 42 xxx
246$ setfacl -a0 user:42:r:allow,user:43:w:deny,user:43:w:allow,user:44:x:allow xxx
247$ chmod 600 xxx
248$ getfacl -n xxx
249> # file: xxx
250> # owner: 42
251> # group: wheel
252>             owner@:rw-p--aARWcCos:-------:allow
253>             group@:------a-R-c--s:-------:allow
254>          everyone@:------a-R-c--s:-------:allow
255$ ls -l xxx | cut -d' ' -f1
256> -rw-------
257
258$ rm xxx
259$ touch xxx
260$ chown 43 xxx
261$ setfacl -a0 user:42:r:allow,user:43:w:deny,user:43:w:allow,user:44:x:allow xxx
262$ chmod 124 xxx
263$ getfacl -n xxx
264> # file: xxx
265> # owner: 43
266> # group: wheel
267>             owner@:rw-p----------:-------:deny
268>             group@:r-------------:-------:deny
269>             owner@:--x---aARWcCos:-------:allow
270>             group@:-w-p--a-R-c--s:-------:allow
271>          everyone@:r-----a-R-c--s:-------:allow
272$ ls -l xxx | cut -d' ' -f1
273> ---x-w-r--
274
275$ rm xxx
276$ touch xxx
277$ chown 43 xxx
278$ setfacl -a0 user:42:r:allow,user:43:w:deny,user:43:w:allow,user:44:x:allow xxx
279$ chmod 412 xxx
280$ getfacl -n xxx
281> # file: xxx
282> # owner: 43
283> # group: wheel
284>             owner@:-wxp----------:-------:deny
285>             group@:-w-p----------:-------:deny
286>             owner@:r-----aARWcCos:-------:allow
287>             group@:--x---a-R-c--s:-------:allow
288>          everyone@:-w-p--a-R-c--s:-------:allow
289$ ls -l xxx | cut -d' ' -f1
290> -r----x-w-
291
292$ mkdir ddd
293$ setfacl -a0 group:44:rwapd:allow ddd
294$ setfacl -a0 group:43:write_data/delete_child:d:deny,group@:ad:allow ddd
295$ setfacl -a0 user:42:rx:fi:allow,group:42:write_data/delete_child:d:allow ddd
296$ setfacl -m everyone@:-w-p--a-R-c--s:fi:allow ddd
297$ getfacl -n ddd
298> # file: ddd
299> # owner: root
300> # group: wheel
301>            user:42:r-x-----------:f-i----:allow
302>           group:42:-w--D---------:-d-----:allow
303>           group:43:-w--D---------:-d-----:deny
304>             group@:-----da-------:-------:allow
305>           group:44:rw-p-da-------:-------:allow
306>             owner@:rwxp--aARWcCos:-------:allow
307>             group@:r-x---a-R-c--s:-------:allow
308>          everyone@:-w-p--a-R-c--s:f-i----:allow
309
310$ chmod 777 ddd
311$ getfacl -n ddd
312> # file: ddd
313> # owner: root
314> # group: wheel
315>             owner@:rwxp--aARWcCos:-------:allow
316>             group@:rwxp--a-R-c--s:-------:allow
317>          everyone@:rwxp--a-R-c--s:-------:allow
318
319# Test applying ACL to mode.
320$ rmdir ddd
321$ mkdir ddd
322$ setfacl -a0 u:42:rwx:fi:allow ddd
323$ ls -ld ddd | cut -d' ' -f1
324> drwxr-xr-x+
325
326$ rmdir ddd
327$ mkdir ddd
328$ chmod 0 ddd
329$ setfacl -a0 owner@:r:allow,group@:w:deny,group@:wx:allow ddd
330$ ls -ld ddd | cut -d' ' -f1
331> dr----x---+
332
333$ rmdir ddd
334$ mkdir ddd
335$ chmod 0 ddd
336$ setfacl -a0 owner@:r:allow,group@:w:fi:deny,group@:wx:allow ddd
337$ ls -ld ddd | cut -d' ' -f1
338> dr---wx---+
339
340$ rmdir ddd
341$ mkdir ddd
342$ chmod 0 ddd
343$ setfacl -a0 owner@:r:allow,group:43:w:deny,group:43:wx:allow ddd
344$ ls -ld ddd | cut -d' ' -f1
345> dr--------+
346
347$ rmdir ddd
348$ mkdir ddd
349$ chmod 0 ddd
350$ setfacl -a0 owner@:r:allow,user:43:w:deny,user:43:wx:allow ddd
351$ ls -ld ddd | cut -d' ' -f1
352> dr--------+
353
354# Test inheritance.
355$ rmdir ddd
356$ mkdir ddd
357$ setfacl -a0 group:43:write_data/write_acl:fin:deny,u:43:rwxp:allow ddd
358$ setfacl -a0 user:42:rx:fi:allow,group:42:write_data/delete_child:dn:deny ddd
359$ setfacl -a0 user:42:write_acl/write_owner:fi:allow ddd
360$ setfacl -a0 group:41:read_data/read_attributes:dni:allow ddd
361$ setfacl -a0 user:41:write_data/write_attributes:fn:allow ddd
362$ getfacl -qn ddd
363>            user:41:-w-----A------:f--n---:allow
364>           group:41:r-----a-------:-din---:allow
365>            user:42:-----------Co-:f-i----:allow
366>            user:42:r-x-----------:f-i----:allow
367>           group:42:-w--D---------:-d-n---:deny
368>           group:43:-w---------C--:f-in---:deny
369>            user:43:rwxp----------:-------:allow
370>             owner@:rwxp--aARWcCos:-------:allow
371>             group@:r-x---a-R-c--s:-------:allow
372>          everyone@:r-x---a-R-c--s:-------:allow
373
374$ cd ddd
375$ touch xxx
376$ getfacl -qn xxx
377>            user:41:--------------:------I:allow
378>            user:42:--------------:------I:allow
379>            user:42:r-------------:------I:allow
380>           group:43:-w---------C--:------I:deny
381>             owner@:rw-p--aARWcCos:-------:allow
382>             group@:r-----a-R-c--s:-------:allow
383>          everyone@:r-----a-R-c--s:-------:allow
384
385$ rm xxx
386$ umask 077
387$ touch xxx
388$ getfacl -qn xxx
389>            user:41:--------------:------I:allow
390>            user:42:--------------:------I:allow
391>            user:42:--------------:------I:allow
392>           group:43:-w---------C--:------I:deny
393>             owner@:rw-p--aARWcCos:-------:allow
394>             group@:------a-R-c--s:-------:allow
395>          everyone@:------a-R-c--s:-------:allow
396
397$ rm xxx
398$ umask 770
399$ touch xxx
400$ getfacl -qn xxx
401>             owner@:rw-p----------:-------:deny
402>             group@:rw-p----------:-------:deny
403>            user:41:--------------:------I:allow
404>            user:42:--------------:------I:allow
405>            user:42:--------------:------I:allow
406>           group:43:-w---------C--:------I:deny
407>             owner@:------aARWcCos:-------:allow
408>             group@:------a-R-c--s:-------:allow
409>          everyone@:rw-p--a-R-c--s:-------:allow
410
411$ rm xxx
412$ umask 707
413$ touch xxx
414$ getfacl -qn xxx
415>             owner@:rw-p----------:-------:deny
416>            user:41:-w------------:------I:allow
417>            user:42:--------------:------I:allow
418>            user:42:r-------------:------I:allow
419>           group:43:-w---------C--:------I:deny
420>             owner@:------aARWcCos:-------:allow
421>             group@:rw-p--a-R-c--s:-------:allow
422>          everyone@:------a-R-c--s:-------:allow
423
424$ umask 077
425$ mkdir yyy
426$ getfacl -qn yyy
427>           group:41:------a-------:------I:allow
428>            user:42:-----------Co-:f-i---I:allow
429>            user:42:r-x-----------:f-i---I:allow
430>           group:42:-w--D---------:------I:deny
431>             owner@:rwxp--aARWcCos:-------:allow
432>             group@:------a-R-c--s:-------:allow
433>          everyone@:------a-R-c--s:-------:allow
434
435$ rmdir yyy
436$ umask 770
437$ mkdir yyy
438$ getfacl -qn yyy
439>             owner@:rwxp----------:-------:deny
440>             group@:rwxp----------:-------:deny
441>           group:41:------a-------:------I:allow
442>            user:42:-----------Co-:f-i---I:allow
443>            user:42:r-x-----------:f-i---I:allow
444>           group:42:-w--D---------:------I:deny
445>             owner@:------aARWcCos:-------:allow
446>             group@:------a-R-c--s:-------:allow
447>          everyone@:rwxp--a-R-c--s:-------:allow
448
449$ rmdir yyy
450$ umask 707
451$ mkdir yyy
452$ getfacl -qn yyy
453>             owner@:rwxp----------:-------:deny
454>           group:41:r-----a-------:------I:allow
455>            user:42:-----------Co-:f-i---I:allow
456>            user:42:r-x-----------:f-i---I:allow
457>           group:42:-w--D---------:------I:deny
458>             owner@:------aARWcCos:-------:allow
459>             group@:rwxp--a-R-c--s:-------:allow
460>          everyone@:------a-R-c--s:-------:allow
461
462# There is some complication regarding how write_acl and write_owner flags
463# get inherited.  Make sure we got it right.
464$ setfacl -b .
465$ setfacl -a0 u:42:Co:f:allow .
466$ setfacl -a0 u:43:Co:d:allow .
467$ setfacl -a0 u:44:Co:fd:allow .
468$ setfacl -a0 u:45:Co:fi:allow .
469$ setfacl -a0 u:46:Co:di:allow .
470$ setfacl -a0 u:47:Co:fdi:allow .
471$ setfacl -a0 u:48:Co:fn:allow .
472$ setfacl -a0 u:49:Co:dn:allow .
473$ setfacl -a0 u:50:Co:fdn:allow .
474$ setfacl -a0 u:51:Co:fni:allow .
475$ setfacl -a0 u:52:Co:dni:allow .
476$ setfacl -a0 u:53:Co:fdni:allow .
477$ umask 022
478$ rm xxx
479$ touch xxx
480$ getfacl -nq xxx
481>            user:53:--------------:------I:allow
482>            user:51:--------------:------I:allow
483>            user:50:--------------:------I:allow
484>            user:48:--------------:------I:allow
485>            user:47:--------------:------I:allow
486>            user:45:--------------:------I:allow
487>            user:44:--------------:------I:allow
488>            user:42:--------------:------I:allow
489>             owner@:rw-p--aARWcCos:-------:allow
490>             group@:r-----a-R-c--s:-------:allow
491>          everyone@:r-----a-R-c--s:-------:allow
492
493$ rmdir yyy
494$ mkdir yyy
495$ getfacl -nq yyy
496>            user:53:--------------:------I:allow
497>            user:52:--------------:------I:allow
498>            user:50:--------------:------I:allow
499>            user:49:--------------:------I:allow
500>            user:47:--------------:fd----I:allow
501>            user:46:--------------:-d----I:allow
502>            user:45:-----------Co-:f-i---I:allow
503>            user:44:--------------:fd----I:allow
504>            user:43:--------------:-d----I:allow
505>            user:42:-----------Co-:f-i---I:allow
506>             owner@:rwxp--aARWcCos:-------:allow
507>             group@:r-x---a-R-c--s:-------:allow
508>          everyone@:r-x---a-R-c--s:-------:allow
509
510$ setfacl -b .
511$ setfacl -a0 u:42:Co:f:deny .
512$ setfacl -a0 u:43:Co:d:deny .
513$ setfacl -a0 u:44:Co:fd:deny .
514$ setfacl -a0 u:45:Co:fi:deny .
515$ setfacl -a0 u:46:Co:di:deny .
516$ setfacl -a0 u:47:Co:fdi:deny .
517$ setfacl -a0 u:48:Co:fn:deny .
518$ setfacl -a0 u:49:Co:dn:deny .
519$ setfacl -a0 u:50:Co:fdn:deny .
520$ setfacl -a0 u:51:Co:fni:deny .
521$ setfacl -a0 u:52:Co:dni:deny .
522$ setfacl -a0 u:53:Co:fdni:deny .
523$ umask 022
524$ rm xxx
525$ touch xxx
526$ getfacl -nq xxx
527>            user:53:-----------Co-:------I:deny
528>            user:51:-----------Co-:------I:deny
529>            user:50:-----------Co-:------I:deny
530>            user:48:-----------Co-:------I:deny
531>            user:47:-----------Co-:------I:deny
532>            user:45:-----------Co-:------I:deny
533>            user:44:-----------Co-:------I:deny
534>            user:42:-----------Co-:------I:deny
535>             owner@:rw-p--aARWcCos:-------:allow
536>             group@:r-----a-R-c--s:-------:allow
537>          everyone@:r-----a-R-c--s:-------:allow
538
539$ rmdir yyy
540$ mkdir yyy
541$ getfacl -nq yyy
542>            user:53:-----------Co-:------I:deny
543>            user:52:-----------Co-:------I:deny
544>            user:50:-----------Co-:------I:deny
545>            user:49:-----------Co-:------I:deny
546>            user:47:-----------Co-:fd----I:deny
547>            user:46:-----------Co-:-d----I:deny
548>            user:45:-----------Co-:f-i---I:deny
549>            user:44:-----------Co-:fd----I:deny
550>            user:43:-----------Co-:-d----I:deny
551>            user:42:-----------Co-:f-i---I:deny
552>             owner@:rwxp--aARWcCos:-------:allow
553>             group@:r-x---a-R-c--s:-------:allow
554>          everyone@:r-x---a-R-c--s:-------:allow
555
556$ rmdir yyy
557$ rm xxx
558$ cd ..
559$ rmdir ddd
560
561$ rm xxx
562
563