getURLs(); $forumCtx = $msz->getForumContext(); $forumPosts = $forumCtx->getPosts(); $usersCtx = $msz->getUsersContext(); $postId = !empty($_GET['p']) && is_string($_GET['p']) ? (int)$_GET['p'] : 0; $postMode = !empty($_GET['m']) && is_string($_GET['m']) ? (string)$_GET['m'] : ''; $submissionConfirmed = !empty($_GET['confirm']) && is_string($_GET['confirm']) && $_GET['confirm'] === '1'; $postRequestVerified = CSRF::validateRequest(); $authInfo = $msz->getAuthInfo(); if(!empty($postMode) && !$authInfo->isLoggedIn()) Template::displayInfo('You must be logged in to manage posts.', 401); $currentUser = $authInfo->getUserInfo(); $currentUserId = $currentUser === null ? '0' : $currentUser->getId(); if($postMode !== '' && $usersCtx->hasActiveBan($currentUser)) Template::displayInfo('You have been banned, check your profile for more information.', 403); try { $postInfo = $forumPosts->getPost(postId: $postId); } catch(RuntimeException $ex) { Template::throwError(404); } $perms = $authInfo->getPerms('forum', $postInfo->getCategoryId()); if(!$perms->check(Perm::F_CATEGORY_VIEW)) Template::throwError(403); $canDeleteAny = $perms->check(Perm::F_POST_DELETE_ANY); switch($postMode) { case 'delete': if($canDeleteAny) { if($postInfo->isDeleted()) Template::displayInfo('This post has already been marked as deleted.', 404); } else { if($postInfo->isDeleted()) Template::throwError(404); if(!$perms->check(Perm::F_POST_DELETE_OWN)) Template::displayInfo('You are not allowed to delete posts.', 403); if($postInfo->getUserId() !== $currentUser->getId()) Template::displayInfo('You can only delete your own posts.', 403); // posts may only be deleted within a week of creation, this should be a config value $deleteTimeFrame = 60 * 60 * 24 * 7; if($postInfo->getCreatedTime() < time() - $deleteTimeFrame) Template::displayInfo('This post has existed for too long. Ask a moderator to remove if it absolutely necessary.', 403); } $originalPostInfo = $forumPosts->getPost(topicInfo: $postInfo->getTopicId()); if($originalPostInfo->getId() === $postInfo->getId()) Template::displayInfo('This is the opening post of the topic it belongs to, it may not be deleted without deleting the entire topic as well.', 403); if($postRequestVerified && !$submissionConfirmed) { Tools::redirect($urls->format('forum-post', ['post' => $postInfo->getId()])); break; } elseif(!$postRequestVerified) { Template::render('forum.confirm', [ 'title' => 'Confirm post deletion', 'class' => 'far fa-trash-alt', 'message' => sprintf('You are about to delete post #%d. Are you sure about that?', $postInfo->getId()), 'params' => [ 'p' => $postInfo->getId(), 'm' => 'delete', ], ]); break; } $forumPosts->deletePost($postInfo); $msz->createAuditLog('FORUM_POST_DELETE', [$postInfo->getId()]); Tools::redirect($urls->format('forum-topic', ['topic' => $postInfo->getTopicId()])); break; case 'nuke': if(!$canDeleteAny) Template::throwError(403); if($postRequestVerified && !$submissionConfirmed) { Tools::redirect($urls->format('forum-post', ['post' => $postInfo->getId()])); break; } elseif(!$postRequestVerified) { Template::render('forum.confirm', [ 'title' => 'Confirm post nuke', 'class' => 'fas fa-radiation', 'message' => sprintf('You are about to PERMANENTLY DELETE post #%d. Are you sure about that?', $postInfo->getId()), 'params' => [ 'p' => $postInfo->getId(), 'm' => 'nuke', ], ]); break; } $forumPosts->nukePost($postInfo->getId()); $msz->createAuditLog('FORUM_POST_NUKE', [$postInfo->getId()]); Tools::redirect($urls->format('forum-topic', ['topic' => $postInfo->getTopicId()])); break; case 'restore': if(!$canDeleteAny) Template::throwError(403); if($postRequestVerified && !$submissionConfirmed) { Tools::redirect($urls->format('forum-post', ['post' => $postInfo->getId()])); break; } elseif(!$postRequestVerified) { Template::render('forum.confirm', [ 'title' => 'Confirm post restore', 'class' => 'fas fa-magic', 'message' => sprintf('You are about to restore post #%d. Are you sure about that?', $postInfo->getId()), 'params' => [ 'p' => $postInfo->getId(), 'm' => 'restore', ], ]); break; } $forumPosts->restorePost($postInfo->getId()); $msz->createAuditLog('FORUM_POST_RESTORE', [$postInfo->getId()]); Tools::redirect($urls->format('forum-topic', ['topic' => $postInfo->getTopicId()])); break; default: // function as an alt for topic.php?p= by default Tools::redirect($urls->format('forum-post', ['post' => $postInfo->getId()]); break; }