plugin = $plugin_instance; } public function settings_page_content() { if (!current_user_can('manage_options')) { return; } nocache_headers(); $menu_structure = [ 'dashboard' => [ 'title' => __('Dashboard', 'advanced-ip-blocker'), 'icon' => 'dashicons-dashboard', 'sub_tabs' => [ 'main_dashboard' => __('Security Dashboard', 'advanced-ip-blocker'), 'status' => __('System Status', 'advanced-ip-blocker') ] ], 'security_headers' => [ 'title' => __('Security Headers', 'advanced-ip-blocker'), 'icon' => 'dashicons-admin-network', 'sub_tabs' => [ 'headers_config' => __('HTTP Headers', 'advanced-ip-blocker') ] ], 'settings' => [ 'title' => __('Settings', 'advanced-ip-blocker'), 'icon' => 'dashicons-admin-settings', 'sub_tabs' => [ 'general_settings' => __('General', 'advanced-ip-blocker'), '2fa_management' => __('2FA Management', 'advanced-ip-blocker'), 'import_export' => __('Import / Export', 'advanced-ip-blocker') ] ], 'rules' => [ 'title' => __('Blocking Rules', 'advanced-ip-blocker'), 'icon' => 'dashicons-shield-alt', 'sub_tabs' => [ 'waf' => __('Firewall (WAF)', 'advanced-ip-blocker'), 'user_agents' => __('User Agents', 'advanced-ip-blocker'), 'honeypot' => __('Honeypot URLs', 'advanced-ip-blocker'), 'asn_blocking' => __('ASN Blocking', 'advanced-ip-blocker'), 'advanced_rules' => __('Advanced Rules', 'advanced-ip-blocker') ] ], 'ip_management' => [ 'title' => __('IP Management', 'advanced-ip-blocker'), 'icon' => 'dashicons-location', 'sub_tabs' => [ 'blocked_ips' => __('Blocked IPs', 'advanced-ip-blocker'), 'blocked_signatures' => __('Blocked Signatures', 'advanced-ip-blocker'), 'blocked_endpoints' => __('Blocked Endpoints', 'advanced-ip-blocker'), 'whitelist' => __('Whitelist', 'advanced-ip-blocker'), 'ip_inspector' => __('IP Inspector', 'advanced-ip-blocker') ] ], 'integrity' => [ 'title' => __('Integrity Scanner', 'advanced-ip-blocker'), 'icon' => 'dashicons-search', 'sub_tabs' => [ 'fim_dashboard' => __('File Integrity Monitor', 'advanced-ip-blocker') ] ], 'scanner' => [ 'title' => __('Site Scanner', 'advanced-ip-blocker'), 'icon' => 'dashicons-search', 'sub_tabs' => [ 'scan_overview' => __('Health & Vulnerabilities', 'advanced-ip-blocker') ] ], 'logs' => [ 'title' => __('Logs & Sessions', 'advanced-ip-blocker'), 'icon' => 'dashicons-list-view', 'sub_tabs' => [ 'security_log' => __('Security Log', 'advanced-ip-blocker'), 'challenge_log' => __('Challenge Logs', 'advanced-ip-blocker'), 'audit_log' => __('Activity Audit Log', 'advanced-ip-blocker'), 'general_log' => __('General Log', 'advanced-ip-blocker'), 'ip_trust_log' => __('IP Trust Log', 'advanced-ip-blocker'), 'user_sessions' => __('User Sessions', 'advanced-ip-blocker'), 'cron_logs' => __('WP-Cron Log', 'advanced-ip-blocker') ] ], 'about' => [ 'title' => __('About', 'advanced-ip-blocker'), 'icon' => 'dashicons-info', 'sub_tabs' => [ 'credits' => __('Credits & Support', 'advanced-ip-blocker') ] ] ]; // phpcs:disable WordPress.Security.NonceVerification.Recommended $current_page_slug = isset($_GET['page']) ? sanitize_key($_GET['page']) : 'advaipbl_settings_page'; if (isset($_GET['tab'])) { $active_main_tab = sanitize_key($_GET['tab']); $active_sub_tab = isset($_GET['sub-tab']) ? sanitize_key($_GET['sub-tab']) : null; } else { $page_slug_to_tab_map = [ 'advaipbl_settings_page' => ['dashboard', 'main_dashboard'], 'advaipbl_settings_page-settings' => ['settings', 'general_settings'], 'advaipbl_settings_page-security-headers' => ['security_headers', 'headers_config'], 'advaipbl_settings_page-rules' => ['rules', 'waf'], 'advaipbl_settings_page-ip-management' => ['ip_management', 'blocked_ips'], 'advaipbl_settings_page-integrity' => ['integrity', 'fim_dashboard'], 'advaipbl_settings_page-scanner' => ['scanner', 'scan_overview'], 'advaipbl_settings_page-logs' => ['logs', 'security_log'], 'advaipbl_settings_page-about' => ['about', 'credits'], ]; if (isset($page_slug_to_tab_map[$current_page_slug])) { list($active_main_tab, $active_sub_tab) = $page_slug_to_tab_map[$current_page_slug]; } else { $active_main_tab = 'dashboard'; $active_sub_tab = 'main_dashboard'; } } if (!isset($menu_structure[$active_main_tab])) { $active_main_tab = 'dashboard'; } if (empty($active_sub_tab) || !isset($menu_structure[$active_main_tab]['sub_tabs'][$active_sub_tab])) { $active_sub_tab = key($menu_structure[$active_main_tab]['sub_tabs']); } $blocked_count = $this->plugin->get_blocked_count(); ?>

plugin->display_admin_notice(); ?>
$sub_tab_title) : $is_active = ($sub_tab_key === $active_sub_tab); $url = add_query_arg( [ 'page' => 'advaipbl_settings_page', 'tab' => $active_main_tab, 'sub-tab' => $sub_tab_key ], 'admin.php' ); ?>
display_dashboard_tab(); break; case 'status': $this->display_status_tab(); break; case 'headers_config': $this->plugin->security_headers_manager->display_settings_tab(); break; case 'general_settings': $this->display_general_settings_tab(); break; case '2fa_management': $this->display_2fa_management_tab(); break; case 'import_export': $this->render_import_export_controls_callback(); break; case 'waf': $this->display_waf_tab(); break; case 'user_agents': $this->display_user_agents_tab(); break; case 'honeypot': $this->display_honeypot_tab(); break; case 'asn_blocking': $this->display_asn_blocking_tab(); break; case 'advanced_rules': $this->display_advanced_rules_tab(); break; case 'blocked_ips': $this->display_blocked_ips_tab(); break; case 'blocked_signatures': $this->display_blocked_signatures_tab(); break; case 'blocked_endpoints': $this->display_blocked_endpoints_tab(); break; case 'whitelist': $this->display_whitelist_tab(); break; case 'ip_inspector': $this->display_ip_inspector_tab(); break; case 'fim_dashboard': $this->display_fim_dashboard(); break; case 'scan_overview': $this->display_scanner_tab(); break; case 'security_log': $this->display_security_log_tab(); break; case 'challenge_log': $this->display_challenge_log_tab(); break; case 'audit_log': $this->display_audit_log_tab(); break; case 'general_log': $this->display_general_log_tab(); break; case 'ip_trust_log': $this->display_ip_trust_log_tab(); break; case 'user_sessions': $this->plugin->session_manager->display_admin_page(); break; case 'cron_logs': $this->display_cron_logs_tab(); break; case 'credits': $this->display_credits_tab(); break; default: echo '

