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'])) {