Consolidated release rolling up unreleased patch iterations 0.5.1 + 0.5.2 + 0.5.3 into a single public release.
Security fixes
- Defend OAuth endpoints against full-page cache poisoning (PR #13). Full-page caches (LiteSpeed Cache verified against 7.8.1 source; WP Rocket, W3 Total Cache, WP Super Cache, host-level FastCGI caches) do not honor arbitrary
Cache-Control: no-storeresponse headers — they gate ondefine( 'DONOTCACHEPAGE', true ). LSC additionally does not vary its cache by query string, so/authorize?client_id=Xand/authorize?client_id=Ywere treated as the same cached URL, potentially serving one OAuth client's consent page to a subsequent request from a different client. Newincludes/OAuth/CacheHeaders.phputility centralizes the three-pronged defense and is wired into every OAuth response path (AuthorizationController,TokenController,ClientRegistrationController).DiscoveryControllerintentionally unchanged —.well-known/oauth-*metadata IS meant to be edge-cached.
New capabilities
- CIMD (Client ID Metadata Document) client trust layer (PR #12, Feature 005). Additive OAuth 2.1 client-trust path alongside RFC 7591 DCR. Adapted from
wp-media/mcp-oauth(GPL-3). Claude bundled as trusted publisher (claude.aihost, two pinnedclient_ids). Gated behind a default-OFF kill switch — the 0.4.0 → 0.5.0 upgrade is a runtime no-op for the CIMD path until an operator opts in with: add_filter( 'acrossai_ai_connectors_cimd_enabled', '__return_true' );
Security posture: three-layer SSRF hardening (URL shape → trusted-host allowlist →wp_safe_remote_get), 5 KB response cap, redirects disabled,token_endpoint_auth_method='none'hard-enforced at persist,hash_equalsbyte-match onclient_id↔ URL, failures never cached. Feature-006 H4 defaultrequire_admin_approval=ONkept for CIMD too (Option A, security-first). Trusted-publisher list extendable viaacrossai_ai_connectors_cimd_trusted_publishersfilter. No schema change — reuses the existingmetadata_fingerprintcolumn onoauth_clientsas an implicit CIMD-vs-DCR source discriminator. - Discovery Site Health check (PR #12). New
directSite Health test at Tools → Site Health → Status named "MCP OAuth discovery documents". Loopback-fetches both.well-known/oauth-*documents and reports one combined status. Distinguishes the acme-challenge interception fingerprint (bare 404 with no WordPress-originated headers →critical— the Trac #37201 wontfix pattern seen on OVH / cPanel-AutoSSL / Plesk / most managed-WP hosts) from ambiguous failures (recommended). Adapted fromwp-media/mcp-oauth. Always on; no configuration required. 5-minute transient cache. Short-circuits torecommendedwhen pretty permalinks are disabled.
Bug fixes — Feature-003 runtime
- Fixed OAuth-operational admin notices (HTTPS +
DISABLE_WP_CRONwarnings) being suppressed on installs where mcp-manager still owns the OAuth code path (PRs #10, #11). - Fixed
class_existsFQN reference inMain::maybe_log_missing_registry()pointing at a moved class location (PR #8). - Fixed
Loader::add_actioncomponent-vs-callback footgun where passingarray( $this, 'method' )as the component argument fatal-ed at fire time (PR #8). - Fixed
ACROSSAI_AI_CONNECTORS_VERSIONconstant drift from the plugin-headerVersion:field (PR #8). Both aligned at 0.5.0. - Root
.mcp.jsonnow gitignored (PR #9) — would otherwise commit MCP client credentials.
Feature 003 — Import AI Connectors + OAuth 2.1 stack from acrossai-mcp-manager
Relocated ~41 files (Connectors framework, OAuth server, BerlinDB modules, admin tab, JS/CSS, consent template) into this plugin with namespace-only edits. Table names, option keys, cron hook (acrossai_mcp_manager_oauth_cleanup), REST namespace (acrossai-mcp-manager/v1), and hook action strings all preserved byte-for-byte — zero data migration, zero re-auth for existing Claude/ChatGPT/Grok connections. Ships DORMANT via a class_exists( '\AcrossAI_MCP_Manager\Includes\OAuth\AuthorizationController' ) probe. BC filter bridge — third-party plugins using the legacy acrossai_mcp_manager_connector_profiles filter continue to work. New settings tab on shared ?page=acrossai-settings with "Delete all data on uninstall" (dual-gated on both admin opt-in AND mcp-manager Feature 039 landing).
Upgrade notes
- Upgrade is a runtime no-op for the CIMD path — CIMD kill switch defaults OFF; operators explicitly opt in via filter.
- Cache-poisoning defense is always on — no operator configuration required. Every install running a full-page cache immediately gains the guard.
- Coupled-rollback policy with
acrossai-mcp-manager— once mcp-manager Feature 039 lands, this plugin can only be rolled back by also rolling back mcp-manager. Fixes after that point are forward-only via hotfix release.
Full compare: v0.4.0…v0.5.0