Completed the library side of the forum perms and add a migration.

This commit is contained in:
flash 2018-08-18 04:10:52 +02:00
parent 6ff77973d8
commit edd4289cdb
3 changed files with 85 additions and 15 deletions

View 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`');
}

View file

@ -3,6 +3,23 @@ use Misuzu\Database;
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_CATEGORY', 1);
define('MSZ_FORUM_TYPE_LINK', 2);

View file

@ -31,12 +31,12 @@ function forum_perms_create(): int
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) {
return 0;
} elseif ($user === 1) {
return 0x7FFFFFFF;
//return 0x7FFFFFFF;
}
$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;
}
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) {
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;
}
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();
@ -93,14 +93,19 @@ function perms_get_user_raw(?int $forum, int $user): array
return $emptyPerms;
}
$getPerms = Database::prepare('
$getPerms = Database::prepare(sprintf('
SELECT
`' . implode('`, `', forum_perms_get_keys()) . '`
FROM `msz_forum_permissions`
WHERE `user_id` = :user_id
WHERE `forum_id` %s
AND `user_id` = :user_id
AND `role_id` IS NULL
');
$getPerms->bindValue('forum_id', $user);
', $forum === null ? 'IS NULL' : '= :forum_id'));
if ($forum !== null) {
$getPerms->bindValue('forum_id', $forum);
}
$getPerms->bindValue('user_id', $user);
if (!$getPerms->execute()) {
@ -116,21 +121,27 @@ function perms_get_user_raw(?int $forum, int $user): array
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) {
return $emptyPerms;
}
$getPerms = Database::prepare('
$getPerms = Database::prepare(sprintf('
SELECT
`' . implode('`, `', perms_get_keys()) . '`
FROM `msz_permissions`
WHERE `user_id` IS NULL
`' . implode('`, `', forum_perms_get_keys()) . '`
FROM `msz_forum_permissions`
WHERE `forum_id` %s
AND `user_id` IS NULL
AND `role_id` = :role_id
');
', $forum === null ? 'IS NULL' : '= :forum_id'));
if ($forum !== null) {
$getPerms->bindValue('forum_id', $forum);
}
$getPerms->bindValue('role_id', $role);
if (!$getPerms->execute()) {