diff --git a/inc/cleantalk-common.php b/inc/cleantalk-common.php index 05f23291c..dcc800fbe 100644 --- a/inc/cleantalk-common.php +++ b/inc/cleantalk-common.php @@ -1859,7 +1859,6 @@ function apbct__bot_detector_get_fired_exclusions() */ function apbct__bot_detector_get_fd_log() { - global $apbct; $result = array( 'plugin_status' => 'OK', 'error_msg' => '', @@ -1874,7 +1873,7 @@ function apbct__bot_detector_get_fd_log() } try { - if ( TT::toString($apbct->settings['data__bot_detector_enabled']) === '0') { + if ( ! apbct__is_bot_detector_enabled() ) { throw new \Exception('bot detector library usage is disabled'); } // Retrieve bot detector frontend data log from Alt Sessions @@ -1931,3 +1930,24 @@ function apbct__bot_detector_get_custom_exclusion_from_settings() } return $exclusions; } + +/** + * Check if Bot-Detector is enabled/disabled + * + * @return bool + */ +function apbct__is_bot_detector_enabled() +{ + global $apbct; + + // Constant is preferred + if ( isset($apbct->service_constants->bot_detector_enabled) && $apbct->service_constants->bot_detector_enabled->isDefined() ) { + return (bool) $apbct->service_constants->bot_detector_enabled->getValue(); + } + // Check by $apbct->data + if ( isset($apbct->data['bot_detector_enabled']) ) { + return (bool) $apbct->data['bot_detector_enabled']; + } + // By default - enabled + return true; +} diff --git a/inc/cleantalk-public.php b/inc/cleantalk-public.php index 4c706eeea..c544db2f4 100644 --- a/inc/cleantalk-public.php +++ b/inc/cleantalk-public.php @@ -32,7 +32,7 @@ function apbct_init() $apbct->settings['data__pixel'] && empty($apbct->pixel_url) && !( - $apbct->settings['data__bot_detector_enabled'] === '1' && + apbct__is_bot_detector_enabled() && $apbct->settings['data__pixel'] === '3' ) ) { @@ -540,7 +540,7 @@ function apbct_hook__wp_footer() ( $apbct->settings['data__pixel'] === '3' && ! apbct_is_cache_plugins_exists() && - $apbct->settings['data__bot_detector_enabled'] !== '1' + ! apbct__is_bot_detector_enabled() ) ) { echo ''; @@ -1245,7 +1245,7 @@ function apbct_enqueue_and_localize_public_scripts() ApbctEnqueue::getInstance()->js($bundle_name, array(), $in_footer); // Bot detector - if ( $apbct->settings['data__bot_detector_enabled'] && ! apbct_bot_detector_scripts_exclusion()) { + if ( apbct__is_bot_detector_enabled() && ! apbct_bot_detector_scripts_exclusion()) { // Attention! Skip old enqueue way for external script. wp_enqueue_script( 'ct_bot_detector', diff --git a/inc/cleantalk-settings.php b/inc/cleantalk-settings.php index 16889ae21..c6e94c6c1 100644 --- a/inc/cleantalk-settings.php +++ b/inc/cleantalk-settings.php @@ -564,14 +564,17 @@ function apbct_settings__set_fields() 'callback' => 'apbct_settings__check_alt_cookies_types' ), //bot detector - 'data__bot_detector_enabled' => array( - 'title' => __('Use ', 'cleantalk-spam-protect') - . $apbct->data['wl_brandname'] - . __(' JavaScript library', 'cleantalk-spam-protect'), - 'description' => __('This option includes external ', 'cleantalk-spam-protect') - . $apbct->data['wl_brandname'] - . __(' JavaScript library to getting visitors info data', 'cleantalk-spam-protect'), - 'childrens' => array('exclusions__bot_detector') + 'bot_detector_state' => array( + 'callback' => function () { + printf( + esc_html__('JavaScript library (Bot Detector) is %s', 'cleantalk-spam-protect'), + apbct__is_bot_detector_enabled() + ? esc_html__('enabled', 'cleantalk-spam-protect') + : esc_html__('disabled', 'cleantalk-spam-protect') + ); + }, + 'long_description' => true, + 'display' => apbct__is_bot_detector_enabled(), ), 'exclusions__bot_detector' => array( 'title' => __('JavaScript Library Exclusions', 'cleantalk-spam-protect'), @@ -584,7 +587,7 @@ function apbct_settings__set_fields() 'Regular expression. Use to skip a HTML form from special service field attach.', 'cleantalk-spam-protect' ), - 'parent' => 'data__bot_detector_enabled', + 'display' => apbct__is_bot_detector_enabled(), ), 'exclusions__bot_detector__form_attributes' => array( 'type' => 'text', @@ -592,6 +595,7 @@ function apbct_settings__set_fields() 'parent' => 'exclusions__bot_detector', 'class' => 'apbct_settings-field_wrapper--sub', 'long_description' => true, + 'display' => apbct__is_bot_detector_enabled(), ), 'exclusions__bot_detector__form_children_attributes' => array( 'type' => 'text', @@ -599,6 +603,7 @@ function apbct_settings__set_fields() 'parent' => 'exclusions__bot_detector', 'class' => 'apbct_settings-field_wrapper--sub', 'long_description' => true, + 'display' => apbct__is_bot_detector_enabled(), ), 'exclusions__bot_detector__form_parent_attributes' => array( 'type' => 'text', @@ -606,6 +611,7 @@ function apbct_settings__set_fields() 'parent' => 'exclusions__bot_detector', 'class' => 'apbct_settings-field_wrapper--sub', 'long_description' => true, + 'display' => apbct__is_bot_detector_enabled(), ), 'wp__use_builtin_http_api' => array( 'title' => __("Use WordPress HTTP API", 'cleantalk-spam-protect'), @@ -3150,6 +3156,14 @@ function apbct_settings__get__long_description() 'title' => __('Contact data encoding', 'cleantalk-spam-protect'), 'desc' => ContactsEncoder::getEmailEncoderCommonLongDescription(), ), + 'bot_detector_state' => array( + 'title' => esc_html__('JavaScript library (Bot Detector)', 'cleantalk-spam-protect'), + 'desc' => esc_html__("The Bot Detector is a JavaScript library that runs in the visitor's browser and collects behavioral signals to distinguish real users from bots.", 'cleantalk-spam-protect') + . '

' . esc_html__("This data is sent to the CleanTalk cloud along with each spam check request, significantly improving detection accuracy for spam on any website forms.", 'cleantalk-spam-protect') + . '

' . esc_html__("Disabling the Bot Detector will reduce anti-spam effectiveness.", 'cleantalk-spam-protect') + . '
' . esc_html__("It can only be disabled by adding the following constant to your wp-config.php: define('APBCT_SERVICE__BOT_DETECTOR_ENABLED', false);", 'cleantalk-spam-protect') + . '
' . esc_html__("We do not recommend disabling this functionality.", 'cleantalk-spam-protect') + ), ); if (!empty($setting_id) && isset($descriptions[$setting_id])) { diff --git a/inc/cleantalk-updater.php b/inc/cleantalk-updater.php index f8304326a..d4c865378 100644 --- a/inc/cleantalk-updater.php +++ b/inc/cleantalk-updater.php @@ -1377,3 +1377,14 @@ function apbct_update_to_6_60_0() } } } + +function apbct_update_to_6_76_0() +{ + global $apbct; + + if ( isset($apbct->settings['data__bot_detector_enabled']) ) { + $bot_detector_state = $apbct->settings['data__bot_detector_enabled']; + $apbct->data['bot_detector_enabled'] = $bot_detector_state; + $apbct->saveData(); + } +} diff --git a/js/cleantalk-admin.min.js b/js/cleantalk-admin.min.js index 66b31d4f1..e914aef60 100644 --- a/js/cleantalk-admin.min.js +++ b/js/cleantalk-admin.min.js @@ -1,2 +1,2 @@ -function apbct_admin_sendAJAX(t,n,c){let o=n.callback||null,i=n.callback_context||null,a=n.callback_params||null;var e=n.async||!0;let d=n.notJson||null;var l=n.timeout||15e3,c=c||null;let r=n.button||null,s=n.spinner||null,u=n.progressbar||null;"string"==typeof t?t=t+"&_ajax_nonce="+ctAdminCommon._ajax_nonce+"&no_cache="+Math.random():(t._ajax_nonce=ctAdminCommon._ajax_nonce,t.no_cache=Math.random()),r&&(r.setAttribute("disabled","disabled"),r.style.cursor="not-allowed"),s&&jQuery(s).css("display","inline"),jQuery.ajax({type:"POST",url:ctAdminCommon._ajax_url,data:t,async:e,success:function(e){r&&(r.removeAttribute("disabled"),r.style.cursor="pointer"),s&&jQuery(s).css("display","none"),(e=d?e:JSON.parse(e)).error?(setTimeout(function(){u&&u.fadeOut("slow")},1e3),"undefined"!=typeof cleantalkModal?(cleantalkModal.loaded="Error:
"+e.error.toString(),cleantalkModal.open()):alert("Error happens: "+(e.error||"Unkown"))):o&&(a?o.apply(i,a.concat(e,t,n,c)):o(e,t,n,c))},error:function(e,t,n){r&&(r.removeAttribute("disabled"),r.style.cursor="pointer"),s&&jQuery(s).css("display","none"),console.log("APBCT_AJAX_ERROR"),console.log(e),console.log(t),console.log(n)},timeout:l})}function apbctSetEmailDecoderPopupAnimation(){var t=["apbct_dog_one","apbct_dog_two","apbct_dog_three"],n=document.createElement("div");n.classList="apbct-ee-animation-wrapper";for(let e=0;e{e.encoded_email===a.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=o.data[0].decoded_email;var n=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,n&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?n.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:n.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,n.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),n=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(n&&n.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(n=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?n.innerText=ctPublicFunctions.text__ee_got_it:n.innerText=ctAdminCommon.text__ee_got_it,n.classList="apbct-email-encoder-got-it-button",n.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(i,o),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&a&&a.click()}),c.append(n),t.append(c))}},3e3);else if(a){let e="unknown_error";o.hasOwnProperty("data")&&0{e.encoded_email===c[n].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[n].href||0!==c[n].href.indexOf("mailto:")&&0!==c[n].href.indexOf("tel:"))c[n].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[n])},2e3);else{let e;if(0===c[n].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[n].href.indexOf("tel:"))continue;e="tel:"}var i=c[n].href.replace(e,""),a=c[n].innerHTML;c[n].innerHTML=a.replace(i,t.decoded_email),c[n].href=e+t.decoded_email,c[n].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let n="";o.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(n=e.decoded_email)}),t.innerHTML=n})}c[n].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=o.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}jQuery(document).ready(function(t){jQuery(".apbct_update_notice").on("click","button",function(){var e=new Date((new Date).getTime()+2592e6),t="https:"===location.protocol?"; secure":"";document.cookie="apbct_update_banner_closed=1; path=/; expires="+e.toUTCString()+"; samesite=lax"+t}),jQuery('li a[href="options-general.php?page=cleantalk"]').css("white-space","nowrap").css("display","inline-block"),jQuery("body").on("click",".apbct-notice .notice-dismiss-link",function(e){jQuery(e.target).parent().parent(".notice").after('

'+ctAdminCommon.apbctNoticeDismissSuccess+"

"),setTimeout(function(){jQuery("#apbct-notice-dismiss-success").fadeOut()},2e3),jQuery(e.target).parent().siblings(".apbct-notice .notice-dismiss").click()}),jQuery("body").on("click",".apbct-notice .notice-dismiss",function(e){e=jQuery(e.target).parent().attr("id");e&&apbct_admin_sendAJAX({action:"cleantalk_dismiss_notice",notice_id:e},{callback:null,notJson:!0})}),jQuery(".ct_username .row-actions .delete a").on("click",function(e){e.preventDefault(),confirm(ctAdminCommon.notice_when_deleting_user_text)&&(window.location=this.href)});let n=document.querySelector("#apbct_setting_forms__force_protection__On");var e;n&&n.addEventListener("click",function(e){n.checked&&!confirm(ctAdminCommon.apbctNoticeForceProtectionOn)&&e.preventDefault()}),t(".apbct-restore-spam-order-button").click(function(){var e=t(this).data("spam-order-id"),e={action:"apbct_restore_spam_order",_ajax_nonce:ctAdminCommon._ajax_nonce,order_id:e};t.ajax({type:"POST",url:ctAdminCommon._ajax_url,data:e,success:function(e){e.success?window.location.reload():alert(e.data.message)}})}),window.location.href.includes("options-general.php?page=cleantalk")&&(e=document.querySelector("[data-original-string]"))&&((ctAdminCommon.encodedEmailNode=e).style.cursor="pointer",e.addEventListener("click",ctFillDecodedEmailHandler))}),document.addEventListener("DOMContentLoaded",function(){var t=document.querySelectorAll("[data-original-string]");if("undefined"!=typeof ctPublic&&(ctPublic.encodedEmailNodes=t),t.length)for(let e=0;e{e.encoded_email===a.dataset.originalString&&(t=e)}),e=t.decoded_email.split(/[&?]/)[0]}else e=o.data[0].decoded_email;var n=t.querySelector("#apbct_email_ecoder__popup_text_node_first"),c=document.createElement("b"),c=(c.setAttribute("class","apbct-email-encoder-select-whole-email"),c.innerText=e,"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_click_to_select?c.title=ctPublicFunctions.text__ee_click_to_select:c.title=ctAdminCommon.text__ee_click_to_select,n&&("undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_original_email?n.innerHTML=ctPublicFunctions.text__ee_original_email+" "+c.outerHTML:n.innerHTML=ctAdminCommon.text__ee_original_email+" "+c.outerHTML,n.setAttribute("style","flex-direction: row;")),t.querySelector(".apbct-ee-animation-wrapper")),n=(c&&c.remove(),t.querySelector("#apbct_email_ecoder__popup_text_node_second")),c=(n&&n.remove(),document.createElement("span"));c.classList="apbct-email-encoder-elements_center top-margin-long",document.querySelector(".apbct-email-encoder-got-it-button")||(n=document.createElement("button"),"undefined"!=typeof ctPublicFunctions&&ctPublicFunctions.text__ee_got_it?n.innerText=ctPublicFunctions.text__ee_got_it:n.innerText=ctAdminCommon.text__ee_got_it,n.classList="apbct-email-encoder-got-it-button",n.addEventListener("click",function(){document.body.classList.remove("apbct-popup-fade"),t.setAttribute("style","display:none"),fillDecodedNodes(i,o),"undefined"!=typeof ctPublic&&ctPublic.encodedEmailNodesIsMixed&&a&&a.click()}),c.append(n),t.append(c))}},3e3);else if(a){let e="unknown_error";o.hasOwnProperty("data")&&0{e.encoded_email===c[n].dataset.originalString&&(t=e)}),!1===t.is_allowed)return;if(void 0===c[n].href||0!==c[n].href.indexOf("mailto:")&&0!==c[n].href.indexOf("tel:"))c[n].classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(t,c[n])},2e3);else{let e;if(0===c[n].href.indexOf("mailto:"))e="mailto:";else{if(0!==c[n].href.indexOf("tel:"))continue;e="tel:"}var i=c[n].href.replace(e,""),a=c[n].innerHTML;c[n].innerHTML=a.replace(i,t.decoded_email),c[n].href=e+t.decoded_email,c[n].querySelectorAll("span.apbct-email-encoder").forEach(t=>{let n="";o.data.forEach(e=>{e.encoded_email===t.dataset.originalString&&(n=e.decoded_email)}),t.innerHTML=n})}c[n].removeEventListener("click",ctFillDecodedEmailHandler)}else{let e=o.data[0];c.classList.add("no-blur"),setTimeout(()=>{ctProcessDecodedDataResult(e,c)},2e3),c.removeEventListener("click",ctFillDecodedEmailHandler)}}function ctProcessDecodedDataResult(e,t){t.setAttribute("title",""),t.removeAttribute("style"),ctFillDecodedEmail(t,e.decoded_email)}function ctFillDecodedEmail(e,t){e.innerHTML=e.innerHTML.replace(/.+?(
)/,t+"$1")}jQuery(document).ready(function(t){jQuery(".apbct_update_notice").on("click","button",function(){var e=new Date((new Date).getTime()+2592e6),t="https:"===location.protocol?"; secure":"";document.cookie="apbct_update_banner_closed=1; path=/; expires="+e.toUTCString()+"; samesite=lax"+t}),jQuery('li a[href="options-general.php?page=cleantalk"]').css("white-space","nowrap").css("display","inline-block"),jQuery("body").on("click",".apbct-notice .notice-dismiss-link",function(e){jQuery(e.target).parent().parent(".notice").after('

'+ctAdminCommon.apbctNoticeDismissSuccess+"

"),setTimeout(function(){jQuery("#apbct-notice-dismiss-success").fadeOut()},2e3),jQuery(e.target).parent().siblings(".apbct-notice .notice-dismiss").click()}),jQuery("body").on("click",".apbct-notice .notice-dismiss",function(e){e=jQuery(e.target).parent().attr("id");e&&apbct_admin_sendAJAX({action:"cleantalk_dismiss_notice",notice_id:e},{callback:null,notJson:!0})}),jQuery(".ct_username .row-actions .delete a").on("click",function(e){e.preventDefault(),confirm(ctAdminCommon.notice_when_deleting_user_text)&&(window.location=this.href)});let n=document.querySelector("#apbct_setting_forms__force_protection__On");var e;n&&n.addEventListener("click",function(e){n.checked&&!confirm(ctAdminCommon.apbctNoticeForceProtectionOn)&&e.preventDefault()}),t(".apbct-restore-spam-order-button").click(function(){var e=t(this).data("spam-order-id"),e={action:"apbct_restore_spam_order",_ajax_nonce:ctAdminCommon._ajax_nonce,order_id:e};t.ajax({type:"POST",url:ctAdminCommon._ajax_url,data:e,success:function(e){e.success?window.location.reload():alert(e.data.message)}})}),window.location.href.includes("options-general.php?page=cleantalk")&&(e=document.querySelector("[data-original-string]"))&&((ctAdminCommon.encodedEmailNode=e).style.cursor="pointer",e.addEventListener("click",ctFillDecodedEmailHandler))}),document.addEventListener("DOMContentLoaded",function(){var t=document.querySelectorAll("[data-original-string]");if("undefined"!=typeof ctPublic&&(ctPublic.encodedEmailNodes=t),t.length)for(let e=0;e

' +\n ctAdminCommon.apbctNoticeDismissSuccess +\n '

');\n setTimeout(function() {\n jQuery('#apbct-notice-dismiss-success').fadeOut();\n }, 2000);\n jQuery(e.target).parent().siblings('.apbct-notice .notice-dismiss').click();\n });\n jQuery('body').on('click', '.apbct-notice .notice-dismiss', function(e) {\n let apbctNoticeName = jQuery(e.target).parent().attr('id');\n if ( apbctNoticeName ) {\n apbct_admin_sendAJAX(\n {\n 'action': 'cleantalk_dismiss_notice',\n 'notice_id': apbctNoticeName,\n },\n {\n 'callback': null,\n 'notJson': true,\n },\n );\n }\n });\n\n // Notice when deleting user\n jQuery('.ct_username .row-actions .delete a').on('click', function(e) {\n e.preventDefault();\n\n let result = confirm(ctAdminCommon.notice_when_deleting_user_text);\n\n if (result) {\n window.location = this.href;\n }\n });\n\n let btnForceProtectionOn = document.querySelector('#apbct_setting_forms__force_protection__On');\n if (btnForceProtectionOn) {\n btnForceProtectionOn.addEventListener('click', function(e) {\n if (btnForceProtectionOn.checked) {\n let result = confirm(ctAdminCommon.apbctNoticeForceProtectionOn);\n\n if (!result) {\n e.preventDefault();\n }\n }\n });\n }\n // Restore spam order\n $('.apbct-restore-spam-order-button').click(function() {\n const spmOrderId = $(this).data('spam-order-id');\n let data = {\n action: 'apbct_restore_spam_order',\n _ajax_nonce: ctAdminCommon._ajax_nonce,\n order_id: spmOrderId,\n };\n $.ajax({\n type: 'POST',\n url: ctAdminCommon._ajax_url,\n data: data,\n success: function(result) {\n if (result.success) {\n window.location.reload();\n } else {\n alert(result.data.message);\n }\n },\n });\n });\n\n // Email decoder example\n if (window.location.href.includes('options-general.php?page=cleantalk')) {\n let encodedEmailNode = document.querySelector('[data-original-string]');\n if (encodedEmailNode) {\n ctAdminCommon.encodedEmailNode = encodedEmailNode;\n encodedEmailNode.style.cursor = 'pointer';\n encodedEmailNode.addEventListener('click', ctFillDecodedEmailHandler);\n }\n }\n});\n// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars\nfunction apbct_admin_sendAJAX(data, params, obj) {\n // Default params\n let callback = params.callback || null;\n let callbackContext = params.callback_context || null;\n let callbackParams = params.callback_params || null;\n let async = params.async || true;\n let notJson = params.notJson || null;\n let timeout = params.timeout || 15000;\n var obj = obj || null; // eslint-disable-line no-var\n let button = params.button || null;\n let spinner = params.spinner || null;\n let progressbar = params.progressbar || null;\n\n if (typeof (data) === 'string') {\n data = data + '&_ajax_nonce=' + ctAdminCommon._ajax_nonce + '&no_cache=' + Math.random();\n } else {\n data._ajax_nonce = ctAdminCommon._ajax_nonce;\n data.no_cache = Math.random();\n }\n // Button and spinner\n if (button) {\n button.setAttribute('disabled', 'disabled'); button.style.cursor = 'not-allowed';\n }\n if (spinner) jQuery(spinner).css('display', 'inline');\n\n jQuery.ajax({\n type: 'POST',\n url: ctAdminCommon._ajax_url,\n data: data,\n async: async,\n success: function(result) {\n if (button) {\n button.removeAttribute('disabled'); button.style.cursor = 'pointer';\n }\n if (spinner) jQuery(spinner).css('display', 'none');\n if (!notJson) result = JSON.parse(result);\n if (result.error) {\n setTimeout(function() {\n if (progressbar) progressbar.fadeOut('slow');\n }, 1000);\n if ( typeof cleantalkModal !== 'undefined' ) {\n // Show the result by modal\n cleantalkModal.loaded = 'Error:
' + result.error.toString();\n cleantalkModal.open();\n } else {\n alert('Error happens: ' + (result.error || 'Unkown'));\n }\n } else {\n if (callback) {\n if (callbackParams) {\n callback.apply( callbackContext, callbackParams.concat( result, data, params, obj ) );\n } else {\n callback(result, data, params, obj);\n }\n }\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n if (button) {\n button.removeAttribute('disabled'); button.style.cursor = 'pointer';\n }\n if (spinner) jQuery(spinner).css('display', 'none');\n console.log('APBCT_AJAX_ERROR');\n console.log(jqXHR);\n console.log(textStatus);\n console.log(errorThrown);\n },\n timeout: timeout,\n });\n}\n","/**\n * @return {HTMLElement} event\n */\nfunction apbctSetEmailDecoderPopupAnimation() {\n const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three'];\n const animationWrapper = document.createElement('div');\n animationWrapper.classList = 'apbct-ee-animation-wrapper';\n for (let i = 0; i < animationElements.length; i++) {\n const apbctEEAnimationDogOne = document.createElement('span');\n apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i];\n apbctEEAnimationDogOne.innerText = '@';\n animationWrapper.append(apbctEEAnimationDogOne);\n }\n return animationWrapper;\n}\n\n/**\n * @param {mixed} event\n */\nfunction ctFillDecodedEmailHandler(event = false) {\n let clickSource = false;\n let ctWlBrandname = '';\n let encodedEmail = '';\n if (typeof ctPublic !== 'undefined') {\n this.removeEventListener('click', ctFillDecodedEmailHandler);\n // remember clickSource\n clickSource = this;\n // globally remember if emails is mixed with mailto\n ctPublic.encodedEmailNodesIsMixed = false;\n ctWlBrandname = ctPublic.wl_brandname;\n encodedEmail = ctPublic.encodedEmailNodes;\n } else if (typeof ctAdminCommon !== 'undefined') {\n ctWlBrandname = ctAdminCommon.plugin_name;\n encodedEmail = ctAdminCommon.encodedEmailNode;\n }\n\n // get fade\n document.body.classList.add('apbct-popup-fade');\n // popup show\n let encoderPopup = document.getElementById('apbct_popup');\n if (!encoderPopup) {\n // construct popup\n let waitingPopup = document.createElement('div');\n waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup');\n waitingPopup.setAttribute('id', 'apbct_popup');\n\n // construct text header\n let popupHeaderWrapper = document.createElement('span');\n popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center';\n let popupHeader = document.createElement('p');\n popupHeader.innerText = ctWlBrandname;\n popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header');\n popupHeaderWrapper.append(popupHeader);\n\n // construct text wrapper\n let popupTextWrapper = document.createElement('div');\n popupTextWrapper.setAttribute('id', 'apbct_popup_text');\n popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center');\n popupTextWrapper.style.color = 'black';\n\n // construct text first node\n // todo make translatable\n let popupTextWaiting = document.createElement('p');\n popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first';\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) {\n popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding;\n } else {\n popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding;\n }\n popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center');\n\n // construct text second node\n // todo make translatable\n let popupTextDecoding = document.createElement('p');\n popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second';\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) {\n popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process;\n } else {\n popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process;\n }\n\n // appending\n popupTextWrapper.append(popupTextWaiting);\n popupTextWrapper.append(popupTextDecoding);\n waitingPopup.append(popupHeaderWrapper);\n waitingPopup.append(popupTextWrapper);\n waitingPopup.append(apbctSetEmailDecoderPopupAnimation());\n document.body.append(waitingPopup);\n } else {\n encoderPopup.setAttribute('style', 'display: inherit');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) {\n document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding;\n } else {\n document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding;\n }\n }\n\n apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource);\n}\n\n/**\n * @param {mixed} event\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) {\n if (event && clickSource) {\n // collect data\n let data = {\n post_url: document.location.href,\n referrer: document.referrer,\n encodedEmails: '',\n };\n if (ctPublic.settings__data__bot_detector_enabled == 1) {\n data.event_token = apbctLocalStorage.get('bot_detector_event_token');\n } else {\n data.event_javascript_data = getJavascriptClientData();\n }\n\n let encodedEmailsCollection = {};\n for (let i = 0; i < encodedEmailNodes.length; i++) {\n // disable click for mailto\n if (\n typeof encodedEmailNodes[i].href !== 'undefined' &&\n encodedEmailNodes[i].href.indexOf('mailto:') === 0\n ) {\n event.preventDefault();\n ctPublic.encodedEmailNodesIsMixed = true;\n }\n\n // Adding a tooltip\n let apbctTooltip = document.createElement('div');\n apbctTooltip.setAttribute('class', 'apbct-tooltip');\n apbct(encodedEmailNodes[i]).append(apbctTooltip);\n\n // collect encoded email strings\n encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString;\n }\n\n // JSONify encoded email strings\n data.encodedEmails = JSON.stringify(encodedEmailsCollection);\n\n // Using REST API handler\n if ( ctPublicFunctions.data__ajax_type === 'rest' ) {\n apbct_public_sendREST(\n 'apbct_decode_email',\n {\n data: data,\n method: 'POST',\n callback: function(result) {\n // set alternative cookie to skip next pages encoding\n ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, '');\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource);\n },\n onErrorCallback: function(res) {\n resetEncodedNodes();\n ctShowDecodeComment(res);\n },\n },\n );\n\n // Using AJAX request and handler\n } else {\n data.action = 'apbct_decode_email';\n apbct_public_sendAJAX(\n data,\n {\n notJson: false,\n callback: function(result) {\n // set alternative cookie to skip next pages encoding\n ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, '');\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource);\n },\n onErrorCallback: function(res) {\n resetEncodedNodes();\n ctShowDecodeComment(res);\n },\n },\n );\n }\n } else {\n const encodedEmail = encodedEmailNodes.dataset.originalString;\n let data = {\n encodedEmails: JSON.stringify({0: encodedEmail}),\n };\n\n // Adding a tooltip\n let apbctTooltip = document.createElement('div');\n apbctTooltip.setAttribute('class', 'apbct-tooltip');\n encodedEmailNodes.appendChild(apbctTooltip);\n\n apbct_admin_sendAJAX(\n {\n 'action': 'apbct_decode_email',\n 'encodedEmails': data.encodedEmails,\n },\n {\n 'callback': function(result) {\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false);\n },\n 'notJson': true,\n },\n );\n }\n}\n\n/**\n * @param {mixed} result\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) {\n if (result.success && result.data[0].is_allowed === true) {\n // start process of visual decoding\n setTimeout(function() {\n // popup remove\n let popup = document.getElementById('apbct_popup');\n if (popup !== null) {\n let email = '';\n if (clickSource) {\n let currentResultData;\n result.data.forEach((row) => {\n if (row.encoded_email === clickSource.dataset.originalString) {\n currentResultData = row;\n }\n });\n\n email = currentResultData.decoded_email.split(/[&?]/)[0];\n } else {\n email = result.data[0].decoded_email;\n }\n // handle first node\n let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first');\n // get email selectable by click\n let selectableEmail = document.createElement('b');\n selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email');\n selectableEmail.innerText = email;\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) {\n selectableEmail.title = ctPublicFunctions.text__ee_click_to_select;\n } else {\n selectableEmail.title = ctAdminCommon.text__ee_click_to_select;\n }\n // add email to the first node\n if (firstNode) {\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) {\n firstNode.innerHTML = ctPublicFunctions.text__ee_original_email +\n ' ' + selectableEmail.outerHTML;\n } else {\n firstNode.innerHTML = ctAdminCommon.text__ee_original_email +\n ' ' + selectableEmail.outerHTML;\n }\n\n firstNode.setAttribute('style', 'flex-direction: row;');\n }\n // remove animation\n let wrapper = popup.querySelector('.apbct-ee-animation-wrapper');\n if (wrapper) {\n wrapper.remove();\n }\n // remove second node\n let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second');\n if (secondNode) {\n secondNode.remove();\n }\n // add button\n let buttonWrapper = document.createElement('span');\n buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long';\n if (!document.querySelector('.apbct-email-encoder-got-it-button')) {\n let button = document.createElement('button');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) {\n button.innerText = ctPublicFunctions.text__ee_got_it;\n } else {\n button.innerText = ctAdminCommon.text__ee_got_it;\n }\n button.classList = 'apbct-email-encoder-got-it-button';\n button.addEventListener('click', function() {\n document.body.classList.remove('apbct-popup-fade');\n popup.setAttribute('style', 'display:none');\n fillDecodedNodes(encodedEmailNodes, result);\n // click on mailto if so\n if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) {\n clickSource.click();\n }\n });\n buttonWrapper.append(button);\n popup.append(buttonWrapper);\n }\n }\n }, 3000);\n } else {\n if (clickSource) {\n let comment = 'unknown_error';\n if (\n result.hasOwnProperty('data') &&\n result.data.length > 0 &&\n typeof result.data[0] === 'object' &&\n typeof result.data[0].comment === 'string'\n ) {\n comment = result.data[0].comment;\n }\n if (result.success) {\n resetEncodedNodes();\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) {\n ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + comment);\n } else {\n ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + comment);\n }\n } else {\n resetEncodedNodes();\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) {\n ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + comment);\n } else {\n ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + comment);\n }\n }\n } else {\n console.log('result', result);\n }\n }\n}\n\n/**\n * Reset click event for encoded email\n */\nfunction resetEncodedNodes() {\n if (typeof ctPublic.encodedEmailNodes !== 'undefined') {\n ctPublic.encodedEmailNodes.forEach(function(element) {\n element.addEventListener('click', ctFillDecodedEmailHandler);\n });\n }\n}\n\n/**\n * Show Decode Comment\n * @param {string} comment\n */\nfunction ctShowDecodeComment(comment) {\n if ( ! comment ) {\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) {\n comment = ctPublicFunctions.text__ee_cannot_decode;\n } else {\n comment = ctAdminCommon.text__ee_cannot_decode;\n }\n }\n\n let popup = document.getElementById('apbct_popup');\n let popupText = document.getElementById('apbct_popup_text');\n if (popup !== null) {\n document.body.classList.remove('apbct-popup-fade');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) {\n popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment;\n } else {\n popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment;\n }\n setTimeout(function() {\n popup.setAttribute('style', 'display:none');\n }, 3000);\n }\n}\n\n/**\n * Run filling for every node with decoding result.\n * @param {mixed} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[i].dataset.originalString) {\n currentResultData = row;\n }\n });\n // quit case on cloud block\n if (currentResultData.is_allowed === false) {\n return;\n }\n // handler for mailto\n if (\n typeof encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => {\n let encodedEmailTextInsideMailto = '';\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === el.dataset.originalString) {\n encodedEmailTextInsideMailto = row.decoded_email;\n }\n });\n el.innerHTML = encodedEmailTextInsideMailto;\n });\n } else {\n encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler);\n }\n}\n\n/**\n * @param {mixed} response\n * @param {mixed} targetElement\n */\nfunction ctProcessDecodedDataResult(response, targetElement) {\n targetElement.setAttribute('title', '');\n targetElement.removeAttribute('style');\n ctFillDecodedEmail(targetElement, response.decoded_email);\n}\n\n/**\n * @param {mixed} target\n * @param {string} email\n */\nfunction ctFillDecodedEmail(target, email) {\n target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1');\n}\n\n// Listen clicks on encoded emails\ndocument.addEventListener('DOMContentLoaded', function() {\n let encodedEmailNodes = document.querySelectorAll('[data-original-string]');\n if (typeof ctPublic !== 'undefined') {\n ctPublic.encodedEmailNodes = encodedEmailNodes;\n }\n if (encodedEmailNodes.length) {\n for (let i = 0; i < encodedEmailNodes.length; ++i) {\n const node = encodedEmailNodes[i];\n if (\n node.parentNode &&\n node.parentNode.tagName === 'A' &&\n node.parentNode.getAttribute('href')?.includes('mailto:') &&\n node.parentNode.hasAttribute('data-original-string')\n ) {\n // This node was skipped from listeners\n continue;\n }\n node.addEventListener('click', ctFillDecodedEmailHandler);\n }\n }\n});\n"]} \ No newline at end of file +{"version":3,"sources":["cleantalk-admin.js","common-decoder.js"],"names":["apbct_admin_sendAJAX","data","params","obj","let","callback","callbackContext","callback_context","callbackParams","callback_params","async","notJson","timeout","button","spinner","progressbar","ctAdminCommon","_ajax_nonce","Math","random","no_cache","setAttribute","style","cursor","jQuery","css","ajax","type","url","_ajax_url","success","result","removeAttribute","JSON","parse","error","setTimeout","fadeOut","cleantalkModal","loaded","toString","open","alert","apply","concat","jqXHR","textStatus","errorThrown","console","log","apbctSetEmailDecoderPopupAnimation","animationElements","animationWrapper","document","createElement","classList","i","length","apbctEEAnimationDogOne","innerText","append","ctFillDecodedEmailHandler","event","clickSource","ctWlBrandname","encodedEmail","ctPublic","this","removeEventListener","encodedEmailNodesIsMixed","wl_brandname","encodedEmailNodes","plugin_name","encodedEmailNode","body","add","popupHeaderWrapper","popupTextWrapper","popupTextWaiting","popupTextDecoding","encoderPopup","getElementById","ctPublicFunctions","text__ee_wait_for_decoding","innerHTML","waitingPopup","popupHeader","color","id","text__ee_decoding_process","apbctAjaxEmailDecodeBulk","post_url","location","href","referrer","encodedEmails","encodedEmailsCollection","bot_detector_enabled","event_token","apbctLocalStorage","get","event_javascript_data","getJavascriptClientData","indexOf","preventDefault","apbctTooltip","apbct","dataset","originalString","stringify","data__ajax_type","apbct_public_sendREST","method","ctSetCookie","emailEncoderPassKey","apbctEmailEncoderCallbackBulk","onErrorCallback","res","resetEncodedNodes","ctShowDecodeComment","action","apbct_public_sendAJAX","0","appendChild","is_allowed","popup","email","currentResultData","forEach","row","encoded_email","decoded_email","split","firstNode","querySelector","selectableEmail","wrapper","text__ee_click_to_select","title","text__ee_original_email","outerHTML","secondNode","remove","buttonWrapper","text__ee_got_it","addEventListener","fillDecodedNodes","click","comment","hasOwnProperty","text__ee_blocked","text__ee_cannot_connect","element","text__ee_cannot_decode","popupText","text__ee_email_decoder","encodedNodes","decodingResult","ctProcessDecodedDataResult","linkTypePrefix","replace","baseElementContent","querySelectorAll","encodedEmailTextInsideMailto","el","response","targetElement","ctFillDecodedEmail","target","ready","$","on","ctDate","Date","getTime","ctSecure","protocol","cookie","toUTCString","e","parent","after","apbctNoticeDismissSuccess","siblings","apbctNoticeName","attr","notice_id","confirm","notice_when_deleting_user_text","window","btnForceProtectionOn","checked","apbctNoticeForceProtectionOn","spmOrderId","order_id","reload","message","includes","node","parentNode","tagName","getAttribute","hasAttribute"],"mappings":"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","file":"cleantalk-admin.min.js","sourcesContent":["jQuery(document).ready(function($) {\n // Auto update banner close handler\n jQuery('.apbct_update_notice').on('click', 'button', function() {\n let ctDate = new Date(new Date().getTime() + 1000 * 86400 * 30 );\n let ctSecure = location.protocol === 'https:' ? '; secure' : '';\n document.cookie = 'apbct_update_banner_closed=1; path=/; expires=' +\n ctDate.toUTCString() + '; samesite=lax' + ctSecure;\n });\n\n jQuery('li a[href=\"options-general.php?page=cleantalk\"]').css('white-space', 'nowrap')\n .css('display', 'inline-block');\n\n jQuery('body').on('click', '.apbct-notice .notice-dismiss-link', function(e) {\n jQuery(e.target).parent()\n .parent('.notice')\n .after('

' +\n ctAdminCommon.apbctNoticeDismissSuccess +\n '

');\n setTimeout(function() {\n jQuery('#apbct-notice-dismiss-success').fadeOut();\n }, 2000);\n jQuery(e.target).parent().siblings('.apbct-notice .notice-dismiss').click();\n });\n jQuery('body').on('click', '.apbct-notice .notice-dismiss', function(e) {\n let apbctNoticeName = jQuery(e.target).parent().attr('id');\n if ( apbctNoticeName ) {\n apbct_admin_sendAJAX(\n {\n 'action': 'cleantalk_dismiss_notice',\n 'notice_id': apbctNoticeName,\n },\n {\n 'callback': null,\n 'notJson': true,\n },\n );\n }\n });\n\n // Notice when deleting user\n jQuery('.ct_username .row-actions .delete a').on('click', function(e) {\n e.preventDefault();\n\n let result = confirm(ctAdminCommon.notice_when_deleting_user_text);\n\n if (result) {\n window.location = this.href;\n }\n });\n\n let btnForceProtectionOn = document.querySelector('#apbct_setting_forms__force_protection__On');\n if (btnForceProtectionOn) {\n btnForceProtectionOn.addEventListener('click', function(e) {\n if (btnForceProtectionOn.checked) {\n let result = confirm(ctAdminCommon.apbctNoticeForceProtectionOn);\n\n if (!result) {\n e.preventDefault();\n }\n }\n });\n }\n // Restore spam order\n $('.apbct-restore-spam-order-button').click(function() {\n const spmOrderId = $(this).data('spam-order-id');\n let data = {\n action: 'apbct_restore_spam_order',\n _ajax_nonce: ctAdminCommon._ajax_nonce,\n order_id: spmOrderId,\n };\n $.ajax({\n type: 'POST',\n url: ctAdminCommon._ajax_url,\n data: data,\n success: function(result) {\n if (result.success) {\n window.location.reload();\n } else {\n alert(result.data.message);\n }\n },\n });\n });\n\n // Email decoder example\n if (window.location.href.includes('options-general.php?page=cleantalk')) {\n let encodedEmailNode = document.querySelector('[data-original-string]');\n if (encodedEmailNode) {\n ctAdminCommon.encodedEmailNode = encodedEmailNode;\n encodedEmailNode.style.cursor = 'pointer';\n encodedEmailNode.addEventListener('click', ctFillDecodedEmailHandler);\n }\n }\n});\n// eslint-disable-next-line camelcase,require-jsdoc,no-unused-vars\nfunction apbct_admin_sendAJAX(data, params, obj) {\n // Default params\n let callback = params.callback || null;\n let callbackContext = params.callback_context || null;\n let callbackParams = params.callback_params || null;\n let async = params.async || true;\n let notJson = params.notJson || null;\n let timeout = params.timeout || 15000;\n var obj = obj || null; // eslint-disable-line no-var\n let button = params.button || null;\n let spinner = params.spinner || null;\n let progressbar = params.progressbar || null;\n\n if (typeof (data) === 'string') {\n data = data + '&_ajax_nonce=' + ctAdminCommon._ajax_nonce + '&no_cache=' + Math.random();\n } else {\n data._ajax_nonce = ctAdminCommon._ajax_nonce;\n data.no_cache = Math.random();\n }\n // Button and spinner\n if (button) {\n button.setAttribute('disabled', 'disabled'); button.style.cursor = 'not-allowed';\n }\n if (spinner) jQuery(spinner).css('display', 'inline');\n\n jQuery.ajax({\n type: 'POST',\n url: ctAdminCommon._ajax_url,\n data: data,\n async: async,\n success: function(result) {\n if (button) {\n button.removeAttribute('disabled'); button.style.cursor = 'pointer';\n }\n if (spinner) jQuery(spinner).css('display', 'none');\n if (!notJson) result = JSON.parse(result);\n if (result.error) {\n setTimeout(function() {\n if (progressbar) progressbar.fadeOut('slow');\n }, 1000);\n if ( typeof cleantalkModal !== 'undefined' ) {\n // Show the result by modal\n cleantalkModal.loaded = 'Error:
' + result.error.toString();\n cleantalkModal.open();\n } else {\n alert('Error happens: ' + (result.error || 'Unkown'));\n }\n } else {\n if (callback) {\n if (callbackParams) {\n callback.apply( callbackContext, callbackParams.concat( result, data, params, obj ) );\n } else {\n callback(result, data, params, obj);\n }\n }\n }\n },\n error: function(jqXHR, textStatus, errorThrown) {\n if (button) {\n button.removeAttribute('disabled'); button.style.cursor = 'pointer';\n }\n if (spinner) jQuery(spinner).css('display', 'none');\n console.log('APBCT_AJAX_ERROR');\n console.log(jqXHR);\n console.log(textStatus);\n console.log(errorThrown);\n },\n timeout: timeout,\n });\n}\n","/**\n * @return {HTMLElement} event\n */\nfunction apbctSetEmailDecoderPopupAnimation() {\n const animationElements = ['apbct_dog_one', 'apbct_dog_two', 'apbct_dog_three'];\n const animationWrapper = document.createElement('div');\n animationWrapper.classList = 'apbct-ee-animation-wrapper';\n for (let i = 0; i < animationElements.length; i++) {\n const apbctEEAnimationDogOne = document.createElement('span');\n apbctEEAnimationDogOne.classList = 'apbct_dog ' + animationElements[i];\n apbctEEAnimationDogOne.innerText = '@';\n animationWrapper.append(apbctEEAnimationDogOne);\n }\n return animationWrapper;\n}\n\n/**\n * @param {mixed} event\n */\nfunction ctFillDecodedEmailHandler(event = false) {\n let clickSource = false;\n let ctWlBrandname = '';\n let encodedEmail = '';\n if (typeof ctPublic !== 'undefined') {\n this.removeEventListener('click', ctFillDecodedEmailHandler);\n // remember clickSource\n clickSource = this;\n // globally remember if emails is mixed with mailto\n ctPublic.encodedEmailNodesIsMixed = false;\n ctWlBrandname = ctPublic.wl_brandname;\n encodedEmail = ctPublic.encodedEmailNodes;\n } else if (typeof ctAdminCommon !== 'undefined') {\n ctWlBrandname = ctAdminCommon.plugin_name;\n encodedEmail = ctAdminCommon.encodedEmailNode;\n }\n\n // get fade\n document.body.classList.add('apbct-popup-fade');\n // popup show\n let encoderPopup = document.getElementById('apbct_popup');\n if (!encoderPopup) {\n // construct popup\n let waitingPopup = document.createElement('div');\n waitingPopup.setAttribute('class', 'apbct-popup apbct-email-encoder-popup');\n waitingPopup.setAttribute('id', 'apbct_popup');\n\n // construct text header\n let popupHeaderWrapper = document.createElement('span');\n popupHeaderWrapper.classList = 'apbct-email-encoder-elements_center';\n let popupHeader = document.createElement('p');\n popupHeader.innerText = ctWlBrandname;\n popupHeader.setAttribute('class', 'apbct-email-encoder--popup-header');\n popupHeaderWrapper.append(popupHeader);\n\n // construct text wrapper\n let popupTextWrapper = document.createElement('div');\n popupTextWrapper.setAttribute('id', 'apbct_popup_text');\n popupTextWrapper.setAttribute('class', 'apbct-email-encoder-elements_center');\n popupTextWrapper.style.color = 'black';\n\n // construct text first node\n // todo make translatable\n let popupTextWaiting = document.createElement('p');\n popupTextWaiting.id = 'apbct_email_ecoder__popup_text_node_first';\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) {\n popupTextWaiting.innerText = ctPublicFunctions.text__ee_wait_for_decoding;\n } else {\n popupTextWaiting.innerText = ctAdminCommon.text__ee_wait_for_decoding;\n }\n popupTextWaiting.setAttribute('class', 'apbct-email-encoder-elements_center');\n\n // construct text second node\n // todo make translatable\n let popupTextDecoding = document.createElement('p');\n popupTextDecoding.id = 'apbct_email_ecoder__popup_text_node_second';\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_decoding_process) {\n popupTextDecoding.innerText = ctPublicFunctions.text__ee_decoding_process;\n } else {\n popupTextDecoding.innerText = ctAdminCommon.text__ee_decoding_process;\n }\n\n // appending\n popupTextWrapper.append(popupTextWaiting);\n popupTextWrapper.append(popupTextDecoding);\n waitingPopup.append(popupHeaderWrapper);\n waitingPopup.append(popupTextWrapper);\n waitingPopup.append(apbctSetEmailDecoderPopupAnimation());\n document.body.append(waitingPopup);\n } else {\n encoderPopup.setAttribute('style', 'display: inherit');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_wait_for_decoding) {\n document.getElementById('apbct_popup_text').innerHTML = ctPublicFunctions.text__ee_wait_for_decoding;\n } else {\n document.getElementById('apbct_popup_text').innerHTML = ctAdminCommon.text__ee_wait_for_decoding;\n }\n }\n\n apbctAjaxEmailDecodeBulk(event, encodedEmail, clickSource);\n}\n\n/**\n * @param {mixed} event\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) {\n if (event && clickSource) {\n // collect data\n let data = {\n post_url: document.location.href,\n referrer: document.referrer,\n encodedEmails: '',\n };\n if (+ctPublic.bot_detector_enabled) {\n data.event_token = apbctLocalStorage.get('bot_detector_event_token');\n } else {\n data.event_javascript_data = getJavascriptClientData();\n }\n\n let encodedEmailsCollection = {};\n for (let i = 0; i < encodedEmailNodes.length; i++) {\n // disable click for mailto\n if (\n typeof encodedEmailNodes[i].href !== 'undefined' &&\n encodedEmailNodes[i].href.indexOf('mailto:') === 0\n ) {\n event.preventDefault();\n ctPublic.encodedEmailNodesIsMixed = true;\n }\n\n // Adding a tooltip\n let apbctTooltip = document.createElement('div');\n apbctTooltip.setAttribute('class', 'apbct-tooltip');\n apbct(encodedEmailNodes[i]).append(apbctTooltip);\n\n // collect encoded email strings\n encodedEmailsCollection[i] = encodedEmailNodes[i].dataset.originalString;\n }\n\n // JSONify encoded email strings\n data.encodedEmails = JSON.stringify(encodedEmailsCollection);\n\n // Using REST API handler\n if ( ctPublicFunctions.data__ajax_type === 'rest' ) {\n apbct_public_sendREST(\n 'apbct_decode_email',\n {\n data: data,\n method: 'POST',\n callback: function(result) {\n // set alternative cookie to skip next pages encoding\n ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, '');\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource);\n },\n onErrorCallback: function(res) {\n resetEncodedNodes();\n ctShowDecodeComment(res);\n },\n },\n );\n\n // Using AJAX request and handler\n } else {\n data.action = 'apbct_decode_email';\n apbct_public_sendAJAX(\n data,\n {\n notJson: false,\n callback: function(result) {\n // set alternative cookie to skip next pages encoding\n ctSetCookie('apbct_email_encoder_passed', ctPublic.emailEncoderPassKey, '');\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource);\n },\n onErrorCallback: function(res) {\n resetEncodedNodes();\n ctShowDecodeComment(res);\n },\n },\n );\n }\n } else {\n const encodedEmail = encodedEmailNodes.dataset.originalString;\n let data = {\n encodedEmails: JSON.stringify({0: encodedEmail}),\n };\n\n // Adding a tooltip\n let apbctTooltip = document.createElement('div');\n apbctTooltip.setAttribute('class', 'apbct-tooltip');\n encodedEmailNodes.appendChild(apbctTooltip);\n\n apbct_admin_sendAJAX(\n {\n 'action': 'apbct_decode_email',\n 'encodedEmails': data.encodedEmails,\n },\n {\n 'callback': function(result) {\n apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, false);\n },\n 'notJson': true,\n },\n );\n }\n}\n\n/**\n * @param {mixed} result\n * @param {mixed} encodedEmailNodes\n * @param {mixed} clickSource\n */\nfunction apbctEmailEncoderCallbackBulk(result, encodedEmailNodes, clickSource = false) {\n if (result.success && result.data[0].is_allowed === true) {\n // start process of visual decoding\n setTimeout(function() {\n // popup remove\n let popup = document.getElementById('apbct_popup');\n if (popup !== null) {\n let email = '';\n if (clickSource) {\n let currentResultData;\n result.data.forEach((row) => {\n if (row.encoded_email === clickSource.dataset.originalString) {\n currentResultData = row;\n }\n });\n\n email = currentResultData.decoded_email.split(/[&?]/)[0];\n } else {\n email = result.data[0].decoded_email;\n }\n // handle first node\n let firstNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_first');\n // get email selectable by click\n let selectableEmail = document.createElement('b');\n selectableEmail.setAttribute('class', 'apbct-email-encoder-select-whole-email');\n selectableEmail.innerText = email;\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_click_to_select) {\n selectableEmail.title = ctPublicFunctions.text__ee_click_to_select;\n } else {\n selectableEmail.title = ctAdminCommon.text__ee_click_to_select;\n }\n // add email to the first node\n if (firstNode) {\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_original_email) {\n firstNode.innerHTML = ctPublicFunctions.text__ee_original_email +\n ' ' + selectableEmail.outerHTML;\n } else {\n firstNode.innerHTML = ctAdminCommon.text__ee_original_email +\n ' ' + selectableEmail.outerHTML;\n }\n\n firstNode.setAttribute('style', 'flex-direction: row;');\n }\n // remove animation\n let wrapper = popup.querySelector('.apbct-ee-animation-wrapper');\n if (wrapper) {\n wrapper.remove();\n }\n // remove second node\n let secondNode = popup.querySelector('#apbct_email_ecoder__popup_text_node_second');\n if (secondNode) {\n secondNode.remove();\n }\n // add button\n let buttonWrapper = document.createElement('span');\n buttonWrapper.classList = 'apbct-email-encoder-elements_center top-margin-long';\n if (!document.querySelector('.apbct-email-encoder-got-it-button')) {\n let button = document.createElement('button');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_got_it) {\n button.innerText = ctPublicFunctions.text__ee_got_it;\n } else {\n button.innerText = ctAdminCommon.text__ee_got_it;\n }\n button.classList = 'apbct-email-encoder-got-it-button';\n button.addEventListener('click', function() {\n document.body.classList.remove('apbct-popup-fade');\n popup.setAttribute('style', 'display:none');\n fillDecodedNodes(encodedEmailNodes, result);\n // click on mailto if so\n if (typeof ctPublic !== 'undefined' && ctPublic.encodedEmailNodesIsMixed && clickSource) {\n clickSource.click();\n }\n });\n buttonWrapper.append(button);\n popup.append(buttonWrapper);\n }\n }\n }, 3000);\n } else {\n if (clickSource) {\n let comment = 'unknown_error';\n if (\n result.hasOwnProperty('data') &&\n result.data.length > 0 &&\n typeof result.data[0] === 'object' &&\n typeof result.data[0].comment === 'string'\n ) {\n comment = result.data[0].comment;\n }\n if (result.success) {\n resetEncodedNodes();\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_blocked) {\n ctShowDecodeComment(ctPublicFunctions.text__ee_blocked + ': ' + comment);\n } else {\n ctShowDecodeComment(ctAdminCommon.text__ee_blocked + ': ' + comment);\n }\n } else {\n resetEncodedNodes();\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_connect) {\n ctShowDecodeComment(ctPublicFunctions.text__ee_cannot_connect + ': ' + comment);\n } else {\n ctShowDecodeComment(ctAdminCommon.text__ee_cannot_connect + ': ' + comment);\n }\n }\n } else {\n console.log('result', result);\n }\n }\n}\n\n/**\n * Reset click event for encoded email\n */\nfunction resetEncodedNodes() {\n if (typeof ctPublic.encodedEmailNodes !== 'undefined') {\n ctPublic.encodedEmailNodes.forEach(function(element) {\n element.addEventListener('click', ctFillDecodedEmailHandler);\n });\n }\n}\n\n/**\n * Show Decode Comment\n * @param {string} comment\n */\nfunction ctShowDecodeComment(comment) {\n if ( ! comment ) {\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_cannot_decode) {\n comment = ctPublicFunctions.text__ee_cannot_decode;\n } else {\n comment = ctAdminCommon.text__ee_cannot_decode;\n }\n }\n\n let popup = document.getElementById('apbct_popup');\n let popupText = document.getElementById('apbct_popup_text');\n if (popup !== null) {\n document.body.classList.remove('apbct-popup-fade');\n if (typeof ctPublicFunctions !== 'undefined' && ctPublicFunctions.text__ee_email_decoder) {\n popupText.innerText = ctPublicFunctions.text__ee_email_decoder + ': ' + comment;\n } else {\n popupText.innerText = ctAdminCommon.text__ee_email_decoder + ': ' + comment;\n }\n setTimeout(function() {\n popup.setAttribute('style', 'display:none');\n }, 3000);\n }\n}\n\n/**\n * Run filling for every node with decoding result.\n * @param {mixed} encodedNodes\n * @param {mixed} decodingResult\n */\nfunction fillDecodedNodes(encodedNodes, decodingResult) {\n if (encodedNodes.length > 0) {\n for (let i = 0; i < encodedNodes.length; i++) {\n // chek what is what\n let currentResultData;\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === encodedNodes[i].dataset.originalString) {\n currentResultData = row;\n }\n });\n // quit case on cloud block\n if (currentResultData.is_allowed === false) {\n return;\n }\n // handler for mailto\n if (\n typeof encodedNodes[i].href !== 'undefined' &&\n (\n encodedNodes[i].href.indexOf('mailto:') === 0 ||\n encodedNodes[i].href.indexOf('tel:') === 0\n )\n ) {\n let linkTypePrefix;\n if (encodedNodes[i].href.indexOf('mailto:') === 0) {\n linkTypePrefix = 'mailto:';\n } else if (encodedNodes[i].href.indexOf('tel:') === 0) {\n linkTypePrefix = 'tel:';\n } else {\n continue;\n }\n let encodedEmail = encodedNodes[i].href.replace(linkTypePrefix, '');\n let baseElementContent = encodedNodes[i].innerHTML;\n encodedNodes[i].innerHTML = baseElementContent.replace(\n encodedEmail,\n currentResultData.decoded_email,\n );\n encodedNodes[i].href = linkTypePrefix + currentResultData.decoded_email;\n\n encodedNodes[i].querySelectorAll('span.apbct-email-encoder').forEach((el) => {\n let encodedEmailTextInsideMailto = '';\n decodingResult.data.forEach((row) => {\n if (row.encoded_email === el.dataset.originalString) {\n encodedEmailTextInsideMailto = row.decoded_email;\n }\n });\n el.innerHTML = encodedEmailTextInsideMailto;\n });\n } else {\n encodedNodes[i].classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes[i]);\n }, 2000);\n }\n // remove listeners\n encodedNodes[i].removeEventListener('click', ctFillDecodedEmailHandler);\n }\n } else {\n let currentResultData = decodingResult.data[0];\n encodedNodes.classList.add('no-blur');\n // fill the nodes\n setTimeout(() => {\n ctProcessDecodedDataResult(currentResultData, encodedNodes);\n }, 2000);\n encodedNodes.removeEventListener('click', ctFillDecodedEmailHandler);\n }\n}\n\n/**\n * @param {mixed} response\n * @param {mixed} targetElement\n */\nfunction ctProcessDecodedDataResult(response, targetElement) {\n targetElement.setAttribute('title', '');\n targetElement.removeAttribute('style');\n ctFillDecodedEmail(targetElement, response.decoded_email);\n}\n\n/**\n * @param {mixed} target\n * @param {string} email\n */\nfunction ctFillDecodedEmail(target, email) {\n target.innerHTML = target.innerHTML.replace(/.+?(
)/, email + '$1');\n}\n\n// Listen clicks on encoded emails\ndocument.addEventListener('DOMContentLoaded', function() {\n let encodedEmailNodes = document.querySelectorAll('[data-original-string]');\n if (typeof ctPublic !== 'undefined') {\n ctPublic.encodedEmailNodes = encodedEmailNodes;\n }\n if (encodedEmailNodes.length) {\n for (let i = 0; i < encodedEmailNodes.length; ++i) {\n const node = encodedEmailNodes[i];\n if (\n node.parentNode &&\n node.parentNode.tagName === 'A' &&\n node.parentNode.getAttribute('href')?.includes('mailto:') &&\n node.parentNode.hasAttribute('data-original-string')\n ) {\n // This node was skipped from listeners\n continue;\n }\n node.addEventListener('click', ctFillDecodedEmailHandler);\n }\n }\n});\n"]} \ No newline at end of file diff --git a/js/src/FetchProxyProtection/ApbctFetchProxyProtection.js b/js/src/FetchProxyProtection/ApbctFetchProxyProtection.js index 8d7b6dae3..c34b8f760 100644 --- a/js/src/FetchProxyProtection/ApbctFetchProxyProtection.js +++ b/js/src/FetchProxyProtection/ApbctFetchProxyProtection.js @@ -57,7 +57,7 @@ class ApbctFetchProxyProtection { data.raw_body = bodyText; } - if (+ctPublic.settings__data__bot_detector_enabled) { + if (+ctPublic.bot_detector_enabled) { const eventToken = new ApbctHandler().toolGetEventToken(); if (eventToken) { data.ct_bot_detector_event_token = eventToken; @@ -142,4 +142,4 @@ class ApbctFetchProxyProtection { const bodyText = this.extractBodyText(args); return await this.checkRequest(match.formKey, match.config, bodyText); } -} \ No newline at end of file +} diff --git a/js/src/common-decoder.js b/js/src/common-decoder.js index 39d1c9f85..ee26f902d 100644 --- a/js/src/common-decoder.js +++ b/js/src/common-decoder.js @@ -111,7 +111,7 @@ function apbctAjaxEmailDecodeBulk(event, encodedEmailNodes, clickSource) { referrer: document.referrer, encodedEmails: '', }; - if (ctPublic.settings__data__bot_detector_enabled == 1) { + if (+ctPublic.bot_detector_enabled) { data.event_token = apbctLocalStorage.get('bot_detector_event_token'); } else { data.event_javascript_data = getJavascriptClientData(); diff --git a/js/src/public-1-main.js b/js/src/public-1-main.js index e64fb0e7d..74e68059a 100644 --- a/js/src/public-1-main.js +++ b/js/src/public-1-main.js @@ -92,7 +92,7 @@ class ApbctAttachData { if (typeof ctPublic.force_alt_cookies == 'undefined' || (ctPublic.force_alt_cookies !== 'undefined' && !ctPublic.force_alt_cookies) ) { - if (!+ctPublic.settings__data__bot_detector_enabled || gatheringLoaded) { + if (!+ctPublic.bot_detector_enabled || gatheringLoaded) { ctNoCookieAttachHiddenFieldsToForms(); document.addEventListener('gform_page_loaded', ctNoCookieAttachHiddenFieldsToForms); } @@ -162,7 +162,7 @@ class ApbctAttachData { event.target.action && event.target.action.toString().indexOf('mailpoet_subscription_form') !== -1 ) { window.XMLHttpRequest.prototype.send = function(data) { - if (!+ctPublic.settings__data__bot_detector_enabled) { + if (!+ctPublic.bot_detector_enabled) { const noCookieData = 'data%5Bct_no_cookie_hidden_field%5D=' + getNoCookieData() + '&'; defaultSend.call(this, noCookieData + data); } else { @@ -477,7 +477,7 @@ class ApbctHandler { cronFormsHandler(cronStartTimeout = 2000) { setTimeout(function() { setInterval(function() { - if (!+ctPublic.settings__data__bot_detector_enabled && typeof ApbctGatheringData !== 'undefined') { + if (!+ctPublic.bot_detector_enabled && typeof ApbctGatheringData !== 'undefined') { new ApbctGatheringData().restartFieldsListening(); } new ApbctEventTokenTransport().restartBotDetectorEventTokenAttach(); @@ -547,7 +547,7 @@ class ApbctHandler { let addidionalCleantalkData = ''; if (!( - +ctPublic.settings__data__bot_detector_enabled && + +ctPublic.bot_detector_enabled && apbctLocalStorage.get('bot_detector_event_token') )) { let noCookieData = getNoCookieData(); @@ -564,7 +564,7 @@ class ApbctHandler { if (isNeedToAddCleantalkDataCheckFormData) { if (!( - +ctPublic.settings__data__bot_detector_enabled && + +ctPublic.bot_detector_enabled && apbctLocalStorage.get('bot_detector_event_token') )) { let noCookieData = getNoCookieData(); @@ -622,7 +622,7 @@ class ApbctHandler { args[1].body instanceof FormData || (typeof args[1].body.append === 'function') ) { if ( - +ctPublic.settings__data__bot_detector_enabled && + +ctPublic.bot_detector_enabled && apbctLocalStorage.get('bot_detector_event_token') ) { args[1].body.append( @@ -782,7 +782,7 @@ class ApbctHandler { try { args[1].body = attachFieldsToBody( args[1].body, - selectFieldsData(+ctPublic.settings__data__bot_detector_enabled), + selectFieldsData(+ctPublic.bot_detector_enabled), ); } catch (e) { // Continue even if error @@ -798,7 +798,7 @@ class ApbctHandler { try { args[1].body = attachFieldsToBody( args[1].body, - selectFieldsData(+ctPublic.settings__data__bot_detector_enabled), + selectFieldsData(+ctPublic.bot_detector_enabled), ); } catch (e) { // Continue even if error @@ -819,7 +819,7 @@ class ApbctHandler { if (+ctPublic.settings__forms__wc_add_to_cart) { args[1].body = attachFieldsToBody( args[1].body, - selectFieldsData(+ctPublic.settings__data__bot_detector_enabled), + selectFieldsData(+ctPublic.bot_detector_enabled), ); } } catch (e) { @@ -1149,7 +1149,7 @@ class ApbctHandler { let visibleFieldsString = ''; if ( - +ctPublic.settings__data__bot_detector_enabled && + +ctPublic.bot_detector_enabled && apbctLocalStorage.get('bot_detector_event_token') ) { const token = new ApbctHandler().toolGetEventToken(); @@ -1215,7 +1215,7 @@ class ApbctHandler { options.data.requests[0].path === '/wc/store/v1/cart/add-item' ) { if ( - +ctPublic.settings__data__bot_detector_enabled && + +ctPublic.bot_detector_enabled && apbctLocalStorage.get('bot_detector_event_token') ) { let token = localStorage.getItem('bot_detector_event_token'); @@ -1230,7 +1230,7 @@ class ApbctHandler { // checkout if (options.path.includes('/wc/store/v1/checkout')) { if ( - +ctPublic.settings__data__bot_detector_enabled && + +ctPublic.bot_detector_enabled && apbctLocalStorage.get('bot_detector_event_token') ) { options.data.ct_bot_detector_event_token = localStorage.getItem('bot_detector_event_token'); @@ -1804,7 +1804,7 @@ async function apbct_ready() { if ( apbctLocalStorage.get('apbct_existing_visitor') && // Not for the first hit - +ctPublic.settings__data__bot_detector_enabled && // If Bot-Detector is active + +ctPublic.bot_detector_enabled && // If Bot-Detector is active !apbctLocalStorage.get('bot_detector_event_token') && // and no `event_token` generated typeof ApbctGatheringData === 'undefined' // and no `gathering` loaded yet ) { @@ -1823,7 +1823,7 @@ async function apbct_ready() { // Gathering data when bot detector is disabled if ( - ( ! +ctPublic.settings__data__bot_detector_enabled || gatheringLoaded ) && + ( ! +ctPublic.bot_detector_enabled || gatheringLoaded ) && typeof ApbctGatheringData !== 'undefined' ) { const gatheringData = new ApbctGatheringData(); @@ -1845,7 +1845,7 @@ async function apbct_ready() { setTimeout(function() { // Attach data when bot detector is enabled - if (+ctPublic.settings__data__bot_detector_enabled) { + if (+ctPublic.bot_detector_enabled) { const eventTokenTransport = new ApbctEventTokenTransport(); eventTokenTransport.attachEventTokenToMultipageGravityForms(); eventTokenTransport.attachEventTokenToWoocommerceGetRequestAddToCart(); @@ -1854,7 +1854,7 @@ async function apbct_ready() { const attachData = new ApbctAttachData(); // Attach data when bot detector is disabled or blocked - if (!+ctPublic.settings__data__bot_detector_enabled || gatheringLoaded) { + if (!+ctPublic.bot_detector_enabled || gatheringLoaded) { attachData.attachHiddenFieldsToForms(gatheringLoaded); } @@ -1881,7 +1881,7 @@ async function apbct_ready() { handler.catchJqueryAjax(); handler.catchWCRestRequestAsMiddleware(); - if (+ctPublic.settings__data__bot_detector_enabled) { + if (+ctPublic.bot_detector_enabled) { let botDetectorEventTokenStored = false; window.addEventListener('botDetectorEventTokenUpdated', (event) => { const botDetectorEventToken = event.detail?.eventToken; @@ -1901,7 +1901,7 @@ async function apbct_ready() { }); } - if (ctPublic.settings__sfw__anti_crawler && +ctPublic.settings__data__bot_detector_enabled) { + if (ctPublic.settings__sfw__anti_crawler && +ctPublic.bot_detector_enabled) { handler.toolForAntiCrawlerCheckDuringBotDetector(); } diff --git a/js/src/public-2-external-forms.js b/js/src/public-2-external-forms.js index 804ce37c8..080c216a1 100644 --- a/js/src/public-2-external-forms.js +++ b/js/src/public-2-external-forms.js @@ -66,7 +66,7 @@ function ctProtectExternal() { // Trying to process external form into an iframe apbctProcessIframes(); // if form is still not processed by fields listening, do it here - if (ctPublic.settings__data__bot_detector_enabled != 1 && typeof ApbctGatheringData !== 'undefined') { + if (ctPublic.bot_detector_enabled != 1 && typeof ApbctGatheringData !== 'undefined') { new ApbctGatheringData().startFieldsListening(); } } diff --git a/js/src/public-2-force-protection.js b/js/src/public-2-force-protection.js index d1383be43..5ca2982ab 100644 --- a/js/src/public-2-force-protection.js +++ b/js/src/public-2-force-protection.js @@ -34,7 +34,7 @@ class ApbctForceProtection { post_url: document.location.href, referrer: document.referrer, }; - if (ctPublic.settings__data__bot_detector_enabled == 1) { + if (+ctPublic.bot_detector_enabled) { data.event_token = apbctLocalStorage.get('bot_detector_event_token'); } else { data.event_javascript_data = getJavascriptClientData(); diff --git a/js/src/public-2-gathering-data.js b/js/src/public-2-gathering-data.js index 84b422817..ad879e1a2 100644 --- a/js/src/public-2-gathering-data.js +++ b/js/src/public-2-gathering-data.js @@ -643,7 +643,7 @@ function getJavascriptClientData(commonCookies = []) { // eslint-disable-line no * @return {bool} */ function ctIsDrawPixel() { - if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + if (ctPublic.pixel__setting == '3' && +ctPublic.bot_detector_enabled) { return false; } @@ -657,7 +657,7 @@ function ctIsDrawPixel() { * @return {bool} */ function ctSetPixelImg(pixelUrl) { - if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + if (ctPublic.pixel__setting == '3' && +ctPublic.bot_detector_enabled) { return false; } ctSetCookie('apbct_pixel_url', pixelUrl); @@ -679,7 +679,7 @@ function ctSetPixelImg(pixelUrl) { * @return {bool} */ function ctSetPixelImgFromLocalstorage(pixelUrl) { - if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + if (ctPublic.pixel__setting == '3' && +ctPublic.bot_detector_enabled) { return false; } if ( ctIsDrawPixel() ) { @@ -701,7 +701,7 @@ function ctSetPixelImgFromLocalstorage(pixelUrl) { */ // eslint-disable-next-line no-unused-vars, require-jsdoc function ctGetPixelUrl() { - if (ctPublic.pixel__setting == '3' && ctPublic.settings__data__bot_detector_enabled == '1') { + if (ctPublic.pixel__setting == '3' && +ctPublic.bot_detector_enabled) { return false; } diff --git a/js/src/public-3-bot-detector-log.js b/js/src/public-3-bot-detector-log.js index 051619e14..6630a29e6 100644 --- a/js/src/public-3-bot-detector-log.js +++ b/js/src/public-3-bot-detector-log.js @@ -3,8 +3,8 @@ let botDetectorLogEventTypesCollected = []; // bot_detector frontend_data log alt session saving cron if ( - ctPublicFunctions.hasOwnProperty('data__bot_detector_enabled') && - ctPublicFunctions.data__bot_detector_enabled == 1 && + ctPublicFunctions.hasOwnProperty('bot_detector_enabled') && + +ctPublicFunctions.bot_detector_enabled && ctPublicFunctions.hasOwnProperty('data__frontend_data_log_enabled') && ctPublicFunctions.data__frontend_data_log_enabled == 1 ) { diff --git a/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php b/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php index dd88c3c68..ad0721c35 100644 --- a/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php +++ b/lib/Cleantalk/ApbctWP/ApbctJsBundleResolver.php @@ -29,7 +29,7 @@ public static function getBundleName($settings) $script = 'apbct-public-bundle.min.js'; } - if (isset($settings['data__bot_detector_enabled']) && $settings['data__bot_detector_enabled'] != '1') { + if ( ! apbct__is_bot_detector_enabled() ) { $script = str_replace('.min.js', '_gathering.min.js', $script); } diff --git a/lib/Cleantalk/ApbctWP/ContactsEncoder/ContactsEncoder.php b/lib/Cleantalk/ApbctWP/ContactsEncoder/ContactsEncoder.php index bece59f24..ef5d569af 100644 --- a/lib/Cleantalk/ApbctWP/ContactsEncoder/ContactsEncoder.php +++ b/lib/Cleantalk/ApbctWP/ContactsEncoder/ContactsEncoder.php @@ -219,7 +219,7 @@ protected function checkRequest() $event_javascript_data = ''; $event_token = ''; - if ($apbct->settings['data__bot_detector_enabled'] == 1) { + if ( apbct__is_bot_detector_enabled() ) { $event_token = Post::getString('event_token'); } else { $post_event_javascript_data = TT::toString(Post::get('event_javascript_data')); diff --git a/lib/Cleantalk/ApbctWP/Firewall/AntiCrawler.php b/lib/Cleantalk/ApbctWP/Firewall/AntiCrawler.php index b7cd38022..a6dbfd0e7 100644 --- a/lib/Cleantalk/ApbctWP/Firewall/AntiCrawler.php +++ b/lib/Cleantalk/ApbctWP/Firewall/AntiCrawler.php @@ -510,7 +510,7 @@ public function printDiePage() 'data__email_check_before_post' => $apbct->settings['data__email_check_before_post'], 'data__cookies_type' => $apbct->data['cookies_type'], 'data__visible_fields_required' => ! apbct_is_user_logged_in() || $apbct->settings['data__protect_logged_in'] == 1, - 'settings__data__bot_detector_enabled' => $apbct->settings['data__bot_detector_enabled'], + 'bot_detector_enabled' => apbct__is_bot_detector_enabled(), ); $replaces = array( diff --git a/lib/Cleantalk/ApbctWP/Firewall/AntiFlood.php b/lib/Cleantalk/ApbctWP/Firewall/AntiFlood.php index 28ba56678..58f1fad5f 100644 --- a/lib/Cleantalk/ApbctWP/Firewall/AntiFlood.php +++ b/lib/Cleantalk/ApbctWP/Firewall/AntiFlood.php @@ -302,7 +302,7 @@ public function printDiePage() 'data__email_check_before_post' => $apbct->settings['data__email_check_before_post'], 'data__cookies_type' => $apbct->data['cookies_type'], 'data__visible_fields_required' => ! apbct_is_user_logged_in() || $apbct->settings['data__protect_logged_in'] == 1, - 'settings__data__bot_detector_enabled' => $apbct->settings['data__bot_detector_enabled'], + 'bot_detector_enabled' => apbct__is_bot_detector_enabled(), ); $replaces = array( diff --git a/lib/Cleantalk/ApbctWP/Firewall/SFW.php b/lib/Cleantalk/ApbctWP/Firewall/SFW.php index 36c8c3774..da6f04e93 100644 --- a/lib/Cleantalk/ApbctWP/Firewall/SFW.php +++ b/lib/Cleantalk/ApbctWP/Firewall/SFW.php @@ -542,7 +542,7 @@ public function printDiePage() 'data__email_check_before_post' => $apbct->settings['data__email_check_before_post'], 'data__cookies_type' => $apbct->data['cookies_type'], 'data__visible_fields_required' => ! apbct_is_user_logged_in() || $apbct->settings['data__protect_logged_in'] == 1, - 'settings__data__bot_detector_enabled' => $apbct->settings['data__bot_detector_enabled'], + 'bot_detector_enabled' => apbct__is_bot_detector_enabled(), ); $replaces = array( diff --git a/lib/Cleantalk/ApbctWP/Localize/CtPublicFunctionsLocalize.php b/lib/Cleantalk/ApbctWP/Localize/CtPublicFunctionsLocalize.php index 0f075d1a6..c1bbcdcaf 100644 --- a/lib/Cleantalk/ApbctWP/Localize/CtPublicFunctionsLocalize.php +++ b/lib/Cleantalk/ApbctWP/Localize/CtPublicFunctionsLocalize.php @@ -22,7 +22,7 @@ public static function getData() '_rest_url' => Escape::escUrl(apbct_get_rest_url()), 'data__cookies_type' => $apbct->data['cookies_type'], 'data__ajax_type' => $apbct->data['ajax_type'], - 'data__bot_detector_enabled' => $apbct->settings['data__bot_detector_enabled'], + 'bot_detector_enabled' => apbct__is_bot_detector_enabled(), 'data__frontend_data_log_enabled' => defined('APBCT_DO_NOT_COLLECT_FRONTEND_DATA_LOGS') ? 0 : 1, 'cookiePrefix' => apbct__get_cookie_prefix(), 'wprocket_detected' => apbct_is_plugin_active('wp-rocket/wp-rocket.php'), diff --git a/lib/Cleantalk/ApbctWP/Localize/CtPublicLocalize.php b/lib/Cleantalk/ApbctWP/Localize/CtPublicLocalize.php index 331ccc71f..361e4fcda 100644 --- a/lib/Cleantalk/ApbctWP/Localize/CtPublicLocalize.php +++ b/lib/Cleantalk/ApbctWP/Localize/CtPublicLocalize.php @@ -20,7 +20,7 @@ public static function getData() 'settings__forms__force_protection' => $apbct->settings['forms__force_protection'], 'settings__forms__search_test' => $apbct->settings['forms__search_test'], 'settings__forms__wc_add_to_cart' => $apbct->settings['forms__wc_add_to_cart'], - 'settings__data__bot_detector_enabled' => $apbct->settings['data__bot_detector_enabled'], + 'bot_detector_enabled' => apbct__is_bot_detector_enabled(), 'settings__sfw__anti_crawler' => $apbct->settings['sfw__anti_crawler'], 'blog_home' => get_home_url() . '/', 'pixel__setting' => $apbct->settings['data__pixel'], diff --git a/lib/Cleantalk/ApbctWP/PluginSettingsPage/SummaryAndSupportRenderer.php b/lib/Cleantalk/ApbctWP/PluginSettingsPage/SummaryAndSupportRenderer.php index eb849ce6f..711429a03 100644 --- a/lib/Cleantalk/ApbctWP/PluginSettingsPage/SummaryAndSupportRenderer.php +++ b/lib/Cleantalk/ApbctWP/PluginSettingsPage/SummaryAndSupportRenderer.php @@ -96,6 +96,7 @@ private function renderStatistics() %s %s %s + %s
'; @@ -106,6 +107,7 @@ private function renderStatistics() $this->renderLastSfwBlock(), $this->renderSfwUpdate(), $this->renderSfwLogs(), + $this->renderBotDetectorState(), $this->renderPluginVersion() ); @@ -287,6 +289,18 @@ private function renderSfwLogs() return $this->wrapListItem($html); } + public function renderBotDetectorState() + { + return $this->wrapListItem( + sprintf( + esc_html__('JavaScript library (Bot Detector) is %s', 'cleantalk-spam-protect'), + apbct__is_bot_detector_enabled() + ? esc_html__('enabled', 'cleantalk-spam-protect') + : esc_html__('disabled', 'cleantalk-spam-protect') + ) + . '' + ); + } /** * Renders the current plugin version. diff --git a/lib/Cleantalk/ApbctWP/RemoteCalls.php b/lib/Cleantalk/ApbctWP/RemoteCalls.php index f347559ba..60b3f4cac 100644 --- a/lib/Cleantalk/ApbctWP/RemoteCalls.php +++ b/lib/Cleantalk/ApbctWP/RemoteCalls.php @@ -531,7 +531,6 @@ private static function getSettings($settings) 'data__use_static_js_key' => 'Use static keys for JavaScript check', 'data__general_postdata_test' => 'Check all post data', 'data__set_cookies' => 'Set cookies', - 'data__bot_detector_enabled' => 'Use JavaScript library', 'exclusions__bot_detector' => 'JavaScript Library Exclusions', 'exclusions__bot_detector__form_attributes' => 'Exclude any forms that has attribute matches', 'exclusions__bot_detector__form_children_attributes' => 'Exclude any forms that includes a child element with attribute matches', diff --git a/lib/Cleantalk/ApbctWP/RequestParameters/SubmitTimeHandler.php b/lib/Cleantalk/ApbctWP/RequestParameters/SubmitTimeHandler.php index 67122704d..5e04d6f3c 100644 --- a/lib/Cleantalk/ApbctWP/RequestParameters/SubmitTimeHandler.php +++ b/lib/Cleantalk/ApbctWP/RequestParameters/SubmitTimeHandler.php @@ -70,10 +70,8 @@ final public static function setToRequest($current_timestamp, &$cookie_test_valu */ final public static function isCalculationDisabled() { - global $apbct; - // Return the value of the bot detector setting - return $apbct->settings['data__bot_detector_enabled'] + return apbct__is_bot_detector_enabled() ? !RequestParameters::get('ct_gathering_loaded') : false; } diff --git a/lib/Cleantalk/ApbctWP/ServiceConstants.php b/lib/Cleantalk/ApbctWP/ServiceConstants.php index 7c8c05288..84b4b4b77 100644 --- a/lib/Cleantalk/ApbctWP/ServiceConstants.php +++ b/lib/Cleantalk/ApbctWP/ServiceConstants.php @@ -20,6 +20,13 @@ class ServiceConstants */ public $set_ajax_route_type; + /** + * Is BotDetector enabled/disabled + * @var ApbctConstant + * @psalm-suppress PossiblyUnusedProperty + */ + public $bot_detector_enabled; + public function __construct() { $this->disable_empty_email_exception = new ApbctConstant( @@ -42,6 +49,10 @@ public function __construct() ), 'Provides AJAX route type' ); + $this->bot_detector_enabled = new ApbctConstant( + array('APBCT_SERVICE__BOT_DETECTOR_ENABLED'), + 'Allows to set Bot-Detector enabled/disabled' + ); // $accepted_constants = array( // // needs to be refactored // 'APBCT_SERVICE__SELF_OWNED_ACCESS_KEY' => array( diff --git a/lib/Cleantalk/ApbctWP/State.php b/lib/Cleantalk/ApbctWP/State.php index 402a8ac6f..92a01c04f 100644 --- a/lib/Cleantalk/ApbctWP/State.php +++ b/lib/Cleantalk/ApbctWP/State.php @@ -84,7 +84,6 @@ class State extends \Cleantalk\Common\State 'data__use_static_js_key' => -1, 'data__general_postdata_test' => 0, //CAPD 'data__set_cookies' => 3, // Cookies type: 0 - Off / 1 - Native cookies / 2 - Alt cookies / 3 - Auto - 'data__bot_detector_enabled' => 1, 'data__pixel' => '3', 'data__email_check_before_post' => 1, 'data__email_check_exist_post' => 1, diff --git a/tests/ApbctWP/PluginSettingsPage/TestSummaryAndSupportRenderer.php b/tests/ApbctWP/PluginSettingsPage/TestSummaryAndSupportRenderer.php new file mode 100644 index 000000000..d65af3307 --- /dev/null +++ b/tests/ApbctWP/PluginSettingsPage/TestSummaryAndSupportRenderer.php @@ -0,0 +1,193 @@ +apbct = new State('cleantalk', array('settings', 'data', 'errors', 'remote_calls', 'stats', 'fw_stats')); + } + + public function testRender() + { + $renderer = new SummaryAndSupportRenderer($this->apbct); + $html = $renderer->render(); + + // 1. Check for the main container element + $this->assertStringContainsString( + 'id="apbct_summary_and_support"', + $html, + 'Main container div should exist' + ); + + // 2. Verify the container is hidden by default + $this->assertStringContainsString( + 'style="display: none;"', + $html, + 'Container should be hidden by default' + ); + + // 3. Verify both sections (Summary and Support) exist + $this->assertStringContainsString( + 'id="apbct_summary_and_support-left_side"', + $html, + 'Left side (Summary) should exist' + ); + + $this->assertStringContainsString( + 'id="apbct_summary_and_support-right_side"', + $html, + 'Right side (Support) should exist' + ); + + // 4. Check section headers + $this->assertStringContainsString( + '

