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