2018-07-08 01:24:34 +02:00
|
|
|
<?php
|
2018-07-10 23:24:00 +02:00
|
|
|
define('MSZ_PERMS_GENERAL', 'general');
|
2018-07-08 01:24:34 +02:00
|
|
|
define('MSZ_PERMS_USER', 'user');
|
|
|
|
define('MSZ_PERMS_CHANGELOG', 'changelog');
|
2018-07-08 21:24:59 +02:00
|
|
|
define('MSZ_PERMS_NEWS', 'news');
|
2018-07-10 23:24:00 +02:00
|
|
|
define('MSZ_PERMS_FORUM', 'forum');
|
|
|
|
define('MSZ_PERMS_COMMENTS', 'comments');
|
2018-07-08 21:24:59 +02:00
|
|
|
|
|
|
|
define('MSZ_PERM_MODES', [
|
2018-07-10 23:24:00 +02:00
|
|
|
MSZ_PERMS_GENERAL, MSZ_PERMS_USER, MSZ_PERMS_CHANGELOG,
|
|
|
|
MSZ_PERMS_NEWS, MSZ_PERMS_FORUM, MSZ_PERMS_COMMENTS,
|
2018-07-08 21:24:59 +02:00
|
|
|
]);
|
|
|
|
|
|
|
|
define('MSZ_PERMS_ALLOW', 'allow');
|
|
|
|
define('MSZ_PERMS_DENY', 'deny');
|
|
|
|
|
|
|
|
define('MSZ_PERM_SETS', [
|
|
|
|
MSZ_PERMS_ALLOW, MSZ_PERMS_DENY
|
|
|
|
]);
|
2018-07-08 01:24:34 +02:00
|
|
|
|
2018-07-08 21:24:59 +02:00
|
|
|
function perms_get_keys(): array
|
|
|
|
{
|
|
|
|
$perms = [];
|
|
|
|
|
|
|
|
foreach (MSZ_PERM_MODES as $mode) {
|
|
|
|
foreach (MSZ_PERM_SETS as $set) {
|
|
|
|
$perms[] = perms_get_key($mode, $set);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $perms;
|
|
|
|
}
|
|
|
|
|
|
|
|
function perms_create(): array
|
|
|
|
{
|
|
|
|
$perms = [];
|
|
|
|
|
|
|
|
foreach (perms_get_keys() as $key) {
|
|
|
|
$perms[$key] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $perms;
|
|
|
|
}
|
|
|
|
|
|
|
|
function perms_get_key(string $prefix, string $suffix): string
|
|
|
|
{
|
|
|
|
return $prefix . '_perms_' . $suffix;
|
|
|
|
}
|
|
|
|
|
2018-07-08 01:24:34 +02:00
|
|
|
function perms_get_user(string $prefix, int $user): int
|
|
|
|
{
|
2018-12-05 16:06:34 +01:00
|
|
|
if (!in_array($prefix, MSZ_PERM_MODES) || $user < 0) {
|
2018-07-08 01:24:34 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-10-07 01:30:48 +02:00
|
|
|
$getPerms = db_prepare("
|
2018-08-15 01:31:13 +02:00
|
|
|
SELECT BIT_OR(`{$prefix}_perms_allow`) &~ BIT_OR(`{$prefix}_perms_deny`)
|
2018-07-08 01:24:34 +02:00
|
|
|
FROM `msz_permissions`
|
|
|
|
WHERE (`user_id` = :user_id_1 AND `role_id` IS NULL)
|
|
|
|
OR (
|
|
|
|
`user_id` IS NULL
|
|
|
|
AND `role_id` IN (
|
|
|
|
SELECT `role_id`
|
|
|
|
FROM `msz_user_roles`
|
|
|
|
WHERE `user_id` = :user_id_2
|
|
|
|
)
|
|
|
|
)
|
|
|
|
");
|
|
|
|
$getPerms->bindValue('user_id_1', $user);
|
|
|
|
$getPerms->bindValue('user_id_2', $user);
|
2018-08-15 01:31:13 +02:00
|
|
|
return $getPerms->execute() ? (int)$getPerms->fetchColumn() : 0;
|
2018-07-08 01:24:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function perms_get_role(string $prefix, int $role): int
|
|
|
|
{
|
2018-07-08 21:24:59 +02:00
|
|
|
if (!in_array($prefix, MSZ_PERM_MODES) || $role < 1) {
|
2018-07-08 01:24:34 +02:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-10-07 01:30:48 +02:00
|
|
|
$getPerms = db_prepare("
|
2018-07-08 01:24:34 +02:00
|
|
|
SELECT `{$prefix}_perms_allow` &~ `{$prefix}_perms_deny`
|
|
|
|
FROM `msz_permissions`
|
|
|
|
WHERE `role_id` = :role_id
|
|
|
|
AND `user_id` IS NULL
|
|
|
|
");
|
|
|
|
$getPerms->bindValue('role_id', $role);
|
2018-08-15 01:31:13 +02:00
|
|
|
return $getPerms->execute() ? (int)$getPerms->fetchColumn() : 0;
|
2018-07-08 01:24:34 +02:00
|
|
|
}
|
|
|
|
|
2018-07-08 21:24:59 +02:00
|
|
|
function perms_get_user_raw(int $user): array
|
|
|
|
{
|
|
|
|
$emptyPerms = perms_create();
|
|
|
|
|
|
|
|
if ($user < 1) {
|
|
|
|
return $emptyPerms;
|
|
|
|
}
|
|
|
|
|
2018-10-07 01:30:48 +02:00
|
|
|
$getPerms = db_prepare('
|
2018-07-08 21:24:59 +02:00
|
|
|
SELECT
|
|
|
|
`' . implode('`, `', perms_get_keys()) . '`
|
|
|
|
FROM `msz_permissions`
|
|
|
|
WHERE `user_id` = :user_id
|
|
|
|
AND `role_id` IS NULL
|
|
|
|
');
|
|
|
|
$getPerms->bindValue('user_id', $user);
|
|
|
|
|
|
|
|
if (!$getPerms->execute()) {
|
|
|
|
return $emptyPerms;
|
|
|
|
}
|
|
|
|
|
|
|
|
$perms = $getPerms->fetch(PDO::FETCH_ASSOC);
|
|
|
|
|
|
|
|
if (!$perms) {
|
|
|
|
return $emptyPerms;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $perms;
|
|
|
|
}
|
|
|
|
|
|
|
|
function perms_get_role_raw(int $role): array
|
|
|
|
{
|
|
|
|
$emptyPerms = perms_create();
|
|
|
|
|
|
|
|
if ($role < 1) {
|
|
|
|
return $emptyPerms;
|
|
|
|
}
|
|
|
|
|
2018-10-07 01:30:48 +02:00
|
|
|
$getPerms = db_prepare('
|
2018-07-08 21:24:59 +02:00
|
|
|
SELECT
|
|
|
|
`' . implode('`, `', perms_get_keys()) . '`
|
|
|
|
FROM `msz_permissions`
|
|
|
|
WHERE `user_id` IS NULL
|
|
|
|
AND `role_id` = :role_id
|
2018-07-08 21:29:18 +02:00
|
|
|
');
|
2018-07-08 21:24:59 +02:00
|
|
|
$getPerms->bindValue('role_id', $role);
|
|
|
|
|
|
|
|
if (!$getPerms->execute()) {
|
|
|
|
return $emptyPerms;
|
|
|
|
}
|
|
|
|
|
|
|
|
$perms = $getPerms->fetch(PDO::FETCH_ASSOC);
|
|
|
|
|
|
|
|
if (!$perms) {
|
|
|
|
return $emptyPerms;
|
|
|
|
}
|
|
|
|
|
|
|
|
return $perms;
|
|
|
|
}
|
|
|
|
|
2018-07-08 01:24:34 +02:00
|
|
|
function perms_check(int $perms, int $perm): bool
|
|
|
|
{
|
|
|
|
return ($perms & $perm) > 0;
|
|
|
|
}
|