Summary

', + $html, + 'Summary header should be present' + ); + + $this->assertStringContainsString( + '

Support

', + $html, + 'Support header should be present' + ); + + // 5. Verify all subheaders exist + $this->assertStringContainsString( + 'Statistics', + $html, + 'Statistics subheader should be present' + ); + + $this->assertStringContainsString( + 'Server requirements check', + $html, + 'Server requirements subheader should be present' + ); + + $this->assertStringContainsString( + 'Connections', + $html, + 'Connections subheader should be present' + ); + + // 6. Check support buttons and links + $this->assertStringContainsString( + 'Open Support Ticket', + $html, + 'Open Support Ticket button should exist' + ); + + $this->assertStringContainsString( + 'CleanTalk Anti-Spam Help', + $html, + 'CleanTalk Anti-Spam Help link should exist' + ); + + $this->assertStringContainsString( + 'Create Support User', + $html, + 'Create Support User button should exist' + ); + + // 7. Verify user creation result display elements + $this->assertStringContainsString( + 'id="apbct_summary_and_support-user_creation_username"', + $html, + 'Username display element should exist' + ); + + $this->assertStringContainsString( + 'id="apbct_summary_and_support-user_creation_email"', + $html, + 'Email display element should exist' + ); + + $this->assertStringContainsString( + 'id="apbct_summary_and_support-user_creation_password"', + $html, + 'Password display element should exist' + ); + + // 8. Check for preloader image + $this->assertStringContainsString( + 'apbct_preloader_button', + $html, + 'Preloader image should exist' + ); + + // 9. Verify statistics list container exists + $this->assertStringContainsString( + 'apbct_summary-list_of_items', + $html, + 'Summary list container should exist' + ); + + // 10. Verify statistics list items have the correct icon class + $this->assertStringContainsString( + 'apbct-icon-right-dir', + $html, + 'Statistics items should have the right-dir icon class' + ); + + // 11. Check for server requirements status icons + $this->assertStringContainsString( + 'apbct-icon-ok', + $html, + 'Server requirements should display success icons' + ); + + // 12. Verify the "no failed connections" message + $this->assertStringContainsString( + 'There are no failed connections to server.', + $html, + 'Should display message about no failed connections' + ); + + // 13. Check for help icon tooltip trigger + $this->assertStringContainsString( + 'apbct-icon-help-circled', + $html, + 'Help icon should be present for settings descriptions' + ); + + // 14. Verify plugin version is displayed + $this->assertStringContainsString( + 'Plugin version', + $html, + 'Plugin version information should be displayed' + ); + + // 15. Check that JavaScript function is attached to create user button + $this->assertStringContainsString( + 'onclick="apbctCreateSupportUser()"', + $html, + 'Create User button should have onclick handler' + ); + + // 16. Verify all links have target="_blank" for external URLs + $this->assertStringContainsString( + 'target="_blank"', + $html, + 'External links should open in new tab' + ); + + // 17. Check that the wrapper structure includes both sides + $this->assertStringContainsString( + 'id="apbct_summary_and_support-sides_wrap"', + $html, + 'Sides wrapper container should exist' + ); + + // 18. Verify the result container has all necessary child elements + $this->assertStringContainsString( + 'apbct_summary_and_support-user_creation_row', + $html, + 'User creation result should have row structure' + ); + } +} \ No newline at end of file diff --git a/tests/ApbctWP/TestSubmitTimeHandler.php b/tests/ApbctWP/TestSubmitTimeHandler.php index 4d86edb9e..52c53ba7c 100644 --- a/tests/ApbctWP/TestSubmitTimeHandler.php +++ b/tests/ApbctWP/TestSubmitTimeHandler.php @@ -9,8 +9,10 @@ public function testGetFromRequestReturnsNullWhenCalculationDisabled() { global $apbct; $apbct = (object) [ - 'settings' => ['data__bot_detector_enabled' => true], - 'data' => ['cookies_type' => 'alternative'] + 'data' => [ + 'cookies_type' => 'alternative', + 'bot_detector_enabled' => true + ] ]; $result = SubmitTimeHandler::getFromRequest(); @@ -23,8 +25,10 @@ public function testSetToRequestModifiesArrayRegardlessOfCalculationDisabled() { global $apbct; $apbct = (object) [ - 'settings' => ['data__bot_detector_enabled' => true], - 'data' => ['cookies_type' => 'alternative'] + 'data' => [ + 'cookies_type' => 'alternative', + 'bot_detector_enabled' => true + ] ]; $cookie_test_value = []; @@ -40,8 +44,10 @@ public function testIsCalculationDisabledReturnsTrueWhenBotDetectorEnabled() { global $apbct; $apbct = (object) [ - 'settings' => ['data__bot_detector_enabled' => true], - 'data' => ['cookies_type' => 'alternative'] + 'data' => [ + 'cookies_type' => 'alternative', + 'bot_detector_enabled' => true + ] ]; $result = SubmitTimeHandler::isCalculationDisabled(); @@ -52,7 +58,7 @@ public function testIsCalculationDisabledReturnsTrueWhenBotDetectorEnabled() public function testIsCalculationDisabledReturnsFalseWhenBotDetectorDisabled() { global $apbct; - $apbct = (object) ['settings' => ['data__bot_detector_enabled' => false]]; + $apbct = (object) ['data' => ['bot_detector_enabled' => false]]; $result = SubmitTimeHandler::isCalculationDisabled(); diff --git a/tests/Inc/TestCleantalkSettings.php b/tests/Inc/TestCleantalkSettings.php new file mode 100644 index 000000000..9e8bbc108 --- /dev/null +++ b/tests/Inc/TestCleantalkSettings.php @@ -0,0 +1,29 @@ +assertArrayHasKey('data_processing', $fields); + + $data_processing_options = $fields['data_processing']['fields']; + + $this->assertArrayNotHasKey('data__bot_detector_enabled', $data_processing_options); + $this->assertArrayHasKey('bot_detector_state', $data_processing_options); + $this->assertArrayHasKey('callback', $data_processing_options['bot_detector_state']); + $this->assertArrayHasKey('long_description', $data_processing_options['bot_detector_state']); + $this->assertArrayHasKey('display', $data_processing_options['bot_detector_state']); + $this->assertArrayNotHasKey('parent', $data_processing_options['exclusions__bot_detector']); + } +} \ No newline at end of file diff --git a/tests/StandaloneFunctions/TestBotDetectorLogGathering.php b/tests/StandaloneFunctions/TestBotDetectorLogGathering.php index e67f8094f..133e0a9a3 100644 --- a/tests/StandaloneFunctions/TestBotDetectorLogGathering.php +++ b/tests/StandaloneFunctions/TestBotDetectorLogGathering.php @@ -11,7 +11,7 @@ class TestBotDetectorLogGathering extends TestCase public function test_returnsFrontendDataLog() { global $apbct; - $apbct->settings['data__bot_detector_enabled'] = '1'; + $apbct->data['bot_detector_enabled'] = '1'; AltSessions::set('ct_bot_detector_frontend_data_log', json_encode(['log' => 'data'])); $result = apbct__bot_detector_get_fd_log(); @@ -27,7 +27,7 @@ public function test_returnsFrontendDataLog() public function test_returnsErrorWhenDisabled() { global $apbct; - $apbct->settings['data__bot_detector_enabled'] = '0'; + $apbct->data['bot_detector_enabled'] = '0'; $result = apbct__bot_detector_get_fd_log(); $expected = json_encode([ @@ -42,7 +42,7 @@ public function test_returnsErrorWhenDisabled() public function test_returnsErrorWhenNoLogFound() { global $apbct; - $apbct->settings['data__bot_detector_enabled'] = '1'; + $apbct->data['bot_detector_enabled'] = '1'; AltSessions::wipe(); $result = apbct__bot_detector_get_fd_log(); @@ -58,7 +58,7 @@ public function test_returnsErrorWhenNoLogFound() public function test_returnsErrorWhenLogNotString() { global $apbct; - $apbct->settings['data__bot_detector_enabled'] = '1'; + $apbct->data['bot_detector_enabled'] = '1'; AltSessions::set('ct_bot_detector_frontend_data_log', false); $result = apbct__bot_detector_get_fd_log(); @@ -74,7 +74,7 @@ public function test_returnsErrorWhenLogNotString() public function test_returnsErrorWhenLogNotJson() { global $apbct; - $apbct->settings['data__bot_detector_enabled'] = '1'; + $apbct->data['bot_detector_enabled'] = '1'; AltSessions::set('ct_bot_detector_frontend_data_log', 'invalid json'); $result = apbct__bot_detector_get_fd_log();