Repository navigation
Conversation
An expired portal session answers /api/* with 401, which the app read as its own token gate and drew the old AccessGate. A 401 on a page the portal signed in now reloads, and the portal serves its own login on the same URL. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
gianlukamoraes
left a comment
There was a problem hiding this comment.
Revisão automática — PR #29
Resumo: a correção faz o que promete. Quando a sessão do portal expira, a próxima chamada local que recebe 401 recarrega a página, e o portal mostra o próprio login em vez do antigo "Pair this device". O 401 de um PC remoto fica de fora. O teste do arquivo passa e o typecheck também. Fica um ponto não bloqueante: se o próprio herdr responder 401 enquanto o portal ainda está válido, a página entra num ciclo de recarga.
- 🟡 Pode entrar em ciclo de recarga. O código parte do princípio de que todo 401 local, atrás do portal, vem do portal. Mas o servidor do herdr também devolve 401 por conta própria (token trocado, dispositivo não pareado). Nesse caso a página recarrega, o portal responde de novo que está autenticado, o mesmo 401 volta e a página recarrega outra vez, sem parar. Correção barata: antes de recarregar, perguntar de novo ao
/api/portal/mee só recarregar se ele não disser maisauthenticated: true. - ⚪ Sem CI neste PR (nenhum check rodou) e o gate do pr-monitor ainda não tem matriz para este repo. Rodei manualmente o teste do arquivo alterado e o
tsc.
Detalhe técnico
🟡 Ciclo de recarga quando o 401 é do próprio herdr (src/lib/portal.ts:40, src/lib/api.ts:134)
- O
portalSeené estado de módulo e volta atrueem cada carga da página, assim quefetchPortalSessionrecebe{authenticated:true}(portal.ts:63). O reset parafalsedentro dereloadIfPortalExpiredsó protege a carga atual. - O herdr gera 401 sozinho:
server/index.ts:1260(unauthorizedJson(access.reason | "token_required")),server/auth.ts:90, além de/api/authe/api/devices/pair(auth.ts:282,devices.ts:225), que também passam porerrorFromcom URL local. - Cenário: o portal está válido, mas o herdr atrás dele recusa (token rotacionado,
devices.gatedligado, identidade do proxy mudou). O/api/portal/meresponde 200 com authenticated,portalSeenvira true, o poll defetchMachinesrecebe 401 e a página recarrega. Na carga seguinte acontece o mesmo, para sempre. Antes do PR o usuário via o AccessGate, o que pelo menos dava diagnóstico. - Correção sugerida: em
reloadIfPortalExpired, para status 401 comportalSeen, refazerfetchPortalSession()e recarregar só seportal === false. Se o portal ainda autentica, o 401 é do herdr e segue o fluxo atual (setLocked). Como a função passa a ser assíncrona, ela é chamada comvoidemerrorFrom. Alternativa: distinguir pelo corpo, já que o 401 do herdr traz{error:{code:"unauthorized"|"invalid_token"|"invalid_code"}}, se o 401 do portal tiver outro formato (não verificado, o portal é outro repo).
Menores
- Entre o 401 e o
reload(), oload()doApp.tsx:339ainda chamasetLocked(true), então o AccessGate pode piscar por um frame antes da recarga. Cosmético. - O teste não cobre a exclusão de
/api/machines/emapi.ts:134. Typo no nome do teste: "for for".
Verificado limpo
machinePath(LOCAL_MACHINE, …)gera/api/<path>(shared/machines.ts:96), então as rotas locais entram e as remotas (/api/machines/<id>/) ficam de fora, como o comentário diz.- Todas as respostas não-ok de
getJson/sendJsonpassam porerrorFrom, inclusive o poll defetchMachines, que é o que dispara o gate hoje. - Antes de o portal responder (ou sem portal)
portalSeené false, então nada muda para quem usa sem portal. bun test src/lib/portal.test.ts: 10 pass / 0 fail;tsc --noEmit: ok (worktree na head8bb4a1d).
Modo revisor: não faço merge. Do lado do código está aceitável para merge (o 🟡 pode ir agora ou num follow-up); falta o merge humano.
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
An expired portal session answers /api/* with 401, which the app read as its own token gate and drew the old AccessGate (Pair this device). A 401 on a page the portal signed in now reloads, and the portal serves its own login on the same URL. Remote-PC 401s are ignored.
🤖 Generated with Claude Code