misuzu/src/perms.php

223 lines
5.5 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');
2019-06-10 19:04:53 +02:00
function perms_get_keys(array $modes = MSZ_PERM_MODES): array {
2018-07-08 21:24:59 +02:00
$perms = [];
2019-06-10 19:04:53 +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;
}
2019-06-10 19:04:53 +02:00
function perms_create(array $modes = MSZ_PERM_MODES): array {
return array_fill_keys(perms_get_keys($modes), 0);
2018-07-08 21:24:59 +02:00
}
2019-06-10 19:04:53 +02:00
function perms_get_key(string $prefix, string $suffix): string {
2018-07-08 21:24:59 +02:00
return $prefix . '_perms_' . $suffix;
}
2019-06-10 19:04:53 +02:00
function perms_get_select(array $modes = MSZ_PERM_MODES, string $allow = MSZ_PERMS_ALLOW, string $deny = MSZ_PERMS_DENY): string {
2019-04-30 02:55:10 +02:00
$select = '';
2019-06-10 19:04:53 +02:00
if(empty($select)) {
foreach($modes as $mode) {
2019-04-30 02:55:10 +02:00
$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;
}
2019-06-10 19:04:53 +02:00
function perms_get_blank(array $modes = MSZ_PERM_MODES): array {
2019-04-30 02:55:10 +02:00
return array_fill_keys($modes, 0);
}
2019-06-10 19:04:53 +02:00
function perms_get_user(int $user): array {
if($user < 1) {
2019-04-30 02:55:10 +02:00
return perms_get_blank();
}
2019-04-30 02:55:10 +02:00
static $memo = [];
2018-12-11 20:08:59 +01:00
2019-06-10 19:04:53 +02:00
if(array_key_exists($user, $memo)) {
2019-04-30 02:55:10 +02:00
return $memo[$user];
}
2019-09-29 00:38:39 +02:00
$getPerms = \Misuzu\DB::prepare(sprintf(
2019-04-30 02:55:10 +02:00
'
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()
));
2019-09-29 00:38:39 +02:00
$getPerms->bind('user_id_1', $user);
$getPerms->bind('user_id_2', $user);
2019-04-30 02:55:10 +02:00
2019-09-29 00:38:39 +02:00
return $memo[$user] = $getPerms->fetch();
2018-07-08 01:24:34 +02:00
}
2019-06-10 19:04:53 +02:00
function perms_delete_user(int $user): bool {
if($user < 1) {
return false;
}
2019-09-29 00:38:39 +02:00
$deletePermissions = \Misuzu\DB::prepare('
DELETE FROM `msz_permissions`
WHERE `role_id` IS NULL
AND `user_id` = :user_id
');
2019-09-29 00:38:39 +02:00
$deletePermissions->bind('user_id', $user);
return $deletePermissions->execute();
}
2019-06-10 19:04:53 +02:00
function perms_get_role(int $role): array {
if($role < 1) {
2019-04-30 02:55:10 +02:00
return perms_get_blank();
2018-07-08 01:24:34 +02:00
}
2019-04-30 02:55:10 +02:00
static $memo = [];
2019-06-10 19:04:53 +02:00
if(array_key_exists($role, $memo)) {
2019-04-30 02:55:10 +02:00
return $memo[$role];
}
2019-09-29 00:38:39 +02:00
$getPerms = \Misuzu\DB::prepare(sprintf(
2019-04-30 02:55:10 +02:00
'
SELECT %s
FROM `msz_permissions`
WHERE `role_id` = :role_id
AND `user_id` IS NULL
',
perms_get_select()
));
2019-09-29 00:38:39 +02:00
$getPerms->bind('role_id', $role);
2019-04-30 02:55:10 +02:00
2019-09-29 00:38:39 +02:00
return $memo[$role] = $getPerms->fetch();
2018-07-08 01:24:34 +02:00
}
2019-06-10 19:04:53 +02:00
function perms_get_user_raw(int $user): array {
if($user < 1) {
return perms_create();
2018-07-08 21:24:59 +02:00
}
2019-09-29 00:38:39 +02:00
$getPerms = \Misuzu\DB::prepare(sprintf('
2018-12-11 20:08:59 +01:00
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())));
2019-09-29 00:38:39 +02:00
$getPerms->bind('user_id', $user);
$perms = $getPerms->fetch();
2018-07-08 21:24:59 +02:00
2019-06-10 19:04:53 +02:00
if(empty($perms)) {
return perms_create();
2018-07-08 21:24:59 +02:00
}
return $perms;
}
2019-06-10 19:04:53 +02:00
function perms_set_user_raw(int $user, array $perms): bool {
if($user < 1) {
return false;
}
$realPerms = perms_create();
$permKeys = array_keys($realPerms);
2019-06-10 19:04:53 +02:00
foreach($permKeys as $perm) {
$realPerms[$perm] = (int)($perms[$perm] ?? 0);
}
2019-09-29 00:38:39 +02:00
$setPermissions = \Misuzu\DB::prepare(sprintf(
'
REPLACE INTO `msz_permissions`
(`role_id`, `user_id`, `%s`)
VALUES
(NULL, :user_id, :%s)
',
implode('`, `', $permKeys),
implode(', :', $permKeys)
));
2019-09-29 00:38:39 +02:00
$setPermissions->bind('user_id', $user);
2019-06-10 19:04:53 +02:00
foreach($realPerms as $key => $value) {
2019-09-29 00:38:39 +02:00
$setPermissions->bind($key, $value);
}
return $setPermissions->execute();
}
2019-06-10 19:04:53 +02:00
function perms_get_role_raw(int $role): array {
if($role < 1) {
return perms_create();
2018-07-08 21:24:59 +02:00
}
2019-09-29 00:38:39 +02:00
$getPerms = \Misuzu\DB::prepare(sprintf('
2018-12-11 20:08:59 +01:00
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())));
2019-09-29 00:38:39 +02:00
$getPerms->bind('role_id', $role);
$perms = $getPerms->fetch();
2018-07-08 21:24:59 +02:00
2019-06-10 19:04:53 +02:00
if(empty($perms)) {
return perms_create();
2018-07-08 21:24:59 +02:00
}
return $perms;
}
2019-06-10 19:04:53 +02:00
function perms_check(?int $perms, ?int $perm, bool $strict = false): bool {
2019-05-09 17:11:42 +02:00
$and = ($perms ?? 0) & ($perm ?? 0);
return $strict ? $and === $perm : $and > 0;
2018-07-08 01:24:34 +02:00
}
2019-06-10 19:04:53 +02:00
function perms_check_user(string $prefix, ?int $userId, int $perm, bool $strict = false): bool {
2019-05-09 17:11:42 +02:00
return $userId > 0 && perms_check(perms_get_user($userId)[$prefix] ?? 0, $perm, $strict);
2019-04-30 02:55:10 +02:00
}
2019-06-10 19:04:53 +02:00
function perms_check_bulk(int $perms, array $set, bool $strict = false): array {
foreach($set as $key => $perm) {
2019-05-09 17:11:42 +02:00
$set[$key] = perms_check($perms, $perm, $strict);
2019-04-30 02:55:10 +02:00
}
return $set;
}
2019-06-10 19:04:53 +02:00
function perms_check_user_bulk(string $prefix, ?int $userId, array $set, bool $strict = false): array {
2019-04-30 02:55:10 +02:00
$perms = perms_get_user($userId)[$prefix] ?? 0;
2019-05-09 17:11:42 +02:00
return perms_check_bulk($perms, $set, $strict);
}