Error: Content for this tab is not available.

'; break; } ?>

'; esc_html_e('This log shows which IP addresses are triggering WP-Cron tasks on your site, and which scheduled tasks (hooks) were due to run at that moment.', 'advanced-ip-blocker'); echo '

'; // phpcs:disable WordPress.Security.NonceVerification.Recommended $search_term = isset($_GET['s']) ? sanitize_text_field(wp_unslash($_GET['s'])) : ''; $orderby = isset($_GET['orderby']) && in_array($_GET['orderby'], ['timestamp', 'ip'], true) ? sanitize_key($_GET['orderby']) : 'timestamp'; $order = isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'], true) ? strtolower(sanitize_key($_GET['order'])) : 'desc'; $current_page = isset($_GET['paged']) ? absint($_GET['paged']) : 1; $per_page = isset($_GET['advaipbl_per_page']) ? absint($_GET['advaipbl_per_page']) : 25; global $wpdb; $table_name = $wpdb->prefix . 'advaipbl_logs'; $where_clauses = [$wpdb->prepare("log_type = %s", 'wp_cron')]; if (!empty($search_term)) { $search_like = '%' . $wpdb->esc_like($search_term) . '%'; $where_clauses[] = $wpdb->prepare("(ip LIKE %s OR details LIKE %s)", $search_like, $search_like); } $where_sql = implode(' AND ', $where_clauses); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $total_items = $wpdb->get_var("SELECT COUNT(log_id) FROM $table_name WHERE $where_sql"); $total_pages = ceil($total_items / $per_page); $offset = ($current_page - 1) * $per_page; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $logs = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE $where_sql ORDER BY " . esc_sql($orderby) . " " . esc_sql($order) . " LIMIT %d OFFSET %d", $per_page, $offset), ARRAY_A); ?>
plugin->render_per_page_selector($per_page); ?>
add_query_arg([ 'paged' => '%#%', 's' => $search_term, 'advaipbl_per_page' => $per_page, ]), 'format' => '', 'total' => $total_pages, 'current' => $current_page ]); if ($page_links) { echo wp_kses_post($page_links); } ?>

