summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
authorczaks <marcin@6irc.net>2013-07-31 19:25:04 -0400
committerczaks <marcin@6irc.net>2013-07-31 19:25:04 -0400
commitb35ea557634af42c3f63b7219cd1bfd46cf486a6 (patch)
tree0530d3025764e09265fa934f8ae1e906efcad7c6 /inc
parentdc9df2b9b3d2994bce02474503b3ebbb56c38ece (diff)
parent6bbe407e18681f2812db4345036bb5ae639f5973 (diff)
Merge branch 'master' of https://github.com/savetheinternet/Tinyboard
Conflicts: templates/thread.html
Diffstat (limited to 'inc')
-rw-r--r--inc/config.php8
-rw-r--r--inc/functions.php39
-rw-r--r--inc/mod/pages.php10
3 files changed, 50 insertions, 7 deletions
diff --git a/inc/config.php b/inc/config.php
index 38a17e03..0ff8ad4c 100644
--- a/inc/config.php
+++ b/inc/config.php
@@ -386,10 +386,10 @@
*/
// "Wiki" markup syntax ($config['wiki_markup'] in pervious versions):
- $config['markup'][] = array("/'''(.+?)'''/", "<strong>\$1</strong>");
- $config['markup'][] = array("/''(.+?)''/", "<em>\$1</em>");
- $config['markup'][] = array("/\*\*(.+?)\*\*/", "<span class=\"spoiler\">\$1</span>");
- $config['markup'][] = array("/^[ |\t]*==(.+?)==[ |\t]*$/m", "<span class=\"heading\">\$1</span>");
+ $config['markup'][] = array("/'''([^<]+?)'''/", "<strong>\$1</strong>");
+ $config['markup'][] = array("/''([^<]+?)''/", "<em>\$1</em>");
+ $config['markup'][] = array("/\*\*([^<]+?)\*\*/", "<span class=\"spoiler\">\$1</span>");
+ $config['markup'][] = array("/^[ |\t]*==([^<]+?)==[ |\t]*$/m", "<span class=\"heading\">\$1</span>");
// Highlight PHP code wrapped in <code> tags (PHP 5.3.0+)
// $config['markup'][] = array(
diff --git a/inc/functions.php b/inc/functions.php
index 119079a6..1f702ba0 100644
--- a/inc/functions.php
+++ b/inc/functions.php
@@ -1451,6 +1451,39 @@ function markup(&$body, $track_cites = false) {
$body = str_replace("\r", '', $body);
$body = utf8tohtml($body);
+ if (preg_match_all('@&lt;tinyboard ([\w\s]+)&gt;(.+)&lt;/tinyboard&gt;@um', $body, $modifiers, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
+ $skip_chars = 0;
+ $body_tmp = $body;
+
+ foreach ($modifiers as $modifier) {
+ // preg_match_all is not multibyte-safe
+ foreach ($modifier as &$match) {
+ $match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
+ }
+
+ $modifier['type'] = $modifier[1][0];
+ $modifier['content'] = $modifier[2][0];
+
+ if ($modifier['type'] == 'ban message') {
+ // Public ban message
+ $replacement = sprintf($config['mod']['ban_message'], $modifier['content']);
+ } elseif ($modifier['type'] == 'raw html') {
+ $body = html_entity_decode($modifier['content']);
+ return array();
+ } elseif (preg_match('/^escape /', $modifier['type'])) {
+ // Escaped (not a real modifier)
+ $replacement = '&lt;tinyboard ' . substr($modifier['type'], strlen('escape ')) . '&gt;' . $modifier['content'] . '&lt;/tinyboard&gt;';
+ } else {
+ // Unknown
+ $replacement = '';
+ }
+
+ $body = mb_substr_replace($body, $replacement, $modifier[0][1] + $skip_chars, mb_strlen($modifier[0][0]));
+ $skip_chars += mb_strlen($replacement) - mb_strlen($modifier[0][0]);
+
+ }
+ }
+
if (mysql_version() < 50503)
$body = mb_encode_numericentity($body, array(0x010000, 0xffffff, 0, 0xffffff), 'UTF-8');
@@ -1492,7 +1525,7 @@ function markup(&$body, $track_cites = false) {
$tracked_cites = array();
// Cites
- if (isset($board) && preg_match_all('/(^|\s)&gt;&gt;(\d+?)([\s,.)?]|$)/m', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
+ if (isset($board) && preg_match_all('/(^|\s)&gt;&gt;(\d+?)([\s,.)?]|$)/m', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
if (count($cites[0]) > $config['max_cites']) {
error($config['error']['toomanycites']);
}
@@ -1591,6 +1624,10 @@ function markup(&$body, $track_cites = false) {
return $tracked_cites;
}
+function escape_markup_modifiers($string) {
+ return preg_replace('@<tinyboard ([\w\s]+)>(.+)</tinyboard>@m', '<tinyboard escape $1>$2</tinyboard>', $string);
+}
+
function utf8tohtml($utf8) {
return htmlspecialchars($utf8, ENT_NOQUOTES, 'UTF-8');
}
diff --git a/inc/mod/pages.php b/inc/mod/pages.php
index 08604039..351d3203 100644
--- a/inc/mod/pages.php
+++ b/inc/mod/pages.php
@@ -507,6 +507,7 @@ function mod_noticeboard($page_no = 1) {
if (!hasPermission($config['mod']['noticeboard_post']))
error($config['error']['noaccess']);
+ $_POST['body'] = escape_markup_modifiers($_POST['body']);
markup($_POST['body']);
$query = prepare('INSERT INTO `noticeboard` VALUES (NULL, :mod, :time, :subject, :body)');
@@ -568,6 +569,7 @@ function mod_news($page_no = 1) {
if (!hasPermission($config['mod']['news']))
error($config['error']['noaccess']);
+ $_POST['body'] = escape_markup_modifiers($_POST['body']);
markup($_POST['body']);
$query = prepare('INSERT INTO `news` VALUES (NULL, :name, :time, :subject, :body)');
@@ -737,6 +739,7 @@ function mod_page_ip($ip) {
if (!hasPermission($config['mod']['create_notes']))
error($config['error']['noaccess']);
+ $_POST['note'] = escape_markup_modifiers($_POST['note']);
markup($_POST['note']);
$query = prepare('INSERT INTO `ip_notes` VALUES (NULL, :ip, :mod, :time, :body)');
$query->bindValue(':ip', $ip);
@@ -1214,12 +1217,14 @@ function mod_ban_post($board, $delete, $post, $token = false) {
if (isset($_POST['public_message'], $_POST['message'])) {
// public ban message
$length_english = parse_time($_POST['length']) ? 'for ' . until(parse_time($_POST['length'])) : 'permanently';
+ $_POST['message'] = preg_replace('/[\r\n]/', '', $_POST['message']);
$_POST['message'] = str_replace('%length%', $length_english, $_POST['message']);
$_POST['message'] = str_replace('%LENGTH%', strtoupper($length_english), $_POST['message']);
- $query = prepare(sprintf('UPDATE `posts_%s` SET `body` = CONCAT(`body`, :body) WHERE `id` = :id', $board));
+ $query = prepare(sprintf('UPDATE `posts_%s` SET `body_nomarkup` = CONCAT(`body_nomarkup`, :body_nomarkup) WHERE `id` = :id', $board));
$query->bindValue(':id', $post);
- $query->bindValue(':body', sprintf($config['mod']['ban_message'], utf8tohtml($_POST['message'])));
+ $query->bindValue(':body_nomarkup', sprintf('<tinyboard ban message>%s</tinyboard>', $_POST['message']));
$query->execute() or error(db_error($query));
+ rebuildPost($post);
modLog("Attached a public ban message to post #{$post}: " . utf8tohtml($_POST['message']));
buildThread($thread ? $thread : $post);
@@ -1713,6 +1718,7 @@ function mod_new_pm($username) {
}
if (isset($_POST['message'])) {
+ $_POST['message'] = escape_markup_modifiers($_POST['message']);
markup($_POST['message']);
$query = prepare("INSERT INTO `pms` VALUES (NULL, :me, :id, :message, :time, 1)");