Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
c8be82a
Fix. AltSession. Correcting the issue of array conversion
AntonV1211 Mar 31, 2026
4e9ed00
Merge pull request #768 from CleanTalk/fix_altsession_ct_checkjs_av
AntonV1211 Apr 1, 2026
dfd4b8a
New. BookingCalendar. New integration with BookingCalendar
AntonV1211 Apr 1, 2026
4c07068
merge fix
AntonV1211 Apr 1, 2026
0a09e29
Version: 6.76.99-dev.
Glomberg Apr 2, 2026
b6f3832
Merge remote-tracking branch 'origin/master' into fix
Glomberg Apr 2, 2026
a2d28fe
Version: 6.76.99-fix.
Glomberg Apr 2, 2026
657e593
Merge fix
AntonV1211 Apr 7, 2026
47468fc
Merge pull request #769 from CleanTalk/integ_wp_booking_cal_av
AntonV1211 Apr 7, 2026
15e239c
Upd. Settings. Updated flow to check pingback. (#764) (#773) (#774)
svfcode Apr 8, 2026
202e3e9
Fix. CF7. Edit honeypot
AntonV1211 Apr 9, 2026
e7963fa
Fix. Integration. EDD integration fixed. (#770)
Glomberg Apr 9, 2026
8cd6687
Fix. Code. Editing the bot detector settings
AntonV1211 Apr 13, 2026
64da8de
Fix. Exclusion. Skip request from Metorik Helper
AntonV1211 Apr 14, 2026
dfea27d
Fix. Common. Add bot detector state to `ct_options`. (#778)
Glomberg Apr 15, 2026
3cb6ce0
Fix. WPMS. Errors output for WPMS mutual-mutual mode fixed. (#772)
Glomberg Apr 15, 2026
598b63e
Merge remote-tracking branch 'origin/fix' into dev
Glomberg Apr 15, 2026
91169e6
Version: 6.77.
Glomberg Apr 15, 2026
a016216
Fix. Readme. Changelog updated.
Glomberg Apr 15, 2026
db65343
Fix. Code. JS error in `ctProtectOutsideFunctionalHandler` fixed.
Glomberg Apr 16, 2026
9cc8cd6
Fix. WPMS. Settings for `mutual/mutual` fixed.
Glomberg Apr 16, 2026
1e3aa28
Fix. Code. AntiCrawler `clearDataTable` fixed.
Glomberg Apr 16, 2026
6f025c8
Fix. WPMS. Settings page error fixed.
Glomberg Apr 16, 2026
6fd14c1
Upd. Readme. Changelog updated.
Glomberg Apr 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ on: # event list
branches:
- dev
- master
- '**'

env: # environment variables (available in any part of the action)
PHP_VERSION: 7.4
Expand Down
2 changes: 1 addition & 1 deletion cleantalk.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
Plugin Name: Anti-Spam by CleanTalk
Plugin URI: https://cleantalk.org
Description: Max power, all-in-one, no Captcha, premium anti-spam plugin. No comment spam, no registration spam, no contact spam, protects any WordPress forms.
Version: 6.76
Version: 6.77
Author: CleanTalk - Anti-Spam Protection <welcome@cleantalk.org>
Author URI: https://cleantalk.org
Text Domain: cleantalk-spam-protect
Expand Down
10 changes: 9 additions & 1 deletion inc/cleantalk-common.php
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,14 @@ function apbct_get_sender_info()
$page_hits = RequestParameters::get('apbct_page_hits', Cookie::$force_alt_cookies_global);
$page_hits = !empty($page_hits) ? TT::toString($page_hits) : null;

$ct_options = json_encode(
array_merge(
(array) $apbct->settings,
['data__bot_detector_enabled' => apbct__is_bot_detector_enabled() ? 1 : 0]
),
JSON_UNESCAPED_SLASHES
);

//Let's keep $data_array for debugging
$data_array = array(
'plugin_request_id' => $apbct->plugin_request_id,
Expand All @@ -615,7 +623,7 @@ function apbct_get_sender_info()
'USER_AGENT' => Server::get('HTTP_USER_AGENT'),
'page_url' => apbct_sender_info___get_page_url(),
'cms_lang' => substr(get_locale(), 0, 2),
'ct_options' => json_encode($apbct->settings, JSON_UNESCAPED_SLASHES),
'ct_options' => $ct_options,
'fields_number' => sizeof($_POST),
'direct_post' => $cookie_is_ok === null && apbct_is_post() ? 1 : 0,
// Raw data to validated JavaScript test in the cloud
Expand Down
9 changes: 8 additions & 1 deletion inc/cleantalk-integrations-by-hook.php
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@
'ajax' => false
),
'EasyDigitalDownloads' => array(
'hook' => array('edd_pre_process_register_form', 'edd_insert_user_args'),
'hook' => array('edd_pre_process_register_form', 'edd_insert_user_args', 'edd_customer_pre_create'),
'setting' => 'forms__registrations_test',
'ajax' => false
),
Expand Down Expand Up @@ -291,6 +291,13 @@
'setting' => 'forms__contact_forms_test',
'ajax' => true
),
'BookingCalendar' => array(
'hook' => [
'WPBC_AJX_BOOKING__CREATE',
],
'setting' => 'forms__contact_forms_test',
'ajax' => true
),
'JobstackThemeRegistration' => array(
'hook' => 'wp_loaded',
'setting' => 'forms__registrations_test',
Expand Down
12 changes: 12 additions & 0 deletions inc/cleantalk-pluggable.php
Original file line number Diff line number Diff line change
Expand Up @@ -1406,6 +1406,13 @@ function apbct_is_skip_request($ajax = false, $ajax_message_obj = array())
return 'BookingPress service action';
}

if (
apbct_is_plugin_active('booking/wpdev-booking.php') &&
(Post::getString('action') === 'WPBC_AJX_BOOKING__CREATE')
) {
return 'WP BookingCalendar service action';
}

if (
(
apbct_is_plugin_active('pixelyoursite/pixelyoursite.php') ||
Expand Down Expand Up @@ -1812,6 +1819,11 @@ class_exists('Cleantalk\Antispam\Integrations\CleantalkInternalForms')
apbct_is_in_uri('wc-ajax=iwd_opc_update_order_review') ) {
return 'cartflows_save_cart';
}
// WC addon - Metorik Helper plugin service requests
if ( apbct_is_plugin_active('metorik-helper/metorik-helper.php') &&
apbct_is_in_uri('wc-ajax=metorik_capture_customer_data') ) {
return 'metorik-helper skip';
}
// Vault Press (JetPack) plugin service requests
if (
Post::get('do_backups') !== '' &&
Expand Down
36 changes: 22 additions & 14 deletions inc/cleantalk-public-integrations.php
Original file line number Diff line number Diff line change
Expand Up @@ -1460,6 +1460,11 @@ function apbct_form__contactForm7__testSpam($spam, $_submission = null)
*/
$input_array = apply_filters('apbct__filter_post', $_POST);

$honeypot_params = array();
if ( isset($input_array['apbct__email_id__wp_contact_form_7']) ) {
$honeypot_params['honeypot_field'] = ($input_array['apbct__email_id__wp_contact_form_7'] === '') ? 1 : 0;
}

$ct_temp_msg_data = ct_get_fields_any($input_array);

$sender_email = isset($ct_temp_msg_data['email']) ? $ct_temp_msg_data['email'] : '';
Expand All @@ -1472,21 +1477,24 @@ function apbct_form__contactForm7__testSpam($spam, $_submission = null)
}

$base_call_result = apbct_base_call(
array(
'message' => $message,
'sender_email' => $sender_email,
'sender_nickname' => $sender_nickname,
'js_on' => $checkjs,
'post_info' => array('comment_type' => 'contact_form_wordpress_cf7'),
'sender_info' => array(
'form_validation' => ! isset($apbct->validation_error)
? null
: json_encode(array(
'validation_notice' => $apbct->validation_error,
'page_url' => TT::toString(Server::get('HTTP_HOST')) . TT::toString(Server::get('REQUEST_URI')),
)),
'sender_emails_array' => $sender_emails_array,
array_merge(
array(
'message' => $message,
'sender_email' => $sender_email,
'sender_nickname' => $sender_nickname,
'js_on' => $checkjs,
'post_info' => array('comment_type' => 'contact_form_wordpress_cf7'),
'sender_info' => array(
'form_validation' => ! isset($apbct->validation_error)
? null
: json_encode(array(
'validation_notice' => $apbct->validation_error,
'page_url' => TT::toString(Server::get('HTTP_HOST')) . TT::toString(Server::get('REQUEST_URI')),
)),
'sender_emails_array' => $sender_emails_array,
),
),
$honeypot_params
)
);

Expand Down
2 changes: 1 addition & 1 deletion js/apbct-public-bundle.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/apbct-public-bundle_ext-protection.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/apbct-public-bundle_ext-protection_gathering.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/apbct-public-bundle_full-protection.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/apbct-public-bundle_full-protection_gathering.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/apbct-public-bundle_gathering.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/apbct-public-bundle_int-protection.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/apbct-public-bundle_int-protection_gathering.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/cleantalk-admin-settings-page.min.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/cleantalk-admin-settings-page.min.js.map

Large diffs are not rendered by default.

19 changes: 13 additions & 6 deletions js/prebuild/apbct-public-bundle.js
Original file line number Diff line number Diff line change
Expand Up @@ -2184,7 +2184,7 @@ function ctSetAlternativeCookie(cookies, params) {
if (Array.isArray(cookies)) {
cookies = getJavascriptClientData(cookies);
}
} else if (!+ctPublic.settings__data__bot_detector_enabled) {
} else if (!+ctPublic.bot_detector_enabled) {
console.log('APBCT ERROR: getJavascriptClientData() is not loaded');
}

Expand Down Expand Up @@ -2400,10 +2400,12 @@ let apbctLocalStorage = {
const json = JSON.parse(storageValue);
if ( json.hasOwnProperty(property) ) {
try {
// if property can be parsed as JSON - do it
return JSON.parse( json[property] );
const parsed = JSON.parse( json[property] );
if ( parsed !== null && typeof parsed === 'object' ) {
return json[property].toString();
}
return parsed;
} catch (e) {
// if not - return string of value
return json[property].toString();
}
} else {
Expand Down Expand Up @@ -3422,7 +3424,7 @@ class ApbctHandler {
try {
const batchPayload = JSON.parse(args[1].body);
if (batchPayload.requests && Array.isArray(batchPayload.requests)) {
const fieldPair = selectFieldsData(+ctPublic.settings__data__bot_detector_enabled);
const fieldPair = selectFieldsData(+ctPublic.bot_detector_enabled);
for (const req of batchPayload.requests) {
const isAddItem = req.path === '/wc/store/v1/cart/add-item';
if (isAddItem && req.body && fieldPair && fieldPair.key) {
Expand Down Expand Up @@ -3596,6 +3598,11 @@ class ApbctHandler {
if (ajaxObject.data.indexOf('action=wwlc_create_user') !== -1) {
sourceSign.found = 'action=wwlc_create_user';
}
if (ajaxObject.data.indexOf('action=WPBC_AJX_BOOKING__CREATE') !== -1) {
sourceSign.found = 'action=WPBC_AJX_BOOKING__CREATE';
sourceSign.keepUnwrapped = true;
sourceSign.attachVisibleFieldsData = true;
}
if (ajaxObject.data.indexOf('action=drplus_signup') !== -1) {
sourceSign.found = 'action=drplus_signup';
sourceSign.keepUnwrapped = true;
Expand Down Expand Up @@ -3675,7 +3682,7 @@ class ApbctHandler {
try {
// Event token
if (
+ctPublic.settings__data__bot_detector_enabled &&
+ctPublic.bot_detector_enabled &&
apbctLocalStorage.get('bot_detector_event_token')
) {
const token = this.toolGetEventToken();
Expand Down
21 changes: 14 additions & 7 deletions js/prebuild/apbct-public-bundle_ext-protection.js
Original file line number Diff line number Diff line change
Expand Up @@ -2184,7 +2184,7 @@ function ctSetAlternativeCookie(cookies, params) {
if (Array.isArray(cookies)) {
cookies = getJavascriptClientData(cookies);
}
} else if (!+ctPublic.settings__data__bot_detector_enabled) {
} else if (!+ctPublic.bot_detector_enabled) {
console.log('APBCT ERROR: getJavascriptClientData() is not loaded');
}

Expand Down Expand Up @@ -2400,10 +2400,12 @@ let apbctLocalStorage = {
const json = JSON.parse(storageValue);
if ( json.hasOwnProperty(property) ) {
try {
// if property can be parsed as JSON - do it
return JSON.parse( json[property] );
const parsed = JSON.parse( json[property] );
if ( parsed !== null && typeof parsed === 'object' ) {
return json[property].toString();
}
return parsed;
} catch (e) {
// if not - return string of value
return json[property].toString();
}
} else {
Expand Down Expand Up @@ -3422,7 +3424,7 @@ class ApbctHandler {
try {
const batchPayload = JSON.parse(args[1].body);
if (batchPayload.requests && Array.isArray(batchPayload.requests)) {
const fieldPair = selectFieldsData(+ctPublic.settings__data__bot_detector_enabled);
const fieldPair = selectFieldsData(+ctPublic.bot_detector_enabled);
for (const req of batchPayload.requests) {
const isAddItem = req.path === '/wc/store/v1/cart/add-item';
if (isAddItem && req.body && fieldPair && fieldPair.key) {
Expand Down Expand Up @@ -3596,6 +3598,11 @@ class ApbctHandler {
if (ajaxObject.data.indexOf('action=wwlc_create_user') !== -1) {
sourceSign.found = 'action=wwlc_create_user';
}
if (ajaxObject.data.indexOf('action=WPBC_AJX_BOOKING__CREATE') !== -1) {
sourceSign.found = 'action=WPBC_AJX_BOOKING__CREATE';
sourceSign.keepUnwrapped = true;
sourceSign.attachVisibleFieldsData = true;
}
if (ajaxObject.data.indexOf('action=drplus_signup') !== -1) {
sourceSign.found = 'action=drplus_signup';
sourceSign.keepUnwrapped = true;
Expand Down Expand Up @@ -3675,7 +3682,7 @@ class ApbctHandler {
try {
// Event token
if (
+ctPublic.settings__data__bot_detector_enabled &&
+ctPublic.bot_detector_enabled &&
apbctLocalStorage.get('bot_detector_event_token')
) {
const token = this.toolGetEventToken();
Expand Down Expand Up @@ -5111,7 +5118,7 @@ function ctProtectOutsideFunctionalHandler(entity, lsStorageName, lsUniqueName)
ctAttachCoverCSSToHead();
entityParent.appendChild(ctProtectOutsideFunctionalGenerateCover());
let entitiesProtected = apbctLocalStorage.get(lsStorageName);
if (false === entitiesProtected) {
if (false === entitiesProtected || !Array.isArray(entitiesProtected)) {
entitiesProtected = [];
}
if (lsUniqueName) {
Expand Down
21 changes: 14 additions & 7 deletions js/prebuild/apbct-public-bundle_ext-protection_gathering.js
Original file line number Diff line number Diff line change
Expand Up @@ -2184,7 +2184,7 @@ function ctSetAlternativeCookie(cookies, params) {
if (Array.isArray(cookies)) {
cookies = getJavascriptClientData(cookies);
}
} else if (!+ctPublic.settings__data__bot_detector_enabled) {
} else if (!+ctPublic.bot_detector_enabled) {
console.log('APBCT ERROR: getJavascriptClientData() is not loaded');
}

Expand Down Expand Up @@ -2400,10 +2400,12 @@ let apbctLocalStorage = {
const json = JSON.parse(storageValue);
if ( json.hasOwnProperty(property) ) {
try {
// if property can be parsed as JSON - do it
return JSON.parse( json[property] );
const parsed = JSON.parse( json[property] );
if ( parsed !== null && typeof parsed === 'object' ) {
return json[property].toString();
}
return parsed;
} catch (e) {
// if not - return string of value
return json[property].toString();
}
} else {
Expand Down Expand Up @@ -3422,7 +3424,7 @@ class ApbctHandler {
try {
const batchPayload = JSON.parse(args[1].body);
if (batchPayload.requests && Array.isArray(batchPayload.requests)) {
const fieldPair = selectFieldsData(+ctPublic.settings__data__bot_detector_enabled);
const fieldPair = selectFieldsData(+ctPublic.bot_detector_enabled);
for (const req of batchPayload.requests) {
const isAddItem = req.path === '/wc/store/v1/cart/add-item';
if (isAddItem && req.body && fieldPair && fieldPair.key) {
Expand Down Expand Up @@ -3596,6 +3598,11 @@ class ApbctHandler {
if (ajaxObject.data.indexOf('action=wwlc_create_user') !== -1) {
sourceSign.found = 'action=wwlc_create_user';
}
if (ajaxObject.data.indexOf('action=WPBC_AJX_BOOKING__CREATE') !== -1) {
sourceSign.found = 'action=WPBC_AJX_BOOKING__CREATE';
sourceSign.keepUnwrapped = true;
sourceSign.attachVisibleFieldsData = true;
}
if (ajaxObject.data.indexOf('action=drplus_signup') !== -1) {
sourceSign.found = 'action=drplus_signup';
sourceSign.keepUnwrapped = true;
Expand Down Expand Up @@ -3675,7 +3682,7 @@ class ApbctHandler {
try {
// Event token
if (
+ctPublic.settings__data__bot_detector_enabled &&
+ctPublic.bot_detector_enabled &&
apbctLocalStorage.get('bot_detector_event_token')
) {
const token = this.toolGetEventToken();
Expand Down Expand Up @@ -5111,7 +5118,7 @@ function ctProtectOutsideFunctionalHandler(entity, lsStorageName, lsUniqueName)
ctAttachCoverCSSToHead();
entityParent.appendChild(ctProtectOutsideFunctionalGenerateCover());
let entitiesProtected = apbctLocalStorage.get(lsStorageName);
if (false === entitiesProtected) {
if (false === entitiesProtected || !Array.isArray(entitiesProtected)) {
entitiesProtected = [];
}
if (lsUniqueName) {
Expand Down
21 changes: 14 additions & 7 deletions js/prebuild/apbct-public-bundle_full-protection.js
Original file line number Diff line number Diff line change
Expand Up @@ -2184,7 +2184,7 @@ function ctSetAlternativeCookie(cookies, params) {
if (Array.isArray(cookies)) {
cookies = getJavascriptClientData(cookies);
}
} else if (!+ctPublic.settings__data__bot_detector_enabled) {
} else if (!+ctPublic.bot_detector_enabled) {
console.log('APBCT ERROR: getJavascriptClientData() is not loaded');
}

Expand Down Expand Up @@ -2400,10 +2400,12 @@ let apbctLocalStorage = {
const json = JSON.parse(storageValue);
if ( json.hasOwnProperty(property) ) {
try {
// if property can be parsed as JSON - do it
return JSON.parse( json[property] );
const parsed = JSON.parse( json[property] );
if ( parsed !== null && typeof parsed === 'object' ) {
return json[property].toString();
}
return parsed;
} catch (e) {
// if not - return string of value
return json[property].toString();
}
} else {
Expand Down Expand Up @@ -3422,7 +3424,7 @@ class ApbctHandler {
try {
const batchPayload = JSON.parse(args[1].body);
if (batchPayload.requests && Array.isArray(batchPayload.requests)) {
const fieldPair = selectFieldsData(+ctPublic.settings__data__bot_detector_enabled);
const fieldPair = selectFieldsData(+ctPublic.bot_detector_enabled);
for (const req of batchPayload.requests) {
const isAddItem = req.path === '/wc/store/v1/cart/add-item';
if (isAddItem && req.body && fieldPair && fieldPair.key) {
Expand Down Expand Up @@ -3596,6 +3598,11 @@ class ApbctHandler {
if (ajaxObject.data.indexOf('action=wwlc_create_user') !== -1) {
sourceSign.found = 'action=wwlc_create_user';
}
if (ajaxObject.data.indexOf('action=WPBC_AJX_BOOKING__CREATE') !== -1) {
sourceSign.found = 'action=WPBC_AJX_BOOKING__CREATE';
sourceSign.keepUnwrapped = true;
sourceSign.attachVisibleFieldsData = true;
}
if (ajaxObject.data.indexOf('action=drplus_signup') !== -1) {
sourceSign.found = 'action=drplus_signup';
sourceSign.keepUnwrapped = true;
Expand Down Expand Up @@ -3675,7 +3682,7 @@ class ApbctHandler {
try {
// Event token
if (
+ctPublic.settings__data__bot_detector_enabled &&
+ctPublic.bot_detector_enabled &&
apbctLocalStorage.get('bot_detector_event_token')
) {
const token = this.toolGetEventToken();
Expand Down Expand Up @@ -5111,7 +5118,7 @@ function ctProtectOutsideFunctionalHandler(entity, lsStorageName, lsUniqueName)
ctAttachCoverCSSToHead();
entityParent.appendChild(ctProtectOutsideFunctionalGenerateCover());
let entitiesProtected = apbctLocalStorage.get(lsStorageName);
if (false === entitiesProtected) {
if (false === entitiesProtected || !Array.isArray(entitiesProtected)) {
entitiesProtected = [];
}
if (lsUniqueName) {
Expand Down
Loading
Loading