misuzu/public/forum/posting.php

143 lines
3.6 KiB
PHP
Raw Normal View History

2018-05-21 23:05:25 +00:00
<?php
use Misuzu\Database;
use Misuzu\Net\IPAddress;
require_once __DIR__ . '/../../misuzu.php';
$db = Database::connection();
$templating = $app->getTemplating();
2018-05-21 23:05:25 +00:00
if (!$app->hasActiveSession()) {
echo render_error(403);
2018-05-21 23:05:25 +00:00
return;
}
$postRequest = $_SERVER['REQUEST_METHOD'] === 'POST';
if ($postRequest) {
$topicId = max(0, (int)($_POST['post']['topic'] ?? 0));
$forumId = max(0, (int)($_POST['post']['forum'] ?? 0));
} else {
$postId = max(0, (int)($_GET['p'] ?? 0));
$topicId = max(0, (int)($_GET['t'] ?? 0));
$forumId = max(0, (int)($_GET['f'] ?? 0));
}
if (empty($postId) && empty($topicId) && empty($forumId)) {
echo render_error(404);
return;
}
2018-05-21 23:05:25 +00:00
if (!empty($postId)) {
$getPost = $db->prepare('
SELECT `post_id`, `topic_id`
2018-05-21 23:05:25 +00:00
FROM `msz_forum_posts`
WHERE `post_id` = :post_id
');
$getPost->bindValue('post_id', $postId);
$post = $getPost->execute() ? $getPost->fetch() : false;
if (isset($post['topic_id'])) { // should automatic cross-quoting be a thing? if so, check if $topicId is < 1 first
$topicId = (int)$post['topic_id'];
}
}
if (!empty($topicId)) {
$getTopic = $db->prepare('
2018-05-23 01:41:57 +00:00
SELECT `topic_id`, `forum_id`, `topic_title`, `topic_locked`
2018-05-21 23:05:25 +00:00
FROM `msz_forum_topics`
WHERE `topic_id` = :topic_id
');
$getTopic->bindValue('topic_id', $topicId);
$topic = $getTopic->execute() ? $getTopic->fetch() : false;
if (isset($topic['forum_id'])) {
$forumId = (int)$topic['forum_id'];
}
}
if (!empty($forumId)) {
$getForum = $db->prepare('
2018-05-23 01:41:57 +00:00
SELECT `forum_id`, `forum_name`, `forum_type`, `forum_archived`
2018-05-21 23:05:25 +00:00
FROM `msz_forum_categories`
WHERE `forum_id` = :forum_id
');
$getForum->bindValue('forum_id', $forumId);
$forum = $getForum->execute() ? $getForum->fetch() : false;
}
if (empty($forum)) {
echo render_error(404);
return;
}
2018-05-23 01:41:57 +00:00
if ($forum['forum_type'] != MSZ_FORUM_TYPE_DISCUSSION) {
echo render_error(400);
return;
}
2018-05-23 01:41:57 +00:00
if ($forum['forum_archived'] || !empty($topic['topic_locked'])) {
echo render_error(403);
2018-05-23 01:41:57 +00:00
return;
}
2018-05-21 23:05:25 +00:00
if ($postRequest) {
if (!tmp_csrf_verify($_POST['csrf'] ?? '')) {
echo 'Could not verify request.';
return;
}
2018-05-23 01:41:57 +00:00
$topicTitle = $_POST['post']['title'] ?? '';
$topicTitleValidate = forum_validate_title($topicTitle);
$postText = $_POST['post']['text'] ?? '';
$postTextValidate = forum_validate_post($postText);
switch ($postTextValidate) {
case 'too-short':
echo 'Post content was too short.';
return;
case 'too-long':
echo 'Post content was too long.';
return;
}
2018-05-21 23:05:25 +00:00
if (isset($topic)) {
2018-05-23 01:41:57 +00:00
forum_topic_bump($topic['topic_id']);
2018-05-21 23:05:25 +00:00
} else {
2018-05-23 01:41:57 +00:00
switch ($topicTitleValidate) {
case 'too-short':
echo 'Topic title was too short.';
return;
case 'too-long':
echo 'Topic title was too long.';
return;
}
$topicId = forum_topic_create($forum['forum_id'], $app->getUserId(), $topicTitle);
2018-05-21 23:05:25 +00:00
}
2018-05-23 01:41:57 +00:00
$postId = forum_post_create(
$topicId,
$forum['forum_id'],
$app->getUserId(),
IPAddress::remote()->getString(),
2018-05-24 19:31:48 +00:00
$postText,
MSZ_FORUM_POST_PARSER_BBCODE
2018-05-23 01:41:57 +00:00
);
forum_topic_mark_read($app->getUserId(), $topicId, $forum['forum_id']);
2018-05-21 23:05:25 +00:00
header("Location: /forum/topic.php?p={$postId}#p{$postId}");
return;
}
2018-05-22 00:54:20 +00:00
if (!empty($topic)) {
$templating->var('posting_topic', $topic);
}
2018-05-21 23:05:25 +00:00
2018-05-22 00:54:20 +00:00
echo $templating->render('forum.posting', [
2018-05-23 01:41:57 +00:00
'posting_breadcrumbs' => forum_get_breadcrumbs($forumId),
2018-05-22 00:54:20 +00:00
'posting_forum' => $forum,
]);