misuzu/src/perms.php

237 lines
5.4 KiB
PHP
Raw Normal View History

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');
function perms_get_keys(array $modes = MSZ_PERM_MODES): array
2018-07-08 21:24:59 +02:00
{
$perms = [];
2019-05-04 21:17:11 +02:00
foreach ($modes as $mode) {
2019-05-04 21:16:49 +02:00
$perms[] = perms_get_key($mode, MSZ_PERMS_ALLOW);
$perms[] = perms_get_key($mode, MSZ_PERMS_DENY);
2018-07-08 21:24:59 +02:00
}
return $perms;
}
function perms_create(array $modes = MSZ_PERM_MODES): array
2018-07-08 21:24:59 +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-04-30 02:55:10 +02:00
function perms_get_user(int $user): array
{
if ($user < 1) {
return perms_get_blank();
}
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
FROM `msz_permissions`
2019-04-30 02:55:10 +02:00
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`
2019-04-30 02:55:10 +02:00
WHERE `user_id` = :user_id_2
)
)
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
}
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-04-30 02:55:10 +02:00
if (array_key_exists($role, $memo)) {
return $memo[$role];
}
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) {
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);
$perms = db_fetch($getPerms);
2018-07-08 21:24:59 +02:00
if (empty($perms)) {
return perms_create();
2018-07-08 21:24:59 +02:00
}
return $perms;
}
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) {
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);
$perms = db_fetch($getPerms);
2018-07-08 21:24:59 +02:00
if (empty($perms)) {
return perms_create();
2018-07-08 21:24:59 +02:00
}
return $perms;
}
2019-05-04 22:00:23 +02:00
function perms_check(?int $perms, ?int $perm): bool
2018-07-08 01:24:34 +02:00
{
2019-05-04 22:00:23 +02:00
return (($perms ?? 0) & ($perm ?? 0)) > 0;
2018-07-08 01:24:34 +02:00
}
2019-03-31 18:49:16 +02:00
function perms_check_user(string $prefix, ?int $userId, int $perm): bool
{
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);
}