Changeset 3742524
- Timestamp:
- 10/12/2026 09:25:15 PM (13 days ago)
- Location:
- truesift/trunk
- Files:
-
- 1 added
- 1 deleted
- 7 edited
-
CHANGELOG.md (modified) (1 diff)
-
THIRD-PARTY-NOTICES.txt (modified) (2 diffs)
-
includes/class-truesift-api-client.php (modified) (2 diffs)
-
includes/class-truesift-privacy.php (modified) (1 diff)
-
public/assets/truesift-public.js (modified) (4 diffs)
-
public/assets/truesift-sdk-0.3.0.js (deleted)
-
public/assets/truesift-sdk-0.4.0.js (added)
-
readme.txt (modified) (6 diffs)
-
truesift.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
truesift/trunk/CHANGELOG.md
r3726713 r3742524 1 1 # Changelog 2 3 ## 1.1.0 - 2026-10-12 4 5 ### SDK and Behavioral Signals v2 6 7 - Updated the WordPress React (`wp-element`) client adapter to `@truesift/next@0.4.0`, retaining the existing WordPress REST bridge and server-side proof validation. 8 - Added optional aggregate Behavioral Signals v2: sampled pointer movements and scrolls, pointer presses, touch, keyboard event counts, focus/blur, visibility changes, challenge interaction counts and timing. Raw keys, coordinates, and form content are never recorded. 9 - Adopted the SDK's cancellation-safe 2,500 ms observation window, per-check collector reset, and event-listener cleanup on success, error, retry and unmount. 10 - Updated the PHP `clientSignals` allowlist to relay permitted numeric v2 fields and `telemetryVersion: 2`, while retaining legacy v1 field support and excluding unknown or non-numeric data. 11 12 ### WordPress integration and packaging 13 14 - Release detached React roots when WooCommerce/AJAX form fragments are removed, so in-flight checks are aborted and listeners are released without clearing existing valid proofs or interrupting still-connected mounts. 15 - Preserved public WordPress password reset protection and administrative reset compatibility (1.0.20), Fluent Forms AJAX verification (1.0.21), and the established WordPress, WooCommerce, Contact Form 7, WPForms and Elementor integrations. 16 - Preserved the static SVG visual fallback and removed unused dotLottie runtime/animation modules from the WordPress-only bundle. 17 - Updated the WordPress Privacy Policy Guide wording and bundled SDK license notice for the Behavioral Signals v2 release. 18 - Kept the established server-side challenge/verify/proof endpoints and contract version `0.2`; no Backend or SDK package was changed. 19 - Set SDK asset revision to `1.1.0-0.4.0`, with WordPress plugin version `1.1.0`. 2 20 3 21 ## 1.0.21 - 2026-10-03 -
truesift/trunk/THIRD-PARTY-NOTICES.txt
r3692660 r3742524 1 1 # Third-party notices 2 2 3 ## `@truesift/next` 0. 3.03 ## `@truesift/next` 0.4.0 4 4 5 The readable browser bundle in `public/assets/truesift-sdk-0. 3.0.js` contains5 The readable browser bundle in `public/assets/truesift-sdk-0.4.0.js` contains 6 6 client-side portions of the official `@truesift/next` package, adapted to use 7 the React runtime supplied by WordPress through `wp-element`. 7 the React runtime supplied by WordPress through `wp-element`. The WordPress 8 adapter retains the SDK's Behavioral Signals v2 collection and verification 9 lifecycle but uses the static SVG visual fallback. No server-side SDK code 10 is shipped in the browser bundle. 8 11 9 12 Copyright © 2026 WebDigiTech … … 36 39 ## Animation runtime 37 40 38 The optional dotLottie runtime and animation asset from the Next.js SDK are39 not distributed in this WordPress release. The official TrueSift static SVG 40 fallback is used instead. This keeps the plugin self-contained and avoids an41 unnecessary third-party animation dependency.41 The optional dotLottie runtime and third-party Lottie animation asset from 42 the Next.js SDK are not distributed in this WordPress release. The official 43 TrueSift static SVG fallback is used instead. This keeps the plugin 44 self-contained and avoids an unnecessary third-party animation dependency. -
truesift/trunk/includes/class-truesift-api-client.php
r3692660 r3742524 603 603 private function sanitizeClientSignals(array $signals): array 604 604 { 605 $allowed = array('elapsedMs', 'honeypotValue', 'interactionCount', 'pointerMoveCount', 'keyPressCount', 'focusCount', 'blurCount', 'checkedAt'); 605 // Mirror the optional, aggregate-only v2 fields from @truesift/next. 606 // The v1 numeric counters remain accepted for existing browser clients. 607 $numericFields = array( 608 'elapsedMs', 609 'interactionCount', 610 'pointerMoveCount', 611 'pointerDownCount', 612 'scrollCount', 613 'touchCount', 614 'visibilityChangeCount', 615 'challengeInteractionCount', 616 'firstInteractionDelayMs', 617 'activeDurationMs', 618 'keyPressCount', 619 'focusCount', 620 'blurCount', 621 ); 606 622 $result = array(); 607 623 608 foreach ($allowed as $key) { 624 if (isset($signals['telemetryVersion']) && $signals['telemetryVersion'] === 2) { 625 $result['telemetryVersion'] = 2; 626 } 627 628 foreach ($numericFields as $key) { 609 629 if (!array_key_exists($key, $signals)) { 610 630 continue; … … 613 633 $value = $signals[$key]; 614 634 615 if (is_string($value)) { 616 $result[$key] = substr(sanitize_text_field($value), 0, 500); 617 } elseif (is_numeric($value)) { 618 $result[$key] = (float) $value; 635 if ((is_int($value) || is_float($value)) && is_finite((float) $value)) { 636 $result[$key] = $value; 637 } 638 } 639 640 foreach (array('honeypotValue', 'checkedAt') as $key) { 641 if (isset($signals[$key]) && is_string($signals[$key])) { 642 $result[$key] = substr(sanitize_text_field($signals[$key]), 0, 500); 619 643 } 620 644 } -
truesift/trunk/includes/class-truesift-privacy.php
r3692660 r3742524 14 14 15 15 $content = '<p>' . esc_html__( 16 'This website uses TrueSift to protect selected public forms from automated abuse. When a protected form is displayed, technical verification data is sent to the TrueSift service. This can include the site key, requested action, page path, website origin, browser language, time zone, screen and viewport dimensions, platform information, cookie availability, referrer, current page URL, verification timing, and a short-lived challenge token. ',16 'This website uses TrueSift to protect selected public forms from automated abuse. When a protected form is displayed, technical verification data is sent to the TrueSift service. This can include the site key, requested action, page path, website origin, browser language, time zone, screen and viewport dimensions, platform information, cookie availability, referrer, current page URL, verification timing, and a short-lived challenge token. Optional temporary Behavioral Signals v2 include aggregate counts of pointer, keyboard, scroll, touch, focus, blur and visibility activity, and interaction timing; no typed keys, pointer coordinates or form content are collected.', 17 17 'truesift' 18 18 ) . '</p>'; -
truesift/trunk/public/assets/truesift-public.js
r3692660 r3742524 8 8 const mountStates = new WeakMap(); 9 9 const trackedForms = new Set(); 10 const trackedMounts = new Set(); 10 11 const PROOF_EXPIRY_SAFETY_MS = 15000; 11 12 const AUTOMATIC_RETRY_DELAYS_MS = [1200, 3000, 7000]; … … 783 784 }; 784 785 mountStates.set(mount, mountState); 786 trackedMounts.add(mount); 785 787 } 786 788 … … 1145 1147 } 1146 1148 1149 function cleanupDisconnectedMounts() { 1150 trackedMounts.forEach((mount) => { 1151 if (mount.isConnected) { 1152 return; 1153 } 1154 1155 const mountState = mountStates.get(mount); 1156 1157 if (mountState?.root && typeof mountState.root.unmount === "function") { 1158 mountState.root.unmount(); 1159 } else if (typeof element.unmountComponentAtNode === "function") { 1160 element.unmountComponentAtNode(mount); 1161 } 1162 1163 mountStates.delete(mount); 1164 trackedMounts.delete(mount); 1165 1166 // A detached WooCommerce or AJAX fragment no longer owns a verification 1167 // run. Its React unmount aborts pending requests and disposes collectors. 1168 // Allow an incoming replacement mount to start one fresh run, but never 1169 // clear an existing valid proof or a check owned by another live mount. 1170 trackedForms.forEach((form) => { 1171 const state = formStates.get(form); 1172 1173 if (!state || !state.mounts.delete(mount)) { 1174 return; 1175 } 1176 1177 if (state.checking && 1178 !Array.from(state.mounts).some((candidate) => candidate.isConnected)) { 1179 state.checking = false; 1180 state.refreshing = false; 1181 } 1182 }); 1183 }); 1184 } 1185 1147 1186 function cleanupDisconnectedForms() { 1148 1187 trackedForms.forEach((form) => { … … 1260 1299 function initDynamicObserver() { 1261 1300 const observer = new MutationObserver((mutations) => { 1301 cleanupDisconnectedMounts(); 1262 1302 cleanupDisconnectedForms(); 1263 1303 mutations.forEach((mutation) => { -
truesift/trunk/readme.txt
r3726713 r3742524 5 5 Tested up to: 7.1 6 6 Requires PHP: 8.1 7 Stable tag: 1. 0.217 Stable tag: 1.1.0 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 15 15 TrueSift connects WordPress forms to the TrueSift verification service. It starts an automated browser challenge when a protected form is displayed, keeps the form submit action unavailable until an authoritative verification token is issued, and validates and atomically consumes that single-use token on the WordPress server before the protected action continues. 16 16 17 The plugin does not implement a separate CAPTCHA protocol. Its browser runtime tracks the public `@truesift/next` 0. 3.0 client contract, and its PHP bridge uses the official TrueSift challenge, verify, and business-proof API contracts.17 The plugin does not implement a separate CAPTCHA protocol. Its browser runtime tracks the public `@truesift/next` 0.4.0 client contract, and its PHP bridge uses the official TrueSift challenge, verify, and business-proof API contracts. 18 18 19 19 = Included integrations = … … 41 41 The plugin sends the token together with a signed WordPress form context to the server. The PHP verifier calls TrueSift's proof endpoint with server-owned credentials and expected action, path, and origin. A normal success is accepted only when TrueSift confirms `allowed: true`, `decision: allow`, and atomic consumption through either `consumed: true` or a non-empty `consumedAt` timestamp. Replayed, expired, invalid, mismatched, reviewed, or blocked proofs are rejected. 42 42 43 The bundled SDK 0. 3.0 adapter may send only aggregate in-memory interaction counters for the current verification window, such as pointer, keyboard, focus, and blur counts. It does not send pointer coordinates, pressed keys, form contents, device fingerprints, or persistent visitor identifiers. Missing or insufficient behavioral telemetry remains neutral.43 The bundled SDK 0.4.0 adapter may send optional Behavioral Signals v2 aggregates for the current verification window: pointer movements and presses, keyboard events, scroll and touch activity, focus, blur, visibility changes, interaction counts, and observation/interaction timing. The SDK samples high-frequency pointer and scroll activity and frees event listeners after verification or unmount. It does not send pointer coordinates, pressed keys, form contents, device fingerprints, or persistent visitor identifiers. Older clients without v2 telemetry remain compatible; missing or insufficient behavioral telemetry remains neutral. 44 44 45 45 = Visual modes = … … 82 82 * Authoritative single-use proof verification directly from the protected WordPress server action to `https://api.truesift.de/api/v1/botguard/proof/verify` 83 83 84 Data sent can include the site key, requested action, page path, website origin, browser language, languages, time zone, screen and viewport dimensions, platform information, cookie availability, referrer, current page URL, challenge identifiers, short-lived challenge tokens, verification timing, aggregate interaction counters for the active verification window, and the single-use verification token. The behavioral counters contain counts only and do not contain pointer coordinates, actual pressed keys, form contents, fingerprints, or persistent visitor identifiers. The secret key is sent only server-to-server and is never exposed to the browser.84 Data sent can include the site key, requested action, page path, website origin, browser language, languages, time zone, screen and viewport dimensions, platform information, cookie availability, referrer, current page URL, challenge identifiers, short-lived challenge tokens, verification timing, aggregate pointer, keyboard, scroll, touch, focus, blur, visibility and interaction counters for the active verification window, and the single-use verification token. The behavioral counters contain counts only and do not contain pointer coordinates, actual pressed keys, form contents, fingerprints, or persistent visitor identifiers. The secret key is sent only server-to-server and is never exposed to the browser. 85 85 86 86 TrueSift service information: https://truesift.de/ … … 128 128 = Does the plugin collect local analytics? = 129 129 130 No. Version 1.0.21does not create a local analytics database or visitor profile. Debug mode stores only administrator troubleshooting events and is disabled by default.130 No. TrueSift does not create a local analytics database or visitor profile. Debug mode stores only administrator troubleshooting events and is disabled by default. 131 131 132 132 = Can I use the shortcode with any form? = … … 149 149 150 150 == Changelog == 151 152 = 1.1.0 = 153 * Updated the WordPress browser adapter to the official `@truesift/next@0.4.0` client and shared protocol, while retaining the existing WordPress REST and PHP proof-validation architecture. 154 * Added optional, privacy-conscious Behavioral Signals v2 aggregates for pointer, keyboard, scroll, touch, focus, blur, visibility, and interaction timing without capturing event contents, pointer coordinates, or form values. 155 * Preserved cancellation-safe observation and automatic verification, with a 2.5-second minimum observation window and listener cleanup after verification or unmount. 156 * Extended the PHP verification bridge's strict field allowlist for Behavioral v2 and retained compatibility with legacy v1 clients. 157 * Released detached React roots when dynamic form fragments are removed; preserved valid proofs and avoided duplicate checks on live replacement mounts. 158 * Kept WordPress login, registration and public password reset protections, administrator-initiated reset compatibility, Fluent Forms AJAX proof validation, and the other supported integrations unchanged. 159 * Continued to use the bundled static SVG fallback, without third-party dotLottie runtime or animation asset. 160 * SDK browser asset revision: `1.1.0-0.4.0`. The server-side proof contract remains unchanged. 151 161 152 162 = 1.0.21 = -
truesift/trunk/truesift.php
r3726713 r3742524 4 4 * Plugin URI: https://truesift.de/ 5 5 * Description: Privacy-first automated human verification for WordPress forms, WooCommerce, and popular form plugins. 6 * Version: 1. 0.216 * Version: 1.1.0 7 7 * Requires at least: 6.6 8 8 * Requires PHP: 8.1 … … 21 21 } 22 22 23 define('TRUESIFT_PLUGIN_VERSION', '1. 0.21');24 define('TRUESIFT_SDK_VERSION', '0. 3.0');23 define('TRUESIFT_PLUGIN_VERSION', '1.1.0'); 24 define('TRUESIFT_SDK_VERSION', '0.4.0'); 25 25 define('TRUESIFT_CONTRACT_VERSION', '0.2'); 26 define('TRUESIFT_BEHAVIORAL_SIGNALS_VERSION', ' 1');27 define('TRUESIFT_SDK_BUNDLE', 'truesift-sdk-0. 3.0.js');26 define('TRUESIFT_BEHAVIORAL_SIGNALS_VERSION', '2'); 27 define('TRUESIFT_SDK_BUNDLE', 'truesift-sdk-0.4.0.js'); 28 28 define('TRUESIFT_SDK_ASSET_VERSION', TRUESIFT_PLUGIN_VERSION . '-' . TRUESIFT_SDK_VERSION); 29 29 define('TRUESIFT_PLUGIN_FILE', __FILE__);
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)