forked from OPSnet/Gazelle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Privilege.php
119 lines (102 loc) · 3.45 KB
/
Privilege.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php
namespace Gazelle;
class Privilege extends BaseObject {
final const tableName = 'permissions';
public function flush(): static { $this->info = []; return $this; }
public function location(): string { return ''; }
public function link(): string { return sprintf('<a href="%s">%s</a>', $this->url(), $this->url()); }
public function info(): array {
if (isset($this->info) && !empty($this->info)) {
return $this->info;
}
$info = self::$db->rowAssoc("
SELECT p.Name,
p.Level,
p.Secondary,
p.PermittedForums,
p.Values,
p.DisplayStaff,
p.StaffGroup,
p.badge,
count(u.ID) + count(DISTINCT l.UserID) AS total
FROM permissions AS p
LEFT JOIN users_main AS u ON (u.PermissionID = p.ID)
LEFT JOIN users_levels AS l ON (l.PermissionID = p.ID)
WHERE p.ID = ?
GROUP BY p.ID
", $this->id
);
$info['Values'] = unserialize($info['Values']);
$this->info = $info;
return $this->info;
}
public function badge(): ?string {
return $this->info()['badge'];
}
public function displayStaff(): bool {
return $this->info()['DisplayStaff'] == '1';
}
public function level(): int {
return $this->info()['Level'];
}
public function name(): string {
return $this->info()['Name'];
}
public function isSecondary(): bool {
return $this->info()['Secondary'] == 1;
}
public function permittedForums(): array {
$list = $this->info()['PermittedForums'];
return !empty($list) ? explode(',', $list) : [];
}
public function staffGroupId(): ?int {
return $this->info()['StaffGroup'];
}
public function userTotal(): int {
return $this->info()['total'];
}
public function values(): array {
return $this->info()['Values'];
}
protected function userFlush(array $ids): int {
self::$cache->delete_multi(array_merge(
["perm_" . $this->id],
array_map(fn($id) => "u_$id", $ids),
));
return count($ids);
}
public function modify(): bool {
$modified = parent::modify();
if ($modified) {
self::$db->prepared_query(
$this->isSecondary()
? "SELECT DISTINCT UserID FROM users_levels WHERE PermissionID = ?"
: "SELECT ID FROM users_main WHERE PermissionID = ?"
, $this->id
);
$this->userFlush(self::$db->collect(0, false));
}
self::$cache->delete_multi(['user_class', 'staff_class']);
return $modified;
}
public function remove(): int {
if ($this->isSecondary()) {
self::$db->prepared_query("
SELECT DISTINCT UserID FROM users_levels WHERE PermissionID = ?
", $this->id
);
$this->userFlush(self::$db->collect(0, false));
self::$db->prepared_query("
DELETE FROM users_levels WHERE PermissionId = ?
", $this->id
);
}
self::$db->prepared_query("
DELETE FROM permissions WHERE ID = ?
", $this->id
);
$affected = self::$db->affected_rows();
self::$cache->delete_value('classes');
return $affected;
}
}