diff --git a/inc/spbc-firewall.php b/inc/spbc-firewall.php index 6848f058c..3c7fccb31 100644 --- a/inc/spbc-firewall.php +++ b/inc/spbc-firewall.php @@ -16,7 +16,7 @@ function spbc_firewall__check() { global $spbc; - $firewall = new Firewall(); + $firewall = Firewall::getInstance(); $secfw_enabled_on_main_site = false; if (!is_main_site() && $spbc->network_settings['ms__work_mode'] == 2) { @@ -46,27 +46,6 @@ function spbc_firewall__check() $GLOBALS['wp_rewrite'] = new WP_Rewrite(); // Fix for early load WP_Rewrite } - $login_url = wp_login_url(); - if ( $spbc->settings['login_page_rename__enabled'] ) { - //todo This rewrite could break permalinks, need to implement new logic - $GLOBALS['wp_rewrite'] = new WP_Rewrite(); // Fix for early load WP_Rewrite - $login_url = RenameLoginPage::getURL($spbc->settings['login_page_rename__name']); - } - - $firewall->loadFwModule( - new BFP( - array( - 'api_key' => $spbc->api_key, - 'state' => $spbc, - 'is_login_page' => strpos(trim(Server::getURL(), '/'), trim($login_url, '/')) === 0, - 'is_logged_in' => Cookie::get('spbc_is_logged_in') === md5($spbc->data['salt'] . get_option('home')), - 'bf_limit' => $spbc->settings['bfp__allowed_wrong_auths'], - 'block_period' => $spbc->settings['bfp__block_period__5_fails'], - 'count_period' => $spbc->settings['bfp__count_interval'], // Counting login attempts in this interval - ) - ) - ); - if ( $spbc->settings['traffic_control__enabled'] && ( diff --git a/inc/spbc-scanner.php b/inc/spbc-scanner.php index 36666a929..1a1ff1ff2 100644 --- a/inc/spbc-scanner.php +++ b/inc/spbc-scanner.php @@ -2103,64 +2103,111 @@ function spbc_restore_file_from_backup_ajax_action_handler($id) } // Success: remove all data about backup - try { - $backup_deleted = unlink($full_backup_path); + $error_msg = array( + spbct_delete_backup_file($full_backup_path), + spbct_remove_backup_from_db($file_path), + spbct_update_cure_log($file_path), + spbct_update_scan_results($file_path, $backup_prev_results_state) + ); - if ($backup_deleted === false) { + foreach ($error_msg as $value) { + if (array_key_exists('error', $value)) { + return $value; + } + } + + return array('success' => true); +} + +/** + * Deleting a backup file + * @param string $full_backup_path + * @return array + */ +function spbct_delete_backup_file($full_backup_path) +{ + if ($full_backup_path) { + if (!unlink($full_backup_path)) { return array('error' => esc_html__('Deleting backup error: Permissions denied.', 'security-malware-firewall')); } + } else { + return array('error' => esc_html__('Deleting backup error: Incorrect backup file path.', 'security-malware-firewall')); + } + return array(); +} - // Remove from backup +/** + * Deleting a backup from a database + * @param string $file_path + * @return array + */ +function spbct_remove_backup_from_db($file_path) +{ + global $wpdb; + if ($file_path) { $sql_prepared = $wpdb->prepare( - 'DELETE ' - . ' FROM ' . SPBC_TBL_BACKUPED_FILES - . ' WHERE real_path="%s";', + 'DELETE FROM ' . SPBC_TBL_BACKUPED_FILES . ' WHERE real_path = %s;', $file_path ); - $delete = $wpdb->query($sql_prepared); - - if (is_null($delete)) { - return array('error' => esc_html__('Error: Something is wrong during deleting backup.', 'security-malware-firewall')); + if ($wpdb->query($sql_prepared) === false) { + return array('error' => esc_html__('Deleting backup error: Something is wrong during deleting backup.', 'security-malware-firewall')); } + } else { + return array('error' => esc_html__('Deleting backup error: Incorrect backup file path for the database query.', 'security-malware-firewall')); + } + return array(); +} - // update cure log +/** + * Changing the file information in the cure_log table regarding file recovery + * @param string $file_path + * @return array + */ +function spbct_update_cure_log($file_path) +{ + global $wpdb; + if ($file_path) { $sql_prepared = $wpdb->prepare( - 'UPDATE ' . SPBC_TBL_CURE_LOG - . ' SET is_restored = 1, ' - . ' cure_status = 0 ' - . ' WHERE real_path = %s;', - array($file_path) + 'UPDATE ' . SPBC_TBL_CURE_LOG . ' SET is_restored = 1, cure_status = 0 WHERE real_path = %s;', + $file_path ); - $update_cure_log = $wpdb->query($sql_prepared); - - if (is_null($update_cure_log)) { - return array('error' => esc_html__('Error: Something is wrong during updating cure log.', 'security-malware-firewall')); + if ($wpdb->query($sql_prepared) === false) { + return array('error' => esc_html__('Error update cure log: Something is wrong during updating cure log.', 'security-malware-firewall')); } + } else { + return array('error' => esc_html__('Error update cure log: Incorrect backup file path for the database query.', 'security-malware-firewall')); + } + return array(); +} - if ($backup_prev_results_state !== null) { - // update scan results table - $sql_prepared = $wpdb->prepare( - 'UPDATE ' . SPBC_TBL_SCAN_FILES - . ' SET weak_spots = %s, checked_heuristic = %s, checked_signatures = %s, status = %s, severity = %s' - . ' WHERE path = %s;', - array( - $backup_prev_results_state['weak_spots'], - $backup_prev_results_state['checked_heuristic'], - $backup_prev_results_state['checked_signatures'], - $backup_prev_results_state['status'], - $backup_prev_results_state['severity'], - $file_path) - ); - $updated = $wpdb->query($sql_prepared); - if (is_null($updated)) { - return array('error' => esc_html__('Error: Something is wrong during saving previous state of file.', 'security-malware-firewall')); - } +/** + * Changing file information after recovery + * @param string $file_path + * @param array $backup_prev_results_state + * @return array + */ +function spbct_update_scan_results($file_path, $backup_prev_results_state) +{ + global $wpdb; + if ($file_path && $backup_prev_results_state !== null) { + $sql_prepared = $wpdb->prepare( + 'UPDATE ' . SPBC_TBL_SCAN_FILES . ' SET weak_spots = %s, checked_heuristic = %s, checked_signatures = %s, status = %s, severity = %s WHERE path = %s;', + array( + $backup_prev_results_state['weak_spots'], + $backup_prev_results_state['checked_heuristic'], + $backup_prev_results_state['checked_signatures'], + $backup_prev_results_state['status'], + $backup_prev_results_state['severity'], + $file_path + ) + ); + if ($wpdb->query($sql_prepared) === false) { + return array('error' => esc_html__('Error update scan results: Something is wrong during saving previous state of file.', 'security-malware-firewall')); } - } catch (\Exception $e) { - return array('error' => esc_html__('Error: Something is wrong.', 'security-malware-firewall')); + } else { + return array('error' => esc_html__('Error update scan results: Incorrect data for changing the recovery results about the file', 'security-malware-firewall')); } - - return array('success' => true); + return array(); } function spbc_restore_file_from_backup_ajax_action() @@ -2169,12 +2216,13 @@ function spbc_restore_file_from_backup_ajax_action() $file_fast_hash = isset($_POST['file_fast_hash']) ? esc_sql($_POST['file_fast_hash']) : null; - $result = spbc_restore_file_from_backup_ajax_action_handler($file_fast_hash); - if (isset($result['error'])) { - wp_send_json_error($result['error']); - } + $restore_result = spbc_restore_file_from_backup_ajax_action_handler($file_fast_hash); - wp_send_json_success(esc_html__('Success!', 'security-malware-firewall')); + if (isset($restore_result['success'])) { + wp_send_json_success(esc_html__('Success!', 'security-malware-firewall')); + } elseif (isset($restore_result['error'])) { + wp_send_json_error($restore_result['error']); + } } /** diff --git a/inc/spbc-settings.php b/inc/spbc-settings.php index fe3971ef4..63e1b85e6 100644 --- a/inc/spbc-settings.php +++ b/inc/spbc-settings.php @@ -5013,6 +5013,12 @@ function spbc_get_key_auto($direct_call = false) 'reload' => false, 'msg' => $result['error'] ); + } elseif (isset($result['error_no']) && $result['error_no'] == '403') { + $out = array( + 'success' => true, + 'reload' => false, + 'error' => isset($result['error_message']) ? esc_html($result['error_message']) : esc_html('Our service is not available in your region.'), + ); } elseif ( ! isset($result['auth_key'])) { $out = array( 'success' => true, diff --git a/js/spbc-settings_tab--scanner.min.js b/js/spbc-settings_tab--scanner.min.js index 2d5b227a0..eb51b077e 100644 --- a/js/spbc-settings_tab--scanner.min.js +++ b/js/spbc-settings_tab--scanner.min.js @@ -1,2 +1,2 @@ -function spbcPopupTipShow(e){var t=e.attr("spbc_tip_title")||null,n=e.attr("spbc_tip_text")||null;function o(e){void 0!==e&&0!=jQuery(e.target).parent(".spbc_popup_tip--wrapper").length&&!jQuery(e.target).hasClass("spbc_popup_tip--icon---cancel")||(jQuery(".spbc_popup_tip--wrapper").hide(),jQuery(document).off("click",o))}o(),e.after("
");var c=jQuery(".spbc_popup_tip--wrapper");c.empty().append("").css({top:e.position().top-2,left:e.position().left+25}),c.append("").append(""+n+"
"),jQuery(document).on("click",o),e.parents("tr").on("mouseout",o)}function spbcScannerButtonFileViewEvent(e){var e=jQuery(e),t={action:"spbc_scanner_file_view",file_id:e.parents(".row-actions").attr("uid")},e={spinner:e.parent().siblings(".tbl-preloader--tiny"),callback:spbcScannerButtonViewCallback,errorOutput:function(e){spbcModal.open().putError(e),document.addEventListener("spbcModalClosed",function(e){spbcReloadAccordion()})}};spbcSendAJAXRequest(t,e)}function spbcScannerAnalysisLogDeleteFromLog(e){let n=[];var t=jQuery(e);let o;if(jQuery(e).hasClass("tbl-row_action"))n.push(t.parents(".row-actions").attr("uid")),o=t.parent().siblings(".tbl-preloader--tiny");else{e=t.closest("#spbc_tbl__scanner_analysis_log").find(".cb-select:checked");if(0===e.length)return void alert("Please, select elements.");e.each(function(e,t){t=jQuery(t).val();n.push(t)}),o=t.children(".tbl-preloader--small")}e={action:"spbc_scanner_analysis_log_delete_from_log",file_ids:n},t={spinner:o,callback:function(){window.location.reload()}};spbcSendAJAXRequest(e,t)}function spbcScannerButtonPageViewEvent(e){var e=jQuery(e),t={action:"spbc_scanner_page_view",page_url:e.parents(".row-actions").attr("uid")},e={spinner:e.parent().siblings(".tbl-preloader--tiny"),callback:spbcScannerButtonViewCallback,errorOutput:function(e){spbcModal.open().putError(e)}},n=jQuery("#wpwrap"),o=jQuery("#spbc_dialog"),c=(o.dialog({modal:!0,title:"Loading..",position:{my:"center top",at:"center top+100px",of:window},width:n.width()/100*90,show:{effect:"blind",duration:500},draggable:!1,resizable:!1,closeText:"X",classes:{"ui-dialog":"spbc---top"},open:function(e,t){e.target.style.overflow="auto",jQuery("#spbc_dialog").height(document.documentElement.clientHeight/100*25)},beforeClose:function(e,t){document.body.style.overflow="auto",jQuery("#spbc_dialog").empty()}}),o.append('
'),jQuery("#spbc_file_view_preloader")),n=4e-4*n.width();c.height(128*n),c.width(128*n),c.css({left:o.width()/2-128*n/2}),c.css({top:o.height()/2-128*n/2}),spbcSendAJAXRequest(t,e)}function spbcScannerButtonViewCallback(e){var t,n=jQuery("#spbc_dialog"),o=(n.empty(),jQuery("#spbc_file_view_preloader").css({display:"none"}),'%s
%s
%s
%s
%s
%s
/g,"\n").replace(/<\/p>/g,""),navigator.clipboard.writeText(e).then(()=>{spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint)}).catch(e=>{spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed)})}else spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported)})}); +function spbcPopupTipShow(e){var t=e.attr("spbc_tip_title")||null,n=e.attr("spbc_tip_text")||null;function o(e){void 0!==e&&0!=jQuery(e.target).parent(".spbc_popup_tip--wrapper").length&&!jQuery(e.target).hasClass("spbc_popup_tip--icon---cancel")||(jQuery(".spbc_popup_tip--wrapper").hide(),jQuery(document).off("click",o))}o(),e.after("
");var c=jQuery(".spbc_popup_tip--wrapper");c.empty().append("").css({top:e.position().top-2,left:e.position().left+25}),c.append("").append(""+n+"
"),jQuery(document).on("click",o),e.parents("tr").on("mouseout",o)}function spbcScannerButtonFileViewEvent(e){var e=jQuery(e),t={action:"spbc_scanner_file_view",file_id:e.parents(".row-actions").attr("uid")},e={spinner:e.parent().siblings(".tbl-preloader--tiny"),callback:spbcScannerButtonViewCallback,errorOutput:function(e){spbcModal.open().putError(e),document.addEventListener("spbcModalClosed",function(e){spbcReloadAccordion()})}};spbcSendAJAXRequest(t,e)}function spbcScannerAnalysisLogDeleteFromLog(e){let n=[];var t=jQuery(e);let o;if(jQuery(e).hasClass("tbl-row_action"))n.push(t.parents(".row-actions").attr("uid")),o=t.parent().siblings(".tbl-preloader--tiny");else{e=t.closest("#spbc_tbl__scanner_analysis_log").find(".cb-select:checked");if(0===e.length)return void alert("Please, select elements.");e.each(function(e,t){t=jQuery(t).val();n.push(t)}),o=t.children(".tbl-preloader--small")}e={action:"spbc_scanner_analysis_log_delete_from_log",file_ids:n},t={spinner:o,callback:function(){window.location.reload()}};spbcSendAJAXRequest(e,t)}function spbcScannerButtonPageViewEvent(e){var e=jQuery(e),t={action:"spbc_scanner_page_view",page_url:e.parents(".row-actions").attr("uid")},e={spinner:e.parent().siblings(".tbl-preloader--tiny"),callback:spbcScannerButtonViewCallback,errorOutput:function(e){spbcModal.open().putError(e)}},n=jQuery("#wpwrap"),o=jQuery("#spbc_dialog"),c=(o.dialog({modal:!0,title:"Loading..",position:{my:"center top",at:"center top+100px",of:window},width:n.width()/100*90,show:{effect:"blind",duration:500},draggable:!1,resizable:!1,closeText:"X",classes:{"ui-dialog":"spbc---top"},open:function(e,t){e.target.style.overflow="auto",jQuery("#spbc_dialog").height(document.documentElement.clientHeight/100*25)},beforeClose:function(e,t){document.body.style.overflow="auto",jQuery("#spbc_dialog").empty()}}),o.append('
'),jQuery("#spbc_file_view_preloader")),n=4e-4*n.width();c.height(128*n),c.width(128*n),c.css({left:o.width()/2-128*n/2}),c.css({top:o.height()/2-128*n/2}),spbcSendAJAXRequest(t,e)}function spbcScannerButtonViewCallback(e){var t,n=jQuery("#spbc_dialog"),o=(n.empty(),jQuery("#spbc_file_view_preloader").css({display:"none"}),'%s
%s
%s
%s
%s
%s
/g,"\n").replace(/<\/p>/g,""),navigator.clipboard.writeText(e).then(()=>{spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint)}).catch(e=>{spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed)})}else spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported)})}); //# sourceMappingURL=spbc-settings_tab--scanner.min.js.map diff --git a/js/spbc-settings_tab--scanner.min.js.map b/js/spbc-settings_tab--scanner.min.js.map index a47cf151d..e43153522 100644 --- a/js/spbc-settings_tab--scanner.min.js.map +++ b/js/spbc-settings_tab--scanner.min.js.map @@ -1 +1 @@ -{"version":3,"file":"spbc-settings_tab--scanner.min.js","sources":["spbc-settings_tab--scanner.js"],"sourcesContent":["/**\n * Show popup tip\n *\n * @param {object} showIcon\n */\nfunction spbcPopupTipShow(showIcon) { // eslint-disable-line no-unused-vars\n let tipTitle = showIcon.attr('spbc_tip_title') || null;\n let tipText = showIcon.attr('spbc_tip_text') || null;\n let removeDescFunc = function(e) {\n if (\n typeof e === 'undefined' ||\n (\n jQuery(e.target).parent('.spbc_popup_tip--wrapper').length == 0 ||\n jQuery(e.target).hasClass('spbc_popup_tip--icon---cancel')\n )\n ) {\n jQuery('.spbc_popup_tip--wrapper').hide();\n jQuery(document).off('click', removeDescFunc);\n }\n };\n\n removeDescFunc();\n\n showIcon.after('
');\n\n let obj = jQuery('.spbc_popup_tip--wrapper');\n\n obj.empty()\n .append('')\n .css({\n top: showIcon.position().top - 2,\n left: showIcon.position().left + 25,\n });\n obj.append('')\n .append('' + tipText + '
');\n\n jQuery(document).on('click', removeDescFunc);\n showIcon.parents('tr').on('mouseout', removeDescFunc);\n}\n\n/**\n * View file in the scanner\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonFileViewEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n document.addEventListener('spbcModalClosed', function( e ) {\n spbcReloadAccordion();\n });\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Delete file from analysis log\n *\n * @param {object} obj\n */\nfunction spbcScannerAnalysisLogDeleteFromLog(obj) { // eslint-disable-line no-unused-vars\n let fileIds = [];\n const self = jQuery(obj);\n let spinner;\n\n if ( jQuery(obj).hasClass('tbl-row_action') ) {\n fileIds.push(self.parents('.row-actions').attr('uid'));\n spinner = self.parent().siblings('.tbl-preloader--tiny');\n } else {\n const selectedItems = self.closest('#spbc_tbl__scanner_analysis_log').find('.cb-select:checked');\n if (selectedItems.length === 0) {\n alert('Please, select elements.');\n return;\n }\n\n selectedItems.each(function(index, element) {\n const elementId = jQuery(element).val();\n fileIds.push(elementId);\n });\n spinner = self.children('.tbl-preloader--small');\n }\n\n const data = {\n action: 'spbc_scanner_analysis_log_delete_from_log',\n file_ids: fileIds,\n };\n\n let params = {\n spinner: spinner,\n callback: function() {\n window.location.reload();\n },\n };\n\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * View page in the scanner\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonPageViewEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n },\n };\n\n let wpWrap = jQuery('#wpwrap');\n let dialogWindow = jQuery('#spbc_dialog');\n\n dialogWindow.dialog({\n modal: true,\n title: 'Loading..',\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(wpWrap.width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: false,\n resizable: false,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = 'auto';\n jQuery('#spbc_dialog').height((document.documentElement.clientHeight) / 100 * 25);\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n });\n\n dialogWindow.append('%s
%s
%s
%s
' +\n '%s
' +\n '/g, '\\n').replace(/<\\/p>/g, '');\n navigator.clipboard.writeText(formattedLog).then(() => {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint);\n }).catch((err) => {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed);\n });\n } else {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported);\n }\n });\n }\n});\n"],"names":["spbcPopupTipShow","showIcon","let","tipTitle","attr","tipText","removeDescFunc","e","jQuery","target","parent","length","hasClass","hide","document","off","after","obj","empty","append","css","top","position","left","on","parents","spbcScannerButtonFileViewEvent","self","data","action","file_id","params","spinner","siblings","callback","spbcScannerButtonViewCallback","errorOutput","msg","spbcModal","open","putError","addEventListener","spbcReloadAccordion","spbcSendAJAXRequest","spbcScannerAnalysisLogDeleteFromLog","fileIds","push","selectedItems","closest","find","alert","each","index","element","elementId","val","children","file_ids","window","location","reload","spbcScannerButtonPageViewEvent","page_url","wpWrap","dialogWindow","dialog","modal","title","my","at","of","width","show","effect","duration","draggable","resizable","closeText","classes","ui-dialog","event","ui","style","overflow","height","documentElement","beforeClose","body","sizeMultiplier","result","row","rowTemplate","display","file","printf","contentHeight","Object","keys","visibleHeight","file_path","console","log","spbcScannerButtonFileViewBadEvent","spbcScannerButtonViewBadFileCallback","spbcScannerButtonPageViewBadEvent","spbcScannerButtonViewBadCallback","severityKeysSorted","severity","severityPart","rowTemplateBad","severityParts","severityPartsSorted","weak_spots","JSON","parse","key","sort","strNum","headerName","toLowerCase","headerHtml","header","Set","temp","currRow","last","remove","afterClose","success","strNums","concat","badStringsMap","Map","entries","CRITICAL","get","includes","isBadString","unformattedRow","highlitedRow","content","close","spbcScannerReloadScanInfo","text","spbcScaner","look_below_for_scan_res","getElementById","innerText","spbcScannerButtonCureFileAjaxHandler","file_fast_hash","security","spbcSettings","ajax_nonce","ajax","type","async","url","ajaxurl","put","spbcScannerButtonRestoreFromBackupAjaxHandler","spbcScannerButtonClearScanResults","confirm","successCallback","complete","context","this","timeout","spbcScannerCopyLogToClipboardHint","animate","opacity","ready","spbcTblBulkActionsListen","spbcTblRowActionsListen","spbcTblPaginationListen","spbcTblSortListen","spbcStartShowHide","progressbar","value","create","marginBottom","change","accordion","heightStyle","collapsible","active","activate","beforeActivate","spbcScanner","SpbcMalwareScanner","settings","states","button","next","progress_overall","progressbar_text","wrapper","getElementsByClassName","warnings","long_scan","outdated","actionControl","handles","containment","no_cache","Math","random","xhrFields","responseType","filename","blob","Blob","link","createElement","href","URL","createObjectURL","download","click","preventDefault","offset","navigator","clipboard","formattedLog","html","replace","writeText","then","copy_log_to_clipboard_hint","catch","copy_log_to_clipboard_hint_failed","copy_log_to_clipboard_hint_unsupported"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"spbc-settings_tab--scanner.min.js","sources":["spbc-settings_tab--scanner.js"],"sourcesContent":["/**\n * Show popup tip\n *\n * @param {object} showIcon\n */\nfunction spbcPopupTipShow(showIcon) { // eslint-disable-line no-unused-vars\n let tipTitle = showIcon.attr('spbc_tip_title') || null;\n let tipText = showIcon.attr('spbc_tip_text') || null;\n let removeDescFunc = function(e) {\n if (\n typeof e === 'undefined' ||\n (\n jQuery(e.target).parent('.spbc_popup_tip--wrapper').length == 0 ||\n jQuery(e.target).hasClass('spbc_popup_tip--icon---cancel')\n )\n ) {\n jQuery('.spbc_popup_tip--wrapper').hide();\n jQuery(document).off('click', removeDescFunc);\n }\n };\n\n removeDescFunc();\n\n showIcon.after('
');\n\n let obj = jQuery('.spbc_popup_tip--wrapper');\n\n obj.empty()\n .append('')\n .css({\n top: showIcon.position().top - 2,\n left: showIcon.position().left + 25,\n });\n obj.append('')\n .append('' + tipText + '
');\n\n jQuery(document).on('click', removeDescFunc);\n showIcon.parents('tr').on('mouseout', removeDescFunc);\n}\n\n/**\n * View file in the scanner\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonFileViewEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_file_view',\n file_id: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n document.addEventListener('spbcModalClosed', function( e ) {\n spbcReloadAccordion();\n });\n },\n };\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * Delete file from analysis log\n *\n * @param {object} obj\n */\nfunction spbcScannerAnalysisLogDeleteFromLog(obj) { // eslint-disable-line no-unused-vars\n let fileIds = [];\n const self = jQuery(obj);\n let spinner;\n\n if ( jQuery(obj).hasClass('tbl-row_action') ) {\n fileIds.push(self.parents('.row-actions').attr('uid'));\n spinner = self.parent().siblings('.tbl-preloader--tiny');\n } else {\n const selectedItems = self.closest('#spbc_tbl__scanner_analysis_log').find('.cb-select:checked');\n if (selectedItems.length === 0) {\n alert('Please, select elements.');\n return;\n }\n\n selectedItems.each(function(index, element) {\n const elementId = jQuery(element).val();\n fileIds.push(elementId);\n });\n spinner = self.children('.tbl-preloader--small');\n }\n\n const data = {\n action: 'spbc_scanner_analysis_log_delete_from_log',\n file_ids: fileIds,\n };\n\n let params = {\n spinner: spinner,\n callback: function() {\n window.location.reload();\n },\n };\n\n spbcSendAJAXRequest(data, params);\n}\n\n/**\n * View page in the scanner\n *\n * @param {object} obj\n */\nfunction spbcScannerButtonPageViewEvent(obj) { // eslint-disable-line no-unused-vars\n let self = jQuery(obj);\n let data = {\n action: 'spbc_scanner_page_view',\n page_url: self.parents('.row-actions').attr('uid'),\n };\n let params = {\n spinner: self.parent().siblings('.tbl-preloader--tiny'),\n callback: spbcScannerButtonViewCallback,\n errorOutput: function(msg) {\n spbcModal.open().putError( msg );\n },\n };\n\n let wpWrap = jQuery('#wpwrap');\n let dialogWindow = jQuery('#spbc_dialog');\n\n dialogWindow.dialog({\n modal: true,\n title: 'Loading..',\n position: {my: 'center top', at: 'center top+100px', of: window},\n width: +(wpWrap.width() / 100 * 90),\n show: {effect: 'blind', duration: 500},\n draggable: false,\n resizable: false,\n closeText: 'X',\n classes: {'ui-dialog': 'spbc---top'},\n open: function(event, ui) {\n event.target.style.overflow = 'auto';\n jQuery('#spbc_dialog').height((document.documentElement.clientHeight) / 100 * 25);\n },\n beforeClose: function(event, ui) {\n document.body.style.overflow = 'auto';\n jQuery('#spbc_dialog').empty();\n },\n });\n\n dialogWindow.append('%s
%s
%s
%s
' +\n '%s
' +\n '/g, '\\n').replace(/<\\/p>/g, '');\n navigator.clipboard.writeText(formattedLog).then(() => {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint);\n }).catch((err) => {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_failed);\n });\n } else {\n spbcScannerCopyLogToClipboardHint(spbcScaner.copy_log_to_clipboard_hint_unsupported);\n }\n });\n }\n});\n"],"names":["spbcPopupTipShow","showIcon","let","tipTitle","attr","tipText","removeDescFunc","e","jQuery","target","parent","length","hasClass","hide","document","off","after","obj","empty","append","css","top","position","left","on","parents","spbcScannerButtonFileViewEvent","self","data","action","file_id","params","spinner","siblings","callback","spbcScannerButtonViewCallback","errorOutput","msg","spbcModal","open","putError","addEventListener","spbcReloadAccordion","spbcSendAJAXRequest","spbcScannerAnalysisLogDeleteFromLog","fileIds","push","selectedItems","closest","find","alert","each","index","element","elementId","val","children","file_ids","window","location","reload","spbcScannerButtonPageViewEvent","page_url","wpWrap","dialogWindow","dialog","modal","title","my","at","of","width","show","effect","duration","draggable","resizable","closeText","classes","ui-dialog","event","ui","style","overflow","height","documentElement","beforeClose","body","sizeMultiplier","result","row","rowTemplate","display","file","printf","contentHeight","Object","keys","visibleHeight","file_path","console","log","spbcScannerButtonFileViewBadEvent","spbcScannerButtonViewBadFileCallback","spbcScannerButtonPageViewBadEvent","spbcScannerButtonViewBadCallback","severityKeysSorted","severity","severityPart","rowTemplateBad","severityParts","severityPartsSorted","weak_spots","JSON","parse","key","sort","strNum","headerName","toLowerCase","headerHtml","header","Set","temp","currRow","last","remove","afterClose","success","strNums","concat","badStringsMap","Map","entries","CRITICAL","get","includes","isBadString","unformattedRow","highlitedRow","content","close","spbcScannerReloadScanInfo","text","spbcScaner","look_below_for_scan_res","getElementById","innerText","spbcScannerButtonCureFileAjaxHandler","file_fast_hash","security","spbcSettings","ajax_nonce","ajax","type","async","url","ajaxurl","put","spbcScannerButtonRestoreFromBackupAjaxHandler","spbcScannerButtonClearScanResults","confirm","successCallback","complete","context","this","timeout","spbcScannerCopyLogToClipboardHint","animate","opacity","ready","spbcTblBulkActionsListen","spbcTblRowActionsListen","spbcTblPaginationListen","spbcTblSortListen","spbcStartShowHide","progressbar","value","create","marginBottom","change","accordion","heightStyle","collapsible","active","activate","beforeActivate","spbcScanner","SpbcMalwareScanner","settings","states","button","next","progress_overall","progressbar_text","wrapper","getElementsByClassName","warnings","long_scan","outdated","actionControl","handles","containment","no_cache","Math","random","xhrFields","responseType","filename","blob","Blob","link","createElement","href","URL","createObjectURL","download","click","preventDefault","offset","navigator","clipboard","formattedLog","html","replace","writeText","then","copy_log_to_clipboard_hint","catch","copy_log_to_clipboard_hint_failed","copy_log_to_clipboard_hint_unsupported"],"mappings":"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"} \ No newline at end of file diff --git a/js/src/spbc-settings_tab--scanner.js b/js/src/spbc-settings_tab--scanner.js index 030c0beb1..4a398362e 100644 --- a/js/src/spbc-settings_tab--scanner.js +++ b/js/src/spbc-settings_tab--scanner.js @@ -542,12 +542,12 @@ function spbcScannerButtonRestoreFromBackupAjaxHandler(obj) { // eslint-disable- success: function(result) { if (result.success) { spbcModal.open().put(result.data); - document.addEventListener('spbcModalClosed', function( e ) { - document.location.reload(); - }); } else { spbcModal.open().putError(result.data); } + document.addEventListener('spbcModalClosed', function( e ) { + document.location.reload(); + }); }, }); } diff --git a/lib/CleantalkSP/Common/Helpers/IP.php b/lib/CleantalkSP/Common/Helpers/IP.php index 248923a5a..eac7edb69 100644 --- a/lib/CleantalkSP/Common/Helpers/IP.php +++ b/lib/CleantalkSP/Common/Helpers/IP.php @@ -49,34 +49,6 @@ class IP ), ); - /** - * @var array Set of CleanTalk servers - */ - public static $cleantalks_servers = array( - // MODERATE - 'moderate1.cleantalk.org' => '162.243.144.175', - 'moderate2.cleantalk.org' => '159.203.121.181', - 'moderate3.cleantalk.org' => '88.198.153.60', - 'moderate4.cleantalk.org' => '159.69.51.30', - 'moderate5.cleantalk.org' => '95.216.200.119', - 'moderate6.cleantalk.org' => '138.68.234.8', - // APIX - 'apix1.cleantalk.org' => '35.158.52.161', - 'apix2.cleantalk.org' => '18.206.49.217', - 'apix3.cleantalk.org' => '3.18.23.246', - 'apix4.cleantalk.org' => '44.227.90.42', - 'apix5.cleantalk.org' => '15.188.198.212', - 'apix6.cleantalk.org' => '54.219.94.72', - 'apix7.cleantalk.org' => '54.219.94.72', - 'apix8.cleantalk.org' => '148.251.84.122', - 'apix9.cleantalk.org' => '135.148.237.215', - 'apix10.cleantalk.org' => '5.9.221.172', - 'apix11.cleantalk.org' => '88.198.99.241', - //ns - 'netserv2.cleantalk.org' => '178.63.60.214', - 'netserv4.cleantalk.org' => '51.81.55.252', - ); - /** * Getting arrays of IP (REMOTE_ADDR, X-Forwarded-For, X-Real-Ip, Cf_Connecting_Ip) * @@ -560,42 +532,6 @@ public static function calculateMaskForIPs($ip, $mask_start, $mask_end) return $out; } - /** - * Get URL form IP. Check if it's belong to cleantalk. - * - * @param string $ip - * - * @return bool|false - * @psalm-suppress PossiblyUnusedMethod - */ - public static function isIPCleantalks($ip) - { - if (self::validate($ip)) { - $url = array_search($ip, self::$cleantalks_servers, true); - return (bool) $url; - } - - return false; - } - - /** - * Get URL form IP. Check if it's belong to cleantalk. - * - * @param $ip - * - * @return false|int|string - * @psalm-suppress PossiblyUnusedMethod - */ - public static function resolveCleantalks($ip) - { - if (self::validate($ip)) { - $url = array_search($ip, self::$cleantalks_servers, true); - return $url ?: self::resolve($ip); - } - - return $ip; - } - /** * Get URL form IP * diff --git a/lib/CleantalkSP/Security/Firewall.php b/lib/CleantalkSP/Security/Firewall.php index 6031a29c1..d9123d236 100644 --- a/lib/CleantalkSP/Security/Firewall.php +++ b/lib/CleantalkSP/Security/Firewall.php @@ -5,6 +5,7 @@ use CleantalkSP\Common\Helper; use CleantalkSP\Security\Firewall\FirewallModule; use CleantalkSP\SpbctWP\Variables\Cookie; +use CleantalkSP\Templates\Singleton; use CleantalkSP\Variables\Get; use CleantalkSP\Security\Firewall\Result; use CleantalkSP\SpbctWP\Helpers\IP; @@ -25,8 +26,12 @@ */ class Firewall { + use Singleton; + public $ip_array = array(); + public $local_networks; + private $test_block; // Database @@ -67,6 +72,7 @@ public function __construct($db = null) { $this->debug = (bool)Get::get('debug'); $this->ip_array = $this->ipGet('real'); + $this->local_networks = $this->getLocalNetworks(); if ( isset($db) ) { $this->db = $db; @@ -117,6 +123,11 @@ public function run() // Check requests by all enabled modules foreach ( $this->fw_modules as $module ) { + + if ( $module->already_checked ) { + continue; + } + // Perform module check $module_results = $module->check(); @@ -138,6 +149,8 @@ public function run() $module->middleAction($results[$module->module_name]); } + $module->already_checked = true; + // Don't use other modules if the IP is whitelisted if ( $this->isWhitelisted($results) && ! empty($this->test_block) ) { break; @@ -287,4 +300,175 @@ private function isWhitelisted($results) public function updateLog(Result $fw_result) { } + + public function getLocalNetworks() + { + try { + $version = IP::validate($current_ip); + if ( $version === 'v6' ) { + //IPV6 handling logic + $db_results = $this->ipv6GetResultsFromDb($current_ip); + } elseif ($version === 'v4') { + //IPV4 handling logic + $db_results = $this->ipv4GetResultsFromDb($current_ip); + } else { + throw new \Exception('IP address record is invalid.'); + } + } catch (\Exception $e) { + error_log('Security by CleanTalk. Firewall IP handling error: ' . $e->getMessage()); + continue; + } + } + + /** + * Return array of database search result for IP (ipv4) + * @param $ip + * @return array|null|object + */ + public function ipv4GetResultsFromDb($ip) + { + $current_ipv4 = sprintf('%u', ip2long($ip)); + $needles = IP::getNetworkNeedles([$current_ipv4]); + $data_table__common_v4 = SPBC_TBL_FIREWALL_DATA_V4; + $data_table__personal_v4 = SPBC_TBL_FIREWALL_DATA__IPS_V4; + + $query_ipv4 = '( + SELECT 0 AS is_personal, 1 AS is_ip, status, country_code, network, mask + FROM ' . $data_table__common_v4 . ' + WHERE network IN (' . current($needles) . ') + AND network = ' . $current_ipv4 . ' & mask + AND country_code = "0" + ) UNION ( + SELECT 1 AS is_personal, 1 AS is_ip, status, 0 AS country_code, network, mask + FROM ' . $data_table__personal_v4 . ' + WHERE network IN (' . current($needles) . ') + AND network = ' . $current_ipv4 . ' & mask + ) UNION ( + SELECT 1 AS is_personal, 0 AS is_ip, tbl_private.status, country_code, network, mask + FROM ' . $this->data_table__personal_countries . ' AS tbl_private + RIGHT JOIN ' . $data_table__common_v4 . ' AS tbl_common USING(country_code) + WHERE network IN (' . current($needles) . ') + AND network = ' . $current_ipv4 . ' & mask + AND tbl_private.status IS NOT NULL + AND ' . mt_rand(1, 100000) . ' <> 0 + )'; + + $db_results = $this->db->fetchAll($query_ipv4, ARRAY_A); + + return $db_results; + } + + /** + * Return database search result for IP (ipv6) + * @param $ip + * @return array + * @throws \Exception + */ + public function ipv6GetResultsFromDb($ip) + { + $needles = IP::getNetworkNeedles(IP::getFourIPv4FromIP($ip)); + $data_table__common_v6 = SPBC_TBL_FIREWALL_DATA_V6; + $data_table__personal_v6 = SPBC_TBL_FIREWALL_DATA__IPS_V6; + + $query_ipv6 = '( + SELECT 0 AS is_personal, 1 AS is_ip, status, country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 + FROM ' . $data_table__common_v6 . ' + WHERE + network1 IN (0,' . $needles[0] . ') + AND network2 IN (0,' . $needles[1] . ') + AND network3 IN (0,' . $needles[2] . ') + AND network4 IN (0,' . $needles[3] . ') + AND country_code = "0" + ) UNION ( + SELECT 1 AS is_personal, 1 AS is_ip, status, 0 AS country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 + FROM ' . $data_table__personal_v6 . ' + WHERE + network1 IN (0,' . $needles[0] . ') + AND network2 IN (0,' . $needles[1] . ') + AND network3 IN (0,' . $needles[2] . ') + AND network4 IN (0,' . $needles[3] . ') + ) UNION ( + SELECT 1 AS is_personal, 0 AS is_ip, tbl_private.status, country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 + FROM ' . $this->data_table__personal_countries . ' AS tbl_private + RIGHT JOIN ' . $data_table__common_v6 . ' AS tbl_common USING(country_code) + WHERE + network1 IN (0,' . $needles[0] . ') + AND network2 IN (0,' . $needles[1] . ') + AND network3 IN (0,' . $needles[2] . ') + AND network4 IN (0,' . $needles[3] . ') + AND tbl_private.status IS NOT NULL + AND ' . mt_rand(1, 100000) . ' <> 0 + )'; + + $db_results = $this->db->fetchAll($query_ipv6, ARRAY_A); + + $output_db_results = array(); + + $error = ''; + + foreach ($db_results as $current_result) { + //collecting data + if ( !isset( + $current_result['network1'], + $current_result['network2'], + $current_result['network3'], + $current_result['network4'], + $current_result['mask1'], + $current_result['mask2'], + $current_result['mask3'], + $current_result['mask4'] + ) ) { + $error = 'db data is not correct;'; + continue; + } + $hex_network_from_db = str_pad(dechex($current_result['network1']), 8, '0', STR_PAD_LEFT); + $hex_network_from_db .= str_pad(dechex($current_result['network2']), 8, '0', STR_PAD_LEFT); + $hex_network_from_db .= str_pad(dechex($current_result['network3']), 8, '0', STR_PAD_LEFT); + $hex_network_from_db .= str_pad(dechex($current_result['network4']), 8, '0', STR_PAD_LEFT); + + if ( strlen($hex_network_from_db) <> 32) { + $error = 'can not collect hex string from db'; + continue; + } + + $mask = IP::convertLongIntmaskToDec($current_result['mask1']); + $mask += IP::convertLongIntmaskToDec($current_result['mask2']); + $mask += IP::convertLongIntmaskToDec($current_result['mask3']); + $mask += IP::convertLongIntmaskToDec($current_result['mask4']); + + if ( !is_int($mask) || $mask < 0 || $mask > 128 ) { + $error = 'can not collect network mask from db'; + continue; + } + + //converting stuff + $ipv6_network_from_db = implode(':', str_split($hex_network_from_db, 4)); + + if ( IP::validate($ipv6_network_from_db) !== 'v6' ) { + $error = 'can not construct ipv6 subnet from db'; + continue; + } + + $ip = IP::extendIPv6(IP::normalizeIPv6($ip)); + + //belonging check logic + $ip_in_network = IP::isIpv6AddrInIpv6Network($ip, $ipv6_network_from_db, $mask); + + if ( false === $ip_in_network ) { + $error = 'can not check if address belongs to network'; + continue; + } + + if ($ip_in_network === 1) { + //output found result + $output_db_results[] = $current_result; + } + } + + if ( !empty($error) ) { + throw new \Exception($error); + } + + return $output_db_results; + } } diff --git a/lib/CleantalkSP/Security/Firewall/FirewallModule.php b/lib/CleantalkSP/Security/Firewall/FirewallModule.php index 737186151..dcd41fdf4 100644 --- a/lib/CleantalkSP/Security/Firewall/FirewallModule.php +++ b/lib/CleantalkSP/Security/Firewall/FirewallModule.php @@ -20,6 +20,8 @@ class FirewallModule extends FirewallModuleAbstract { public $module_name; + public $already_checked = false; + /** * @var DB */ diff --git a/lib/CleantalkSP/SpbctWP/Firewall/BFP.php b/lib/CleantalkSP/SpbctWP/Firewall/BFP.php index 6c27cf6a6..2ba8047d6 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall/BFP.php +++ b/lib/CleantalkSP/SpbctWP/Firewall/BFP.php @@ -67,6 +67,14 @@ public function check() ) ); FirewallState::setIsNeedToIncrementEntire(false); + } else { + $results[] = new Result( + array( + 'module' => 'BFP', + 'ip' => $current_ip, + 'status' => 'PASS', + ) + ); } } } diff --git a/lib/CleantalkSP/SpbctWP/Firewall/FW.php b/lib/CleantalkSP/SpbctWP/Firewall/FW.php index d02ff1046..c3c507bab 100644 --- a/lib/CleantalkSP/SpbctWP/Firewall/FW.php +++ b/lib/CleantalkSP/SpbctWP/Firewall/FW.php @@ -139,158 +139,6 @@ public function check() return $results; } - /** - * Return array of database search result for IP (ipv4) - * @param $ip - * @return array|null|object - */ - protected function ipv4GetResultsFromDb($ip) - { - $current_ipv4 = sprintf('%u', ip2long($ip)); - $needles = IP::getNetworkNeedles([$current_ipv4]); - $data_table__common_v4 = SPBC_TBL_FIREWALL_DATA_V4; - $data_table__personal_v4 = SPBC_TBL_FIREWALL_DATA__IPS_V4; - - $query_ipv4 = '( - SELECT 0 AS is_personal, 1 AS is_ip, status, country_code, network, mask - FROM ' . $data_table__common_v4 . ' - WHERE network IN (' . current($needles) . ') - AND network = ' . $current_ipv4 . ' & mask - AND country_code = "0" - ) UNION ( - SELECT 1 AS is_personal, 1 AS is_ip, status, 0 AS country_code, network, mask - FROM ' . $data_table__personal_v4 . ' - WHERE network IN (' . current($needles) . ') - AND network = ' . $current_ipv4 . ' & mask - ) UNION ( - SELECT 1 AS is_personal, 0 AS is_ip, tbl_private.status, country_code, network, mask - FROM ' . $this->data_table__personal_countries . ' AS tbl_private - RIGHT JOIN ' . $data_table__common_v4 . ' AS tbl_common USING(country_code) - WHERE network IN (' . current($needles) . ') - AND network = ' . $current_ipv4 . ' & mask - AND tbl_private.status IS NOT NULL - AND ' . mt_rand(1, 100000) . ' <> 0 - )'; - - $db_results = $this->db->fetchAll($query_ipv4, ARRAY_A); - - return $db_results; - } - - /** - * Return database search result for IP (ipv6) - * @param $ip - * @return array - * @throws \Exception - */ - protected function ipv6GetResultsFromDb($ip) - { - $needles = IP::getNetworkNeedles(IP::getFourIPv4FromIP($ip)); - $data_table__common_v6 = SPBC_TBL_FIREWALL_DATA_V6; - $data_table__personal_v6 = SPBC_TBL_FIREWALL_DATA__IPS_V6; - - $query_ipv6 = '( - SELECT 0 AS is_personal, 1 AS is_ip, status, country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 - FROM ' . $data_table__common_v6 . ' - WHERE - network1 IN (0,' . $needles[0] . ') - AND network2 IN (0,' . $needles[1] . ') - AND network3 IN (0,' . $needles[2] . ') - AND network4 IN (0,' . $needles[3] . ') - AND country_code = "0" - ) UNION ( - SELECT 1 AS is_personal, 1 AS is_ip, status, 0 AS country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 - FROM ' . $data_table__personal_v6 . ' - WHERE - network1 IN (0,' . $needles[0] . ') - AND network2 IN (0,' . $needles[1] . ') - AND network3 IN (0,' . $needles[2] . ') - AND network4 IN (0,' . $needles[3] . ') - ) UNION ( - SELECT 1 AS is_personal, 0 AS is_ip, tbl_private.status, country_code, network1, network2, network3, network4, mask1, mask2, mask3, mask4 - FROM ' . $this->data_table__personal_countries . ' AS tbl_private - RIGHT JOIN ' . $data_table__common_v6 . ' AS tbl_common USING(country_code) - WHERE - network1 IN (0,' . $needles[0] . ') - AND network2 IN (0,' . $needles[1] . ') - AND network3 IN (0,' . $needles[2] . ') - AND network4 IN (0,' . $needles[3] . ') - AND tbl_private.status IS NOT NULL - AND ' . mt_rand(1, 100000) . ' <> 0 - )'; - - $db_results = $this->db->fetchAll($query_ipv6, ARRAY_A); - - $output_db_results = array(); - - $error = ''; - - foreach ($db_results as $current_result) { - //collecting data - if ( !isset( - $current_result['network1'], - $current_result['network2'], - $current_result['network3'], - $current_result['network4'], - $current_result['mask1'], - $current_result['mask2'], - $current_result['mask3'], - $current_result['mask4'] - ) ) { - $error = 'db data is not correct;'; - continue; - } - $hex_network_from_db = str_pad(dechex($current_result['network1']), 8, '0', STR_PAD_LEFT); - $hex_network_from_db .= str_pad(dechex($current_result['network2']), 8, '0', STR_PAD_LEFT); - $hex_network_from_db .= str_pad(dechex($current_result['network3']), 8, '0', STR_PAD_LEFT); - $hex_network_from_db .= str_pad(dechex($current_result['network4']), 8, '0', STR_PAD_LEFT); - - if ( strlen($hex_network_from_db) <> 32) { - $error = 'can not collect hex string from db'; - continue; - } - - $mask = IP::convertLongIntmaskToDec($current_result['mask1']); - $mask += IP::convertLongIntmaskToDec($current_result['mask2']); - $mask += IP::convertLongIntmaskToDec($current_result['mask3']); - $mask += IP::convertLongIntmaskToDec($current_result['mask4']); - - if ( !is_int($mask) || $mask < 0 || $mask > 128 ) { - $error = 'can not collect network mask from db'; - continue; - } - - //converting stuff - $ipv6_network_from_db = implode(':', str_split($hex_network_from_db, 4)); - - if ( IP::validate($ipv6_network_from_db) !== 'v6' ) { - $error = 'can not construct ipv6 subnet from db'; - continue; - } - - $ip = IP::extendIPv6(IP::normalizeIPv6($ip)); - - //belonging check logic - $ip_in_network = IP::isIpv6AddrInIpv6Network($ip, $ipv6_network_from_db, $mask); - - if ( false === $ip_in_network ) { - $error = 'can not check if address belongs to network'; - continue; - } - - if ($ip_in_network === 1) { - //output found result - $output_db_results[] = $current_result; - } - } - - if ( !empty($error) ) { - throw new \Exception($error); - } - - return $output_db_results; - } - /** * Sends and wipe SFW log * diff --git a/lib/CleantalkSP/SpbctWP/Helpers/HTTP.php b/lib/CleantalkSP/SpbctWP/Helpers/HTTP.php index 5d5b259da..05d6c810a 100644 --- a/lib/CleantalkSP/SpbctWP/Helpers/HTTP.php +++ b/lib/CleantalkSP/SpbctWP/Helpers/HTTP.php @@ -18,39 +18,41 @@ class HTTP extends \CleantalkSP\Common\Helpers\HTTP { /** - * Sort CleanTalks API servers by response time - * Wrapper for self::sortHostsByResponseTime() + * Get CleanTalk API servers from DNS * * @return array */ - public static function getCleantalksAPIServersOrderedByResponseTime() + public static function getCleantalksAPIServersFromDNS() { - return static::sortHostsByResponseTime( - // Get only apix*.cleantalk.org domains from cleantalk servers - array_filter( - IP::$cleantalks_servers, - static function ($key) { - return (bool)preg_match('/^apix\d\d?\.cleantalk\.org$/', $key); - }, - ARRAY_FILTER_USE_KEY - ) - ); + $servers = []; + $dns_records = dns_get_record('api.cleantalk.org', DNS_A); + + foreach ($dns_records as $record) { + if (isset($record['ip'])) { + $server_host = gethostbyaddr($record['ip']); + if ( $server_host !== false && $server_host !== $record['ip'] ) { + $servers[$server_host] = $record['ip']; + } + } + } + + return $servers; } /** - * Sort CleanTalks moderate servers by response time + * Sort CleanTalks API servers by response time * Wrapper for self::sortHostsByResponseTime() * * @return array */ - public static function getCleantalksModerateServersOrderedByResponseTime() + public static function getCleantalksAPIServersOrderedByResponseTime() { return static::sortHostsByResponseTime( - // Get only moderate*.cleantalk.org domains from cleantalk servers + // Get only apix*.cleantalk.org domains from cleantalk servers array_filter( - IP::$cleantalks_servers, + static::getCleantalksAPIServersFromDNS(), static function ($key) { - return (bool)preg_match('/^moderate\d\d?\.cleantalk\.org$/', $key); + return (bool)preg_match('/^apix\d\d?\.cleantalk\.org$/', $key); }, ARRAY_FILTER_USE_KEY ) diff --git a/security-malware-firewall.php b/security-malware-firewall.php index 0ec3d563d..9d1e8ab14 100644 --- a/security-malware-firewall.php +++ b/security-malware-firewall.php @@ -5,7 +5,7 @@ Plugin URI: https://wordpress.org/plugins/security-malware-firewall/ Description: Security & Malware scan by CleanTalk to protect your website from online threats and viruses. IP/Country FireWall, Web application FireWall. Detailed stats and logs to have full control. Author: CleanTalk Security -Version: 2.152.99-fix +Version: 2.152.99-dev Author URI: https://cleantalk.org Text Domain: security-malware-firewall Domain Path: /i18n @@ -574,6 +574,8 @@ function spbc_authenticate__check_brute_force() $login_url = RenameLoginPage::getURL($spbc->settings['login_page_rename__name']); } + $firewall = new \CleantalkSP\SpbctWP\Firewall(); + $bfp = new BFP( array( 'api_key' => $spbc->api_key, @@ -586,14 +588,9 @@ function spbc_authenticate__check_brute_force() ) ); - $bfp->setDb(new DB()); - $bfp->setIpArray([IP::get()]); - $bfp_result = $bfp->check(); - $bfp->middleAction(); + $firewall->loadFwModule($bfp); - if (!empty($bfp_result)) { - $bfp->_die($bfp_result[0]); - } + $firewall->run(); } // @@ -1347,7 +1344,7 @@ function spbc_test_connection($urls_to_test = array()) { $out = array(); - $urls_to_test = $urls_to_test ?: array_keys(\CleantalkSP\SpbctWP\Helpers\IP::$cleantalks_servers); + $urls_to_test = $urls_to_test ?: array_keys(HTTP::getCleantalksAPIServersFromDNS()); foreach ( $urls_to_test as $url ) { $start = microtime(true); diff --git a/tests/Common/Helpers/HelperHTTPTest.php b/tests/Common/Helpers/HelperHTTPTest.php index cf7deb931..765ddbb64 100644 --- a/tests/Common/Helpers/HelperHTTPTest.php +++ b/tests/Common/Helpers/HelperHTTPTest.php @@ -62,7 +62,7 @@ public function testPingMethods() public function testPingCurl() { $hosts = array_filter( - IP::$cleantalks_servers, + HTTP::getCleantalksAPIServersFromDNS(), static function ($key) { return (bool)preg_match('/^apix\d\d?\.cleantalk\.org$/', $key); },