misuzu/public/comments.php

260 lines
8.1 KiB
PHP
Raw Normal View History

2022-09-13 13:14:49 +00:00
<?php
namespace Misuzu;
2023-07-15 23:58:17 +00:00
use RuntimeException;
2022-09-13 13:14:49 +00:00
use Misuzu\Users\User;
require_once '../misuzu.php';
// basing whether or not this is an xhr request on whether a referrer header is present
// this page is never directy accessed, under normal circumstances
$redirect = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : url('index');
2022-09-13 13:14:49 +00:00
if(!is_local_url($redirect)) {
2022-09-13 13:14:49 +00:00
echo render_info('Possible request forgery detected.', 403);
return;
}
if(!CSRF::validateRequest()) {
echo render_info("Couldn't verify this request, please refresh the page and try again.", 403);
2022-09-13 13:14:49 +00:00
return;
}
$currentUserInfo = User::getCurrent();
if($currentUserInfo === null) {
echo render_info('You must be logged in to manage comments.', 401);
2022-09-13 13:14:49 +00:00
return;
}
if($currentUserInfo->isBanned()) {
echo render_info('You have been banned, check your profile for more information.', 403);
2022-09-13 13:14:49 +00:00
return;
}
if($currentUserInfo->isSilenced()) {
echo render_info('You have been silenced, check your profile for more information.', 403);
2022-09-13 13:14:49 +00:00
return;
}
2023-07-15 23:58:17 +00:00
$comments = $msz->getComments();
2022-09-13 13:14:49 +00:00
$commentPerms = $currentUserInfo->commentPerms();
2023-07-15 23:58:17 +00:00
$commentId = (string)filter_input(INPUT_GET, 'c', FILTER_SANITIZE_NUMBER_INT);
$commentMode = (string)filter_input(INPUT_GET, 'm');
2022-09-13 13:14:49 +00:00
$commentVote = (int)filter_input(INPUT_GET, 'v', FILTER_SANITIZE_NUMBER_INT);
2023-07-15 23:58:17 +00:00
if(!empty($commentId)) {
2022-09-13 13:14:49 +00:00
try {
2023-07-15 23:58:17 +00:00
$commentInfo = $comments->getPostById($commentId);
} catch(RuntimeException $ex) {
echo render_info('Post not found.', 404);
2022-09-13 13:14:49 +00:00
return;
}
2023-07-15 23:58:17 +00:00
$categoryInfo = $comments->getCategoryByPost($commentInfo);
}
if($commentMode !== 'create' && empty($commentInfo)) {
echo render_error(400);
return;
}
2022-09-13 13:14:49 +00:00
switch($commentMode) {
case 'pin':
case 'unpin':
2023-07-15 23:58:17 +00:00
if(!$commentPerms['can_pin'] && !$categoryInfo->isOwner($currentUserInfo)) {
echo render_info("You're not allowed to pin comments.", 403);
2022-09-13 13:14:49 +00:00
break;
}
2023-07-15 23:58:17 +00:00
if($commentInfo->isDeleted()) {
echo render_info("This comment doesn't exist!", 400);
2022-09-13 13:14:49 +00:00
break;
}
2023-07-15 23:58:17 +00:00
if($commentInfo->isReply()) {
echo render_info("You can't pin replies!", 400);
2022-09-13 13:14:49 +00:00
break;
}
$isPinning = $commentMode === 'pin';
2023-07-15 23:58:17 +00:00
if($isPinning) {
if($commentInfo->isPinned()) {
echo render_info('This comment is already pinned.', 400);
break;
}
2022-09-13 13:14:49 +00:00
2023-07-15 23:58:17 +00:00
$comments->pinPost($commentInfo);
} else {
if(!$commentInfo->isPinned()) {
echo render_info("This comment isn't pinned yet.", 400);
break;
}
$comments->unpinPost($commentInfo);
}
2022-09-13 13:14:49 +00:00
2023-07-15 23:58:17 +00:00
redirect($redirect . '#comment-' . $commentInfo->getId());
2022-09-13 13:14:49 +00:00
break;
case 'vote':
2023-07-15 23:58:17 +00:00
if(!$commentPerms['can_vote'] && !$categoryInfo->isOwner($currentUserInfo)) {
echo render_info("You're not allowed to vote on comments.", 403);
2022-09-13 13:14:49 +00:00
break;
}
2023-07-15 23:58:17 +00:00
if($commentInfo->isDeleted()) {
echo render_info("This comment doesn't exist!", 400);
2022-09-13 13:14:49 +00:00
break;
}
if($commentVote > 0)
2023-07-15 23:58:17 +00:00
$comments->addPostPositiveVote($commentInfo, $currentUserInfo);
2022-09-13 13:14:49 +00:00
elseif($commentVote < 0)
2023-07-15 23:58:17 +00:00
$comments->addPostNegativeVote($commentInfo, $currentUserInfo);
2022-09-13 13:14:49 +00:00
else
2023-07-15 23:58:17 +00:00
$comments->removePostVote($commentInfo, $currentUserInfo);
2022-09-13 13:14:49 +00:00
2023-07-15 23:58:17 +00:00
redirect($redirect . '#comment-' . $commentInfo->getId());
2022-09-13 13:14:49 +00:00
break;
case 'delete':
2023-07-15 23:58:17 +00:00
if(!$commentPerms['can_delete'] && !$categoryInfo->isOwner($currentUserInfo)) {
echo render_info("You're not allowed to delete comments.", 403);
2022-09-13 13:14:49 +00:00
break;
}
2023-07-15 23:58:17 +00:00
if($commentInfo->isDeleted()) {
echo render_info(
2022-09-13 13:14:49 +00:00
$commentPerms['can_delete_any'] ? 'This comment is already marked for deletion.' : "This comment doesn't exist.",
400
);
break;
}
2023-07-15 23:58:17 +00:00
$isOwnComment = $commentInfo->getUserId() === (string)$currentUserInfo->getId();
2022-09-13 13:14:49 +00:00
$isModAction = $commentPerms['can_delete_any'] && !$isOwnComment;
if(!$isModAction && !$isOwnComment) {
echo render_info("You're not allowed to delete comments made by others.", 403);
2022-09-13 13:14:49 +00:00
break;
}
2023-07-15 23:58:17 +00:00
$comments->deletePost($commentInfo);
2022-09-13 13:14:49 +00:00
if($isModAction) {
$msz->createAuditLog('COMMENT_ENTRY_DELETE_MOD', [
2023-07-15 23:58:17 +00:00
$commentInfo->getId(),
$commentUserId = $commentInfo->getUserId(),
'<username>',
2022-09-13 13:14:49 +00:00
]);
} else {
$msz->createAuditLog('COMMENT_ENTRY_DELETE', [$commentInfo->getId()]);
2022-09-13 13:14:49 +00:00
}
redirect($redirect);
2022-09-13 13:14:49 +00:00
break;
case 'restore':
if(!$commentPerms['can_delete_any']) {
echo render_info("You're not allowed to restore deleted comments.", 403);
2022-09-13 13:14:49 +00:00
break;
}
2023-07-15 23:58:17 +00:00
if(!$commentInfo->isDeleted()) {
echo render_info("This comment isn't in a deleted state.", 400);
2022-09-13 13:14:49 +00:00
break;
}
2023-07-15 23:58:17 +00:00
$comments->restorePost($commentInfo);
2022-09-13 13:14:49 +00:00
$msz->createAuditLog('COMMENT_ENTRY_RESTORE', [
2023-07-15 23:58:17 +00:00
$commentInfo->getId(),
$commentUserId = $commentInfo->getUserId(),
'<username>',
2022-09-13 13:14:49 +00:00
]);
2023-07-15 23:58:17 +00:00
redirect($redirect . '#comment-' . $commentInfo->getId());
2022-09-13 13:14:49 +00:00
break;
case 'create':
2023-07-15 23:58:17 +00:00
if(!$commentPerms['can_comment'] && !$categoryInfo->isOwner($currentUserInfo)) {
echo render_info("You're not allowed to post comments.", 403);
2022-09-13 13:14:49 +00:00
break;
}
if(empty($_POST['comment']) || !is_array($_POST['comment'])) {
echo render_info('Missing data.', 400);
2022-09-13 13:14:49 +00:00
break;
}
try {
2023-07-15 23:58:17 +00:00
$categoryId = isset($_POST['comment']['category']) && is_string($_POST['comment']['category'])
? (int)$_POST['comment']['category']
: 0;
$categoryInfo = $comments->getCategoryById($categoryId);
} catch(RuntimeException $ex) {
echo render_info('This comment category doesn\'t exist.', 404);
2022-09-13 13:14:49 +00:00
break;
}
if($categoryInfo->isLocked() && !$commentPerms['can_lock']) {
echo render_info('This comment category has been locked.', 403);
2022-09-13 13:14:49 +00:00
break;
}
2023-07-15 23:58:17 +00:00
$commentText = !empty($_POST['comment']['text']) && is_string($_POST['comment']['text']) ? $_POST['comment']['text'] : '';
$commentReply = (string)(!empty($_POST['comment']['reply']) && is_string($_POST['comment']['reply']) ? (int)$_POST['comment']['reply'] : 0);
$commentLock = !empty($_POST['comment']['lock']) && $commentPerms['can_lock'];
$commentPin = !empty($_POST['comment']['pin']) && $commentPerms['can_pin'];
2022-09-13 13:14:49 +00:00
if($commentLock) {
2023-07-15 23:58:17 +00:00
if($categoryInfo->isLocked())
$comments->unlockCategory($categoryInfo);
else
$comments->lockCategory($categoryInfo);
2022-09-13 13:14:49 +00:00
}
if(strlen($commentText) > 0) {
$commentText = preg_replace("/[\r\n]{2,}/", "\n", $commentText);
} else {
if($commentPerms['can_lock']) {
2023-07-15 23:58:17 +00:00
echo render_info('The action has been processed.', 400);
2022-09-13 13:14:49 +00:00
} else {
echo render_info('Your comment is too short.', 400);
2022-09-13 13:14:49 +00:00
}
break;
}
if(mb_strlen($commentText) > 5000) {
echo render_info('Your comment is too long.', 400);
2022-09-13 13:14:49 +00:00
break;
}
if($commentReply > 0) {
try {
2023-07-15 23:58:17 +00:00
$parentInfo = $comments->getPostById($commentReply);
} catch(RuntimeException $ex) {}
2022-09-13 13:14:49 +00:00
2023-07-15 23:58:17 +00:00
if(!isset($parentInfo) || $parentInfo->isDeleted()) {
echo render_info('The comment you tried to reply to does not exist.', 404);
2022-09-13 13:14:49 +00:00
break;
}
}
2023-07-15 23:58:17 +00:00
$commentInfo = $comments->createPost(
$categoryInfo,
$parentInfo ?? null,
$currentUserInfo,
$commentText,
$commentPin
);
2022-09-13 13:14:49 +00:00
2023-07-15 23:58:17 +00:00
redirect($redirect . '#comment-' . $commentInfo->getId());
2022-09-13 13:14:49 +00:00
break;
default:
echo render_info('Not found.', 404);
2022-09-13 13:14:49 +00:00
}