From 39e5960369d959fc88c2adf23e9d9caaa9dfeee4 Mon Sep 17 00:00:00 2001 From: towards-a-new-leftypol Date: Tue, 22 Aug 2023 17:58:05 -0400 Subject: [PATCH] Make spamnoticer aware of users deleting their own posts --- inc/anti-bot.php | 4 ---- inc/config.php | 2 ++ inc/functions.php | 26 +++++++++++++++++++++++--- inc/spamnoticer.php | 33 +++++++++++++++++++++++++++++++++ install.php | 14 -------------- post.php | 11 +++++------ 6 files changed, 63 insertions(+), 27 deletions(-) diff --git a/inc/anti-bot.php b/inc/anti-bot.php index 384da6ac..6035ba8e 100644 --- a/inc/anti-bot.php +++ b/inc/anti-bot.php @@ -35,10 +35,6 @@ function getStackTraceAsString() { return $traceString; } -function print_err2($s) { - print_err($s); -} - print_err("\n\nSTART\n\n"); class AntiBot { diff --git a/inc/config.php b/inc/config.php index 90d568ea..3cf27c85 100644 --- a/inc/config.php +++ b/inc/config.php @@ -517,6 +517,8 @@ // Allow users to delete their own posts? $config['allow_delete'] = true; + // Allow users to delete their own threads? + $config['allow_thread_deletion'] = false; // How long after posting should you have to wait before being able to delete that post? (In seconds.) $config['delete_time'] = 10; // Reply limit (stops bumping thread when this is reached). diff --git a/inc/functions.php b/inc/functions.php index b824a226..bf8afd55 100644 --- a/inc/functions.php +++ b/inc/functions.php @@ -23,6 +23,7 @@ require_once 'inc/mod/auth.php'; require_once 'inc/lock.php'; require_once 'inc/queue.php'; require_once 'inc/polyfill.php'; +require_once 'inc/spamnoticer.php'; @include_once 'inc/lib/parsedown/Parsedown.php'; // fail silently, this isn't a critical piece of code if (!extension_loaded('gettext')) { @@ -1116,7 +1117,7 @@ function bumpThread($id) { function deleteFile($id, $remove_entirely_if_already=true, $file=null, $alert_spamnoticer=false) { global $board, $config; - $query = prepare(sprintf("SELECT `thread`, `files`, `num_files` FROM ``posts_%s`` WHERE `id` = :id LIMIT 1", $board['uri'])); + $query = prepare(sprintf("SELECT `thread`, `files`, `num_files`, `delete_token` FROM ``posts_%s`` WHERE `id` = :id LIMIT 1", $board['uri'])); $query->bindValue(':id', $id, PDO::PARAM_INT); $query->execute() or error(db_error($query)); if (!$post = $query->fetch(PDO::FETCH_ASSOC)) @@ -1154,6 +1155,16 @@ function deleteFile($id, $remove_entirely_if_already=true, $file=null, $alert_sp $query->bindValue(':id', $id, PDO::PARAM_INT); $query->execute() or error(db_error($query)); + if ($alert_spamnoticer) { + $delete_tokens = array(); + + if ($post['delete_token']) { + $delete_tokens[] = $post['delete_token']; + } + + removeRecentPostFromSpamnoticer($config, $delete_tokens, true); + } + if ($post['thread']) buildThread($post['thread']); else @@ -1192,7 +1203,7 @@ function deletePost($id, $error_if_doesnt_exist=true, $rebuild_after=true, $aler global $board, $config; // Select post and replies (if thread) in one query - $query = prepare(sprintf("SELECT `id`,`thread`,`files`,`slug` FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri'])); + $query = prepare(sprintf("SELECT `id`,`thread`,`files`,`slug`, `delete_token` FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri'])); $query->bindValue(':id', $id, PDO::PARAM_INT); $query->execute() or error(db_error($query)); @@ -1206,6 +1217,7 @@ function deletePost($id, $error_if_doesnt_exist=true, $rebuild_after=true, $aler } $ids = array(); + $delete_tokens = array(); // Delete posts and maybe replies while ($post = $query->fetch(PDO::FETCH_ASSOC)) { @@ -1238,14 +1250,22 @@ function deletePost($id, $error_if_doesnt_exist=true, $rebuild_after=true, $aler } } - $ids[] = (int)$post['id']; + $ids[] = (int) $post['id']; + if ($post['delete_token']) { + $delete_tokens[] = $post['delete_token']; + } } + $query = prepare(sprintf("DELETE FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri'])); $query->bindValue(':id', $id, PDO::PARAM_INT); $query->execute() or error(db_error($query)); + if ($alert_spamnoticer) { + removeRecentPostFromSpamnoticer($config, $delete_tokens); + } + $query = prepare("SELECT `board`, `post` FROM ``cites`` WHERE `target_board` = :board AND (`target` = " . implode(' OR `target` = ', $ids) . ") ORDER BY `board`"); $query->bindValue(':board', $board['uri']); $query->execute() or error(db_error($query)); diff --git a/inc/spamnoticer.php b/inc/spamnoticer.php index 0256730f..ddd7cb19 100644 --- a/inc/spamnoticer.php +++ b/inc/spamnoticer.php @@ -211,3 +211,36 @@ function checkWithSpamNoticer($config, $post, $boardname) { return $result; } + +function removeRecentPostFromSpamnoticer($config, $delete_tokens, $files_only = false) { + if (!$delete_tokens) { + return; + } + + $client = _createClient($config); + + $promise = $client->postAsync('/undo_recent_post', [ + 'headers' => [ + 'Content-Type' => 'application/json', + ], + 'json' => [ + 'delete_tokens' => $delete_tokens, + 'files_only' => $files_only, + ] + ]); + + $promise->then( + function ($response) use ($config) { + // This callback is executed when the request is successful + if ($config['debug']) { + print_err("POST to SpamNoticer /undo_recent_post sent successfully!"); + } + }, + function (RequestException $exception) { + print_err("ERROR sending POST to SpamNoticer /undo_recent_post:\n$exception"); + } + ); + + // This will initiate the asynchronous request, but we won't wait for the response. + $promise->wait(false); // Set to false for asynchronous behavior +} diff --git a/install.php b/install.php index a35a3360..fa81304f 100644 --- a/install.php +++ b/install.php @@ -9,7 +9,6 @@ if (fopen('inc/instance-config.php' , 'a') === false) { } require 'inc/functions.php'; -require_once 'inc/anti-bot.php'; // DELETE ME THIS IS FOR print_err function only! loadConfig(); @@ -25,27 +24,17 @@ $page = array( $config['minify_html'] = false; function checkMd5Exec(bool $can_exec) { - print_err2("checkMd5Exec"); - print_err2($can_exec); $shell_out = shell_exec("pwd"); - print_err2("shell out: " . $shell_out); $shell_out = shell_exec('echo "vichan" | md5sum'); - print_err2("shell out: " . $shell_out); $shell_ok = $shell_out == "141225c362da02b5c359c45b665168de -\n"; - print_err2("shell ok: " . strval($shell_ok)); $result = $can_exec && $shell_ok; - print_err2($result); return $result; } function checkGifsicle() { - print_err2("checkGifsicle"); $shell_out = shell_exec('echo $PATH'); - print_err2("shell out: " . $shell_out); $shell_out = shell_exec('gifsicle --help'); - print_err2("shell out: " . $shell_out); $shell_out = shell_exec('which gifsicle'); - print_err2("shell out (which gifsicle): " . $shell_out); return $shell_out; } @@ -673,7 +662,6 @@ if ($step == 0) { echo Element('page.html', $page); } elseif ($step == 1) { - print_err2("Hello World install.php"); $page['title'] = 'Pre-installation test'; $can_exec = true; @@ -691,8 +679,6 @@ if ($step == 0) { define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); } - print_err2("Can exec: " . strval($can_exec)); - // Required extensions $extensions = array( 'PDO' => array( diff --git a/post.php b/post.php index 4d6cfad3..915b598d 100644 --- a/post.php +++ b/post.php @@ -172,7 +172,7 @@ function handle_nntpchan() { } -function handle_delete(){ +function handle_delete() { // Delete global $config, $board, $mod; if (!isset($_POST['board'], $_POST['password'])) @@ -278,9 +278,10 @@ function handle_delete(){ echo json_encode(array('success' => true)); } - // We are already done, let's continue our heavy-lifting work in the background (if we run off FastCGI) - if (function_exists('fastcgi_finish_request')) - @fastcgi_finish_request(); + // We are already done, let's continue our heavy-lifting work in the background (if we run off FastCGI) + if (function_exists('fastcgi_finish_request')) { + @fastcgi_finish_request(); + } rebuildThemes('post-delete', $board['uri']); @@ -988,8 +989,6 @@ function handle_post(){ } else { print_err($spam_noticer_result->reason); } - } else { - print_err("spam_noticer off!"); } if (!hasPermission($config['mod']['bypass_filters'], $board['uri']) && !$dropped_post) {