From e4e0d0d1f1e57926ba2d6dd8f9cb273fa5a6b9a5 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Mon, 20 Apr 2026 16:32:24 +0200 Subject: [PATCH] fix: handle 403 (inactive peer) alongside 401 for stale peer re-handshake --- packages/server/src/utils/federationWorker.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/server/src/utils/federationWorker.ts b/packages/server/src/utils/federationWorker.ts index 6e272613..054afa0e 100644 --- a/packages/server/src/utils/federationWorker.ts +++ b/packages/server/src/utils/federationWorker.ts @@ -261,14 +261,15 @@ async function processOutboxTick(): Promise { }) .where(eq(schema.federationPeers.id, peerId)) .run(); - } else if (response.status === 401) { - // 401 = HMAC verification failed on the remote side. - // This means the remote deleted/revoked our peer record — our local - // peer is stale. Reset to 'pending' so resolvePendingPeers() triggers - // a fresh handshake via ensurePeered() on the next tick. + } else if (response.status === 401 || response.status === 403) { + // 401 = HMAC verification failed (remote deleted our peer record entirely) + // 403 = Peer exists but is not active (remote revoked/rejected us) + // Both mean the peer relationship is broken on the remote side. Reset to + // 'pending' so resolvePendingPeers() triggers a fresh handshake via + // ensurePeered() on the next tick. // Outbox entries are preserved (same peer ID) and will deliver after re-peering. console.warn( - `[federation-worker] Peer ${peerOrigin} returned 401 (HMAC rejected) — resetting to pending for re-handshake`, + `[federation-worker] Peer ${peerOrigin} returned ${response.status} (peer stale) — resetting to pending for re-handshake`, ); db.update(schema.federationPeers) .set({