Compare commits

...
116 Commits
Author SHA1 Message Date
tech a8cdbef65a Update signed manifest to 7.52.0 2026-09-23 09:51:35 +00:00
tech 806094d6a0 Update signed manifest to 7.51.0 2026-09-19 16:44:44 +00:00
tech 0faf78287a Update signed manifest to 7.49.0 2026-09-19 10:22:45 +00:00
tech 235169e8ac Update signed manifest to 7.46.0 2026-09-17 23:20:51 +00:00
tech 67323f0204 Update signed manifest to 7.45.5 2026-09-17 22:40:55 +00:00
tech f3a00c618b Update signed manifest to 7.45.4 2026-09-17 22:28:23 +00:00
tech d39aa6f9bc Update signed manifest to 7.45.1 2026-09-17 18:11:59 +00:00
tech efb0dfc838 Update signed manifest to 7.45.0 2026-09-17 17:48:05 +00:00
tech 7fa580d4d6 Update signed manifest to 7.44.0 2026-09-17 16:36:26 +00:00
tech bd3275d252 Update signed manifest to 7.43.0 2026-09-17 12:33:03 +00:00
tech a0f46c0678 Update signed manifest to 7.42.0 2026-09-17 12:12:42 +00:00
tech 82dd287445 Update signed manifest to 7.41.0 2026-09-17 11:36:04 +00:00
tech f48da5e5f1 Update signed manifest to 7.40.0 2026-09-17 10:42:49 +00:00
tech f787d3a070 Update signed manifest to 7.39.9 2026-09-16 22:55:42 +00:00
tech e924c0adf1 Update signed manifest to 7.39.8 2026-09-16 22:24:00 +00:00
tech 343642a869 Update signed manifest to 7.39.7 2026-09-16 21:32:34 +00:00
tech 2cc4a318ad Update signed manifest to 7.39.6 2026-09-16 21:29:47 +00:00
tech e016046e1f Update signed manifest to 7.39.4 2026-09-16 20:32:22 +00:00
tech 0f197d4bfd Update signed manifest to 7.39.3 2026-09-16 18:30:54 +00:00
tech 49610d6da0 Update signed manifest to 7.39.2 2026-09-16 18:06:20 +00:00
tech 39463e255c Update signed manifest to 7.39.1 2026-09-16 13:42:30 +00:00
tech ecfe29e693 Update signed manifest to 7.39.0 2026-09-16 08:17:24 +00:00
tech 488b27ffc4 Update signed manifest to 7.38.0 2026-09-15 16:58:37 +00:00
tech 19246c3f5a Update signed manifest to 7.37.1 2026-09-15 16:45:42 +00:00
tech fddf34cd50 Update signed manifest to 7.37.0 2026-09-15 13:21:26 +00:00
tech db1f6d1fd6 Update signed manifest to 7.36.0 2026-09-15 11:03:26 +00:00
tech 5f928ba8d1 Update signed manifest to 7.35.0 2026-09-15 10:48:24 +00:00
tech 6a7b33b145 Update signed manifest to 7.34.0 2026-09-15 09:39:49 +00:00
tech 19ca566549 Update signed manifest to 7.33.0 2026-09-15 09:00:19 +00:00
tech bffd79abdb Update signed manifest to 7.32.0 2026-09-15 07:59:24 +00:00
tech c6faa3e74e Update signed manifest to 7.31.0 2026-09-15 00:51:19 +00:00
tech 022d999dc3 Update signed manifest to 7.30.0 2026-09-14 20:03:16 +00:00
tech 23e68f7385 Update signed manifest to 7.29.4 2026-09-14 14:57:40 +00:00
tech 51dcf25e5a Update signed manifest to 7.29.2 2026-09-14 09:33:46 +00:00
tech 50b657b23b Update signed manifest to 7.29.1 2026-09-14 09:20:05 +00:00
tech b7646b720a Update signed manifest to 7.29.0 2026-09-10 15:52:11 +00:00
tech 499a74da7b Update signed manifest to 7.28.6 2026-09-10 15:41:14 +00:00
tech 5028dfabd5 Update signed manifest to 7.28.5 2026-09-02 16:09:40 +00:00
tech daaff5e873 Update signed manifest to 7.28.4 2026-09-02 15:15:17 +00:00
tech 07c8997e1f Update signed manifest to 7.28.3 2026-08-26 09:17:13 +00:00
tech 2bf328fa3d Update signed manifest to 7.28.2 2026-08-16 07:50:50 +00:00
tech 5462c91106 Update signed manifest to 7.28.1 2026-08-16 07:25:22 +00:00
tech bb36fe77e0 Update signed manifest to 7.28.0 2026-08-15 21:32:33 +00:00
tech 1e1dfae997 Update signed manifest to 7.27.3 2026-08-14 18:07:43 +00:00
tech 5a1901fd3e Update signed manifest to 7.27.2 2026-08-14 17:28:45 +00:00
tech 10e92f4bd3 Update signed manifest to 7.27.1 2026-08-14 14:43:12 +00:00
tech 96aa3b20ea Update signed manifest to 7.27.0 2026-08-14 14:30:38 +00:00
tech e6f74fe0c3 Update signed manifest to 7.26.0 2026-08-14 13:59:45 +00:00
tech cd12b06c7a Update signed manifest to 7.25.7 2026-08-14 13:37:04 +00:00
tech d324d5a7a6 Update signed manifest to 7.25.6 2026-08-14 13:28:28 +00:00
tech b5e86863ba Update signed manifest to 7.25.5 2026-08-14 13:14:46 +00:00
tech cfe2cd5369 Update signed manifest to 7.25.4 2026-08-14 13:05:23 +00:00
tech c8e65d8b79 Update signed manifest to 7.25.3 2026-08-14 12:51:13 +00:00
tech 1f306340d8 Update signed manifest to 7.25.2 2026-08-14 12:26:58 +00:00
tech db095bc4a0 Update signed manifest to 7.25.1 2026-08-14 12:17:37 +00:00
tech 6031ba5163 Update signed manifest to 7.25.0 2026-08-14 10:32:57 +00:00
tech 7f7c8de38c Update signed manifest to 7.24.9 2026-08-14 10:15:10 +00:00
tech 769f532207 Update signed manifest to 7.24.8 2026-08-14 09:59:07 +00:00
tech cce638adb3 Update signed manifest to 7.24.6 2026-08-14 09:46:33 +00:00
tech 446bd5deb9 Update signed manifest to 7.24.5 2026-08-14 09:44:00 +00:00
tech b70f9b0675 Update signed manifest to 7.24.4 2026-08-14 09:17:23 +00:00
tech 3b5b86162b Update signed manifest to 7.24.3 2026-08-14 08:56:24 +00:00
tech 49b9d8fca5 Update signed manifest to 7.24.2 2026-08-14 08:06:56 +00:00
tech 1187ac412c Update signed manifest to 7.23.55 2026-08-13 19:15:45 +00:00
tech c56b4e6e9d Update signed manifest to 7.23.54 2026-08-13 12:58:44 +00:00
tech 6676ceb60e Update signed manifest to 7.23.53 2026-08-13 12:16:31 +00:00
tech fdc592d01f Update signed manifest to 7.23.52 2026-08-13 11:34:47 +00:00
tech 6e80e24159 Update signed manifest to 7.23.51 2026-08-13 11:09:50 +00:00
tech facfffbc1d Update signed manifest to 7.23.50 2026-08-13 11:00:49 +00:00
tech d33ab11b77 Update signed manifest to 7.23.49 2026-08-13 10:53:46 +00:00
tech 1bb03b6c5c Update signed manifest to 7.23.48 2026-08-13 10:52:36 +00:00
tech 729c24a83c Update signed manifest to 7.23.47 2026-08-13 09:49:16 +00:00
tech e95bc58ffc Update signed manifest to 7.23.46 2026-08-13 09:46:06 +00:00
tech 7cb4c1a8fc Update signed manifest to 7.23.45 2026-08-13 09:44:46 +00:00
tech f20c35fbc5 Update signed manifest to 7.23.44 2026-08-13 09:41:29 +00:00
tech d845e6a57d Update signed manifest to 7.23.43 2026-08-12 22:47:23 +00:00
tech fbfa908695 Update signed manifest to 7.23.42 2026-08-12 19:23:41 +00:00
tech 39ef0c2f3f Update signed manifest to 7.23.41 2026-08-12 19:11:53 +00:00
tech 9a459b4644 Update signed manifest to 7.23.40 2026-08-12 18:15:10 +00:00
tech 342c2ee43f Update signed manifest to 7.23.39 2026-08-12 17:58:06 +00:00
tech 105abf4e24 Update signed manifest to 7.23.38 2026-08-12 17:08:28 +00:00
tech d48beb9757 Update signed manifest to 7.23.37 2026-08-12 16:47:29 +00:00
tech 4a43572b15 Update signed manifest to 7.23.36 2026-08-12 15:43:51 +00:00
tech 20c46d3d26 Update signed manifest to 7.23.35 2026-08-12 15:40:08 +00:00
tech 74fdd42561 Update signed manifest to 7.23.34 2026-08-12 15:34:18 +00:00
tech 1e4806457e Update signed manifest to 7.23.33 2026-08-12 15:28:05 +00:00
tech da9237171a Update signed manifest to 7.23.32 2026-08-12 15:26:38 +00:00
tech 904bf52960 Update signed manifest to 7.23.31 2026-08-12 15:21:12 +00:00
tech 8ea7b9f5be Update signed manifest to 7.23.30 2026-08-12 13:24:01 +00:00
tech 804a1aae58 Update signed manifest to 7.23.28 2026-08-10 22:09:40 +00:00
tech 76e585139e Update signed manifest to 7.23.27 2026-08-10 20:18:36 +00:00
tech f871592d27 Update signed manifest to 7.23.26 2026-08-10 19:56:33 +00:00
tech f1375d3d7d Update signed manifest to 7.23.25 2026-08-10 19:23:48 +00:00
tech 72fa8e8901 Update signed manifest to 7.23.24 2026-08-10 16:35:02 +00:00
tech efa84723ee Update signed manifest to 7.23.23 2026-08-10 16:06:43 +00:00
tech 39616478c9 Update signed manifest to 7.23.22 2026-08-10 15:57:46 +00:00
tech c1969d4293 Update signed manifest to 7.23.21 2026-08-10 15:53:45 +00:00
tech 524b893e65 Update signed manifest to 7.23.20 2026-08-10 15:34:44 +00:00
tech 303f31e869 Update signed manifest to 7.23.19 2026-08-10 15:05:44 +00:00
tech 20a2a84ee8 Update signed manifest to 7.23.18 2026-08-10 14:14:25 +00:00
tech 9127b06836 Update signed manifest to 7.23.17 2026-08-10 11:36:11 +00:00
tech 19cb788556 Update signed manifest to 7.23.16 2026-08-10 11:08:03 +00:00
tech e52046437b Update signed manifest to 7.23.15 2026-08-10 10:55:14 +00:00
tech 5d36e1058f Update signed manifest to 7.23.14 2026-08-10 10:42:30 +00:00
tech b79ead3dcf Update signed manifest to 7.23.13 2026-08-10 09:48:52 +00:00
root b0102ea518 Update signed manifest to 7.23.12 (critical fix) 2026-08-10 01:14:06 +00:00
root 1b8d7950f5 Update signed manifest to 7.23.11 2026-08-10 00:59:55 +00:00
root 56284b5d20 Update signed manifest to 7.23.10 2026-08-10 00:39:47 +00:00
ARGUS 037c2b8cc6 Update signed manifest to 7.23.9 2026-08-09 23:50:36 +00:00
ARGUS b1688a0e16 Update signed manifest to 7.23.8 2026-08-09 23:29:08 +00:00
ARGUS 6649b75eb9 Update signed manifest to 7.23.7 (critical fix) 2026-08-09 23:10:37 +00:00
ARGUS 99bce8b86a Update signed manifest to 7.23.6 2026-08-09 22:57:31 +00:00
ARGUS a214c1656f Update signed manifest to 7.23.5 2026-08-09 22:53:52 +00:00
ARGUS 1b1f657b41 Update signed manifest to 7.23.3 2026-08-09 20:06:34 +00:00
ARGUS af032f8f1c Update signed manifest to 7.23.2 2026-08-09 19:39:28 +00:00
ARGUSandClaude Sonnet 5 c4db87af84 ARGUS WordPress Defence 7.23.2
- New: License section in Settings -- a 30-day trial with every
  feature active starts automatically, no registration required to
  start. Protection continues regardless of license status; the trial
  only affects what's shown, never what's enforced. Enter a license
  key to keep Premium features once the trial ends. This is the first
  release where the license system is actually visible anywhere --
  it existed in the codebase before but had no entry form and was
  excluded from every published build.
