2021-12-14 18:32:47 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
2023-01-10 22:44:09 +00:00
|
|
|
|
|
|
|
namespace Shimmie2;
|
|
|
|
|
2023-02-07 13:21:37 +00:00
|
|
|
use GQLA\Type;
|
|
|
|
use GQLA\Field;
|
2012-02-14 21:11:23 +00:00
|
|
|
|
2014-04-29 05:33:03 +00:00
|
|
|
/**
|
|
|
|
* Class UserClass
|
|
|
|
*/
|
2023-02-07 13:21:37 +00:00
|
|
|
#[Type(name: "UserClass")]
|
2019-05-28 16:59:38 +00:00
|
|
|
class UserClass
|
|
|
|
{
|
2024-01-20 19:52:18 +00:00
|
|
|
/** @var array<string, UserClass> */
|
|
|
|
public static array $known_classes = [];
|
|
|
|
|
2023-02-07 13:21:37 +00:00
|
|
|
#[Field]
|
2021-03-14 23:43:50 +00:00
|
|
|
public ?string $name = null;
|
|
|
|
public ?UserClass $parent = null;
|
2024-01-20 14:10:59 +00:00
|
|
|
|
|
|
|
/** @var array<string, bool> */
|
2021-03-14 23:43:50 +00:00
|
|
|
public array $abilities = [];
|
2019-05-28 16:59:38 +00:00
|
|
|
|
2024-01-20 14:10:59 +00:00
|
|
|
/**
|
|
|
|
* @param array<string, bool> $abilities
|
|
|
|
*/
|
2020-03-18 22:15:25 +00:00
|
|
|
public function __construct(string $name, string $parent = null, array $abilities = [])
|
2019-05-28 16:59:38 +00:00
|
|
|
{
|
|
|
|
$this->name = $name;
|
|
|
|
$this->abilities = $abilities;
|
|
|
|
|
|
|
|
if (!is_null($parent)) {
|
2024-01-20 19:52:18 +00:00
|
|
|
$this->parent = static::$known_classes[$parent];
|
2019-05-28 16:59:38 +00:00
|
|
|
}
|
|
|
|
|
2024-01-20 19:52:18 +00:00
|
|
|
static::$known_classes[$name] = $this;
|
2019-05-28 16:59:38 +00:00
|
|
|
}
|
|
|
|
|
2024-01-20 14:10:59 +00:00
|
|
|
/**
|
|
|
|
* @return string[]
|
|
|
|
*/
|
2023-02-15 22:26:34 +00:00
|
|
|
#[Field(type: "[Permission!]!")]
|
2023-02-07 13:21:37 +00:00
|
|
|
public function permissions(): array
|
|
|
|
{
|
|
|
|
global $_all_false;
|
|
|
|
$perms = [];
|
2024-01-20 01:03:01 +00:00
|
|
|
foreach ((new \ReflectionClass(Permissions::class))->getConstants() as $k => $v) {
|
2023-02-07 13:21:37 +00:00
|
|
|
if ($this->can($v)) {
|
|
|
|
$perms[] = $v;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $perms;
|
|
|
|
}
|
|
|
|
|
2019-05-28 16:59:38 +00:00
|
|
|
/**
|
|
|
|
* Determine if this class of user can perform an action or has ability.
|
|
|
|
*/
|
|
|
|
public function can(string $ability): bool
|
|
|
|
{
|
|
|
|
if (array_key_exists($ability, $this->abilities)) {
|
2020-01-26 13:19:35 +00:00
|
|
|
return $this->abilities[$ability];
|
2019-05-28 16:59:38 +00:00
|
|
|
} elseif (!is_null($this->parent)) {
|
|
|
|
return $this->parent->can($ability);
|
|
|
|
} else {
|
|
|
|
$min_dist = 9999;
|
|
|
|
$min_ability = null;
|
2024-01-20 19:52:18 +00:00
|
|
|
foreach (UserClass::$known_classes['base']->abilities as $a => $cando) {
|
2019-05-28 16:59:38 +00:00
|
|
|
$v = levenshtein($ability, $a);
|
|
|
|
if ($v < $min_dist) {
|
|
|
|
$min_dist = $v;
|
|
|
|
$min_ability = $a;
|
|
|
|
}
|
|
|
|
}
|
2024-02-11 15:47:40 +00:00
|
|
|
throw new ServerError("Unknown ability '$ability'. Did the developer mean '$min_ability'?");
|
2019-05-28 16:59:38 +00:00
|
|
|
}
|
|
|
|
}
|
2012-02-14 21:11:23 +00:00
|
|
|
}
|
|
|
|
|
2020-03-19 13:37:14 +00:00
|
|
|
$_all_false = [];
|
2024-01-20 01:03:01 +00:00
|
|
|
foreach ((new \ReflectionClass(Permissions::class))->getConstants() as $k => $v) {
|
2024-01-20 19:47:26 +00:00
|
|
|
assert(is_string($v));
|
2020-03-19 13:37:14 +00:00
|
|
|
$_all_false[$v] = false;
|
|
|
|
}
|
|
|
|
new UserClass("base", null, $_all_false);
|
|
|
|
unset($_all_false);
|
2019-05-28 16:59:38 +00:00
|
|
|
|
2019-11-28 17:20:23 +00:00
|
|
|
// Ghost users can't do anything
|
|
|
|
new UserClass("ghost", "base", [
|
2023-12-21 21:09:49 +00:00
|
|
|
Permissions::READ_PM => true,
|
2019-11-28 17:20:23 +00:00
|
|
|
]);
|
|
|
|
|
|
|
|
// Anonymous users can't do anything by default, but
|
|
|
|
// the admin might grant them some permissions
|
2019-05-28 16:59:38 +00:00
|
|
|
new UserClass("anonymous", "base", [
|
2019-11-28 21:32:18 +00:00
|
|
|
Permissions::CREATE_USER => true,
|
2019-05-28 16:59:38 +00:00
|
|
|
]);
|
|
|
|
|
|
|
|
new UserClass("user", "base", [
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::BIG_SEARCH => true,
|
|
|
|
Permissions::CREATE_IMAGE => true,
|
|
|
|
Permissions::CREATE_COMMENT => true,
|
|
|
|
Permissions::EDIT_IMAGE_TAG => true,
|
|
|
|
Permissions::EDIT_IMAGE_SOURCE => true,
|
2019-07-09 14:23:46 +00:00
|
|
|
Permissions::EDIT_IMAGE_TITLE => true,
|
2020-02-08 00:24:13 +00:00
|
|
|
Permissions::EDIT_IMAGE_RELATIONSHIPS => true,
|
|
|
|
Permissions::EDIT_IMAGE_ARTIST => true,
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::CREATE_IMAGE_REPORT => true,
|
|
|
|
Permissions::EDIT_IMAGE_RATING => true,
|
2020-02-08 00:24:13 +00:00
|
|
|
Permissions::EDIT_FAVOURITES => true,
|
2023-02-24 05:32:23 +00:00
|
|
|
Permissions::CREATE_VOTE => true,
|
2019-12-15 20:40:05 +00:00
|
|
|
Permissions::SEND_PM => true,
|
|
|
|
Permissions::READ_PM => true,
|
2020-06-02 23:08:24 +00:00
|
|
|
Permissions::SET_PRIVATE_IMAGE => true,
|
2022-07-09 22:37:43 +00:00
|
|
|
Permissions::PERFORM_BULK_ACTIONS => true,
|
2020-06-22 00:17:58 +00:00
|
|
|
Permissions::BULK_DOWNLOAD => true,
|
2024-02-10 23:32:50 +00:00
|
|
|
Permissions::CHANGE_USER_SETTING => true,
|
2024-02-21 11:12:51 +00:00
|
|
|
Permissions::FORUM_CREATE => true,
|
2024-02-10 23:32:50 +00:00
|
|
|
Permissions::NOTES_CREATE => true,
|
|
|
|
Permissions::NOTES_EDIT => true,
|
2024-02-21 11:13:09 +00:00
|
|
|
Permissions::NOTES_REQUEST => true,
|
2024-02-10 23:32:50 +00:00
|
|
|
Permissions::POOLS_CREATE => true,
|
|
|
|
Permissions::POOLS_UPDATE => true,
|
2019-05-28 16:59:38 +00:00
|
|
|
]);
|
|
|
|
|
2020-03-19 13:37:14 +00:00
|
|
|
new UserClass("hellbanned", "user", [
|
|
|
|
Permissions::HELLBANNED => true,
|
|
|
|
]);
|
|
|
|
|
2020-03-18 22:15:25 +00:00
|
|
|
new UserClass("admin", "base", [
|
|
|
|
Permissions::CHANGE_SETTING => true,
|
2020-10-26 15:13:28 +00:00
|
|
|
Permissions::CHANGE_USER_SETTING => true,
|
|
|
|
Permissions::CHANGE_OTHER_USER_SETTING => true,
|
2020-03-18 22:15:25 +00:00
|
|
|
Permissions::OVERRIDE_CONFIG => true,
|
|
|
|
Permissions::BIG_SEARCH => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
|
|
|
Permissions::MANAGE_EXTENSION_LIST => true,
|
|
|
|
Permissions::MANAGE_ALIAS_LIST => true,
|
|
|
|
Permissions::MANAGE_AUTO_TAG => true,
|
|
|
|
Permissions::MASS_TAG_EDIT => true,
|
|
|
|
|
2020-03-18 22:15:25 +00:00
|
|
|
Permissions::VIEW_IP => true,
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::BAN_IP => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
|
|
|
Permissions::CREATE_USER => true,
|
2020-05-19 18:33:51 +00:00
|
|
|
Permissions::CREATE_OTHER_USER => true,
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::EDIT_USER_NAME => true,
|
|
|
|
Permissions::EDIT_USER_PASSWORD => true,
|
2020-03-18 22:15:25 +00:00
|
|
|
Permissions::EDIT_USER_INFO => true,
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::EDIT_USER_CLASS => true,
|
|
|
|
Permissions::DELETE_USER => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::CREATE_COMMENT => true,
|
|
|
|
Permissions::DELETE_COMMENT => true,
|
2020-03-18 22:15:25 +00:00
|
|
|
Permissions::BYPASS_COMMENT_CHECKS => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::REPLACE_IMAGE => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
Permissions::CREATE_IMAGE => true,
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::EDIT_IMAGE_TAG => true,
|
|
|
|
Permissions::EDIT_IMAGE_SOURCE => true,
|
|
|
|
Permissions::EDIT_IMAGE_OWNER => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
Permissions::EDIT_IMAGE_LOCK => true,
|
2019-07-09 14:23:46 +00:00
|
|
|
Permissions::EDIT_IMAGE_TITLE => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
Permissions::EDIT_IMAGE_RELATIONSHIPS => true,
|
|
|
|
Permissions::EDIT_IMAGE_ARTIST => true,
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::BULK_EDIT_IMAGE_TAG => true,
|
|
|
|
Permissions::BULK_EDIT_IMAGE_SOURCE => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
Permissions::DELETE_IMAGE => true,
|
|
|
|
|
|
|
|
Permissions::BAN_IMAGE => true,
|
|
|
|
|
|
|
|
Permissions::VIEW_EVENTLOG => true,
|
|
|
|
Permissions::IGNORE_DOWNTIME => true,
|
2020-03-19 13:37:14 +00:00
|
|
|
Permissions::VIEW_REGISTRATIONS => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::CREATE_IMAGE_REPORT => true,
|
2020-03-18 22:15:25 +00:00
|
|
|
Permissions::VIEW_IMAGE_REPORT => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-09-29 18:00:51 +00:00
|
|
|
Permissions::WIKI_ADMIN => true,
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::EDIT_WIKI_PAGE => true,
|
|
|
|
Permissions::DELETE_WIKI_PAGE => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::MANAGE_BLOCKS => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::MANAGE_ADMINTOOLS => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-12-15 20:40:05 +00:00
|
|
|
Permissions::SEND_PM => true,
|
|
|
|
Permissions::READ_PM => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
Permissions::VIEW_OTHER_PMS => true, # hm
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::EDIT_FEATURE => true,
|
|
|
|
Permissions::BULK_EDIT_VOTE => true,
|
|
|
|
Permissions::EDIT_OTHER_VOTE => true,
|
2023-02-28 23:17:00 +00:00
|
|
|
Permissions::CREATE_VOTE => true,
|
2024-02-10 23:03:14 +00:00
|
|
|
Permissions::VIEW_SYSINFO => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
|
|
|
Permissions::HELLBANNED => false,
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::VIEW_HELLBANNED => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2020-03-18 22:15:25 +00:00
|
|
|
Permissions::PROTECTED => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::EDIT_IMAGE_RATING => true,
|
|
|
|
Permissions::BULK_EDIT_IMAGE_RATING => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-07-09 14:10:21 +00:00
|
|
|
Permissions::VIEW_TRASH => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-07-13 22:39:27 +00:00
|
|
|
Permissions::PERFORM_BULK_ACTIONS => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-09-29 18:00:51 +00:00
|
|
|
Permissions::BULK_ADD => true,
|
|
|
|
Permissions::EDIT_FILES => true,
|
|
|
|
Permissions::EDIT_TAG_CATEGORIES => true,
|
|
|
|
Permissions::RESCAN_MEDIA => true,
|
|
|
|
Permissions::SEE_IMAGE_VIEW_COUNTS => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
|
|
|
Permissions::EDIT_FAVOURITES => true,
|
|
|
|
|
2019-09-29 18:00:51 +00:00
|
|
|
Permissions::ARTISTS_ADMIN => true,
|
|
|
|
Permissions::BLOTTER_ADMIN => true,
|
|
|
|
Permissions::FORUM_ADMIN => true,
|
|
|
|
Permissions::NOTES_ADMIN => true,
|
|
|
|
Permissions::POOLS_ADMIN => true,
|
|
|
|
Permissions::TIPS_ADMIN => true,
|
2019-10-17 19:22:33 +00:00
|
|
|
Permissions::CRON_ADMIN => true,
|
2020-03-18 22:06:55 +00:00
|
|
|
|
2019-10-14 18:43:49 +00:00
|
|
|
Permissions::APPROVE_IMAGE => true,
|
|
|
|
Permissions::APPROVE_COMMENT => true,
|
2023-06-14 07:48:38 +00:00
|
|
|
Permissions::BYPASS_IMAGE_APPROVAL => true,
|
2020-06-02 23:05:09 +00:00
|
|
|
|
2023-11-11 21:49:12 +00:00
|
|
|
Permissions::CRON_RUN => true,
|
2020-10-08 22:14:15 +00:00
|
|
|
|
2023-11-11 21:49:12 +00:00
|
|
|
Permissions::BULK_IMPORT => true,
|
|
|
|
Permissions::BULK_EXPORT => true,
|
2020-06-22 00:17:58 +00:00
|
|
|
Permissions::BULK_DOWNLOAD => true,
|
2023-03-30 19:37:06 +00:00
|
|
|
Permissions::BULK_PARENT_CHILD => true,
|
2020-06-02 23:08:24 +00:00
|
|
|
|
|
|
|
Permissions::SET_PRIVATE_IMAGE => true,
|
|
|
|
Permissions::SET_OTHERS_PRIVATE_IMAGES => true,
|
2019-05-28 16:59:38 +00:00
|
|
|
]);
|
|
|
|
|
2012-06-18 00:06:36 +00:00
|
|
|
@include_once "data/config/user-classes.conf.php";
|