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: acl_get_file() 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: acl_get_file() 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$ rm xxx 561 562# Test basic recursive setting of ACLs. 563$ mkdir ddd 564$ touch ddd/xxx 565$ mkdir ddd/eee 566$ touch ddd/eee/yyy 567$ setfacl -R -m owner@:full_set:f:allow,group@:full_set::allow,everyone@:full_set::allow ddd 568$ getfacl -q ddd 569> owner@:rwxpDdaARWcCos:f------:allow 570> group@:rwxpDdaARWcCos:-------:allow 571> everyone@:rwxpDdaARWcCos:-------:allow 572$ getfacl -q ddd/xxx 573> owner@:rwxpDdaARWcCos:-------:allow 574> group@:rwxpDdaARWcCos:-------:allow 575> everyone@:rwxpDdaARWcCos:-------:allow 576$ getfacl -q ddd/eee 577> owner@:rwxpDdaARWcCos:f------:allow 578> group@:rwxpDdaARWcCos:-------:allow 579> everyone@:rwxpDdaARWcCos:-------:allow 580$ getfacl -q ddd/eee/yyy 581> owner@:rwxpDdaARWcCos:-------:allow 582> group@:rwxpDdaARWcCos:-------:allow 583> everyone@:rwxpDdaARWcCos:-------:allow 584 585$ rm -r ddd 586