)/, 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();