From a73f6ab70e3bf8297538667d8c16d2a2a42adb19 Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Tue, 25 Mar 2025 14:53:41 +0300 Subject: [PATCH] feat: Added `StopForumSpam` integration --- composer.json | 1 + composer.lock | 53 ++++++++++++++++++++++++++++++- library/config.php | 1 + library/includes/ucp/register.php | 49 +++++++++++++++++++++------- 4 files changed, 92 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 51b0f2780..48628a686 100644 --- a/composer.json +++ b/composer.json @@ -55,6 +55,7 @@ "claviska/simpleimage": "^4.0", "belomaxorka/captcha": "1.*", "egulias/email-validator": "^4.0.1", + "resolventa/stopforumspam-php-api": "2.0.0", "filp/whoops": "^2.15", "z4kn4fein/php-semver": "^v3.0.0", "gigablah/sphinxphp": "2.0.8", diff --git a/composer.lock b/composer.lock index 917724db8..266aa63e5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ed0c6f72e121f5b35712c0855bc64a82", + "content-hash": "f6d6bb6e8a17a431f0cd91349e8ad6e0", "packages": [ { "name": "arokettu/bencode", @@ -2800,6 +2800,57 @@ }, "time": "2019-03-08T08:55:37+00:00" }, + { + "name": "resolventa/stopforumspam-php-api", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ResolventaGroup/StopForumSpam-PHP-API.git", + "reference": "58ba2beb255cb8be504163e24a66525a3e921a52" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ResolventaGroup/StopForumSpam-PHP-API/zipball/58ba2beb255cb8be504163e24a66525a3e921a52", + "reference": "58ba2beb255cb8be504163e24a66525a3e921a52", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": ">=8.1" + }, + "require-dev": { + "fzaninotto/faker": "^1.8", + "phpunit/phpunit": "^9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Resolventa\\StopForumSpamApi\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dmitry Pankin", + "email": "dpankin@gmail.com" + } + ], + "description": "PHP API for StopForumSpam service. See https://www.stopforumspam.com for details.", + "keywords": [ + "api", + "php", + "stopforumspam" + ], + "support": { + "issues": "https://github.com/ResolventaGroup/StopForumSpam-PHP-API/issues", + "source": "https://github.com/ResolventaGroup/StopForumSpam-PHP-API/tree/2.0.0" + }, + "time": "2022-06-06T07:48:27+00:00" + }, { "name": "samdark/sitemap", "version": "2.4.1", diff --git a/library/config.php b/library/config.php index af87d3ace..dbb0e6fe5 100644 --- a/library/config.php +++ b/library/config.php @@ -408,6 +408,7 @@ $bb_cfg['max_last_visit_days'] = 14; // days $bb_cfg['last_visit_update_intrv'] = 3600; // sec // Registration +$bb_cfg['use_stop_forum_spam_service'] = true; // Use StopForumSpam service to prevent registering for spam users $bb_cfg['invalid_logins'] = 5; // Max incorrect password submits before showing captcha $bb_cfg['new_user_reg_disabled'] = false; // Disable registration of new users $bb_cfg['unique_ip'] = false; // Disallow registration from multiple IP addresses diff --git a/library/includes/ucp/register.php b/library/includes/ucp/register.php index feaab65df..0170602aa 100644 --- a/library/includes/ucp/register.php +++ b/library/includes/ucp/register.php @@ -582,20 +582,47 @@ if ($submit && !$errors) { * Создание нового профиля */ if ($mode == 'register') { - if ($bb_cfg['reg_email_activation']) { - $user_actkey = make_rand_str(ACTKEY_LENGTH); - $db_data['user_active'] = 0; - $db_data['user_actkey'] = $user_actkey; - } else { - $db_data['user_active'] = 1; - $db_data['user_actkey'] = ''; - } - $db_data['user_regdate'] = TIMENOW; - if (!IS_ADMIN) { $db_data['user_reg_ip'] = USER_IP; } + // Check StopForumSpam + $spamUserDetected = false; + if ($bb_cfg['use_stop_forum_spam_service'] && !IS_ADMIN) { + $stopForumSpamApi = new \Resolventa\StopForumSpamApi\StopForumSpamApi(); + $stopForumSpamApi + ->checkEmail($db_data['user_email']) + ->checkIp($db_data['user_reg_ip']) + ->checkUsername($db_data['username']); + $response = $stopForumSpamApi->getCheckResponse(); + $analyzer = new \Resolventa\StopForumSpamApi\ResponseAnalyzer(new \Resolventa\StopForumSpamApi\ResponseAnalyzerSettings()); + + try { + if ($analyzer->isSpammerDetected($response)) { + bb_die(''); + $spamUserDetected = true; + } + } catch (\Resolventa\StopForumSpamApi\Exception\StopForumSpamApiException $e) { + bb_die('[StopForumSpamApi] Bad response: ' . $e->getMessage()); + } + } + + if ($spamUserDetected) { + $db_data['user_active'] = 0; + $db_data['user_actkey'] = ''; + } else { + if ($bb_cfg['reg_email_activation']) { + $user_actkey = make_rand_str(ACTKEY_LENGTH); + $db_data['user_active'] = 0; + $db_data['user_actkey'] = $user_actkey; + } else { + $db_data['user_active'] = 1; + $db_data['user_actkey'] = ''; + } + } + + $db_data['user_regdate'] = TIMENOW; + if (!isset($db_data['tpl_name'])) { $db_data['tpl_name'] = (string)$bb_cfg['tpl_name']; } @@ -618,7 +645,7 @@ if ($submit && !$errors) { if (IS_ADMIN) { set_pr_die_append_msg($new_user_id); $message = $lang['ACCOUNT_ADDED']; - } else { + } elseif (!$spamUserDetected) { if ($bb_cfg['reg_email_activation']) { $message = $lang['ACCOUNT_INACTIVE']; $email_subject = sprintf($lang['EMAILER_SUBJECT']['USER_WELCOME_INACTIVE'], $bb_cfg['sitename']);