From 46f50248f01c03bb4fefd181c5e5ac594fac4774 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Thu, 16 Aug 2012 09:05:19 -0500 Subject: [PATCH 01/19] Don't require closing tag for tags that don't need it. --- inc/display.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/inc/display.php b/inc/display.php index 264fde60..6394c711 100644 --- a/inc/display.php +++ b/inc/display.php @@ -190,9 +190,12 @@ function truncate($body, $url, $max_lines = false, $max_chars = false) { // remove broken HTML entity at the end (if existent) $body = preg_replace('/&[^;]+$/', '', $body); + $tags_no_close_needed = array("colgroup", "dd", "dt", "li", "optgroup", "option", "p", "tbody", "td", "tfoot", "th", "thead", "tr", "br", "img"); + // Close any open tags foreach ($tags as &$tag) { - $body .= ""; + if (!in_array($tag, $tags_no_close_needed)) + $body .= ""; } } else { // remove broken HTML entity at the end (if existent) From 948dfe8555e06b2f900a92678faff918c2ab95b6 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Mon, 14 Jan 2013 19:11:55 -0600 Subject: [PATCH 02/19] Don't truncate inside an HTML comment! --- inc/display.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/inc/display.php b/inc/display.php index 6394c711..f4e1151e 100644 --- a/inc/display.php +++ b/inc/display.php @@ -155,6 +155,11 @@ function truncate($body, $url, $max_lines = false, $max_chars = false) { $max_lines = $config['body_truncate']; if ($max_chars === false) $max_chars = $config['body_truncate_char']; + + // We don't want to risk truncating in the middle of an HTML comment. + // It's easiest just to remove them all first. + $body = preg_replace('//s', '', $body); + $original_body = $body; $lines = substr_count($body, '
'); From b63d94838da090cddb98f1b7f19268a32c6a75d8 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Fri, 18 Jan 2013 18:10:14 -0600 Subject: [PATCH 03/19] Do truncation by actual character count. Using substr can cut a multi-byte character in half. Also, if a long post with many multi-byte characters was reported, then the mod interface would temporarily extend the body_truncate_char setting to be sure to cover all of the *characters* in the report, but this function would interpret body_truncate_char as a number of *bytes*, so sometimes the end of the report's appended html would be cut off. --- inc/display.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/display.php b/inc/display.php index f4e1151e..85c21e7c 100644 --- a/inc/display.php +++ b/inc/display.php @@ -170,7 +170,7 @@ function truncate($body, $url, $max_lines = false, $max_chars = false) { $body = $m[0]; } - $body = substr($body, 0, $max_chars); + $body = mb_substr($body, 0, $max_chars); if ($body != $original_body) { // Remove any corrupt tags at the end From 00bd5e8d2033c14fe1fd7b15a0db1b1827d549b9 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Fri, 18 Jan 2013 23:13:08 -0600 Subject: [PATCH 04/19] Remove buildThread() call from mod_deletefile because deleteFile() already calls it. --- inc/mod/pages.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/inc/mod/pages.php b/inc/mod/pages.php index 4f1ab73c..6261d4af 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -1019,13 +1019,6 @@ function mod_deletefile($board, $post) { // Record the action modLog("Deleted file from post #{$post}"); - $query = prepare(sprintf('SELECT `thread` FROM `posts_%s` WHERE `id` = :id', $board)); - $query->bindValue(':id', $post); - $query->execute() or error(db_error($query)); - $thread = $query->fetchColumn(); - - // Rebuild thread - buildThread($thread ? $thread : $post); // Rebuild board buildIndex(); From b1c1a25c26ceac45793536c9a4fe903075cc3b63 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Mon, 29 Oct 2012 22:10:58 -0600 Subject: [PATCH 05/19] Add (`thread`, `id`) multi-column key to optimize rebuilding index pages. This SQL command can be used to add the key to existing board tables: create index `thread_id` on posts_%s (`thread`, `id`); --- templates/posts.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/templates/posts.sql b/templates/posts.sql index d10749f8..ac383ab0 100644 --- a/templates/posts.sql +++ b/templates/posts.sql @@ -27,6 +27,7 @@ CREATE TABLE IF NOT EXISTS `posts_{{ board }}` ( `embed` text, UNIQUE KEY `id` (`id`), KEY `thread` (`thread`), + KEY `thread_id` (`thread`, `id`), KEY `time` (`time`), FULLTEXT KEY `body` (`body`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; From 91e8547b0469e0e046bc15cd9c86f7d7abe86999 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Wed, 14 Nov 2012 13:33:27 -0700 Subject: [PATCH 06/19] Add image_reject_repost_in_thread option --- inc/config.php | 5 ++++- inc/functions.php | 14 ++++++++++++++ post.php | 39 ++++++++++++++++++++++++++++----------- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/inc/config.php b/inc/config.php index f4951a40..e977f066 100644 --- a/inc/config.php +++ b/inc/config.php @@ -445,8 +445,10 @@ // Maximum image dimensions $config['max_width'] = 10000; $config['max_height'] = $config['max_width']; // 1:1 - // Reject dupliate image uploads + // Reject duplicate image uploads $config['image_reject_repost'] = true; + // Reject duplicate image uploads within the same thread. Doesn't change anything if image_reject_repost is true. + $config['image_reject_repost_in_thread'] = false; // Display the aspect ratio in a post's file info $config['show_ratio'] = false; @@ -667,6 +669,7 @@ $config['error']['maxsize'] = _('The file was too big.'); $config['error']['invalidzip'] = _('Invalid archive!'); $config['error']['fileexists'] = _('That file already exists!'); + $config['error']['fileexistsinthread'] = _('That file already exists in this thread!'); $config['error']['delete_too_soon'] = _('You\'ll have to wait another %s before deleting that.'); $config['error']['mime_exploit'] = _('MIME type detection XSS exploit (IE) detected; post discarded.'); $config['error']['invalid_embed'] = _('Couldn\'t make sense of the URL of the video you tried to embed.'); diff --git a/inc/functions.php b/inc/functions.php index a7b6b434..63fd4a27 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -1651,6 +1651,20 @@ function getPostByHash($hash) { return false; } +function getPostByHashInThread($hash, $thread) { + global $board; + $query = prepare(sprintf("SELECT `id`,`thread` FROM `posts_%s` WHERE `filehash` = :hash AND ( `thread` = :thread OR `id` = :thread )", $board['uri'])); + $query->bindValue(':hash', $hash, PDO::PARAM_STR); + $query->bindValue(':thread', $thread, PDO::PARAM_INT); + $query->execute() or error(db_error($query)); + + if ($post = $query->fetch()) { + return $post; + } + + return false; +} + function undoImage(array $post) { if (!$post['has_file']) return; diff --git a/post.php b/post.php index 16566b51..a462916b 100644 --- a/post.php +++ b/post.php @@ -500,17 +500,34 @@ if (isset($_POST['delete'])) { } } - if ($post['has_file'] && $config['image_reject_repost'] && $p = getPostByHash($post['filehash'])) { - undoImage($post); - error(sprintf($config['error']['fileexists'], - $post['mod'] ? $config['root'] . $config['file_mod'] . '?/' : $config['root'] . - $board['dir'] . $config['dir']['res'] . - ($p['thread'] ? - $p['thread'] . '.html#' . $p['id'] - : - $p['id'] . '.html' - ) - )); + if ($post['has_file']) { + if ($config['image_reject_repost']) { + if ($p = getPostByHash($post['filehash'])) { + undoImage($post); + error(sprintf($config['error']['fileexists'], + $post['mod'] ? $config['root'] . $config['file_mod'] . '?/' : $config['root'] . + $board['dir'] . $config['dir']['res'] . + ($p['thread'] ? + $p['thread'] . '.html#' . $p['id'] + : + $p['id'] . '.html' + ) + )); + } + } else if (!$post['op'] && $config['image_reject_repost_in_thread']) { + if ($p = getPostByHashInThread($post['filehash'], $post['thread'])) { + undoImage($post); + error(sprintf($config['error']['fileexistsinthread'], + $post['mod'] ? $config['root'] . $config['file_mod'] . '?/' : $config['root'] . + $board['dir'] . $config['dir']['res'] . + ($p['thread'] ? + $p['thread'] . '.html#' . $p['id'] + : + $p['id'] . '.html' + ) + )); + } + } } if (!hasPermission($config['mod']['postunoriginal'], $board['uri']) && $config['robot_enable'] && checkRobot($post['body_nomarkup'])) { From 9007640e88543f972321cbd4f5561e8666c51afd Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Wed, 16 Jan 2013 16:32:24 -0600 Subject: [PATCH 07/19] Don't do anything if a mod link is middle-clicked. This lets Chrome users open mod actions in a new tab by middle-clicking, as Chrome still calls the onclick event when middle-clicking unlike Firefox. --- inc/display.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/display.php b/inc/display.php index 85c21e7c..ef952ca2 100644 --- a/inc/display.php +++ b/inc/display.php @@ -216,7 +216,7 @@ function truncate($body, $url, $max_lines = false, $max_chars = false) { function secure_link_confirm($text, $title, $confirm_message, $href) { global $config; - return '' . $text . ''; + return '' . $text . ''; } function secure_link($href) { return $href . '/' . make_secure_link_token($href); From fda99305aee1adbf8d57dc73b46565471fac4c4d Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Fri, 18 Jan 2013 23:16:42 -0600 Subject: [PATCH 08/19] Global missing from mod_logout --- inc/mod/pages.php | 1 + 1 file changed, 1 insertion(+) diff --git a/inc/mod/pages.php b/inc/mod/pages.php index 6261d4af..7baaa3d9 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -64,6 +64,7 @@ function mod_confirm($request) { } function mod_logout() { + global $config; destroyCookies(); header('Location: ?/', true, $config['redirect_http']); From 322b902c8a316c4c64cb81cd5db0974817ca57f5 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Thu, 12 Jul 2012 07:43:43 -0600 Subject: [PATCH 09/19] Fix incorrect log message when bumplocking and stickying threads. --- inc/mod/pages.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/mod/pages.php b/inc/mod/pages.php index 7baaa3d9..9526a7df 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -707,7 +707,7 @@ function mod_sticky($board, $unsticky, $post) { $query->bindValue(':sticky', $unsticky ? 0 : 1); $query->execute() or error(db_error($query)); if ($query->rowCount()) { - modLog(($unlock ? 'Unstickied' : 'Stickied') . " thread #{$post}"); + modLog(($unsticky ? 'Unstickied' : 'Stickied') . " thread #{$post}"); buildThread($post); buildIndex(); } @@ -729,7 +729,7 @@ function mod_bumplock($board, $unbumplock, $post) { $query->bindValue(':bumplock', $unbumplock ? 0 : 1); $query->execute() or error(db_error($query)); if ($query->rowCount()) { - modLog(($unlock ? 'Unbumplocked' : 'Bumplocked') . " thread #{$post}"); + modLog(($unbumplock ? 'Unbumplocked' : 'Bumplocked') . " thread #{$post}"); buildThread($post); buildIndex(); } From f2d3e45fd3b21758fd12c0c4a23ce272cca18026 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Fri, 13 Jul 2012 11:03:22 -0600 Subject: [PATCH 10/19] Handle posts without filenames. If a post doesn't have a filename (such as because of a post event changing it), then don't show an empty filename with the post. --- templates/post_reply.html | 2 +- templates/post_thread.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/post_reply.html b/templates/post_reply.html index f50e392e..ddd0afd4 100644 --- a/templates/post_reply.html +++ b/templates/post_reply.html @@ -63,7 +63,7 @@ , {{ post.ratio }} {% endif %} {% endif %} - {% if config.show_filename %} + {% if config.show_filename and post.filename %} , {% if post.filename|length > config.max_filename_display %} {{ post.filename|truncate(config.max_filename_display) }} diff --git a/templates/post_thread.html b/templates/post_thread.html index da93c5dd..cf93bed0 100644 --- a/templates/post_thread.html +++ b/templates/post_thread.html @@ -20,7 +20,7 @@ , {{ post.ratio }} {% endif %} {% endif %} - {% if config.show_filename %} + {% if config.show_filename and post.filename %} , {% if post.filename|length > config.max_filename_display %} {{ post.filename|truncate(config.max_filename_display) }} From 67ab3760baf43061d68b9480ed2e651b7b6566ae Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Thu, 19 Jul 2012 00:16:50 -0600 Subject: [PATCH 11/19] Removed redundant code in image processing. Both paths of the code here did the same thing. --- post.php | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/post.php b/post.php index 16566b51..1153b46a 100644 --- a/post.php +++ b/post.php @@ -407,34 +407,12 @@ if (isset($_POST['delete'])) { require_once 'inc/image.php'; - if ($config['thumb_method'] == 'imagick') { - // This is tricky, because Imagick won't let us find - // an image's dimensions without loading it all into - // memory first, unlike GD which provides the - // getimagesize() to do exactly that. This section - // is why GD is required, even when using Imagick - // instead. There doesn't seem to be an alternative. - // Necessary for security, as Imagick even ignores - // PHP's memory limit. - - // first try GD's getimagesize() - if ($size = @getimagesize($upload)) { - if ($size[0] > $config['max_width'] || $size[1] > $config['max_height']) { - - error($config['error']['maxsize']); - } - } else { - // GD failed - // TODO? - } - } else { - // find dimensions of an image using GD - if (!$size = @getimagesize($upload)) { - error($config['error']['invalidimg']); - } - if ($size[0] > $config['max_width'] || $size[1] > $config['max_height']) { - error($config['error']['maxsize']); - } + // find dimensions of an image using GD + if (!$size = @getimagesize($upload)) { + error($config['error']['invalidimg']); + } + if ($size[0] > $config['max_width'] || $size[1] > $config['max_height']) { + error($config['error']['maxsize']); } // create image object From 0092fc62ab48bb9abc84a9f0641f253e5e9f1d35 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Tue, 24 Jul 2012 11:51:59 -0600 Subject: [PATCH 12/19] Extend timelimit when rebuilding from mod interface. The rebuild_timelimit config option was not used anywhere since the mod interface rewrite. --- inc/mod/pages.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/inc/mod/pages.php b/inc/mod/pages.php index 9526a7df..91ae8046 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -1406,6 +1406,8 @@ function mod_rebuild() { error($config['error']['noaccess']); if (isset($_POST['rebuild'])) { + set_time_limit($config['mod']['rebuild_timelimit']); + $log = array(); $boards = listBoards(); $rebuilt_scripts = array(); From 5628f789702d9bdbd573f1833f6258b4f26a47b4 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Tue, 4 Sep 2012 00:21:04 -0600 Subject: [PATCH 13/19] Made deleting posts by IP more efficient. No longer rebuilds same thread multiple times. --- inc/mod/pages.php | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/inc/mod/pages.php b/inc/mod/pages.php index 91ae8046..e90e9ff0 100644 --- a/inc/mod/pages.php +++ b/inc/mod/pages.php @@ -1052,7 +1052,7 @@ function mod_deletebyip($boardName, $post, $global = false) { $query = ''; foreach ($boards as $_board) { - $query .= sprintf("SELECT `id`, '%s' AS `board` FROM `posts_%s` WHERE `ip` = :ip UNION ALL ", $_board['uri'], $_board['uri']); + $query .= sprintf("SELECT `thread`, `id`, '%s' AS `board` FROM `posts_%s` WHERE `ip` = :ip UNION ALL ", $_board['uri'], $_board['uri']); } $query = preg_replace('/UNION ALL $/', '', $query); @@ -1063,18 +1063,27 @@ function mod_deletebyip($boardName, $post, $global = false) { if ($query->rowCount() < 1) error($config['error']['invalidpost']); - $boards = array(); + set_time_limit($config['mod']['rebuild_timelimit']); + + $threads_to_rebuild = array(); + $threads_deleted = array(); while ($post = $query->fetch()) { openBoard($post['board']); - $boards[] = $post['board']; - deletePost($post['id'], false); + deletePost($post['id'], false, false); + + if ($post['thread']) + $threads_to_rebuild[$post['board']][$post['thread']] = true; + else + $threads_deleted[$post['board']][$post['id']] = true; } - $boards = array_unique($boards); - - foreach ($boards as $_board) { + foreach ($threads_to_rebuild as $_board => $_threads) { openBoard($_board); + foreach ($_threads as $_thread => $_dummy) { + if ($_dummy && !isset($threads_deleted[$_board][$_thread])) + buildThread($_thread); + } buildIndex(); } From 90ada24ddc84c08ddeb2411e0ede02b1afa7104c Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Tue, 9 Oct 2012 19:57:01 -0600 Subject: [PATCH 14/19] Insert into posts table using named columns. Makes it easier to update the posts table schema. --- inc/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/functions.php b/inc/functions.php index a7b6b434..3de1ccaf 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -697,7 +697,7 @@ function threadExists($id) { function post(array $post) { global $pdo, $board; - $query = prepare(sprintf("INSERT INTO `posts_%s` VALUES ( NULL, :thread, :subject, :email, :name, :trip, :capcode, :body, :body_nomarkup, :time, :time, :thumb, :thumbwidth, :thumbheight, :file, :width, :height, :filesize, :filename, :filehash, :password, :ip, :sticky, :locked, 0, :embed)", $board['uri'])); + $query = prepare(sprintf("INSERT INTO `posts_%s` (`id`, `thread`, `subject`, `email`, `name`, `trip`, `capcode`, `body`, `body_nomarkup`, `time`, `bump`, `thumb`, `thumbwidth`, `thumbheight`, `file`, `filewidth`, `fileheight`, `filesize`, `filename`, `filehash`, `password`, `ip`, `sticky`, `locked`, `sage`, `embed`) VALUES ( NULL, :thread, :subject, :email, :name, :trip, :capcode, :body, :body_nomarkup, :time, :time, :thumb, :thumbwidth, :thumbheight, :file, :width, :height, :filesize, :filename, :filehash, :password, :ip, :sticky, :locked, 0, :embed)", $board['uri'])); // Basic stuff if (!empty($post['subject'])) { From 7eef94e04e3f80ae776cd2c02ca29dd93945a47f Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Fri, 2 Nov 2012 22:29:11 -0600 Subject: [PATCH 15/19] Fix transforming links to mod links in OP posts. Similar regexes are called for threads and posts, but they differed needlessly, and the thread regex would drop anything between the `= :floodtime) OR (`ip` = :ip AND `body` != '' AND `body` = :body AND `time` >= :floodsameiptime) OR (`body` != '' AND `body` = :body AND `time` >= :floodsametime) LIMIT 1", $board['uri'])); $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']); - $query->bindValue(':body', $post['body'], PDO::PARAM_INT); + $query->bindValue(':body', $post['body']); $query->bindValue(':floodtime', time()-$config['flood_time'], PDO::PARAM_INT); $query->bindValue(':floodsameiptime', time()-$config['flood_time_ip'], PDO::PARAM_INT); $query->bindValue(':floodsametime', time()-$config['flood_time_same'], PDO::PARAM_INT); From f01813d95b2e39fc938262a3aca6986d97c7da6b Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Sat, 19 Jan 2013 01:20:55 -0600 Subject: [PATCH 17/19] Remove now redundant single-column `thread` key from posts_* tables. --- templates/posts.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/posts.sql b/templates/posts.sql index ac383ab0..c766d38e 100644 --- a/templates/posts.sql +++ b/templates/posts.sql @@ -26,7 +26,6 @@ CREATE TABLE IF NOT EXISTS `posts_{{ board }}` ( `sage` int(1) NOT NULL, `embed` text, UNIQUE KEY `id` (`id`), - KEY `thread` (`thread`), KEY `thread_id` (`thread`, `id`), KEY `time` (`time`), FULLTEXT KEY `body` (`body`) From 0da1c18a7ff2328a3cdd422e3f67d4b4bf403fb5 Mon Sep 17 00:00:00 2001 From: Macil Tech Date: Thu, 30 Aug 2012 04:07:23 -0600 Subject: [PATCH 18/19] Add field_disable_subject and field_disable_reply_subject config options. --- inc/config.php | 4 ++++ post.php | 8 +++++++- templates/post_form.html | 8 +++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/inc/config.php b/inc/config.php index e977f066..ea936032 100644 --- a/inc/config.php +++ b/inc/config.php @@ -348,6 +348,10 @@ $config['field_disable_name'] = false; // When true, no email will be able to be set. $config['field_disable_email'] = false; + // When true, no subject will be able to be set. + $config['field_disable_subject'] = false; + // When true, no subject will be able to be set in replies. + $config['field_disable_reply_subject'] = false; // When true, a blank password will be used for files (not usable for deletion). $config['field_disable_password'] = false; diff --git a/post.php b/post.php index 98da7486..54065832 100644 --- a/post.php +++ b/post.php @@ -139,7 +139,7 @@ if (isset($_POST['delete'])) { header('Location: ' . $root . $board['dir'] . $config['file_index'], true, $config['redirect_http']); } elseif (isset($_POST['post'])) { - if (!isset($_POST['subject'], $_POST['body'], $_POST['board'])) + if (!isset($_POST['body'], $_POST['board'])) error($config['error']['bot']); if (!isset($_POST['name'])) @@ -148,6 +148,9 @@ if (isset($_POST['delete'])) { if (!isset($_POST['email'])) $_POST['email'] = ''; + if (!isset($_POST['subject'])) + $_POST['subject'] = ''; + if (!isset($_POST['password'])) $_POST['password'] = ''; @@ -271,6 +274,9 @@ if (isset($_POST['delete'])) { if ($config['field_disable_password']) $_POST['password'] = ''; + + if ($config['field_disable_subject'] || (!$post['op'] && $config['field_disable_reply_subject'])) + $_POST['subject'] = ''; } // Check for a file diff --git a/templates/post_form.html b/templates/post_form.html index 8b7350c7..aa051f5f 100644 --- a/templates/post_form.html +++ b/templates/post_form.html @@ -27,12 +27,18 @@ {% endif %} - + {% if not (config.field_disable_subject or (id and config.field_disable_reply_subject)) or (mod and post.mod|hasPermission(config.mod.bypass_field_disable, board.uri)) %} {% trans %}Subject{% endtrans %} {{ antibot.html() }} + {% else %} + {% trans %}Submit{% endtrans %} + {{ antibot.html() }} + + + {% endif %} {% if config.spoiler_images %} {% endif %} From 27ee4d320c196a5490891831f615f2e871eb6782 Mon Sep 17 00:00:00 2001 From: Michael Save Date: Sat, 19 Jan 2013 18:49:00 +1100 Subject: [PATCH 19/19] Upgrade script for new kew --- install.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/install.php b/install.php index 7d27940b..1447c723 100644 --- a/install.php +++ b/install.php @@ -1,7 +1,7 @@