plugin->print_log_sortable_header(__('Date/Time', 'advanced-ip-blocker'), 'timestamp', $orderby, $order); ?> plugin->print_log_sortable_header(__('IP Address', 'advanced-ip-blocker'), 'ip', $orderby, $order); ?>
'; foreach ($details['due_hooks'] as $hook) { echo '
  • ' . esc_html($hook) . '
  • '; } echo ''; } else { echo '-'; } ?>


    '; } else { $now = time(); foreach ($crons as $timestamp => $hooks) { foreach ($hooks as $hook => $events) { foreach ($events as $sig => $event) { $schedule = $event['schedule'] ? $event['schedule'] : __('Non-repeating', 'advanced-ip-blocker'); $time_diff = $timestamp - $now; if ($time_diff < 0) { $next_run = '' . __('Now (Pending)', 'advanced-ip-blocker') . ''; } else { $next_run = human_time_diff($now, $timestamp) . ' ' . __('from now', 'advanced-ip-blocker'); } echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; } } } } ?>
    ' . esc_html__('No scheduled cron events found.', 'advanced-ip-blocker') . '
    ' . esc_html($hook) . '' . wp_kses_post($next_run) . '
    ' . esc_html(ADVAIPBL_Main::get_formatted_datetime($timestamp)) . '
    ' . esc_html($schedule) . '
    plugin->options['geolocation_provider'] ?? ''; $is_compatible = in_array($provider, ['ip-api.com', 'ipinfo.io'], true); $is_spamhaus_enabled = !empty($this->plugin->options['enable_spamhaus_asn']); $is_manual_enabled = !empty($this->plugin->options['enable_manual_asn']); $settings_url = admin_url('admin.php?page=advaipbl_settings_page-settings'); $spamhaus_stats = $this->plugin->dashboard_manager->get_spamhaus_stats(); ?>

    Warning: Your current geolocation provider (%1$s) does not support ASN lookups. This feature is fully supported by ip-api.com and ipinfo.io. Please change your provider to use ASN blocking.', 'advanced-ip-blocker'), ['strong' => [], 'a' => ['href' => []]] ), esc_html($provider), esc_url($settings_url) ); ?>




    prefix . 'advaipbl_malicious_signatures'; $is_enabled = !empty($this->plugin->options['enable_signature_blocking']); $settings_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=general_settings#section-signature_engine'); ?>

    %s', $is_enabled ? 'enabled' : 'disabled', $is_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); printf( wp_kses( /* translators: %s is a placeholder */ __('The Attack Signature Blocking system is currently %1$s. You can change this in the Settings.', 'advanced-ip-blocker'), [ 'span' => ['class' => true], 'a' => ['href' => []] ] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $status_tag, esc_url($settings_url) ); ?>

    get_var("SELECT COUNT(id) FROM {$table_name}"); $total_pages = ceil($total_items / $per_page); $offset = ($current_page - 1) * $per_page; $query = "SELECT * FROM {$table_name} ORDER BY " . esc_sql($orderby) . " " . esc_sql($order) . " LIMIT %d OFFSET %d"; // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $items = $wpdb->get_results($wpdb->prepare($query, $per_page, $offset), ARRAY_A); ?>

    plugin->render_per_page_selector($per_page); ?>
    add_query_arg('paged', '%#%'), 'format' => '', 'total' => $total_pages, 'current' => $current_page]); if ($page_links) { echo wp_kses_post($page_links); } ?>

    plugin->print_log_sortable_header(__('Signature Hash', 'advanced-ip-blocker'), 'signature_hash', $orderby, $order); ?> plugin->print_log_sortable_header(__('Reason', 'advanced-ip-blocker'), 'reason', $orderby, $order); ?> plugin->print_log_sortable_header(__('Last Seen', 'advanced-ip-blocker'), 'last_seen', $orderby, $order); ?> plugin->print_log_sortable_header(__('Expires In', 'advanced-ip-blocker'), 'expires_at', $orderby, $order); ?>

    prefix . 'advaipbl_endpoint_lockdowns'; $lockdown_endpoints = [ 'xmlrpc' => [ 'name' => 'XML-RPC', 'option' => 'enable_xmlrpc_lockdown', 'anchor' => '#sub-section-xmlrpc-lockdown' ], 'login' => [ 'name' => 'Login Page (wp-login.php)', 'option' => 'enable_login_lockdown', 'anchor' => '#sub-section-login-lockdown' ], '404' => [ 'name' => '404 Errors', 'option' => 'enable_404_lockdown', 'anchor' => '#section-blocking_rules' ], '403' => [ 'name' => '403 Errors', 'option' => 'enable_403_lockdown', 'anchor' => '#section-blocking_rules' ], ]; $settings_base_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=general_settings'); $status_parts = []; foreach ($lockdown_endpoints as $key => $details) { $is_enabled = !empty($this->plugin->options[$details['option']]); $status_tag = sprintf( '%s', $is_enabled ? 'enabled' : 'disabled', $is_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); $settings_link = sprintf( '%s', esc_url($settings_base_url . $details['anchor']), esc_html__('Configure', 'advanced-ip-blocker') ); $status_parts[] = sprintf('%1$s: %2$s (%3$s)', esc_html($details['name']), $status_tag, $settings_link); } ?>

    [], 'span' => ['class' => true], 'a' => ['href' => true], ]); ?>

    query($wpdb->prepare("DELETE FROM {$table_name} WHERE expires_at <= %d", time())); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $items = $wpdb->get_results("SELECT * FROM {$table_name} ORDER BY created_at DESC", ARRAY_A); ?>


    'advaipbl_delete_lockdown', 'lockdown_id' => $item['id'] ]), 'advaipbl_delete_lockdown_' . $item['id'] ); ?>
    plugin->options['enable_waf']); $settings_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=general_settings#sub-section-waf'); ?>

    %s', $is_enabled ? 'enabled' : 'disabled', $is_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); printf( wp_kses( /* translators: %s is a placeholder */ __('Web Application Firewall (WAF) is currently %1$s. You can change this in the Settings.', 'advanced-ip-blocker'), [ 'span' => ['class' => true], 'a' => ['href' => []] ] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $status_tag, esc_url($settings_url) ); ?>

    plugin->options['enable_intelligent_waf']); ?>

    %s', $is_zeroday_enabled ? 'enabled' : 'disabled', $is_zeroday_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); $sync_text = /* translators: %s is a placeholder */ __('Intelligent Zero-Day Sync is currently %1$s. You can change this in the Settings.', 'advanced-ip-blocker'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped printf( wp_kses( $sync_text, [ 'span' => ['class' => true], 'a' => ['href' => []] ] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $zeroday_status_tag, esc_url($settings_url) ); ?>


    plugin->options = get_option(ADVAIPBL_Main::OPTION_SETTINGS); $sections = [ 'general' => __('General', 'advanced-ip-blocker'), 'notifications' => __('Notifications', 'advanced-ip-blocker'), 'htaccess' => __('Server Firewall (.htaccess)', 'advanced-ip-blocker'), 'cloudflare' => __('Cloud Edge Defense', 'advanced-ip-blocker'), 'ip_detection' => __('IP Detection', 'advanced-ip-blocker'), 'geolocation' => __('Geolocation', 'advanced-ip-blocker'), 'threat_intelligence' => __('Threat Intelligence', 'advanced-ip-blocker'), 'hardening' => __('Hardening & Core Protection', 'advanced-ip-blocker'), 'protections' => __('Core Protections', 'advanced-ip-blocker'), 'blocking_rules' => __('Threshold Blocking', 'advanced-ip-blocker'), 'ip_trust' => __('IP Trust & Scoring', 'advanced-ip-blocker'), 'login_protection' => __('Login Protection', 'advanced-ip-blocker'), 'captcha_integrations' => __('Captcha Integrations', 'advanced-ip-blocker'), 'signature_engine' => __('Signature Engine', 'advanced-ip-blocker'), 'internal_security' => __('Internal Security', 'advanced-ip-blocker'), 'uninstall' => __('Uninstallation', 'advanced-ip-blocker'), ]; $community_stats = $this->plugin->community_manager->get_stats(); $list_count = $community_stats['count'] ?? 0; $last_update = $community_stats['last_update'] ?? 0; ?>

    '; echo '' . esc_html__('Compatibility Warning:', 'advanced-ip-blocker') . ' '; echo esc_html__('Your server appears to be running Nginx independently. Nginx does NOT support .htaccess files. Enabling these options will write to the file, but the server will likely ignore them.', 'advanced-ip-blocker'); echo '

    '; } ?>

    plugin->htaccess_manager->is_writable()) : ?>

    X-Forwarded-For if the request comes from one of these IPs, preventing IP spoofing.', 'advanced-ip-blocker'); ?>

    free API key is required.', 'advanced-ip-blocker'), ['a' => ['href' => [], 'target' => []]] ), 'https://www.abuseipdb.com/pricing' ); ?>

    plugin->options['enable_community_blocking'])) : ?>
    0 && $last_update > 0) { printf( wp_kses( /* translators: %s is a placeholder */ __('Blocking %1$s known malicious IPs. Updated %2$s ago.', 'advanced-ip-blocker'), [ 'strong' => [] ] ), '' . esc_html(number_format_i18n($list_count)) . '', esc_html(human_time_diff($last_update)) ); } elseif ($list_count > 0) { printf( wp_kses( /* translators: %s is a placeholder */ __('Blocking %1$s known malicious IPs. Waiting for sync...', 'advanced-ip-blocker'), [ 'strong' => [] ] ), '' . esc_html(number_format_i18n($list_count)) . '' ); } else { esc_html_e('Waiting for initial download...', 'advanced-ip-blocker'); } ?>

    plugin->options['allow_telemetry'])) : $telemetry_setting_id = 'advaipbl_allow_telemetry'; ?>

    Enable anonymous usage tracking.', 'advanced-ip-blocker'), ['a' => ['href' => []]]), '#' . esc_attr($telemetry_setting_id)); ?>

    plugin->options['enable_2fa']); $settings_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=general_settings#sub-section-2FA'); $profile_url = admin_url('profile.php'); ?>

    %s', $is_enabled ? 'enabled' : 'disabled', $is_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); printf( wp_kses( /* translators: %s is a placeholder */ __('Two-Factor Authentication (2FA) is currently %1$s. You can change this in the Settings. When enabled, users will see the 2FA setup section in their Profile.', 'advanced-ip-blocker'), [ 'span' => ['class' => true], 'a' => ['href' => true], ] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $status_tag, esc_url($settings_url), esc_url($profile_url) ); ?>

    process_bulk_action(); $users_list_table->prepare_items(); ?>


    views(); ?>
    search_box(__('Search Users', 'advanced-ip-blocker'), 'user'); $users_list_table->display(); ?>
    plugin->options['enable_user_agent_blocking']); $settings_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=general_settings#sub-section-user-agent'); ?>

    %s', $is_enabled ? 'enabled' : 'disabled', $is_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); printf( wp_kses( /* translators: %s is a placeholder */ __('User-Agent Protection is currently %1$s. You can change this in the Settings.', 'advanced-ip-blocker'), [ 'span' => ['class' => true], 'a' => ['href' => []] ] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $status_tag, esc_url($settings_url) ); ?>


    plugin->options['enable_honeypot_blocking']); $settings_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=general_settings#sub-section-honeypot'); ?>

    %s', $is_enabled ? 'enabled' : 'disabled', $is_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); printf( wp_kses( /* translators: %s is a placeholder */ __('Honeypot Protection is currently %1$s. You can change this in the Settings.', 'advanced-ip-blocker'), [ 'span' => ['class' => true], 'a' => ['href' => []] ] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $status_tag, esc_url($settings_url) ); ?>

    /blog/ or /contact/). Use attack-specific patterns.', 'advanced-ip-blocker')); ?>


    prefix . 'advaipbl_blocked_ips'; // phpcs:disable WordPress.Security.NonceVerification.Recommended $filter_type = isset($_GET['filter_type']) ? sanitize_key($_GET['filter_type']) : 'all'; $search_term = isset($_GET['s']) ? sanitize_text_field(wp_unslash($_GET['s'])) : ''; $orderby = isset($_GET['orderby']) && in_array($_GET['orderby'], ['ip_range', 'block_type', 'timestamp'], true) ? sanitize_key($_GET['orderby']) : 'timestamp'; $order = isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'], true) ? strtolower(sanitize_key($_GET['order'])) : 'desc'; $current_page = isset($_GET['paged']) ? absint($_GET['paged']) : 1; $per_page = isset($_GET['advaipbl_per_page']) ? absint($_GET['advaipbl_per_page']) : 20; $offset = ($current_page - 1) * $per_page; $where_clauses = []; if ('all' !== $filter_type) { $where_clauses[] = $wpdb->prepare("block_type = %s", $filter_type); } if (!empty($search_term)) { $search_like = '%' . $wpdb->esc_like($search_term) . '%'; $where_clauses[] = $wpdb->prepare("ip_range LIKE %s", $search_like); } $where_sql = !empty($where_clauses) ? 'WHERE ' . implode(' AND ', $where_clauses) : ''; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $total_items = $wpdb->get_var("SELECT COUNT(id) FROM {$table_name} {$where_sql}"); $total_pages = ceil($total_items / $per_page); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $items_for_page = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$table_name} {$where_sql} ORDER BY " . esc_sql($orderby) . " " . esc_sql($order) . " LIMIT %d OFFSET %d", $per_page, $offset), ARRAY_A); $ips_and_ranges_on_page = wp_list_pluck($items_for_page, 'ip_range'); $single_ips_on_page = array_filter($ips_and_ranges_on_page, function ($entry) { return filter_var($entry, FILTER_VALIDATE_IP); }); $locations = !empty($single_ips_on_page) ? $this->plugin->session_manager->get_cached_locations($single_ips_on_page) : []; $definitions = $this->plugin->get_all_block_type_definitions(); ?>

    plugin->render_per_page_selector($per_page); ?>
    add_query_arg(['paged' => '%#%', 'filter_type' => $filter_type, 's' => $search_term, 'advaipbl_per_page' => $per_page]), 'format' => '', 'total' => $total_pages, 'current' => $current_page]); if ($page_links) { echo wp_kses_post($page_links); } ?>


    plugin->print_sortable_header(__('IP', 'advanced-ip-blocker'), 'ip_range', $orderby, $order); ?> plugin->print_sortable_header(__('Block Type', 'advanced-ip-blocker'), 'block_type', $orderby, $order); ?> plugin->print_sortable_header(__('Since', 'advanced-ip-blocker'), 'timestamp', $orderby, $order); ?>
    31536000) { esc_html_e('Permanent', 'advanced-ip-blocker'); } else { $duration_minutes = round($duration_seconds / 60); printf( /* translators: %s is a placeholder */ esc_html__('%d minutes', 'advanced-ip-blocker'), (int) $duration_minutes ); } } ?> '; } } else { esc_html_e('Not available', 'advanced-ip-blocker'); } ?> 'advaipbl_unblock_ip', 'ip' => $block['ip_range']]), 'advaipbl_unblock_ip' ); ?>

    $data) { if (is_array($data) && isset($data['timestamp'])) { $table_data[] = [ 'ip' => $ip, 'timestamp' => $data['timestamp'], 'detail' => $data['detail'] ?? '' ]; } elseif (is_numeric($data)) { $table_data[] = [ 'ip' => $ip, 'timestamp' => $data, 'detail' => __('Migrated from old format', 'advanced-ip-blocker') ]; } } } // phpcs:disable WordPress.Security.NonceVerification.Recommended $sortable_columns = ['ip', 'timestamp', 'detail']; $orderby = isset($_GET['orderby']) && in_array($_GET['orderby'], $sortable_columns, true) ? sanitize_key($_GET['orderby']) : 'timestamp'; $order = isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'], true) ? strtolower(sanitize_key($_GET['order'])) : 'desc'; usort($table_data, function ($a, $b) use ($orderby, $order) { $a_val = $a[$orderby] ?? ''; $b_val = $b[$orderby] ?? ''; if ($a_val == $b_val) { return 0; } return ($order === 'asc') ? strnatcasecmp((string)$a_val, (string)$b_val) : strnatcasecmp((string)$b_val, (string)$a_val); }); // phpcs:ignore WordPress.Security.NonceVerification.Recommended $current_page = isset($_GET['paged']) ? absint($_GET['paged']) : 1; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $per_page = isset($_GET['advaipbl_per_page']) ? absint($_GET['advaipbl_per_page']) : 20; $total_items = count($table_data); $total_pages = ceil($total_items / $per_page); $items_for_page = array_slice($table_data, ($current_page - 1) * $per_page, $per_page); $ips_on_page = wp_list_pluck($items_for_page, 'ip'); $locations = $this->plugin->session_manager->get_cached_locations($ips_on_page); ?>

    plugin->render_per_page_selector($per_page); ?>
    add_query_arg('paged', '%#%'), 'format' => '', 'total' => $total_pages, 'current' => $current_page]); if ($page_links) { echo wp_kses_post($page_links); } ?>


    plugin->print_log_sortable_header(__('IP / Location', 'advanced-ip-blocker'), 'ip', $orderby, $order); ?> plugin->print_log_sortable_header(__('User', 'advanced-ip-blocker'), 'user', $orderby, $order); ?> plugin->print_log_sortable_header(__('Details', 'advanced-ip-blocker'), 'detail', $orderby, $order); ?> plugin->print_log_sortable_header(__('Added Since', 'advanced-ip-blocker'), 'timestamp', $orderby, $order); ?>
    ' . esc_html(implode(', ', $location_parts)) . ''; } ?> ' . esc_html($matches[1]) . ''; echo '
    ' . esc_html($matches[2]) . ''; } ?>
    0 ? esc_html(ADVAIPBL_Main::get_formatted_datetime($item['timestamp'])) : '...'; ?>

    display_log_table_generic($security_log_types, ['critical', 'warning'], null, null, true); } /** * Displays the unified challenges tab. */ public function display_challenge_log_tab() { $challenge_log_types = [ 'under_attack_challenge', 'abuseipdb_challenge', 'aib_network_challenge', 'signature_challenge', 'endpoint_challenge', 'geo_challenge', 'rate_limit_challenge', 'advanced_rule_challenge' ]; $this->display_log_table_generic($challenge_log_types, ['warning', 'info'], __('Challenge Logs', 'advanced-ip-blocker'), 'challenge_log', true); } /** * Displays the general logs tab (audit), restored to its original format. */ public function display_general_log_tab() { if (empty($this->plugin->options['enable_logging'])) { echo '

    ' . esc_html__('General event logging is disabled in the "Settings" tab.', 'advanced-ip-blocker') . '

    '; return; } // phpcs:disable WordPress.Security.NonceVerification.Recommended // phpcs:disable WordPress.Security.NonceVerification.Recommended $search_term = isset($_GET['s']) ? sanitize_text_field(wp_unslash($_GET['s'])) : ''; $orderby = isset($_GET['orderby']) && in_array($_GET['orderby'], ['timestamp', 'level', 'ip', 'message'], true) ? sanitize_key($_GET['orderby']) : 'timestamp'; $order = isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'], true) ? strtolower(sanitize_key($_GET['order'])) : 'desc'; $current_page = isset($_GET['paged']) ? absint($_GET['paged']) : 1; $per_page = isset($_GET['advaipbl_per_page']) ? absint($_GET['advaipbl_per_page']) : 25; global $wpdb; $table_name = $wpdb->prefix . 'advaipbl_logs'; $where_clauses = [$wpdb->prepare("log_type = %s", 'general')]; if (!empty($search_term)) { $search_like = '%' . $wpdb->esc_like($search_term) . '%'; $where_clauses[] = $wpdb->prepare("(ip LIKE %s OR message LIKE %s)", $search_like, $search_like); } $where_sql = implode(' AND ', $where_clauses); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $total_items = $wpdb->get_var("SELECT COUNT(log_id) FROM $table_name WHERE $where_sql"); $total_pages = ceil($total_items / $per_page); $offset = ($current_page - 1) * $per_page; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $logs = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE $where_sql ORDER BY " . esc_sql($orderby) . " " . esc_sql($order) . " LIMIT %d OFFSET %d", $per_page, $offset), ARRAY_A); ?>

    plugin->render_per_page_selector($per_page); ?>
    add_query_arg('paged', '%#%'), 'format' => '', 'total' => $total_pages, 'current' => $current_page]); if ($page_links) { echo wp_kses_post($page_links); } ?>

    plugin->print_log_sortable_header(__('Date/Time', 'advanced-ip-blocker'), 'timestamp', $orderby, $order); ?> plugin->print_log_sortable_header(__('Level', 'advanced-ip-blocker'), 'level', $orderby, $order); ?> plugin->print_log_sortable_header(__('IP', 'advanced-ip-blocker'), 'ip', $orderby, $order); ?> plugin->print_log_sortable_header(__('Message', 'advanced-ip-blocker'), 'message', $orderby, $order); ?>
    prefix . 'advaipbl_ip_scores'; $is_enabled = !empty($this->plugin->options['enable_threat_scoring']); $settings_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=general_settings#section-ip_trust'); ?>

    %s', $is_enabled ? 'enabled' : 'disabled', $is_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); printf( wp_kses( /* translators: %s is a placeholder */ __('The Threat Scoring System is currently %1$s. You can change this in the Settings.', 'advanced-ip-blocker'), [ 'span' => ['class' => true], 'a' => ['href' => []] ] ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped $status_tag, esc_url($settings_url) ); ?>

    0"]; if (!empty($search_term)) { $where_clauses[] = $wpdb->prepare("ip LIKE %s", '%' . $wpdb->esc_like($search_term) . '%'); } $where_sql = implode(' AND ', $where_clauses); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $total_items = $wpdb->get_var("SELECT COUNT(id) FROM {$table_name} WHERE {$where_sql}"); $total_pages = ceil($total_items / $per_page); $offset = ($current_page - 1) * $per_page; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $items = $wpdb->get_results($wpdb->prepare( // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared "SELECT * FROM {$table_name} WHERE {$where_sql} ORDER BY " . esc_sql($orderby) . " " . esc_sql($order) . " LIMIT %d OFFSET %d", $per_page, $offset ), ARRAY_A); $ips_on_page = wp_list_pluck($items, 'ip'); $locations = $this->plugin->session_manager->get_cached_locations($ips_on_page); $threshold = (int) ($this->plugin->options['threat_score_threshold'] ?? 100); ?>

    plugin->render_per_page_selector($per_page); ?>
    add_query_arg('paged', '%#%'), 'format' => '', 'total' => $total_pages, 'current' => $current_page]); if ($page_links) { echo wp_kses_post($page_links); } ?>

    plugin->print_log_sortable_header(__('IP / Location', 'advanced-ip-blocker'), 'ip', $orderby, $order); ?> plugin->print_log_sortable_header(__('Current Score', 'advanced-ip-blocker'), 'score', $orderby, $order); ?> plugin->print_log_sortable_header(__('Last Activity', 'advanced-ip-blocker'), 'last_event_timestamp', $orderby, $order); ?>
    ' . esc_html(trim("$city, $country", ', ')) . ''; } ?> 0 ? min(100, ($item['score'] / $threshold) * 100) : 100; $progress_color = $score_percentage > 80 ? '#dc3232' : ($score_percentage > 50 ? '#f59e0b' : '#0073aa'); ?>

    ' . esc_html(ucfirst(str_replace('_', ' ', $last_event['event']))) . ''; echo ' (+ ' . esc_html($last_event['points']) . ' ' . esc_html__('points', 'advanced-ip-blocker') . ')'; } ?>
    __('General System Event Log', 'advanced-ip-blocker'), 'wp_cron' => __('WP-Cron Execution Log', 'advanced-ip-blocker'), ]; $title = $titles[$log_types] ?? ucfirst($log_types) . ' Log'; $current_sub_tab = ($log_types === 'general') ? 'general_log' : $log_types . '_logs'; } // phpcs:disable WordPress.Security.NonceVerification.Recommended $search_term = isset($_GET['s']) ? sanitize_text_field(wp_unslash($_GET['s'])) : ''; $orderby = isset($_GET['orderby']) && in_array($_GET['orderby'], ['timestamp', 'ip', 'log_type', 'message'], true) ? sanitize_key($_GET['orderby']) : 'timestamp'; $order = isset($_GET['order']) && in_array(strtolower($_GET['order']), ['asc', 'desc'], true) ? strtolower(sanitize_key($_GET['order'])) : 'desc'; $current_page = isset($_GET['paged']) ? absint($_GET['paged']) : 1; $per_page = isset($_GET['advaipbl_per_page']) ? absint($_GET['advaipbl_per_page']) : 20; $hide_community = isset($_GET['hide_community']) && $_GET['hide_community'] === '1'; global $wpdb; $table_name = $wpdb->prefix . 'advaipbl_logs'; $where_clauses = []; $level_placeholders = implode(', ', array_fill(0, count($levels_to_show), '%s')); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare $where_clauses[] = $wpdb->prepare("level IN ({$level_placeholders})", ...$levels_to_show); if ($is_unified_log) { $types_to_query = ($current_filter !== 'all' && in_array($current_filter, $log_types)) ? [$current_filter] : $log_types; if (!empty($types_to_query)) { $placeholders = implode(', ', array_fill(0, count($types_to_query), '%s')); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare $where_clauses[] = $wpdb->prepare("log_type IN ({$placeholders})", ...$types_to_query); } } else { $where_clauses[] = $wpdb->prepare("log_type = %s", $log_types); } if (!empty($search_term)) { $search_like = '%' . $wpdb->esc_like($search_term) . '%'; $where_clauses[] = $wpdb->prepare("(ip LIKE %s OR details LIKE %s OR message LIKE %s)", $search_like, $search_like, $search_like); } if ($is_unified_log && $hide_community && $current_filter !== 'aib_network') { $where_clauses[] = "log_type != 'aib_network'"; } $where_sql = implode(' AND ', $where_clauses); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $total_items = $wpdb->get_var("SELECT COUNT(log_id) FROM $table_name WHERE $where_sql"); $total_pages = ceil($total_items / $per_page); $offset = ($current_page - 1) * $per_page; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $logs = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table_name WHERE $where_sql ORDER BY " . esc_sql($orderby) . " " . esc_sql($order) . " LIMIT %d OFFSET %d", $per_page, $offset), ARRAY_A); ?>

    plugin->render_per_page_selector($per_page); ?>
    add_query_arg('paged', '%#%'), 'format' => '', 'total' => $total_pages, 'current' => $current_page]); if ($page_links) { echo wp_kses_post($page_links); } ?>

    plugin->print_log_sortable_header(__('Date/Time', 'advanced-ip-blocker'), 'timestamp', $orderby, $order); ?> plugin->print_log_sortable_header(__('IP', 'advanced-ip-blocker'), 'ip', $orderby, $order); ?> plugin->print_log_sortable_header(__('Type', 'advanced-ip-blocker'), 'log_type', $orderby, $order); ?> $entry): $details = json_decode($entry['details'], true) ?: []; $user_agent_string = $details['user_agent'] ?? 'N/A'; $log_type = $entry['log_type']; $entry_id = $entry['id'] ?? 'ray_' . substr(md5($entry['ip'] . $entry['timestamp'] . $index), 0, 16); $row_id = 'log_row_' . $index . '_' . $entry_id; ?> >
    plugin->options['duration_' . $log_type])) { $duration_minutes = (int) $this->plugin->options['duration_' . $log_type]; } $duration_text = ''; if ($duration_minutes <= 0) { $duration_text = __('Permanent', 'advanced-ip-blocker'); } else { $duration_text = sprintf(/* translators: %s is a placeholder */ esc_html__('%d min', 'advanced-ip-blocker'), $duration_minutes); } echo '
    ' . esc_html__('Blocked:', 'advanced-ip-blocker') . ' ' . esc_html($duration_text); } ?>
    |
    ' . implode(', ', $location_parts) . ''; } ?>
    plugin->get_all_block_type_definitions()[$log_type]['label'] ?? ucwords(str_replace('_', ' ', $log_type))); ?> ' . esc_html__('User:', 'advanced-ip-blocker') . ' ' . esc_html($details['username'] ?? 'N/A'); break; case 'waf': $detail_display = '' . esc_html__('Rule:', 'advanced-ip-blocker') . ' ' . esc_html($details['rule'] ?? 'N/A'); if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case 'asn': $detail_display = esc_html($details['asn_number'] ?? 'N/A') . ' (' . esc_html($details['asn_name'] ?? '') . ')'; if (!empty($details['source'])) { $detail_display .= ' - ' . __('Source:', 'advanced-ip-blocker') . ' ' . esc_html($details['source']); } if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case 'threat_score': $detail_display = esc_html($entry['message']); if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case 'advanced_rule': case 'advanced_rule_challenge': $level = $entry['level']; $rule_name_html = '' . esc_html__('Rule:', 'advanced-ip-blocker') . ' ' . esc_html($details['rule_name'] ?? 'N/A'); if ($level === 'critical') { $detail_display = $rule_name_html; } elseif ($level === 'warning') { $detail_display = $rule_name_html; } else { $points = $details['points_added'] ?? 0; $detail_display = $rule_name_html . ' (+ ' . esc_html($points) . ' ' . esc_html__('points', 'advanced-ip-blocker') . ')'; } if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case 'rate_limit_challenge': case 'under_attack_challenge': $detail_display = esc_html($entry['message']); if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case 'geo_challenge': $country_name = esc_html($details['country'] ?? 'N/A'); $detail_display = '' . esc_html__('Country:', 'advanced-ip-blocker') . ' ' . $country_name; if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case 'signature_challenge': $detail_display = esc_html($entry['message']); if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case 'signature_flagged': $hash = $details['signature_hash'] ?? 'N/A'; $short_hash = substr($hash, 0, 12) . '...'; $detail_display = '' . esc_html__('Signature:', 'advanced-ip-blocker') . ' ' . esc_html($short_hash) . ''; $detail_display .= '
    ' . esc_html($entry['message']) . ''; break; case 'endpoint_challenge': $reason = $details['reason'] ?? $entry['message']; $detail_display = '' . esc_html($reason) . ''; if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case 'login_geoblock': $detail_display = '' . esc_html($entry['message']) . ''; if (!empty($uri)) { $detail_display .= '
    ' . $uri . ''; } break; case '404': case '403': case 'honeypot': default: $detail_display = !empty($uri) ? $uri : esc_html($entry['message']); break; } if (!empty($details['panic_trigger'])) { if ($details['panic_trigger'] === 'manual') { $trigger_text = __('Manual', 'advanced-ip-blocker'); $trigger_bg = '#fef7e0'; $trigger_color = '#b08d00'; } elseif ($details['panic_trigger'] === 'automatic') { $trigger_text = __('Automatic', 'advanced-ip-blocker'); $trigger_bg = '#e6f4ea'; $trigger_color = '#1e8e3e'; } elseif ($details['panic_trigger'] === 'advanced_rule') { $trigger_text = __('Advanced Rule', 'advanced-ip-blocker'); $trigger_bg = '#e3f2fd'; $trigger_color = '#1976d2'; } else { $trigger_text = $details['panic_trigger']; $trigger_bg = '#e3f2fd'; $trigger_color = '#1976d2'; } $detail_display .= '
    ' . esc_html__('Trigger:', 'advanced-ip-blocker') . ' ' . esc_html($trigger_text) . ''; } $engine_val = $details['engine'] ?? ($details['mode'] ?? ($details['challenge_type'] ?? '')); if (!empty($engine_val) && strpos($log_type, '_challenge') !== false) { $engine_label = $engine_val; $engine_bg = '#f0f0f1'; $engine_color = '#3c434a'; switch ($engine_val) { case 'turnstile': $engine_label = 'Turnstile'; $engine_bg = '#fff3e0'; $engine_color = '#d84315'; break; case 'hcaptcha': $engine_label = 'hCaptcha'; $engine_bg = '#f3e5f5'; $engine_color = '#6a1b9a'; break; case 'js_automatic': case 'automatic': $engine_label = 'JS Automatic'; $engine_bg = '#e8f5e9'; $engine_color = '#2e7d32'; break; case 'js_managed': case 'managed': $engine_label = 'JS Managed'; $engine_bg = '#e8f5e9'; $engine_color = '#2e7d32'; break; case 'default': $engine_label = 'Global Default'; $engine_bg = '#e3f2fd'; $engine_color = '#1565c0'; break; } $detail_display .= '
    ' . esc_html__('Engine:', 'advanced-ip-blocker') . ' ' . esc_html($engine_label) . ''; } elseif (!empty($details['mode']) && strpos($log_type, '_challenge') === false) { $mode_bg = ($details['mode'] === 'automatic') ? '#e6f4ea' : '#fef7e0'; $mode_text = ($details['mode'] === 'automatic') ? '#1e8e3e' : '#b08d00'; $detail_display .= '
    ' . esc_html($details['mode']) . ''; } echo wp_kses_post($detail_display); ?>

    • Stripe
    • bc1qxfsmpqk0q7an82ckm7380pzpsea2sa294824lg
    • 0xAF8CC1B71EAbF5dffDa2aF58AEF43b2559163284

    
    # Core Help (Self-Documented)
    wp advaipbl --help
    wp advaipbl <command> --help
    
    # IP & Access Management
    wp advaipbl block <ip-or-range> [--reason=<reason>]
    wp advaipbl unblock <ip-or-range> [--all]
    wp advaipbl blocked [--type=<type>]
    wp advaipbl whitelist <add|remove|list> [<ip>]
    wp advaipbl trusted-proxy <list|add|remove> [<ip|asn>]
    
    # Threat Scoring & Signatures
    wp advaipbl score <list|get|reset|decay-run>
    wp advaipbl signature <list|delete|whitelist> [--hash=<hash>]
    wp advaipbl signature-analyze
    
    # Geolocation & ASN
    wp advaipbl geoblock <add|remove|list> [<country_code>]
    wp advaipbl asn <add|remove|list> [<asn>]
    wp advaipbl asn-whitelist <add|remove|list> [<asn>]
    wp advaipbl geo-challenge <enable|disable|add|remove|list>
    
    # WAF & Security Modules
    wp advaipbl waf <add|remove|list|exclude> [<rule>]
    wp advaipbl waf_enable / wp advaipbl waf_disable
    wp advaipbl xmlrpc_mode <enabled|smart|disabled>
    wp advaipbl spamhaus_enable / wp advaipbl spamhaus_disable
    wp advaipbl manual_asn_enable / wp advaipbl manual_asn_disable
    
    # Users, 2FA & Sessions
    wp advaipbl session <list|terminate>
    wp advaipbl tfa_status <user>
    wp advaipbl tfa_reset <user>
    
    # Scans & Monitoring
    wp advaipbl scan
    wp advaipbl fim <scan|create-baseline>
    wp advaipbl audit <list|clear>
    
    # Logs, Config & Status
    wp advaipbl status
    wp advaipbl config <get|set> [<key>] [<value>]
    wp advaipbl log <list|clear> [--type=<type>]
    wp advaipbl provider <list|set|set_key|remove_key>
    wp advaipbl cloudflare <sync|clear>
    

    plugin->get_ip_intelligence(); $server_ip = $this->plugin->get_server_ip(); $client_ip = $ip_data['visitor_ip'] ?? 'N/A'; ?>

    plugin->get_remote_addr(); $client_ip = $this->plugin->get_client_ip(); if ($remote_addr && $client_ip !== $remote_addr && filter_var($remote_addr, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { echo '

    '; echo '' . /* translators: %s is a placeholder */ esc_html__('Info:', 'advanced-ip-blocker') . ' ' . sprintf(esc_html__('It seems your site is behind a reverse proxy or CDN. Your IP is correctly detected as %1$s, while your server connects through %2$s. This is a normal and correct configuration.', 'advanced-ip-blocker'), '' . esc_html($client_ip) . '', '' . esc_html($remote_addr) . ''); echo '

    '; $has_recommendations = true; } if (! $this->plugin->get_server_ip()) { echo '

    '; echo '' . esc_html__('Warning:', 'advanced-ip-blocker') . ' ' . esc_html__('The plugin could not automatically determine your server\'s public IP. The feature that adds the server IP to the whitelist on activation will not work. Please add your server IP to the whitelist manually to prevent any issues with geoblocking or other functionalities.', 'advanced-ip-blocker'); echo '

    '; $has_recommendations = true; } $xmlrpc_plugins = $this->plugin->get_xmlrpc_dependent_plugins(); if (! empty($xmlrpc_plugins)) : ?>


    '; echo '' . esc_html__('All Clear!', 'advanced-ip-blocker') . ' ' . esc_html__('No potential configuration issues were detected.', 'advanced-ip-blocker'); echo '

    '; } ?>



    plugin->get_client_ip(); $server_ip = $this->plugin->get_server_ip(); $is_cloudflare = isset($_SERVER['HTTP_CF_CONNECTING_IP']); ?>

    plugin->options['enable_threat_scoring']); $is_geolocation_ready = !empty($this->plugin->options['geolocation_provider']); $is_cloud_sync_enabled = !empty($this->plugin->options['enable_cloud_advanced_rules']); $settings_base_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=general_settings'); $waf_settings_url = admin_url('admin.php?page=advaipbl_settings_page-settings&sub-tab=waf_settings'); $status_parts = []; $status_parts[] = sprintf( '%1$s: %3$s (%5$s)', esc_html__('Threat Scoring', 'advanced-ip-blocker'), $is_threat_scoring_enabled ? 'enabled' : 'disabled', $is_threat_scoring_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker'), esc_url($settings_base_url . '#section-ip_trust'), esc_html__('configure', 'advanced-ip-blocker') ); $status_parts[] = sprintf( '%1$s: %3$s (%5$s)', esc_html__('Geolocation', 'advanced-ip-blocker'), $is_geolocation_ready ? 'enabled' : 'disabled', $is_geolocation_ready ? esc_html__('Ready', 'advanced-ip-blocker') : esc_html__('Not Configured', 'advanced-ip-blocker'), esc_url($settings_base_url . '#section-geolocation'), esc_html__('configure', 'advanced-ip-blocker') ); $status_parts[] = sprintf( '%1$s: %3$s (%5$s)', esc_html__('Cloud Sync', 'advanced-ip-blocker'), $is_cloud_sync_enabled ? 'enabled' : 'disabled', $is_cloud_sync_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Deactivated', 'advanced-ip-blocker'), esc_url($waf_settings_url . '#sub-section-waf'), esc_html__('configure', 'advanced-ip-blocker') ); ?>


    ', $status_parts), [ 'strong' => [], 'span' => ['class' => true], 'a' => ['href' => []], 'br' => [] ]); ?>

    plugin->site_scanner->run_local_scan(); $get_icon = function ($status) { switch ($status) { case 'good': return ''; case 'warning': return ''; case 'critical': return ''; default: return ''; } }; ?>

    PHP Version
    Database
    SSL (HTTPS)

    Version
    Debug Mode

    0) : ?>
      $data) { if ($count >= 5) { echo '
    • ...and more
    • '; break; } $name = $slug; echo '
    • ' . esc_html($slug) . '
    • '; $count++; } ?>

    $theme) : ?>
    ' . esc_html__('Parent Theme', 'advanced-ip-blocker') . ''; } elseif ($theme['is_active'] && !$theme['is_parent'] && $theme['is_active']) { echo esc_html__('Standard / Child', 'advanced-ip-blocker'); } else { echo esc_html__('Inactive', 'advanced-ip-blocker'); } ?>

    ' . esc_html__('You do not have permission to view this log.', 'advanced-ip-blocker') . '

    '; return; } $is_enabled = !empty($this->plugin->options['enable_audit_log']) && '1' === $this->plugin->options['enable_audit_log']; $settings_url = admin_url('admin.php?page=advaipbl_settings_page&tab=settings&sub-tab=general_settings#section-internal_security'); ?>

    %s', $is_enabled ? 'enabled' : 'disabled', $is_enabled ? esc_html__('Active', 'advanced-ip-blocker') : esc_html__('Inactive', 'advanced-ip-blocker') ); printf( wp_kses( /* translators: %s is a placeholder */ __('Activity Logging is currently %1$s. You can configure this feature in the Settings tab.', 'advanced-ip-blocker'), ['a' => ['href' => []], 'span' => ['class' => []]] ), wp_kses_post($status_tag), esc_url($settings_url) ); ?>

    prefix . 'advaipbl_activity_log'; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) { $logs = []; $total_items = 0; $total_pages = 0; } else { $logs = $this->plugin->audit_logger->get_logs($per_page, $offset); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, PluginCheck.Security.DirectDB.UnescapedDBParameter $total_items = $wpdb->get_var("SELECT COUNT(id) FROM $table_name"); $total_pages = ceil($total_items / $per_page); } ?>
    add_query_arg('paged', '%#%'), 'format' => '', 'total' => $total_pages, 'current' => $current_page ]); if ($page_links) { echo wp_kses_post($page_links); } ?>

    user_login : __('System/Guest', 'advanced-ip-blocker'); $details = json_decode($log['details'], true); $formatted_details = $details ? '
    ' . esc_html(json_encode($details, JSON_PRETTY_PRINT)) . '
    ' : ''; ?>

    (ID: )

    plugin->options; $fim_raw = !isset($opts['fim_enable_raw']) || !empty($opts['fim_enable_raw']); $fim_regex = !empty($opts['fim_enable_regex']); $fim_domains = !isset($opts['fim_enable_domains']) || !empty($opts['fim_enable_domains']); $fim_md5 = !isset($opts['fim_enable_md5']) || !empty($opts['fim_enable_md5']); $fim_sha256 = !empty($opts['fim_enable_sha256']); $render_status = function ($is_active, $label) { $icon = $is_active ? 'yes-alt' : 'dismiss'; $color = $is_active ? '#46b450' : '#dc3232'; return ' ' . esc_html($label) . ''; }; ?>