Plugin Directory

Changeset 3483103


Ignore:
Timestamp:
03/15/2026 01:16:49 PM (3 weeks ago)
Author:
jerryscg
Message:

Release 2.1.6

Location:
vulntitan/trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • vulntitan/trunk/CHANGELOG.md

    r3483084 r3483103  
    55The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
    66and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
     7
     8## [2.1.6] - 2026-03-15
     9### Added
     10- Added scan progress status notes that highlight the current component or file during Malware, Vulnerability, and Integrity scans.
    711
    812## [2.1.5] - 2026-03-15
  • vulntitan/trunk/assets/css/admin.css

    r3483084 r3483103  
    20182018}
    20192019
     2020#vulntitan-scan-progress-bar-container {
     2021    height: auto;
     2022    overflow: visible;
     2023}
     2024
     2025.vulntitan-scan-progress-note {
     2026    margin-top: 8px;
     2027    font-size: 12px;
     2028    color: #93c5fd;
     2029    letter-spacing: 0.02em;
     2030    display: none;
     2031}
     2032
    20202033.vulntitan-integrity-legend-grid {
    20212034    display: grid;
  • vulntitan/trunk/assets/css/admin.min.css

    r3483084 r3483103  
    20182018}
    20192019
     2020#vulntitan-scan-progress-bar-container {
     2021    height: auto;
     2022    overflow: visible;
     2023}
     2024
     2025.vulntitan-scan-progress-note {
     2026    margin-top: 8px;
     2027    font-size: 12px;
     2028    color: #93c5fd;
     2029    letter-spacing: 0.02em;
     2030    display: none;
     2031}
     2032
    20202033.vulntitan-integrity-legend-grid {
    20212034    display: grid;
  • vulntitan/trunk/assets/js/integrity-scanner.js

    r3482704 r3483103  
    2020        const $resultsList = $('#vulntitan-scan-results');
    2121        const $progressBarContainer = $('#vulntitan-scan-progress-bar-container');
     22        const $progressNote = $('#vulntitan-scan-progress-note');
    2223        const problematicFiles = [];
    2324        const statusColors = {
     
    4445                }[m];
    4546            });
     47        }
     48
     49        function setProgressNote(text) {
     50            if (!$progressNote.length) {
     51                return;
     52            }
     53
     54            if (text) {
     55                $progressNote.text(text).show();
     56                return;
     57            }
     58
     59            $progressNote.text('').hide();
     60        }
     61
     62        function formatScanTarget(path) {
     63            if (!path) {
     64                return '';
     65            }
     66
     67            const normalized = String(path).replace(/\\/g, '/');
     68            if (normalized.indexOf('wp-config.php') !== -1) {
     69                return 'wp-config.php';
     70            }
     71
     72            const pluginRoot = 'wp-content/plugins/';
     73            const themeRoot = 'wp-content/themes/';
     74
     75            if (normalized.indexOf(pluginRoot) !== -1) {
     76                const slug = normalized.split(pluginRoot)[1].split('/')[0];
     77                if (slug) {
     78                    return `${VulnTitan.i18n.vuln_type_plugin || 'Plugin'}: ${slug}`;
     79                }
     80            }
     81
     82            if (normalized.indexOf(themeRoot) !== -1) {
     83                const slug = normalized.split(themeRoot)[1].split('/')[0];
     84                if (slug) {
     85                    return `${VulnTitan.i18n.vuln_type_theme || 'Theme'}: ${slug}`;
     86                }
     87            }
     88
     89            const basename = normalized.split('/').pop();
     90            return basename || normalized;
    4691        }
    4792
     
    225270        $('#vulntitan-scan-progress-bar').css('width', '0%');
    226271        $('#vulntitan-scan-progress-text').text('0%');
     272        setProgressNote(VulnTitan.i18n.preparing || 'Preparing...');
    227273        $resultsList.html(`<p>${VulnTitan.i18n.preparing}</p>`);
    228274
     
    281327                            consecutiveFailures = 0;
    282328                            const batchCount = res.data.results.length;
     329                            const scanPrefix = VulnTitan.i18n.scanning || 'Scanning';
     330
     331                            if (batchCount) {
     332                                const lastResult = res.data.results[batchCount - 1];
     333                                const lastLabel = formatScanTarget(lastResult.file_path || '');
     334                                if (lastLabel) {
     335                                    setProgressNote(`${scanPrefix}: ${lastLabel}`);
     336                                }
     337                            }
    283338
    284339                            res.data.results.forEach(result => {
     
    328383                        if (res.data.done) {
    329384                            $('#vulntitan-scan-progress-text').text(VulnTitan.i18n.scan_finished);
     385                            setProgressNote(VulnTitan.i18n.scan_finished || 'Scan finished.');
    330386                            renderProblematicFiles();
    331387                            resetUI();
     
    361417            $btnMlw.prop('disabled', false);
    362418            $progressBarContainer.hide();
     419            setProgressNote('');
    363420        }
    364421    });
  • vulntitan/trunk/assets/js/integrity-scanner.min.js

    r3482704 r3483103  
    2020        const $resultsList = $('#vulntitan-scan-results');
    2121        const $progressBarContainer = $('#vulntitan-scan-progress-bar-container');
     22        const $progressNote = $('#vulntitan-scan-progress-note');
    2223        const problematicFiles = [];
    2324        const statusColors = {
     
    4445                }[m];
    4546            });
     47        }
     48
     49        function setProgressNote(text) {
     50            if (!$progressNote.length) {
     51                return;
     52            }
     53
     54            if (text) {
     55                $progressNote.text(text).show();
     56                return;
     57            }
     58
     59            $progressNote.text('').hide();
     60        }
     61
     62        function formatScanTarget(path) {
     63            if (!path) {
     64                return '';
     65            }
     66
     67            const normalized = String(path).replace(/\\/g, '/');
     68            if (normalized.indexOf('wp-config.php') !== -1) {
     69                return 'wp-config.php';
     70            }
     71
     72            const pluginRoot = 'wp-content/plugins/';
     73            const themeRoot = 'wp-content/themes/';
     74
     75            if (normalized.indexOf(pluginRoot) !== -1) {
     76                const slug = normalized.split(pluginRoot)[1].split('/')[0];
     77                if (slug) {
     78                    return `${VulnTitan.i18n.vuln_type_plugin || 'Plugin'}: ${slug}`;
     79                }
     80            }
     81
     82            if (normalized.indexOf(themeRoot) !== -1) {
     83                const slug = normalized.split(themeRoot)[1].split('/')[0];
     84                if (slug) {
     85                    return `${VulnTitan.i18n.vuln_type_theme || 'Theme'}: ${slug}`;
     86                }
     87            }
     88
     89            const basename = normalized.split('/').pop();
     90            return basename || normalized;
    4691        }
    4792
     
    225270        $('#vulntitan-scan-progress-bar').css('width', '0%');
    226271        $('#vulntitan-scan-progress-text').text('0%');
     272        setProgressNote(VulnTitan.i18n.preparing || 'Preparing...');
    227273        $resultsList.html(`<p>${VulnTitan.i18n.preparing}</p>`);
    228274
     
    281327                            consecutiveFailures = 0;
    282328                            const batchCount = res.data.results.length;
     329                            const scanPrefix = VulnTitan.i18n.scanning || 'Scanning';
     330
     331                            if (batchCount) {
     332                                const lastResult = res.data.results[batchCount - 1];
     333                                const lastLabel = formatScanTarget(lastResult.file_path || '');
     334                                if (lastLabel) {
     335                                    setProgressNote(`${scanPrefix}: ${lastLabel}`);
     336                                }
     337                            }
    283338
    284339                            res.data.results.forEach(result => {
     
    328383                        if (res.data.done) {
    329384                            $('#vulntitan-scan-progress-text').text(VulnTitan.i18n.scan_finished);
     385                            setProgressNote(VulnTitan.i18n.scan_finished || 'Scan finished.');
    330386                            renderProblematicFiles();
    331387                            resetUI();
     
    361417            $btnMlw.prop('disabled', false);
    362418            $progressBarContainer.hide();
     419            setProgressNote('');
    363420        }
    364421    });
  • vulntitan/trunk/assets/js/malware-scanner.js

    r3482704 r3483103  
    2020        const $resultsList = $('#vulntitan-scan-results');
    2121        const $progressBarContainer = $('#vulntitan-scan-progress-bar-container');
     22        const $progressNote = $('#vulntitan-scan-progress-note');
    2223        const statusColors = {
    2324            clean: '#10b981',
     
    2728            unknown: '#94a3b8'
    2829        };
     30        const scanPrefix = VulnTitan.i18n.scanning_for_malware || VulnTitan.i18n.scanning || 'Scanning';
    2931        const stats = {
    3032            total: 0,
     
    6062        $('#vulntitan-scan-progress-bar').css('width', '0%');
    6163        $('#vulntitan-scan-progress-text').text('0%');
     64        setProgressNote(VulnTitan.i18n.preparing || 'Preparing...');
    6265        renderLayout();
    6366        updateOverview();
     
    7376                }[m];
    7477            });
     78        }
     79
     80        function setProgressNote(text) {
     81            if (!$progressNote.length) {
     82                return;
     83            }
     84
     85            if (text) {
     86                $progressNote.text(text).show();
     87                return;
     88            }
     89
     90            $progressNote.text('').hide();
     91        }
     92
     93        function formatScanTarget(path) {
     94            if (!path) {
     95                return '';
     96            }
     97
     98            const normalized = String(path).replace(/\\/g, '/');
     99            if (normalized.indexOf('wp-config.php') !== -1) {
     100                return 'wp-config.php';
     101            }
     102
     103            const pluginRoot = 'wp-content/plugins/';
     104            const themeRoot = 'wp-content/themes/';
     105
     106            if (normalized.indexOf(pluginRoot) !== -1) {
     107                const slug = normalized.split(pluginRoot)[1].split('/')[0];
     108                if (slug) {
     109                    return `${VulnTitan.i18n.vuln_type_plugin || 'Plugin'}: ${slug}`;
     110                }
     111            }
     112
     113            if (normalized.indexOf(themeRoot) !== -1) {
     114                const slug = normalized.split(themeRoot)[1].split('/')[0];
     115                if (slug) {
     116                    return `${VulnTitan.i18n.vuln_type_theme || 'Theme'}: ${slug}`;
     117                }
     118            }
     119
     120            const basename = normalized.split('/').pop();
     121            return basename || normalized;
    75122        }
    76123
     
    465512                    renderProblematicSummary();
    466513                    resetUI();
     514                    setProgressNote('');
    467515                    return;
    468516                }
     
    475523                            </div>
    476524                        `);
     525                        setProgressNote(VulnTitan.i18n.scan_finished || 'Scan finished.');
    477526                        renderProblematicSummary();
    478527                        resetUI();
     
    482531                    const batch = files.slice(currentIndex, currentIndex + batchSize);
    483532                    const $detailsList = $('#vulntitan-malware-details-list');
     533                    const scanLabel = formatScanTarget(batch[0]);
     534                    setProgressNote(scanLabel ? `${scanPrefix}: ${scanLabel}` : scanPrefix + '...');
    484535
    485536                    $.post(ajaxurl, {
     
    489540                    }, function (res) {
    490541                        if (res.success && Array.isArray(res.data.results)) {
     542                            if (res.data.results.length) {
     543                                const lastResult = res.data.results[res.data.results.length - 1];
     544                                const lastLabel = formatScanTarget(lastResult.file || '');
     545                                if (lastLabel) {
     546                                    setProgressNote(`${scanPrefix}: ${lastLabel}`);
     547                                }
     548                            }
    491549                            const scopeInfo = {
    492550                                scope: res.data.scope,
     
    551609            $btnInt.prop('disabled', false);
    552610            $progressBarContainer.hide();
     611            setProgressNote('');
    553612        }
    554613    });
  • vulntitan/trunk/assets/js/malware-scanner.min.js

    r3482704 r3483103  
    2020        const $resultsList = $('#vulntitan-scan-results');
    2121        const $progressBarContainer = $('#vulntitan-scan-progress-bar-container');
     22        const $progressNote = $('#vulntitan-scan-progress-note');
    2223        const statusColors = {
    2324            clean: '#10b981',
     
    2728            unknown: '#94a3b8'
    2829        };
     30        const scanPrefix = VulnTitan.i18n.scanning_for_malware || VulnTitan.i18n.scanning || 'Scanning';
    2931        const stats = {
    3032            total: 0,
     
    6062        $('#vulntitan-scan-progress-bar').css('width', '0%');
    6163        $('#vulntitan-scan-progress-text').text('0%');
     64        setProgressNote(VulnTitan.i18n.preparing || 'Preparing...');
    6265        renderLayout();
    6366        updateOverview();
     
    7376                }[m];
    7477            });
     78        }
     79
     80        function setProgressNote(text) {
     81            if (!$progressNote.length) {
     82                return;
     83            }
     84
     85            if (text) {
     86                $progressNote.text(text).show();
     87                return;
     88            }
     89
     90            $progressNote.text('').hide();
     91        }
     92
     93        function formatScanTarget(path) {
     94            if (!path) {
     95                return '';
     96            }
     97
     98            const normalized = String(path).replace(/\\/g, '/');
     99            if (normalized.indexOf('wp-config.php') !== -1) {
     100                return 'wp-config.php';
     101            }
     102
     103            const pluginRoot = 'wp-content/plugins/';
     104            const themeRoot = 'wp-content/themes/';
     105
     106            if (normalized.indexOf(pluginRoot) !== -1) {
     107                const slug = normalized.split(pluginRoot)[1].split('/')[0];
     108                if (slug) {
     109                    return `${VulnTitan.i18n.vuln_type_plugin || 'Plugin'}: ${slug}`;
     110                }
     111            }
     112
     113            if (normalized.indexOf(themeRoot) !== -1) {
     114                const slug = normalized.split(themeRoot)[1].split('/')[0];
     115                if (slug) {
     116                    return `${VulnTitan.i18n.vuln_type_theme || 'Theme'}: ${slug}`;
     117                }
     118            }
     119
     120            const basename = normalized.split('/').pop();
     121            return basename || normalized;
    75122        }
    76123
     
    465512                    renderProblematicSummary();
    466513                    resetUI();
     514                    setProgressNote('');
    467515                    return;
    468516                }
     
    475523                            </div>
    476524                        `);
     525                        setProgressNote(VulnTitan.i18n.scan_finished || 'Scan finished.');
    477526                        renderProblematicSummary();
    478527                        resetUI();
     
    482531                    const batch = files.slice(currentIndex, currentIndex + batchSize);
    483532                    const $detailsList = $('#vulntitan-malware-details-list');
     533                    const scanLabel = formatScanTarget(batch[0]);
     534                    setProgressNote(scanLabel ? `${scanPrefix}: ${scanLabel}` : scanPrefix + '...');
    484535
    485536                    $.post(ajaxurl, {
     
    489540                    }, function (res) {
    490541                        if (res.success && Array.isArray(res.data.results)) {
     542                            if (res.data.results.length) {
     543                                const lastResult = res.data.results[res.data.results.length - 1];
     544                                const lastLabel = formatScanTarget(lastResult.file || '');
     545                                if (lastLabel) {
     546                                    setProgressNote(`${scanPrefix}: ${lastLabel}`);
     547                                }
     548                            }
    491549                            const scopeInfo = {
    492550                                scope: res.data.scope,
     
    551609            $btnInt.prop('disabled', false);
    552610            $progressBarContainer.hide();
     611            setProgressNote('');
    553612        }
    554613    });
  • vulntitan/trunk/assets/js/vulnerability-scanner.js

    r3482704 r3483103  
    2020        const $progressBarContainer = $('#vulntitan-scan-progress-bar-container');
    2121        const $progressBar = $('#vulntitan-scan-progress-bar');
     22        const $progressNote = $('#vulntitan-scan-progress-note');
    2223        const $resultsContainer = $('#vulntitan-scan-results-container');
    2324        const items = VulnTitan.scanItems || [];
     
    7071        $progressBar.css('width', '0%');
    7172        $('#vulntitan-scan-progress-text').text('0%');
     73        setProgressNote(VulnTitan.i18n.preparing || 'Preparing...');
    7274
    7375        if (!items.length) {
     
    7577            resetUI();
    7678            $resultsContainer.removeClass('is-vulnerability-layout');
     79            setProgressNote('');
    7780            return;
    7881        }
     
    9497                }[match];
    9598            });
     99        }
     100
     101        function setProgressNote(text) {
     102            if (!$progressNote.length) {
     103                return;
     104            }
     105
     106            if (text) {
     107                $progressNote.text(text).show();
     108                return;
     109            }
     110
     111            $progressNote.text('').hide();
    96112        }
    97113
     
    396412            if (currentIndex >= total) {
    397413                updateProgress();
     414                setProgressNote(VulnTitan.i18n.scan_finished || 'Scan finished.');
    398415                $detailsList.append(`
    399416                    <article class="vulntitan-vuln-detail-item is-finished">
     
    407424            const item = items[currentIndex];
    408425            const rowId = 'scan-item-' + currentIndex;
     426            setProgressNote(`${VulnTitan.i18n.scanning || 'Scanning'}: ${componentDisplayName(item)}`);
    409427
    410428            $detailsList.append(renderDetailItem(item, {
     
    430448                    updateOverview();
    431449                    updateProgress();
     450                    setProgressNote(VulnTitan.i18n.scan_stopped || 'Scan stopped due to error.');
    432451                    resetUI();
    433452                    $detailsList.append(`
  • vulntitan/trunk/assets/js/vulnerability-scanner.min.js

    r3482704 r3483103  
    2020        const $progressBarContainer = $('#vulntitan-scan-progress-bar-container');
    2121        const $progressBar = $('#vulntitan-scan-progress-bar');
     22        const $progressNote = $('#vulntitan-scan-progress-note');
    2223        const $resultsContainer = $('#vulntitan-scan-results-container');
    2324        const items = VulnTitan.scanItems || [];
     
    7071        $progressBar.css('width', '0%');
    7172        $('#vulntitan-scan-progress-text').text('0%');
     73        setProgressNote(VulnTitan.i18n.preparing || 'Preparing...');
    7274
    7375        if (!items.length) {
     
    7577            resetUI();
    7678            $resultsContainer.removeClass('is-vulnerability-layout');
     79            setProgressNote('');
    7780            return;
    7881        }
     
    9497                }[match];
    9598            });
     99        }
     100
     101        function setProgressNote(text) {
     102            if (!$progressNote.length) {
     103                return;
     104            }
     105
     106            if (text) {
     107                $progressNote.text(text).show();
     108                return;
     109            }
     110
     111            $progressNote.text('').hide();
    96112        }
    97113
     
    396412            if (currentIndex >= total) {
    397413                updateProgress();
     414                setProgressNote(VulnTitan.i18n.scan_finished || 'Scan finished.');
    398415                $detailsList.append(`
    399416                    <article class="vulntitan-vuln-detail-item is-finished">
     
    407424            const item = items[currentIndex];
    408425            const rowId = 'scan-item-' + currentIndex;
     426            setProgressNote(`${VulnTitan.i18n.scanning || 'Scanning'}: ${componentDisplayName(item)}`);
    409427
    410428            $detailsList.append(renderDetailItem(item, {
     
    430448                    updateOverview();
    431449                    updateProgress();
     450                    setProgressNote(VulnTitan.i18n.scan_stopped || 'Scan stopped due to error.');
    432451                    resetUI();
    433452                    $detailsList.append(`
  • vulntitan/trunk/includes/Admin/Pages/Dashboard.php

    r3482704 r3483103  
    126126                                    <span id="vulntitan-scan-progress-text">0%</span>
    127127                                </div>
     128                                <div id="vulntitan-scan-progress-note" class="vulntitan-scan-progress-note" aria-live="polite"></div>
    128129                            </div>
    129130
  • vulntitan/trunk/readme.txt

    r3483090 r3483103  
    44Tested up to: 6.9
    55Requires PHP: 7.4
    6 Stable tag: 2.1.5
     6Stable tag: 2.1.6
    77License: GPLv2
    88License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    165165== Changelog ==
    166166
     167= v2.1.6 - 15 Mar, 2026 =
     168* Added scan progress status notes that highlight the current component or file during Malware, Vulnerability, and Integrity scans.
     169
    167170= v2.1.5 - 15 Mar, 2026 =
    168171* Added role-based 2FA enforcement so selected roles must enroll before using the admin dashboard, with a direct setup shortcut.
  • vulntitan/trunk/vulntitan.php

    r3483084 r3483103  
    44 * Plugin URI: https://vulntitan.com/vulntitan/
    55 * Description: VulnTitan is a WordPress security plugin with vulnerability scanning, malware detection, file integrity monitoring, comment anti-spam protection, and a built-in firewall with WAF payload rules and login protection.
    6  * Version: 2.1.5
     6 * Version: 2.1.6
    77 * Author: Jaroslav Svetlik
    88 * Author URI: https://vulntitan.com
     
    3030
    3131// Define plugin constants
    32 define('VULNTITAN_PLUGIN_VERSION', VULNTITAN_DEVELOPMENT ? uniqid() : '2.1.5');
     32define('VULNTITAN_PLUGIN_VERSION', VULNTITAN_DEVELOPMENT ? uniqid() : '2.1.6');
    3333define('VULNTITAN_PLUGIN_BASENAME', plugin_basename(__FILE__));
    3434define('VULNTITAN_PLUGIN_DIR', untrailingslashit(plugin_dir_path(__FILE__)));
Note: See TracChangeset for help on using the changeset viewer.