4
4
5
5
namespace Shimmie2 ;
6
6
7
+ use FFSPHP \PDO ;
8
+
7
9
use GQLA \Type ;
8
10
use GQLA \Field ;
9
11
@@ -19,21 +21,29 @@ class UserClass
19
21
#[Field]
20
22
public ?string $ name = null ;
21
23
public ?UserClass $ parent = null ;
24
+ public bool $ core = false ;
22
25
23
26
/** @var array<string, bool> */
24
27
public array $ abilities = [];
25
28
26
- /**
27
- * @param array<string, bool> $abilities
28
- */
29
- public function __construct (string $ name , string $ parent = null , array $ abilities = [])
29
+ public function __construct (string $ name )
30
30
{
31
+ global $ database ;
32
+
31
33
$ this ->name = $ name ;
32
- $ this -> abilities = $ abilities ;
34
+ $ class = $ database -> execute ( " SELECT * FROM permissions WHERE class = :class " , [ " class " => $ name ])-> fetch ( PDO :: FETCH_ASSOC ) ;
33
35
34
- if (!is_null ($ parent )) {
35
- $ this ->parent = static ::$ known_classes [$ parent ];
36
+ if (!is_null ($ class [ " parent " ] )) {
37
+ $ this ->parent = static ::$ known_classes [$ class [ " parent " ] ];
36
38
}
39
+ $ this ->core = (bool )$ class ["core " ];
40
+
41
+ unset($ class ["id " ]);
42
+ unset($ class ["class " ]);
43
+ unset($ class ["parent " ]);
44
+ unset($ class ["core " ]);
45
+
46
+ $ this ->abilities = $ class ;
37
47
38
48
static ::$ known_classes [$ name ] = $ this ;
39
49
}
@@ -58,10 +68,16 @@ public function permissions(): array
58
68
*/
59
69
public function can (string $ ability ): bool
60
70
{
61
- if (array_key_exists ($ ability , $ this ->abilities )) {
62
- return $ this ->abilities [$ ability ];
71
+ // hellbanned is a snowflake, it isn't really a "permission" so much as
72
+ // "a special behaviour which applies to one particular user class"
73
+ if ($ this ->name == "admin " && $ ability != "hellbanned " ) {
74
+ return true ;
75
+ } elseif (array_key_exists ($ ability , $ this ->abilities ) && $ this ->abilities [$ ability ]) {
76
+ return true ;
63
77
} elseif (!is_null ($ this ->parent )) {
64
78
return $ this ->parent ->can ($ ability );
79
+ } elseif (array_key_exists ($ ability , $ this ->abilities )) {
80
+ return false ;
65
81
} else {
66
82
$ min_dist = 9999 ;
67
83
$ min_ability = null ;
@@ -75,63 +91,20 @@ public function can(string $ability): bool
75
91
throw new ServerError ("Unknown ability ' $ ability'. Did the developer mean ' $ min_ability'? " );
76
92
}
77
93
}
78
- }
79
94
80
- $ _all_false = [];
81
- $ _all_true = [];
82
- foreach ((new \ReflectionClass (Permissions::class))->getConstants () as $ k => $ v ) {
83
- assert (is_string ($ v ));
84
- $ _all_false [$ v ] = false ;
85
- $ _all_true [$ v ] = true ;
95
+ // clear and load classes from the database.
96
+ public static function loadClasses (): void
97
+ {
98
+ global $ database ;
99
+
100
+ // clear any existing classes to avoid complications with parent classes
101
+ foreach (static ::$ known_classes as $ k => $ v ) {
102
+ unset(static ::$ known_classes [$ k ]);
103
+ }
104
+
105
+ $ classes = $ database ->get_col ("SELECT class FROM permissions WHERE 1=1 ORDER BY id " );
106
+ foreach ($ classes as $ class ) {
107
+ new UserClass ($ class );
108
+ }
109
+ }
86
110
}
87
- // hellbanned is a snowflake, it isn't really a "permission" so much as
88
- // "a special behaviour which applies to one particular user class"
89
- $ _all_true [Permissions::HELLBANNED ] = false ;
90
- new UserClass ("base " , null , $ _all_false );
91
- new UserClass ("admin " , null , $ _all_true );
92
- unset($ _all_true );
93
- unset($ _all_false );
94
-
95
- // Ghost users can't do anything
96
- new UserClass ("ghost " , "base " , [
97
- Permissions::READ_PM => true ,
98
- ]);
99
-
100
- // Anonymous users can't do anything by default, but
101
- // the admin might grant them some permissions
102
- new UserClass ("anonymous " , "base " , [
103
- Permissions::CREATE_USER => true ,
104
- ]);
105
-
106
- new UserClass ("user " , "base " , [
107
- Permissions::BIG_SEARCH => true ,
108
- Permissions::CREATE_IMAGE => true ,
109
- Permissions::CREATE_COMMENT => true ,
110
- Permissions::EDIT_IMAGE_TAG => true ,
111
- Permissions::EDIT_IMAGE_SOURCE => true ,
112
- Permissions::EDIT_IMAGE_TITLE => true ,
113
- Permissions::EDIT_IMAGE_RELATIONSHIPS => true ,
114
- Permissions::EDIT_IMAGE_ARTIST => true ,
115
- Permissions::CREATE_IMAGE_REPORT => true ,
116
- Permissions::EDIT_IMAGE_RATING => true ,
117
- Permissions::EDIT_FAVOURITES => true ,
118
- Permissions::CREATE_VOTE => true ,
119
- Permissions::SEND_PM => true ,
120
- Permissions::READ_PM => true ,
121
- Permissions::SET_PRIVATE_IMAGE => true ,
122
- Permissions::PERFORM_BULK_ACTIONS => true ,
123
- Permissions::BULK_DOWNLOAD => true ,
124
- Permissions::CHANGE_USER_SETTING => true ,
125
- Permissions::FORUM_CREATE => true ,
126
- Permissions::NOTES_CREATE => true ,
127
- Permissions::NOTES_EDIT => true ,
128
- Permissions::NOTES_REQUEST => true ,
129
- Permissions::POOLS_CREATE => true ,
130
- Permissions::POOLS_UPDATE => true ,
131
- ]);
132
-
133
- new UserClass ("hellbanned " , "user " , [
134
- Permissions::HELLBANNED => true ,
135
- ]);
136
-
137
- @include_once "data/config/user-classes.conf.php " ;
0 commit comments