- Intelligence page: rewrote descriptions in plain language about what
  each thing does for your site's protection, not internal
  implementation details (was showing raw technical descriptions like
  a "signature corpus" and "RIR delegation database" range counts).

Verified end-to-end before publishing (not just code review): a real
signup and license created on the actual companion license service,
then submitted through the real Settings page form exactly as a
customer would -- status went from "TRIAL -- 30 DAYS LEFT" to
"LICENSED" on both the Settings and Overview pages. This exact ZIP was
also installed fresh and every admin page loaded with zero errors
before this commit.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-09 19:37:16 +00:00
9 changed files with 218 additions and 51 deletions
+6 -1
View File
@@ -4,7 +4,7 @@ Automatic WordPress security. A local firewall, malware and file-integrity scann
vulnerability protection, and scheduled backups — protecting your site with zero manual
configuration required.
**Version:** 7.23.1
**Version:** 7.23.2
**Requires:** WordPress 6.0+, PHP 7.4+
**License:** GPLv2 or later
@@ -30,6 +30,11 @@ configuration required.
Everything except Global Threat Intelligence works out of the box. There is nothing to
configure to get protected.
**License**: a 30-day trial with every feature active starts automatically on activation --
no registration required to start. Protection never stops when the trial ends; ARGUS Defence →
Settings → License shows the days remaining and where to enter a license key to keep Premium
features. This section is specific to this self-distributed build.
## Status
This is a self-distributed release: it is not listed on WordPress.org and has not gone
+6
View File
@@ -655,6 +655,12 @@ class Argus_Admin {
public static function render_settings() {
$saved = false;
$template_applied = null;
$license_result = null;
if ( class_exists( 'Argus_License' ) && isset( $_POST['argus_wpd_activate_license_nonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['argus_wpd_activate_license_nonce'] ) ), 'argus_wpd_activate_license' ) ) { // phpcs:ignore
Argus_License::set_license_key( sanitize_text_field( wp_unslash( $_POST['license_key'] ?? '' ) ) ); // phpcs:ignore
$license_result = Argus_License::validate_now();
}
if ( isset( $_POST['argus_wpd_apply_template_nonce'], $_POST['template'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['argus_wpd_apply_template_nonce'] ) ), 'argus_wpd_apply_template' ) ) { // phpcs:ignore
$key = sanitize_key( wp_unslash( $_POST['template'] ) ); // phpcs:ignore
+19 -31
View File
@@ -40,75 +40,63 @@ include ARGUS_WPD_DIR . 'admin/views/partials/header.php';
<div class="argus-wpd-tile-row">
<div class="argus-wpd-tile">
<div class="argus-wpd-tile-label"><?php esc_html_e( 'WAF Rule Corpus', 'argus-wordpress-defence' ); ?></div>
<div class="argus-wpd-tile-value"><?php echo esc_html( number_format_i18n( $waf_rule_count ) ); ?></div>
<div class="argus-wpd-tile-label"><?php esc_html_e( 'Firewall', 'argus-wordpress-defence' ); ?></div>
<div class="argus-wpd-tile-value" style="font-size:16px;"><span style="color:var(--emerald)"><?php esc_html_e( 'Protecting', 'argus-wordpress-defence' ); ?></span></div>
</div>
<div class="argus-wpd-tile">
<div class="argus-wpd-tile-label"><?php esc_html_e( 'Vulnerability Intelligence', 'argus-wordpress-defence' ); ?></div>
<div class="argus-wpd-tile-value" style="font-size:16px;">
<?php if ( $vuln_row_count > 0 ) : ?>
<span style="color:var(--emerald)"><?php esc_html_e( 'Active', 'argus-wordpress-defence' ); ?></span>
<?php else : ?>
<span style="color:var(--faint)"><?php esc_html_e( 'Standby', 'argus-wordpress-defence' ); ?></span>
<?php endif; ?>
</div>
<div class="argus-wpd-tile-label"><?php esc_html_e( 'Vulnerability Protection', 'argus-wordpress-defence' ); ?></div>
<div class="argus-wpd-tile-value" style="font-size:16px;"><span style="color:var(--emerald)"><?php esc_html_e( 'Protecting', 'argus-wordpress-defence' ); ?></span></div>
</div>
<div class="argus-wpd-tile">
<div class="argus-wpd-tile-label"><?php esc_html_e( 'GeoIP Database', 'argus-wordpress-defence' ); ?></div>
<div class="argus-wpd-tile-label"><?php esc_html_e( 'Location Awareness', 'argus-wordpress-defence' ); ?></div>
<div class="argus-wpd-tile-value" style="font-size:16px;">
<?php if ( $geoip_status && ! empty( $geoip_status['range_count'] ) ) : ?>
<span style="color:var(--emerald)"><?php esc_html_e( 'Loaded', 'argus-wordpress-defence' ); ?></span>
<span style="color:var(--emerald)"><?php esc_html_e( 'Active', 'argus-wordpress-defence' ); ?></span>
<?php else : ?>
<span style="color:var(--faint)"><?php esc_html_e( 'Building', 'argus-wordpress-defence' ); ?></span>
<span style="color:var(--faint)"><?php esc_html_e( 'Activating', 'argus-wordpress-defence' ); ?></span>
<?php endif; ?>
</div>
</div>
</div>
<div class="argus-wpd-panel">
<h2><?php esc_html_e( 'Local Intelligence Sources', 'argus-wordpress-defence' ); ?></h2>
<h2><?php esc_html_e( 'What\'s Protecting Your Site', 'argus-wordpress-defence' ); ?></h2>
<div class="argus-wpd-ioc-row">
<span class="argus-wpd-ioc-type">WAF</span>
<span class="argus-wpd-ioc-desc"><?php echo esc_html( sprintf( __( 'Application-layer signature corpus (SQLi/XSS/RCE/path traversal/protocol anomaly) -- %d rules, updated with this plugin.', 'argus-wordpress-defence' ), $waf_rule_count ) ); ?></span>
<span class="argus-wpd-ioc-type"><?php esc_html_e( 'Firewall', 'argus-wordpress-defence' ); ?></span>
<span class="argus-wpd-ioc-desc"><?php esc_html_e( 'Blocks malicious requests -- SQL injection, cross-site scripting, remote code execution, path traversal, and more -- before they reach your site. Kept up to date automatically.', 'argus-wordpress-defence' ); ?></span>
</div>
<div class="argus-wpd-ioc-row">
<span class="argus-wpd-ioc-type">VULN</span>
<span class="argus-wpd-ioc-type"><?php esc_html_e( 'Vulnerability Protection', 'argus-wordpress-defence' ); ?></span>
<span class="argus-wpd-ioc-desc">
<?php
echo esc_html(
$vuln_row_count > 0
? __( 'Vulnerability intelligence -- actively matching installed plugins and themes against known security issues.', 'argus-wordpress-defence' )
: __( 'Vulnerability intelligence -- WordPress core is checked live against WordPress.org. Plugin and theme results activate automatically as intelligence becomes available.', 'argus-wordpress-defence' )
? __( 'Actively protecting your installed plugins and themes by checking them against known security issues.', 'argus-wordpress-defence' )
: __( 'Actively protecting WordPress core against known security issues. Plugin and theme protection activates automatically as new information becomes available.', 'argus-wordpress-defence' )
);
?>
</span>
</div>
<div class="argus-wpd-ioc-row">
<span class="argus-wpd-ioc-type">GEOIP</span>
<span class="argus-wpd-ioc-type"><?php esc_html_e( 'Location Awareness', 'argus-wordpress-defence' ); ?></span>
<span class="argus-wpd-ioc-desc">
<?php
if ( $geoip_status && ! empty( $geoip_status['range_count'] ) ) {
echo esc_html(
sprintf(
__( 'Self-hosted RIR delegation database -- %s IPv4 ranges, last refreshed %s.', 'argus-wordpress-defence' ),
number_format_i18n( $geoip_status['range_count'] ),
$geoip_status['last_refresh'] ? human_time_diff( strtotime( $geoip_status['last_refresh'] . ' UTC' ) ) . ' ' . __( 'ago', 'argus-wordpress-defence' ) : __( 'never', 'argus-wordpress-defence' )
)
);
esc_html_e( 'Identifies where threats are coming from automatically, with no external service or configuration required.', 'argus-wordpress-defence' );
} else {
esc_html_e( 'Self-hosted RIR delegation database has not built its first snapshot yet -- refreshes automatically once daily, no action needed.', 'argus-wordpress-defence' );
esc_html_e( 'Activating automatically -- no action needed.', 'argus-wordpress-defence' );
}
?>
</span>
</div>
<div class="argus-wpd-ioc-row">
<span class="argus-wpd-ioc-type">ANIS</span>
<span class="argus-wpd-ioc-type"><?php esc_html_e( 'Global Threat Network', 'argus-wordpress-defence' ); ?></span>
<span class="argus-wpd-ioc-desc">
<?php
if ( 'not_connected' === $anis_status['protection'] ) {
esc_html_e( 'Global threat intelligence -- connecting automatically.', 'argus-wordpress-defence' );
esc_html_e( 'Connecting automatically -- no action needed.', 'argus-wordpress-defence' );
} else {
esc_html_e( 'Global threat intelligence -- automatically updated to help identify malicious sources.', 'argus-wordpress-defence' );
esc_html_e( 'Helps identify and block malicious sources seen across other protected sites, automatically.', 'argus-wordpress-defence' );
}
?>
</span>
+38
View File
@@ -182,6 +182,44 @@ include ARGUS_WPD_DIR . 'admin/views/partials/header.php';
<?php endif; ?>
</div>
<?php if ( class_exists( 'Argus_License' ) ) : ?>
<div class="argus-wpd-panel">
<h2><?php esc_html_e( 'License', 'argus-wordpress-defence' ); ?></h2>
<?php $license_summary = Argus_License::summary(); ?>
<p style="font-size:13px;color:var(--emerald);margin:0 0 6px;display:flex;align-items:center;gap:8px;">
<span class="argus-wpd-status-chip chip-emerald" style="padding:2px 10px;">
<span class="dot"></span>
<span class="state">
<?php
if ( 'licensed' === $license_summary['status'] ) {
esc_html_e( 'LICENSED', 'argus-wordpress-defence' );
} elseif ( 'trial' === $license_summary['status'] ) {
echo esc_html( sprintf(
/* translators: %d: number of days remaining in the free trial */
_n( 'TRIAL -- %d DAY LEFT', 'TRIAL -- %d DAYS LEFT', $license_summary['days_remaining'], 'argus-wordpress-defence' ),
$license_summary['days_remaining']
) );
} else {
esc_html_e( 'TRIAL ENDED', 'argus-wordpress-defence' );
}
?>
</span>
</span>
</p>
<?php if ( ! empty( $license_result ) ) : ?>
<p style="font-size:12.5px;margin:8px 0 0;color:<?php echo ! empty( $license_result['success'] ) ? 'var(--emerald)' : 'var(--rose)'; ?>;"><?php echo esc_html( $license_result['message'] ); ?></p>
<?php endif; ?>
<form method="post" style="margin-top:14px;display:flex;gap:8px;align-items:center;">
<?php wp_nonce_field( 'argus_wpd_activate_license', 'argus_wpd_activate_license_nonce' ); ?>
<input type="text" name="license_key" placeholder="<?php esc_attr_e( 'ARGUS-XXXX-XXXX-...', 'argus-wordpress-defence' ); ?>" value="<?php echo esc_attr( $license_summary['has_key'] ? Argus_License::license_key() : '' ); ?>" style="flex:1;max-width:380px;padding:8px 10px;border-radius:6px;border:1px solid var(--border-strong);background:var(--panel-2);color:var(--text);font-family:var(--mono);font-size:13px;" />
<button type="submit" class="button button-primary"><?php esc_html_e( 'Activate', 'argus-wordpress-defence' ); ?></button>
</form>
<?php if ( $license_summary['purchase_url'] ) : ?>
<p style="font-size:12.5px;margin:12px 0 0;"><a href="<?php echo esc_url( $license_summary['purchase_url'] ); ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e( 'Get a license', 'argus-wordpress-defence' ); ?></a></p>
<?php endif; ?>
</div>
<?php endif; ?>
<div class="argus-wpd-panel">
<h2><?php esc_html_e( 'Website Acceleration', 'argus-wordpress-defence' ); ?></h2>
<p style="color:var(--faint);font-size:12.5px;margin:-8px 0 12px;"><?php esc_html_e( 'Cache & Performance now has its own dedicated page -- speed up your website, reduce load, and see what\'s being accelerated.', 'argus-wordpress-defence' ); ?></p>
+2 -2
View File
@@ -3,7 +3,7 @@
* Plugin Name: ARGUS WordPress Defence
* Plugin URI: https://git-cloud.weboria.eu/Weboria/argus-wp-defence
* Description: Standalone WordPress security: local WAF, malware & integrity scanning, vulnerability intelligence, and a deterministic ban/policy engine. Works fully offline; optionally connects to ARGUS Cloud for richer intelligence and cross-asset correlation.
* Version: 7.23.1
* Version: 7.23.2
* Requires at least: 6.0
* Requires PHP: 7.4
* Author: ARGUS
@@ -28,7 +28,7 @@ if ( ! defined( 'ABSPATH' ) ) {
exit;
}
define( 'ARGUS_WPD_VERSION', '7.23.1' );
define( 'ARGUS_WPD_VERSION', '7.23.2' );
define( 'ARGUS_WPD_FILE', __FILE__ );
define( 'ARGUS_WPD_DIR', plugin_dir_path( __FILE__ ) );
define( 'ARGUS_WPD_URL', plugin_dir_url( __FILE__ ) );
+7 -11
View File
@@ -46,24 +46,20 @@ rm -rf \
if [ "${CHANNEL}" = "wporg" ]; then
# A plugin hosted on WordPress.org must rely solely on WordPress.org's own
# update channel -- never a self-update-from-external-manifest mechanism,
# even one that ships inert-by-default. class_exists( 'Argus_Update_Client' )
# guards every reference to this class elsewhere in the codebase, so
# removing the file here is sufficient; nothing else needs to change.
# even one that ships inert-by-default -- and must stay genuinely,
# permanently functional with no license/trial requirement (WordPress.org
# explicitly prohibits trialware). class_exists() guards every reference
# to both classes elsewhere in the codebase, so removing the files here is
# sufficient; nothing else needs to change per build.
echo "==> [wporg channel] Removing the self-update client (WordPress.org must be the only update channel)"
rm -f "${STAGE_DIR}/includes/class-argus-update-client.php"
echo "==> [wporg channel] Removing the license/trial system (WordPress.org prohibits trialware)"
rm -f "${STAGE_DIR}/includes/class-argus-license.php"
elif [ "${CHANNEL}" != "self" ]; then
echo "==> BUILD FAILED: unknown channel '${CHANNEL}' (expected 'self' or 'wporg')"
exit 1
fi
# WordPress.org explicitly prohibits trialware -- a plugin submitted to the
# directory must stay genuinely, permanently functional with no license
# requirement. class_exists( 'Argus_License' ) guards every reference to
# this class elsewhere, so removing the file here is sufficient; the free
# build never has a trial timer at all.
echo "==> Removing the license/trial system (WordPress.org prohibits trialware)"
rm -f "${STAGE_DIR}/includes/class-argus-license.php"
echo "==> Allowlist audit -- fail closed on anything unexpected"
UNEXPECTED=0
while IFS= read -r -d '' item; do
+127
View File
@@ -0,0 +1,127 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
// Premium-build-only, same as Argus_Update_Client: excluded from the
// WordPress.org release ZIP (bin/build-release.sh), guarded everywhere with
// class_exists() so the free build never references it. WP.org's guidelines
// prohibit trialware in a plugin submitted to the directory -- the free
// build stays genuinely, permanently functional, with no trial timer and no
// license requirement anywhere in it. This class exists only in a
// separately-distributed Premium build.
class Argus_License {
const TRIAL_DAYS = 30;
const TRIAL_STARTED_OPTION = 'argus_wpd_license_trial_started_at';
const LICENSE_KEY_OPTION = 'argus_wpd_license_key';
const LICENSE_STATUS_OPTION = 'argus_wpd_license_validation_status';
const LICENSE_CHECKED_OPTION = 'argus_wpd_license_last_checked';
public static function ensure_trial_started() {
if ( ! get_option( self::TRIAL_STARTED_OPTION ) ) {
update_option( self::TRIAL_STARTED_OPTION, time(), false );
}
}
public static function trial_started_at() {
return (int) get_option( self::TRIAL_STARTED_OPTION, time() );
}
public static function trial_ends_at() {
return self::trial_started_at() + ( self::TRIAL_DAYS * DAY_IN_SECONDS );
}
public static function days_remaining() {
$remaining_secs = self::trial_ends_at() - time();
return max( 0, (int) ceil( $remaining_secs / DAY_IN_SECONDS ) );
}
public static function license_key() {
if ( defined( 'ARGUS_WPD_LICENSE_KEY' ) && ARGUS_WPD_LICENSE_KEY ) {
return trim( ARGUS_WPD_LICENSE_KEY );
}
return trim( (string) get_option( self::LICENSE_KEY_OPTION, '' ) );
}
// Saving a submitted key never marks it valid by itself -- the caller
// still has to call validate_now() to actually check it against the
// configured validation server, same as entering any license key
// anywhere always requires a real check before it does anything.
public static function set_license_key( $key ) {
update_option( self::LICENSE_KEY_OPTION, trim( (string) $key ), false );
delete_option( self::LICENSE_STATUS_OPTION );
}
public static function validation_endpoint() {
return defined( 'ARGUS_WPD_LICENSE_VALIDATE_URL' ) ? ARGUS_WPD_LICENSE_VALIDATE_URL : '';
}
// Honest, not fabricated: a license key alone never counts as "licensed"
// unless there's a real validation endpoint configured to actually check
// it against. No key -> unlicensed. Key present but no validation
// endpoint configured -> still unlicensed, not a silent green light.
public static function is_licensed() {
if ( '' === self::license_key() || '' === self::validation_endpoint() ) {
return false;
}
return 'valid' === get_option( self::LICENSE_STATUS_OPTION, '' );
}
public static function validate_now() {
$key = self::license_key();
$url = self::validation_endpoint();
if ( '' === $key ) {
return array( 'success' => false, 'message' => __( 'Enter a license key first.', 'argus-wordpress-defence' ) );
}
if ( '' === $url ) {
return array( 'success' => false, 'message' => __( 'No license validation server is configured for this deployment.', 'argus-wordpress-defence' ) );
}
$response = wp_remote_post(
$url,
array(
'timeout' => 15,
'headers' => array( 'Content-Type' => 'application/json' ),
'body' => wp_json_encode( array( 'license_key' => $key, 'domain' => wp_parse_url( home_url(), PHP_URL_HOST ) ) ),
)
);
update_option( self::LICENSE_CHECKED_OPTION, current_time( 'mysql', true ), false );
if ( is_wp_error( $response ) || 200 !== (int) wp_remote_retrieve_response_code( $response ) ) {
update_option( self::LICENSE_STATUS_OPTION, 'error', false );
return array( 'success' => false, 'message' => __( 'Could not reach the license server. Try again shortly.', 'argus-wordpress-defence' ) );
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
$valid = is_array( $data ) && ! empty( $data['valid'] );
update_option( self::LICENSE_STATUS_OPTION, $valid ? 'valid' : 'invalid', false );
return array(
'success' => $valid,
'message' => $valid
? __( 'License activated.', 'argus-wordpress-defence' )
: __( 'That license key is not valid or has expired.', 'argus-wordpress-defence' ),
);
}
public static function status() {
if ( self::is_licensed() ) {
return 'licensed';
}
return self::days_remaining() > 0 ? 'trial' : 'trial_expired';
}
public static function summary() {
return array(
'status' => self::status(),
'days_remaining' => self::days_remaining(),
'trial_ends_at' => gmdate( 'Y-m-d H:i:s', self::trial_ends_at() ),
'has_key' => '' !== self::license_key(),
'purchase_url' => defined( 'ARGUS_WPD_LICENSE_PURCHASE_URL' ) ? ARGUS_WPD_LICENSE_PURCHASE_URL : '',
);
}
}
+6 -5
View File
@@ -1,10 +1,11 @@
{
"version": "7.23.1",
"released_at": "2026-08-09T19:17:57+00:00",
"package_url": "https://git-cloud.weboria.eu/Weboria/argus-wp-defence/releases/download/v7.23.1/argus-wordpress-defence-7.23.1.zip",
"sha256": "22e4e75f6ea0933787a8e3f63c9c8f99da97df36529354b116af730eaa34c38a",
"version": "7.52.0",
"released_at": "2026-09-23T09:51:34+00:00",
"package_url": "https://git-cloud.weboria.eu/Weboria/argus-wp-defence/releases/download/v7.52.0/argus-wordpress-defence-7.52.0.zip",
"sha256": "c954611e46daefc04d34313a5b3d321b5f0eac5a8a80c6b791aa72f6fadea82a",
"min_php": "7.4",
"min_wp": "6.0",
"critical": false,
"signature": "68j0L5KMYY+10s9NmhQCeNr80+13ZMs+fj8ynW3ov9Nst64+Wc+e1nqE3Y0TlNKBj5fHqty1Fz0HBT14pXcwCg=="
"summary": "* Manual IP blocking now lets you choose the block duration -- Temporary, Extended, or Permanent\n -- instead of always applying a fixed 24-hour block.\n* Fixed remote management actions sent from the WAD portal sometimes being rejected when they\n contained certain special characters (such as accented letters or punctuation) in a reason or\n note field.\n* Fixed a scan that could get permanently stuck reporting \"already in progress\" if it was\n interrupted; a new scan can now always be started.\n* Fixed deleting a backup that was already removed being reported as an error instead of simply\n confirming it's gone.",
"signature": "4jOlj5HY/GIuDiy0iqmqADegPHXJWC22KZoHlKyVeRVfuCEFDPtscPEtpaYkbAZ8vC+mkCQjrGdfVO+vIxBjBA=="
}
+7 -1
View File
@@ -4,7 +4,7 @@ Tags: security, firewall, malware, vulnerability, backup
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 7.23.1
Stable tag: 7.23.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -53,6 +53,12 @@ dashboard whenever a new version is available, and you can update it in one clic
== Changelog ==
= 7.23.2 =
* Settings: added a License section -- a 30-day trial with everything active, then enter a
license key to keep Premium features. Protection never stops regardless of license status.
* Intelligence page: rewrote descriptions in plain language focused on what's protecting your
site, not internal implementation details.
= 7.23.1 =
* Automatic updates: fixed a bug where a normal (non-critical) update would be detected and
shown as available, but never actually installed -- now any newer, compatible, verified