openclaw/extensions/matrix
Natalie K 86956f71e6
fix(matrix): close owner-side device verification loop on SAS confirm (#74542)
* fix(matrix): close owner-side device verification loop on SAS confirm

After SAS confirm via the `openclaw matrix verify confirm-sas` CLI, the
operator's Element X stayed in "Verifying…" because three things on the
bot side did not happen before the verb returned:

1. confirmVerificationSas didn't await the rust-crypto verifier promise.
   `Verifier.verify()` resolves only after both sides exchange MACs and
   the protocol fully settles, including cross-signing-key uploads
   triggered by `crossSignDevice`. Returning early meant Element X's
   next /keys/query saw an inconsistent state and the prompt persisted.

2. The 30s auto-confirm path (used when the operator initiates from
   their phone) explicitly passed `{ trustOwnDevice: false }`, so the
   bot never cross-signed its own device on this path. The check inside
   trustOwnDeviceAfterConfirmedSas already gates on isSelfVerification,
   so flipping the flag is safe — non-self requests remain a no-op.

3. The standalone `confirmMatrixVerificationSas` action did not call
   `trustOwnIdentityAfterSelfVerification` (only the higher-level
   `runMatrixSelfVerification` path did). Without that call, the bot
   had not signed the operator's master key, so Element X had no path
   to clear the prompt without a passive sync tick.

Three additive edits:

- verification-manager.ts (confirmVerificationSas): await
  session.verifyPromise after confirmSasForSession returns.
  verifyPromise is the .then().catch() chain set by
  ensureVerificationStarted, which already routes rejections into
  session.error, so awaiting it cannot double-throw.
- verification-manager.ts (maybeAutoConfirmSas): pass
  { trustOwnDevice: true } so the auto-confirm path also cross-signs
  the bot device for self-verifications.
- actions/verification.ts (confirmMatrixVerificationSas): mirror the
  trustOwnIdentityAfterSelfVerification call from
  completeMatrixSelfVerification when the returned summary indicates
  isSelfVerification.

Tests:
- verification-manager.test.ts: flipped the existing "auto-confirmed
  self-verification" assertion (now expects trustOwnDeviceAfterSas to
  be called); added two new tests for verifyPromise await and
  rejection-on-summary.error.
- actions/verification.test.ts: two new tests asserting
  confirmMatrixVerificationSas calls trustOwnIdentityAfterSelfVerification
  on self-verifications and not on remote verifications.

Verified end-to-end against matrix.thepolycule.ca (Synapse 1.145.0+ess.1,
MAS-fronted): after `verify confirm-sas`, Element X's device-list view
shows the bot device with a green shield and no pending Verify prompt.

* fix(matrix): guard owner trust after failed SAS verification

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-04-29 19:42:45 +01:00
..
src fix(matrix): close owner-side device verification loop on SAS confirm (#74542) 2026-04-29 19:42:45 +01:00
.npmignore plugins: trim staged runtime cargo 2026-04-13 18:10:40 -04:00
api.ts refactor: pin remaining extension api surfaces 2026-04-27 21:02:53 +01:00
auth-presence.ts refactor(plugin-sdk): narrow config runtime imports 2026-04-27 14:58:32 +01:00
CHANGELOG.md fix(matrix): close owner-side device verification loop on SAS confirm (#74542) 2026-04-29 19:42:45 +01:00
channel-plugin-api.ts
cli-metadata.ts perf(plugins): trim channel boundary core imports 2026-04-08 08:52:52 +01:00
contract-api.ts
doctor-contract-api.ts fix(plugins): prune inactive bundled runtime deps 2026-04-28 10:34:24 +01:00
helper-api.ts
index.test.ts refactor: move plugin api test helper to sdk 2026-04-28 00:24:54 +01:00
index.ts fix(matrix): stabilize e2ee qa flows 2026-04-26 23:40:52 -04:00
openclaw.plugin.json perf: mark channel plugins startup lazy 2026-04-28 04:33:47 +01:00
package.json chore: update dependencies 2026-04-26 10:54:58 +01:00
plugin-entry.handlers.runtime.ts
runtime-api.ts fix: resolve main ci shard failures 2026-04-28 05:52:19 +01:00
runtime-heavy-api.ts matrix: break migration runtime import cycle 2026-04-09 01:20:46 -04:00
runtime-setter-api.ts perf(matrix): narrow register-time runtime surface (#69782) 2026-04-21 12:50:53 -04:00
secret-contract-api.ts fix: repair bundled channel secret sidecars 2026-04-08 04:56:58 +01:00
setup-entry.ts fix(channels): keep bundled setup entries dependency-light 2026-04-24 06:10:07 +01:00
setup-plugin-api.ts fix(channels): keep bundled setup entries dependency-light 2026-04-24 06:10:07 +01:00
SPEC-SUPPORT.md docs(matrix): track spec support gaps 2026-04-10 13:48:15 -04:00
subagent-hooks-api.ts refactor(hooks): centralize matrix subagent hook wiring 2026-04-22 11:45:33 -07:00
test-api.ts Matrix: expose E2EE QA verification hooks 2026-04-16 16:18:54 -04:00
thread-binding-api.ts Tests: fast-path Matrix ACP thread binding 2026-04-17 02:00:26 -04:00
thread-bindings-runtime.ts
tsconfig.json