You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Security
- Atomic rate-limit helper (wp_cache_incr path, transient fallback) replaces
the read-then-write race in review submissions.
- Public AJAX endpoints (rtg_get_tires, rtg_get_filter_options,
rtg_track_click, rtg_track_search) are now rate limited per fingerprint
in their own buckets. Analytics drops silently when throttled so user
typing isn't penalized; reviews keep the tight 3/5min ceiling.
- submit_guest_tire_rating trims guest_name before the empty check so
whitespace-only names are rejected.
- roamer_assign / roamer_hide / roamer_restore now validate every ID
against RTG_Database::validate_tire_id() and cap the batch at 50.
UX / a11y
- Cards render immediately; ratings swap in on XHR resolution instead of
blocking the first paint.
- Server pagination shows a dimmed, input-blocking overlay only after
500ms so fast responses don't flash.
- Mobile filter drawer moves keyboard focus to the first control on open.
- Switch-slider toggles replace inline onclick= with data-toggle-target +
a delegated listener in rivian-tires.js.
Ops
- Admin gets an HTML email when cron Roamer sync fails (wp_error / non-200
/ bad JSON), throttled to once per 12h per reason. Manual admin runs
don't email (errors already surface in the UI). Honors the existing
roamer_notify_enabled setting.
Code health
- RTG_Ajax::ALLOWED_SORTS centralizes the sort whitelist.
- Admin dashboard "missing links/images" strings now go through _n().
- Removed stale "AI" comment + production console.time in search.js.
- New PHPUnit test covers rate-limit overflow behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
0 commit comments