* fix(oauth): stop treating a foreign window.opener as a bind flow The /oauth/:provider callback decided between an account bind and a plain login with `window.opener ? 'bind' : 'login'`. Any tab opened from an external link (target="_blank", Slack, mail clients, another site) carries a live opener, and that opener survives the cross-origin round trip to the identity provider. Such a login callback was therefore misread as a bind: it posted a handshake to a window that speaks no such protocol, showed the "binding your account" screen, and hung until the 30s deadline fired with "OAuth binding timed out" — while the backend was never called at all. Reproduced against a real Keycloak round trip: a tab opened via window.open still reports window.opener !== null on the callback, so mode resolved to 'bind' for an ordinary OIDC login. A bind now requires positive proof: the popup we open for it is same-origin (about:blank) before being sent to the provider, so we stamp its own sessionStorage. The stamp rides through the provider round trip and is scoped to that popup alone, so a login tab can never carry it. Ambiguity resolves to 'login', which is the recoverable direction. Affects every provider sharing this callback (OIDC, GitHub, Discord, LinuxDO, custom). * fix(oauth): harden bind popup detection
| Name |
Last commit
|
Last Update |
|---|---|---|
| .agents/skills | Loading commit data... | |
| .github | Loading commit data... | |
| bin | Loading commit data... | |
| common | Loading commit data... | |
| constant | Loading commit data... | |
| controller | Loading commit data... | |
| docs | Loading commit data... | |
| dto | Loading commit data... | |
| electron | Loading commit data... | |
| i18n | Loading commit data... | |
| logger | Loading commit data... | |
| middleware | Loading commit data... | |
| model | Loading commit data... | |
| oauth | Loading commit data... | |
| pkg | Loading commit data... | |
| relay | Loading commit data... | |
| relaykit | Loading commit data... | |
| router | Loading commit data... | |
| service | Loading commit data... | |
| setting | Loading commit data... | |
| types | Loading commit data... | |
| web | Loading commit data... | |
| .dockerignore | Loading commit data... | |
| .env.example | Loading commit data... | |
| .gitattributes | Loading commit data... | |
| .gitignore | Loading commit data... | |
| AGENTS.md | Loading commit data... | |
| CLAUDE.md | Loading commit data... | |
| Dockerfile | Loading commit data... | |
| Dockerfile.dev | Loading commit data... | |
| LICENSE | Loading commit data... | |
| NOTICE | Loading commit data... | |
| README.en.md | Loading commit data... | |
| README.fr.md | Loading commit data... | |
| README.ja.md | Loading commit data... | |
| README.md | Loading commit data... | |
| README.zh_CN.md | Loading commit data... | |
| README.zh_TW.md | Loading commit data... | |
| THIRD-PARTY-LICENSES.md | Loading commit data... | |
| VERSION | Loading commit data... | |
| docker-compose.dev.yml | Loading commit data... | |
| docker-compose.yml | Loading commit data... | |
| go.mod | Loading commit data... | |
| go.sum | Loading commit data... | |
| main.go | Loading commit data... | |
| makefile | Loading commit data... | |
| new-api.service | Loading commit data... |