Completed the library side of the forum perms and add a migration.
This commit is contained in:
parent
6ff77973d8
commit
edd4289cdb
3 changed files with 85 additions and 15 deletions
42
database/2018_08_18_014408_add_forum_permissions.php
Normal file
42
database/2018_08_18_014408_add_forum_permissions.php
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<?php
|
||||||
|
namespace Misuzu\DatabaseMigrations\AddForumPermissions;
|
||||||
|
|
||||||
|
use PDO;
|
||||||
|
|
||||||
|
function migrate_up(PDO $conn): void
|
||||||
|
{
|
||||||
|
// this permission system is nearly identical to the global site one, aside from it having a forum_id field
|
||||||
|
|
||||||
|
$conn->exec("
|
||||||
|
CREATE TABLE `msz_forum_permissions` (
|
||||||
|
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
|
||||||
|
`role_id` INT(10) UNSIGNED NULL DEFAULT NULL,
|
||||||
|
`forum_id` INT(10) UNSIGNED NULL DEFAULT NULL,
|
||||||
|
`forum_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
`forum_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
|
||||||
|
UNIQUE INDEX `forum_permissions_user_id_unique` (`user_id`),
|
||||||
|
UNIQUE INDEX `forum_permissions_role_id_unique` (`role_id`),
|
||||||
|
UNIQUE INDEX `forum_permissions_forum_id_unique` (`forum_id`),
|
||||||
|
CONSTRAINT `forum_permissions_user_id_foreign`
|
||||||
|
FOREIGN KEY (`user_id`)
|
||||||
|
REFERENCES `msz_users` (`user_id`)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `forum_permissions_role_id_foreign`
|
||||||
|
FOREIGN KEY (`role_id`)
|
||||||
|
REFERENCES `msz_roles` (`role_id`)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `forum_permissions_forum_id_foreign`
|
||||||
|
FOREIGN KEY (`forum_id`)
|
||||||
|
REFERENCES `msz_forum_categories` (`forum_id`)
|
||||||
|
ON UPDATE CASCADE
|
||||||
|
ON DELETE CASCADE
|
||||||
|
)
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
function migrate_down(PDO $conn): void
|
||||||
|
{
|
||||||
|
$conn->exec('DROP TABLE `msz_forum_permissions`');
|
||||||
|
}
|
|
@ -3,6 +3,23 @@ use Misuzu\Database;
|
||||||
|
|
||||||
define('MSZ_FORUM_PERM_MANAGE_FORUMS', 1);
|
define('MSZ_FORUM_PERM_MANAGE_FORUMS', 1);
|
||||||
|
|
||||||
|
define('MSZ_FORUM_PERM_LIST_FORUM', 1); // can see stats, but will get error when trying to view
|
||||||
|
define('MSZ_FORUM_PERM_VIEW_FORUM', 1 << 1);
|
||||||
|
|
||||||
|
define('MSZ_FORUM_PERM_CREATE_TOPIC', 1 << 10);
|
||||||
|
define('MSZ_FORUM_PERM_DELETE_TOPIC', 1 << 11);
|
||||||
|
define('MSZ_FORUM_PERM_MOVE_TOPIC', 1 << 12);
|
||||||
|
define('MSZ_FORUM_PERM_LOCK_TOPIC', 1 << 13);
|
||||||
|
define('MSZ_FORUM_PERM_STICKY_TOPIC', 1 << 14);
|
||||||
|
define('MSZ_FORUM_PERM_ANNOUNCE_TOPIC', 1 << 15);
|
||||||
|
define('MSZ_FORUM_PERM_GLOBAL_ANNOUNCE_TOPIC', 1 << 16);
|
||||||
|
|
||||||
|
define('MSZ_FORUM_PERM_CREATE_POST', 1 << 20);
|
||||||
|
define('MSZ_FORUM_PERM_EDIT_POST', 1 << 21);
|
||||||
|
define('MSZ_FORUM_PERM_EDIT_ANY_POST', 1 << 22);
|
||||||
|
define('MSZ_FORUM_PERM_DELETE_POST', 1 << 23);
|
||||||
|
define('MSZ_FORUM_PERM_DELETE_ANY_POST', 1 << 24);
|
||||||
|
|
||||||
define('MSZ_FORUM_TYPE_DISCUSSION', 0);
|
define('MSZ_FORUM_TYPE_DISCUSSION', 0);
|
||||||
define('MSZ_FORUM_TYPE_CATEGORY', 1);
|
define('MSZ_FORUM_TYPE_CATEGORY', 1);
|
||||||
define('MSZ_FORUM_TYPE_LINK', 2);
|
define('MSZ_FORUM_TYPE_LINK', 2);
|
||||||
|
|
|
@ -31,12 +31,12 @@ function forum_perms_create(): int
|
||||||
return $perms;
|
return $perms;
|
||||||
}
|
}
|
||||||
|
|
||||||
function forum_perms_get_user(string $prefix, ?int $forum, int $user): int
|
function forum_perms_get_user(string $prefix, int $forum, int $user): int
|
||||||
{
|
{
|
||||||
if (!in_array($prefix, MSZ_FORUM_PERM_MODES) || $user < 1) {
|
if (!in_array($prefix, MSZ_FORUM_PERM_MODES) || $user < 1) {
|
||||||
return 0;
|
return 0;
|
||||||
} elseif ($user === 1) {
|
} elseif ($user === 1) {
|
||||||
return 0x7FFFFFFF;
|
//return 0x7FFFFFFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
$getPerms = Database::prepare("
|
$getPerms = Database::prepare("
|
||||||
|
@ -64,7 +64,7 @@ function forum_perms_get_user(string $prefix, ?int $forum, int $user): int
|
||||||
return $getPerms->execute() ? (int)$getPerms->fetchColumn() : 0;
|
return $getPerms->execute() ? (int)$getPerms->fetchColumn() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function forum_perms_get_role(string $prefix, ?int $forum, int $role): int
|
function forum_perms_get_role(string $prefix, int $forum, int $role): int
|
||||||
{
|
{
|
||||||
if (!in_array($prefix, MSZ_FORUM_PERM_MODES) || $role < 1) {
|
if (!in_array($prefix, MSZ_FORUM_PERM_MODES) || $role < 1) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -85,7 +85,7 @@ function forum_perms_get_role(string $prefix, ?int $forum, int $role): int
|
||||||
return $getPerms->execute() ? (int)$getPerms->fetchColumn() : 0;
|
return $getPerms->execute() ? (int)$getPerms->fetchColumn() : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
function perms_get_user_raw(?int $forum, int $user): array
|
function forum_perms_get_user_raw(?int $forum, int $user): array
|
||||||
{
|
{
|
||||||
$emptyPerms = forum_perms_create();
|
$emptyPerms = forum_perms_create();
|
||||||
|
|
||||||
|
@ -93,14 +93,19 @@ function perms_get_user_raw(?int $forum, int $user): array
|
||||||
return $emptyPerms;
|
return $emptyPerms;
|
||||||
}
|
}
|
||||||
|
|
||||||
$getPerms = Database::prepare('
|
$getPerms = Database::prepare(sprintf('
|
||||||
SELECT
|
SELECT
|
||||||
`' . implode('`, `', forum_perms_get_keys()) . '`
|
`' . implode('`, `', forum_perms_get_keys()) . '`
|
||||||
FROM `msz_forum_permissions`
|
FROM `msz_forum_permissions`
|
||||||
WHERE `user_id` = :user_id
|
WHERE `forum_id` %s
|
||||||
|
AND `user_id` = :user_id
|
||||||
AND `role_id` IS NULL
|
AND `role_id` IS NULL
|
||||||
');
|
', $forum === null ? 'IS NULL' : '= :forum_id'));
|
||||||
$getPerms->bindValue('forum_id', $user);
|
|
||||||
|
if ($forum !== null) {
|
||||||
|
$getPerms->bindValue('forum_id', $forum);
|
||||||
|
}
|
||||||
|
|
||||||
$getPerms->bindValue('user_id', $user);
|
$getPerms->bindValue('user_id', $user);
|
||||||
|
|
||||||
if (!$getPerms->execute()) {
|
if (!$getPerms->execute()) {
|
||||||
|
@ -116,21 +121,27 @@ function perms_get_user_raw(?int $forum, int $user): array
|
||||||
return $perms;
|
return $perms;
|
||||||
}
|
}
|
||||||
|
|
||||||
function perms_get_role_raw(int $role): array
|
function forum_perms_get_role_raw(?int $forum, int $role): array
|
||||||
{
|
{
|
||||||
$emptyPerms = perms_create();
|
$emptyPerms = forum_perms_create();
|
||||||
|
|
||||||
if ($role < 1) {
|
if ($role < 1) {
|
||||||
return $emptyPerms;
|
return $emptyPerms;
|
||||||
}
|
}
|
||||||
|
|
||||||
$getPerms = Database::prepare('
|
$getPerms = Database::prepare(sprintf('
|
||||||
SELECT
|
SELECT
|
||||||
`' . implode('`, `', perms_get_keys()) . '`
|
`' . implode('`, `', forum_perms_get_keys()) . '`
|
||||||
FROM `msz_permissions`
|
FROM `msz_forum_permissions`
|
||||||
WHERE `user_id` IS NULL
|
WHERE `forum_id` %s
|
||||||
|
AND `user_id` IS NULL
|
||||||
AND `role_id` = :role_id
|
AND `role_id` = :role_id
|
||||||
');
|
', $forum === null ? 'IS NULL' : '= :forum_id'));
|
||||||
|
|
||||||
|
if ($forum !== null) {
|
||||||
|
$getPerms->bindValue('forum_id', $forum);
|
||||||
|
}
|
||||||
|
|
||||||
$getPerms->bindValue('role_id', $role);
|
$getPerms->bindValue('role_id', $role);
|
||||||
|
|
||||||
if (!$getPerms->execute()) {
|
if (!$getPerms->execute()) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue