@@ -18,48 +18,58 @@ enum Permission: int
1818{
1919 // No permissions
2020
21- case NONE = 0o000 ;
21+ case NONE = 0o0000 ;
2222
2323 // Owner permissions
2424
25- case OWNER_EXECUTE = 0o100 ;
26- case OWNER_WRITE = 0o200 ;
27- case OWNER_EXECUTE_WRITE = 0o300 ;
28- case OWNER_READ = 0o400 ;
29- case OWNER_EXECUTE_READ = 0o500 ;
30- case OWNER_WRITE_READ = 0o600 ;
31- case OWNER_FULL = 0o700 ;
25+ case OWNER_EXECUTE = 0o0100 ;
26+ case OWNER_WRITE = 0o0200 ;
27+ case OWNER_EXECUTE_WRITE = 0o0300 ;
28+ case OWNER_READ = 0o0400 ;
29+ case OWNER_EXECUTE_READ = 0o0500 ;
30+ case OWNER_WRITE_READ = 0o0600 ;
31+ case OWNER_FULL = 0o0700 ;
3232
3333 // Group permissions
3434
35- case GROUP_EXECUTE = 0o010 ;
36- case GROUP_WRITE = 0o020 ;
37- case GROUP_EXECUTE_WRITE = 0o030 ;
38- case GROUP_READ = 0o040 ;
39- case GROUP_EXECUTE_READ = 0o050 ;
40- case GROUP_WRITE_READ = 0o060 ;
41- case GROUP_FULL = 0o070 ;
35+ case GROUP_EXECUTE = 0o0010 ;
36+ case GROUP_WRITE = 0o0020 ;
37+ case GROUP_EXECUTE_WRITE = 0o0030 ;
38+ case GROUP_READ = 0o0040 ;
39+ case GROUP_EXECUTE_READ = 0o0050 ;
40+ case GROUP_WRITE_READ = 0o0060 ;
41+ case GROUP_FULL = 0o0070 ;
4242
4343 // Public permissions
4444
45- case PUBLIC_EXECUTE = 0o001 ;
46- case PUBLIC_WRITE = 0o002 ;
47- case PUBLIC_EXECUTE_WRITE = 0o003 ;
48- case PUBLIC_READ = 0o004 ;
49- case PUBLIC_EXECUTE_READ = 0o005 ;
50- case PUBLIC_WRITE_READ = 0o006 ;
51- case PUBLIC_FULL = 0o007 ;
45+ case PUBLIC_EXECUTE = 0o0001 ;
46+ case PUBLIC_WRITE = 0o0002 ;
47+ case PUBLIC_EXECUTE_WRITE = 0o0003 ;
48+ case PUBLIC_READ = 0o0004 ;
49+ case PUBLIC_EXECUTE_READ = 0o0005 ;
50+ case PUBLIC_WRITE_READ = 0o0006 ;
51+ case PUBLIC_FULL = 0o0007 ;
5252
5353 // Full permissions (owner, group, and public)
5454
55- case FULL = 0o777 ;
55+ case FULL = 0o0777 ;
56+
57+ // Special bits
58+
59+ case SPECIAL_STICKY = 0o1000 ;
60+ case SPECIAL_SETGID = 0o2000 ;
61+ case SPECIAL_SETUID = 0o4000 ;
62+
63+ // Full permissions (owner, group, and public) with all special bits
64+
65+ case FULL_WITH_ALL_SPECIAL = 0o7777 ;
5666
5767 /**
5868 * Calculates sum of the specified permissions.
5969 */
6070 public static function calculate (Permission ...$ permission ): int
6171 {
62- $ permissions = 0o000 ;
72+ $ permissions = 0o0000 ;
6373
6474 foreach ($ permission as $ _permission ) {
6575 $ permissions |= $ _permission ->value ;
@@ -73,14 +83,14 @@ public static function calculate(Permission ...$permission): int
7383 */
7484 public static function hasPermissions (int $ permissions , Permission ...$ permission ): bool
7585 {
76- if ($ permissions < 0o000 || $ permissions > 0o777 ) {
77- throw new InvalidArgumentException (sprintf ('The integer [ %s ] does not represent a valid octal between 0o000 and 0o777 . ' , $ permissions ));
86+ if ($ permissions < 0o0000 || $ permissions > 0o7777 ) {
87+ throw new InvalidArgumentException (sprintf ('The integer [ %s ] does not represent a valid octal between 0o0000 and 0o7777 . ' , $ permissions ));
7888 }
7989
80- $ permission = empty ($ permission ) ? 0o000 : self ::calculate (...$ permission );
90+ $ permission = empty ($ permission ) ? 0o0000 : self ::calculate (...$ permission );
8191
82- if ($ permission === 0o000 ) {
83- return $ permissions === 0o000 ;
92+ if ($ permission === 0o0000 ) {
93+ return $ permissions === 0o0000 ;
8494 }
8595
8696 return ($ permissions & $ permission ) === $ permission ;
0 commit comments