From edd4289cdb707d74d8c3bdc544e718b6e107d5c6 Mon Sep 17 00:00:00 2001 From: flashwave Date: Sat, 18 Aug 2018 04:10:52 +0200 Subject: [PATCH] Completed the library side of the forum perms and add a migration. --- ...018_08_18_014408_add_forum_permissions.php | 42 +++++++++++++++++++ src/Forum/forum.php | 17 ++++++++ src/Forum/perms.php | 41 +++++++++++------- 3 files changed, 85 insertions(+), 15 deletions(-) create mode 100644 database/2018_08_18_014408_add_forum_permissions.php diff --git a/database/2018_08_18_014408_add_forum_permissions.php b/database/2018_08_18_014408_add_forum_permissions.php new file mode 100644 index 00000000..dbf02e43 --- /dev/null +++ b/database/2018_08_18_014408_add_forum_permissions.php @@ -0,0 +1,42 @@ +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`'); +} diff --git a/src/Forum/forum.php b/src/Forum/forum.php index a99bb57b..dfc55491 100644 --- a/src/Forum/forum.php +++ b/src/Forum/forum.php @@ -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); diff --git a/src/Forum/perms.php b/src/Forum/perms.php index b99cd4f4..af70e809 100644 --- a/src/Forum/perms.php +++ b/src/Forum/perms.php @@ -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()) {