- Shipped
- 28 de agosto de 2026 às 02:59 UTC
- Author
- Kamo
- Commit
- ce4d901
"Open in new tab" foi `window.open(location.href, ' blank', 'noopener, noreferer')». O ID da sessão não está em um cookie — ele vive em sessãoStorage, por aba, porque organizações sem um domínio próprio partilham uma máquina e um cookie por origem seria um único slot qualquer aba poderia sobrescrever. `janela.aberto` legado-encerra o armazenamento galpão apenas enquanto o relacionamento aberto sobrevive, e `noopener' (implicado por "noreferer" também) corta exatamente isso. A nova aba começou com uma loja vazia, não encontrou nenhuma sessão, e voltou para a página de login. Parecia que funcionava porque estava a ser resgatado: a aba caiu no login.*, onde o auto-login leu o cookie *** apenas para a máquina e o reencaminhou para o org. Removendo que para a frente é o que expôs isso, então o botão é corrigido em vez do que o redirecionamento restaurado — ele nunca teve uma sessão própria. Ele agora usa o mesmo aperto de mão de uma vez-chave que qualquer outra entrada cross-tab: aberto cerca de:blank síncrono dentro do clique (uma espera primeiro perde transiente ativação e WebKit bloqueia o popup), menta um OTK, em seguida, navegue para /validate com a página atual em `next`. O OTK resolve para a sessão SAME, então o novo tab é genuinamente outra instância da mesma org, na página a partir da qual foi aberto. 'newtab' é registrado como um documento-carregar finalidade OTK. Um propósito não listado não é Rejeitado — subsiste silenciosamente num TTL de 10s, que /api/validate não pode confiar sobrevivendo, uma vez que lê a chave de volta de um Redis REPLICA e volta através lag de replicação antes mesmo de iniciar o aplicativo. Três coisas que as notas da segunda janela alertaram e isso evita: a chave continua /validar com o destino em `next`, porque a borda reescreve qualquer `?otk=` request to /validate e descarta o caminho original; o alvo é um URL absoluto realizada em uma variável, porque um literal atribuído a `.location.href` falha check-client-navigation e o Docker construir com ele; e /validate é um caminho pré-sessão, então ele não vai assinar a aba fresca para fora enquanto ele não é autenticado.