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');
|
|
|
|
|
2019-04-30 22:55:12 +02:00
|
|
|
function perms_get_keys(array $modes = MSZ_PERM_MODES): array
|
2018-07-08 21:24:59 +02:00
|
|
|
{
|
|
|
|
$perms = [];
|
|
|
|
|
|
|
|
foreach (MSZ_PERM_MODES as $mode) {
|
2019-04-30 22:55:12 +02:00
|
|
|
$perms[] = [
|
|
|
|
perms_get_key($mode, MSZ_PERMS_ALLOW),
|
|
|
|
perms_get_key($mode, MSZ_PERMS_DENY),
|
|
|
|
];
|
2018-07-08 21:24:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return $perms;
|
|
|
|
}
|
|
|
|
|
2019-04-30 22:55:12 +02:00
|
|
|
function perms_create(array $modes = MSZ_PERM_MODES): array
|
2018-07-08 21:24:59 +02:00
|
|
|
{
|
2019-04-30 22:55:12 +02:00
|
|
|
return array_fill_keys(perms_get_keys($modes), 0);
|
2018-07-08 21:24:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function perms_get_key(string $prefix, string $suffix): string
|
|
|
|
{
|
|
|
|
return $prefix . '_perms_' . $suffix;
|
|
|
|
}
|
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
function perms_get_select(array $modes = MSZ_PERM_MODES, string $allow = MSZ_PERMS_ALLOW, string $deny = MSZ_PERMS_DENY): string
|
2018-07-08 01:24:34 +02:00
|
|
|
{
|
2019-04-30 02:55:10 +02:00
|
|
|
$select = '';
|
|
|
|
|
|
|
|
if (empty($select)) {
|
|
|
|
foreach ($modes as $mode) {
|
|
|
|
$select .= sprintf(
|
|
|
|
'(BIT_OR(`%1$s_perms_%2$s`) &~ BIT_OR(`%1$s_perms_%3$s`)) AS `%1$s`,',
|
|
|
|
$mode, $allow, $deny
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
$select = substr($select, 0, -1);
|
2018-07-08 01:24:34 +02:00
|
|
|
}
|
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
return $select;
|
|
|
|
}
|
|
|
|
|
|
|
|
function perms_get_blank(array $modes = MSZ_PERM_MODES): array
|
|
|
|
{
|
|
|
|
return array_fill_keys($modes, 0);
|
|
|
|
}
|
2019-02-27 20:24:17 +01:00
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
function perms_get_user(int $user): array
|
|
|
|
{
|
|
|
|
if ($user < 1) {
|
|
|
|
return perms_get_blank();
|
2019-02-27 20:24:17 +01:00
|
|
|
}
|
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
static $memo = [];
|
2018-12-11 20:08:59 +01:00
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
if (array_key_exists($user, $memo)) {
|
|
|
|
return $memo[$user];
|
|
|
|
}
|
|
|
|
|
|
|
|
$getPerms = db_prepare(sprintf(
|
|
|
|
'
|
|
|
|
SELECT %s
|
2018-12-28 21:20:38 +01:00
|
|
|
FROM `msz_permissions`
|
2019-04-30 02:55:10 +02:00
|
|
|
WHERE (`user_id` = :user_id_1 AND `role_id` IS NULL)
|
2018-12-28 21:20:38 +01:00
|
|
|
OR (
|
|
|
|
`user_id` IS NULL
|
|
|
|
AND `role_id` IN (
|
|
|
|
SELECT `role_id`
|
|
|
|
FROM `msz_user_roles`
|
2019-04-30 02:55:10 +02:00
|
|
|
WHERE `user_id` = :user_id_2
|
2018-12-16 22:52:41 +01:00
|
|
|
)
|
2018-12-28 21:20:38 +01:00
|
|
|
)
|
2019-04-30 02:55:10 +02:00
|
|
|
',
|
|
|
|
perms_get_select()
|
|
|
|
));
|
|
|
|
$getPerms->bindValue('user_id_1', $user);
|
|
|
|
$getPerms->bindValue('user_id_2', $user);
|
|
|
|
|
|
|
|
return $memo[$user] = db_fetch($getPerms);
|
2018-07-08 01:24:34 +02:00
|
|
|
}
|
|
|
|
|
2019-02-04 22:10:00 +01:00
|
|
|
function perms_delete_user(int $user): bool
|
|
|
|
{
|
|
|
|
if ($user < 1) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$deletePermissions = db_prepare('
|
|
|
|
DELETE FROM `msz_permissions`
|
|
|
|
WHERE `role_id` IS NULL
|
|
|
|
AND `user_id` = :user_id
|
|
|
|
');
|
|
|
|
$deletePermissions->bindValue('user_id', $user);
|
|
|
|
return $deletePermissions->execute();
|
|
|
|
}
|
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
function perms_get_role(int $role): array
|
2018-07-08 01:24:34 +02:00
|
|
|
{
|
2019-04-30 02:55:10 +02:00
|
|
|
if ($role < 1) {
|
|
|
|
return perms_get_blank();
|
2018-07-08 01:24:34 +02:00
|
|
|
}
|
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
static $memo = [];
|
2019-02-27 20:24:17 +01:00
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
if (array_key_exists($role, $memo)) {
|
|
|
|
return $memo[$role];
|
2019-02-27 20:24:17 +01:00
|
|
|
}
|
|
|
|
|
2019-04-30 02:55:10 +02:00
|
|
|
$getPerms = db_prepare(sprintf(
|
|
|
|
'
|
|
|
|
SELECT %s
|
|
|
|
FROM `msz_permissions`
|
|
|
|
WHERE `role_id` = :role_id
|
|
|
|
AND `user_id` IS NULL
|
|
|
|
',
|
|
|
|
perms_get_select()
|
|
|
|
));
|
2018-07-08 01:24:34 +02:00
|
|
|
$getPerms->bindValue('role_id', $role);
|
2019-04-30 02:55:10 +02:00
|
|
|
|
|
|
|
return $memo[$role] = db_fetch($getPerms);
|
2018-07-08 01:24:34 +02:00
|
|
|
}
|
|
|
|
|
2018-07-08 21:24:59 +02:00
|
|
|
function perms_get_user_raw(int $user): array
|
|
|
|
{
|
|
|
|
if ($user < 1) {
|
2019-01-09 20:06:02 +01:00
|
|
|
return perms_create();
|
2018-07-08 21:24:59 +02:00
|
|
|
}
|
|
|
|
|
2018-12-11 20:08:59 +01:00
|
|
|
$getPerms = db_prepare(sprintf('
|
|
|
|
SELECT `%s`
|
2018-07-08 21:24:59 +02:00
|
|
|
FROM `msz_permissions`
|
|
|
|
WHERE `user_id` = :user_id
|
|
|
|
AND `role_id` IS NULL
|
2018-12-11 20:08:59 +01:00
|
|
|
', implode('`, `', perms_get_keys())));
|
2018-07-08 21:24:59 +02:00
|
|
|
$getPerms->bindValue('user_id', $user);
|
2019-01-09 20:06:02 +01:00
|
|
|
$perms = db_fetch($getPerms);
|
2018-07-08 21:24:59 +02:00
|
|
|
|
2019-01-09 20:06:02 +01:00
|
|
|
if (empty($perms)) {
|
|
|
|
return perms_create();
|
2018-07-08 21:24:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return $perms;
|
|
|
|
}
|
|
|
|
|
2019-02-04 22:10:00 +01:00
|
|
|
function perms_set_user_raw(int $user, array $perms): bool
|
|
|
|
{
|
|
|
|
if ($user < 1) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$realPerms = perms_create();
|
|
|
|
$permKeys = array_keys($realPerms);
|
|
|
|
|
|
|
|
foreach ($permKeys as $perm) {
|
|
|
|
$realPerms[$perm] = (int)($perms[$perm] ?? 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
$setPermissions = db_prepare(sprintf(
|
|
|
|
'
|
|
|
|
REPLACE INTO `msz_permissions`
|
|
|
|
(`role_id`, `user_id`, `%s`)
|
|
|
|
VALUES
|
|
|
|
(NULL, :user_id, :%s)
|
|
|
|
',
|
|
|
|
implode('`, `', $permKeys),
|
|
|
|
implode(', :', $permKeys)
|
|
|
|
));
|
|
|
|
$setPermissions->bindValue('user_id', $user);
|
|
|
|
|
|
|
|
foreach ($realPerms as $key => $value) {
|
|
|
|
$setPermissions->bindValue($key, $value);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $setPermissions->execute();
|
|
|
|
}
|
|
|
|
|
2018-07-08 21:24:59 +02:00
|
|
|
function perms_get_role_raw(int $role): array
|
|
|
|
{
|
|
|
|
if ($role < 1) {
|
2019-01-09 20:06:02 +01:00
|
|
|
return perms_create();
|
2018-07-08 21:24:59 +02:00
|
|
|
}
|
|
|
|
|
2018-12-11 20:08:59 +01:00
|
|
|
$getPerms = db_prepare(sprintf('
|
|
|
|
SELECT `%s`
|
2018-07-08 21:24:59 +02:00
|
|
|
FROM `msz_permissions`
|
|
|
|
WHERE `user_id` IS NULL
|
|
|
|
AND `role_id` = :role_id
|
2018-12-11 20:08:59 +01:00
|
|
|
', implode('`, `', perms_get_keys())));
|
2018-07-08 21:24:59 +02:00
|
|
|
$getPerms->bindValue('role_id', $role);
|
2019-01-09 20:06:02 +01:00
|
|
|
$perms = db_fetch($getPerms);
|
2018-07-08 21:24:59 +02:00
|
|
|
|
2019-01-09 20:06:02 +01:00
|
|
|
if (empty($perms)) {
|
|
|
|
return perms_create();
|
2018-07-08 21:24:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return $perms;
|
|
|
|
}
|
|
|
|
|
2018-07-08 01:24:34 +02:00
|
|
|
function perms_check(int $perms, int $perm): bool
|
|
|
|
{
|
|
|
|
return ($perms & $perm) > 0;
|
|
|
|
}
|
2019-02-27 20:24:17 +01:00
|
|
|
|
2019-03-31 18:49:16 +02:00
|
|
|
function perms_check_user(string $prefix, ?int $userId, int $perm): bool
|
2019-02-27 20:24:17 +01:00
|
|
|
{
|
2019-04-30 02:55:10 +02:00
|
|
|
return $userId > 0 && perms_check(perms_get_user($userId)[$prefix] ?? 0, $perm);
|
|
|
|
}
|
|
|
|
|
|
|
|
function perms_check_bulk(int $perms, array $set): array
|
|
|
|
{
|
|
|
|
foreach ($set as $key => $perm) {
|
|
|
|
$set[$key] = perms_check($perms, $perm);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $set;
|
|
|
|
}
|
|
|
|
|
|
|
|
function perms_check_user_bulk(string $prefix, ?int $userId, array $set): array
|
|
|
|
{
|
|
|
|
$perms = perms_get_user($userId)[$prefix] ?? 0;
|
|
|
|
return perms_check_bulk($perms, $set);
|
2019-02-27 20:24:17 +01:00
|
|
|
}
|