Plugin Directory

Changeset 3742524


Ignore:
Timestamp:
10/12/2026 09:25:15 PM (13 days ago)
Author:
webdigitech
Message:

Release TrueSift WordPress 1.1.0 - Next SDK 0.4.0 and Behavioral Signals v2

Location:
truesift/trunk
Files:
1 added
1 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • truesift/trunk/CHANGELOG.md

    r3726713 r3742524  
    11# 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`.
    220
    321## 1.0.21 - 2026-10-03
  • truesift/trunk/THIRD-PARTY-NOTICES.txt

    r3692660 r3742524  
    11# Third-party notices
    22
    3 ## `@truesift/next` 0.3.0
     3## `@truesift/next` 0.4.0
    44
    5 The readable browser bundle in `public/assets/truesift-sdk-0.3.0.js` contains
     5The readable browser bundle in `public/assets/truesift-sdk-0.4.0.js` contains
    66client-side portions of the official `@truesift/next` package, adapted to use
    7 the React runtime supplied by WordPress through `wp-element`.
     7the React runtime supplied by WordPress through `wp-element`. The WordPress
     8adapter retains the SDK's Behavioral Signals v2 collection and verification
     9lifecycle but uses the static SVG visual fallback. No server-side SDK code
     10is shipped in the browser bundle.
    811
    912Copyright © 2026 WebDigiTech
    … …  
    3639## Animation runtime
    3740
    38 The optional dotLottie runtime and animation asset from the Next.js SDK are
    39 not distributed in this WordPress release. The official TrueSift static SVG
    40 fallback is used instead. This keeps the plugin self-contained and avoids an
    41 unnecessary third-party animation dependency.
     41The optional dotLottie runtime and third-party Lottie animation asset from
     42the Next.js SDK are not distributed in this WordPress release. The official
     43TrueSift static SVG fallback is used instead. This keeps the plugin
     44self-contained and avoids an unnecessary third-party animation dependency.
  • truesift/trunk/includes/class-truesift-api-client.php

    r3692660 r3742524  
    603603    private function sanitizeClientSignals(array $signals): array
    604604    {
    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        );
    606622        $result = array();
    607623
    608         foreach ($allowed as $key) {
     624        if (isset($signals['telemetryVersion']) && $signals['telemetryVersion'] === 2) {
     625            $result['telemetryVersion'] = 2;
     626        }
     627
     628        foreach ($numericFields as $key) {
    609629            if (!array_key_exists($key, $signals)) {
    610630                continue;
    … …  
    613633            $value = $signals[$key];
    614634
    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);
    619643            }
    620644        }
  • truesift/trunk/includes/class-truesift-privacy.php

    r3692660 r3742524  
    1414
    1515        $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.',
    1717            'truesift'
    1818        ) . '</p>';
  • truesift/trunk/public/assets/truesift-public.js

    r3692660 r3742524  
    88  const mountStates = new WeakMap();
    99  const trackedForms = new Set();
     10  const trackedMounts = new Set();
    1011  const PROOF_EXPIRY_SAFETY_MS = 15000;
    1112  const AUTOMATIC_RETRY_DELAYS_MS = [1200, 3000, 7000];
    … …  
    783784      };
    784785      mountStates.set(mount, mountState);
     786      trackedMounts.add(mount);
    785787    }
    786788
    … …  
    11451147  }
    11461148
     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
    11471186  function cleanupDisconnectedForms() {
    11481187    trackedForms.forEach((form) => {
    … …  
    12601299  function initDynamicObserver() {
    12611300    const observer = new MutationObserver((mutations) => {
     1301      cleanupDisconnectedMounts();
    12621302      cleanupDisconnectedForms();
    12631303      mutations.forEach((mutation) => {
  • truesift/trunk/readme.txt

    r3726713 r3742524  
    55Tested up to: 7.1
    66Requires PHP: 8.1
    7 Stable tag: 1.0.21
     7Stable tag: 1.1.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    1515TrueSift 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.
    1616
    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.
     17The 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.
    1818
    1919= Included integrations =
    … …  
    4141The 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.
    4242
    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.
     43The 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.
    4444
    4545= Visual modes =
    … …  
    8282* Authoritative single-use proof verification directly from the protected WordPress server action to `https://api.truesift.de/api/v1/botguard/proof/verify`
    8383
    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.
     84Data 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.
    8585
    8686TrueSift service information: https://truesift.de/
    … …  
    128128= Does the plugin collect local analytics? =
    129129
    130 No. Version 1.0.21 does not create a local analytics database or visitor profile. Debug mode stores only administrator troubleshooting events and is disabled by default.
     130No. TrueSift does not create a local analytics database or visitor profile. Debug mode stores only administrator troubleshooting events and is disabled by default.
    131131
    132132= Can I use the shortcode with any form? =
    … …  
    149149
    150150== 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.
    151161
    152162= 1.0.21 =
  • truesift/trunk/truesift.php

    r3726713 r3742524  
    44 * Plugin URI:        https://truesift.de/
    55 * Description:       Privacy-first automated human verification for WordPress forms, WooCommerce, and popular form plugins.
    6  * Version:           1.0.21
     6 * Version:           1.1.0
    77 * Requires at least: 6.6
    88 * Requires PHP:      8.1
    … …  
    2121}
    2222
    23 define('TRUESIFT_PLUGIN_VERSION', '1.0.21');
    24 define('TRUESIFT_SDK_VERSION', '0.3.0');
     23define('TRUESIFT_PLUGIN_VERSION', '1.1.0');
     24define('TRUESIFT_SDK_VERSION', '0.4.0');
    2525define('TRUESIFT_CONTRACT_VERSION', '0.2');
    26 define('TRUESIFT_BEHAVIORAL_SIGNALS_VERSION', '1');
    27 define('TRUESIFT_SDK_BUNDLE', 'truesift-sdk-0.3.0.js');
     26define('TRUESIFT_BEHAVIORAL_SIGNALS_VERSION', '2');
     27define('TRUESIFT_SDK_BUNDLE', 'truesift-sdk-0.4.0.js');
    2828define('TRUESIFT_SDK_ASSET_VERSION', TRUESIFT_PLUGIN_VERSION . '-' . TRUESIFT_SDK_VERSION);
    2929define('TRUESIFT_PLUGIN_FILE', __FILE__);
Note: See TracChangeset for help on using the changeset viewer.