222 lines
7.1 KiB
PHP
222 lines
7.1 KiB
PHP
<?php
|
|
use Misuzu\Database;
|
|
|
|
require_once __DIR__ . '/../../misuzu.php';
|
|
|
|
$db = Database::connection();
|
|
$templating = $app->getTemplating();
|
|
|
|
$isPostRequest = $_SERVER['REQUEST_METHOD'] === 'POST';
|
|
$queryQffset = (int)($_GET['o'] ?? 0);
|
|
|
|
switch ($_GET['v'] ?? null) {
|
|
case 'listing':
|
|
$usersTake = 32;
|
|
|
|
$manageUsersCount = $db->query('
|
|
SELECT COUNT(`user_id`)
|
|
FROM `msz_users`
|
|
')->fetchColumn();
|
|
|
|
$getManageUsers = $db->prepare('
|
|
SELECT
|
|
u.`user_id`, u.`username`,
|
|
COALESCE(r.`role_colour`, CAST(0x40000000 AS UNSIGNED)) as `colour`
|
|
FROM `msz_users` as u
|
|
LEFT JOIN `msz_roles` as r
|
|
ON u.`display_role` = r.`role_id`
|
|
LIMIT :offset, :take
|
|
');
|
|
$getManageUsers->bindValue('offset', $queryQffset);
|
|
$getManageUsers->bindValue('take', $usersTake);
|
|
$manageUsers = $getManageUsers->execute() ? $getManageUsers->fetchAll() : [];
|
|
|
|
$templating->vars([
|
|
'manage_users' => $manageUsers,
|
|
'manage_users_count' => $manageUsersCount,
|
|
'manage_users_range' => $usersTake,
|
|
'manage_users_offset' => $queryQffset,
|
|
]);
|
|
echo $templating->render('@manage.users.listing');
|
|
break;
|
|
|
|
case 'view':
|
|
$userId = $_GET['u'] ?? null;
|
|
|
|
if ($userId === null || ($userId = (int)$userId) < 1) {
|
|
echo 'no';
|
|
break;
|
|
}
|
|
|
|
$getUser = $db->prepare('
|
|
SELECT
|
|
u.*,
|
|
INET6_NTOA(u.`register_ip`) as `register_ip_decoded`,
|
|
INET6_NTOA(u.`last_ip`) as `last_ip_decoded`,
|
|
COALESCE(r.`role_colour`, CAST(0x40000000 AS UNSIGNED)) as `colour`
|
|
FROM `msz_users` as u
|
|
LEFT JOIN `msz_roles` as r
|
|
ON u.`display_role` = r.`role_id`
|
|
WHERE `user_id` = :user_id
|
|
');
|
|
$getUser->bindValue('user_id', $userId);
|
|
$getUser->execute();
|
|
$manageUser = $getUser->execute() ? $getUser->fetch() : [];
|
|
|
|
if (!$manageUser) {
|
|
echo 'Could not find that user.';
|
|
break;
|
|
}
|
|
|
|
$templating->var('view_user', $manageUser);
|
|
echo $templating->render('@manage.users.view');
|
|
break;
|
|
|
|
case 'roles':
|
|
$rolesTake = 10;
|
|
|
|
$manageRolesCount = $db->query('
|
|
SELECT COUNT(`role_id`)
|
|
FROM `msz_roles`
|
|
')->fetchColumn();
|
|
|
|
$getManageRoles = $db->prepare('
|
|
SELECT
|
|
`role_id`, `role_colour`, `role_name`,
|
|
(
|
|
SELECT COUNT(`user_id`)
|
|
FROM `msz_user_roles` as ur
|
|
WHERE ur.`role_id` = r.`role_id`
|
|
) as `users`
|
|
FROM `msz_roles` as r
|
|
LIMIT :offset, :take
|
|
');
|
|
$getManageRoles->bindValue('offset', $queryQffset);
|
|
$getManageRoles->bindValue('take', $rolesTake);
|
|
$manageRoles = $getManageRoles->execute() ? $getManageRoles->fetchAll() : [];
|
|
|
|
$templating->vars([
|
|
'manage_roles' => $manageRoles,
|
|
'manage_roles_count' => $manageRolesCount,
|
|
'manage_roles_range' => $rolesTake,
|
|
'manage_roles_offset' => $queryQffset,
|
|
]);
|
|
echo $templating->render('@manage.users.roles');
|
|
break;
|
|
|
|
case 'role':
|
|
$roleId = $_GET['r'] ?? null;
|
|
|
|
if ($isPostRequest) {
|
|
if (!tmp_csrf_verify($_POST['csrf'] ?? '')) {
|
|
echo 'csrf err';
|
|
break;
|
|
}
|
|
|
|
if (!isset($_POST['role'])) {
|
|
echo 'no';
|
|
break;
|
|
}
|
|
|
|
$roleName = $_POST['role']['name'] ?? '';
|
|
$roleNameLength = strlen($roleName);
|
|
|
|
if ($roleNameLength < 1 || $roleNameLength > 255) {
|
|
echo 'invalid name length';
|
|
break;
|
|
}
|
|
|
|
$roleSecret = !empty($_POST['role']['secret']);
|
|
|
|
$roleHierarchy = (int)($_POST['role']['hierarchy'] ?? -1);
|
|
|
|
if ($roleHierarchy < 1 || $roleHierarchy > 100) {
|
|
echo 'Invalid hierarchy value.';
|
|
break;
|
|
}
|
|
|
|
$roleColour = colour_create();
|
|
|
|
if (!empty($_POST['role']['colour']['inherit'])) {
|
|
colour_set_inherit($roleColour);
|
|
} else {
|
|
foreach (['red', 'green', 'blue'] as $key) {
|
|
$value = (int)($_POST['role']['colour'][$key] ?? -1);
|
|
$func = 'colour_set_' . ucfirst($key);
|
|
|
|
if ($value < 0 || $value > 0xFF) {
|
|
echo 'invalid colour value';
|
|
break 2;
|
|
}
|
|
|
|
$func($roleColour, $value);
|
|
}
|
|
}
|
|
|
|
$roleDescription = $_POST['role']['description'] ?? '';
|
|
|
|
if (strlen($roleDescription) > 1000) {
|
|
echo 'description is too long';
|
|
break;
|
|
}
|
|
|
|
if ($roleId < 1) {
|
|
$updateRole = $db->prepare('
|
|
INSERT INTO `msz_roles`
|
|
(`role_name`, `role_hierarchy`, `role_secret`, `role_colour`, `role_description`, `created_at`)
|
|
VALUES
|
|
(:role_name, :role_hierarchy, :role_secret, :role_colour, :role_description, NOW())
|
|
');
|
|
} else {
|
|
$updateRole = $db->prepare('
|
|
UPDATE `msz_roles` SET
|
|
`role_name` = :role_name,
|
|
`role_hierarchy` = :role_hierarchy,
|
|
`role_secret` = :role_secret,
|
|
`role_colour` = :role_colour,
|
|
`role_description` = :role_description
|
|
WHERE `role_id` = :role_id
|
|
');
|
|
$updateRole->bindValue('role_id', $roleId);
|
|
}
|
|
|
|
$updateRole->bindValue('role_name', $roleName);
|
|
$updateRole->bindValue('role_hierarchy', $roleHierarchy);
|
|
$updateRole->bindValue('role_secret', $roleSecret ? 1 : 0);
|
|
$updateRole->bindValue('role_colour', $roleColour);
|
|
$updateRole->bindValue('role_description', $roleDescription);
|
|
$updateRole->execute();
|
|
|
|
if ($roleId < 1) {
|
|
$roleId = (int)$db->lastInsertId();
|
|
}
|
|
|
|
header("Location: ?v=role&r={$roleId}");
|
|
break;
|
|
}
|
|
|
|
if ($roleId !== null) {
|
|
if ($roleId < 1) {
|
|
echo 'no';
|
|
break;
|
|
}
|
|
|
|
$getEditRole = $db->prepare('
|
|
SELECT *
|
|
FROM `msz_roles`
|
|
WHERE `role_id` = :role_id
|
|
');
|
|
$getEditRole->bindValue('role_id', $roleId);
|
|
$editRole = $getEditRole->execute() ? $getEditRole->fetch() : [];
|
|
|
|
if (!$editRole) {
|
|
echo 'invalid role';
|
|
break;
|
|
}
|
|
|
|
$templating->vars(['edit_role' => $editRole]);
|
|
}
|
|
|
|
echo $templating->render('@manage.users.roles_create');
|
|
break;
|
|
}
|