The previous attempt updated the oauth-authorize e2e assertion to expect /login#redirect= but never ran the test, and the implementation did not actually produce it. Root cause: the guard wrote the redirect hash as encodeURIComponent(to.fullPath), but vue-router runs its own encodeURI over the hash field, turning the embedded %xx into %25xx (double-encoding). On the follow-up navigation to /login the address-bar hash (to.fullPath) was then double-encoded while to.hash was single-decoded, so the pre-existing `!to.fullPath.endsWith(to.hash)` fallback never matched and kept re-appending the hash — an infinite redirect loop that left the URL stuck on /oauth/authorize. Fix: - Pass to.fullPath to the hash raw and read it back without an extra decodeURIComponent. vue-router's encode/decode round-trips it cleanly, so the address bar carries a single-encoded, copyable destination and the guard recovers the exact original fullPath for saveLastVisited. - Skip the endsWith hash re-attach when the hash is the redirect hash, which vue-router keeps url-encoded in fullPath, breaking the loop. Verified locally: tests/e2e/user/oauth-authorize.spec.ts now passes (redirect to /login#redirect=, decoded hash contains /oauth/authorize, and the post-login PKCE code exchange completes); logout.spec.ts still passes. openid-login.spec.ts requires the Dex service container that only CI provides, so it cannot run locally; it does not touch the changed paths. |
||
|---|---|---|
| .claude | ||
| .github | ||
| .vscode | ||
| .zed | ||
| build | ||
| contrib | ||
| desktop | ||
| examples/plugins/example | ||
| frontend | ||
| pkg | ||
| rest | ||
| veans | ||
| .devcontainer.json | ||
| .dockerignore | ||
| .editorconfig | ||
| .envrc | ||
| .gitignore | ||
| .golangci.yml | ||
| .opensourcefinder-verify | ||
| AGENTS.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| CONTRIBUTING.md | ||
| Dockerfile | ||
| LICENSE | ||
| README.md | ||
| cliff.toml | ||
| code-header-template.txt | ||
| conductor.json | ||
| config-raw.json | ||
| crowdin.yml | ||
| devenv.lock | ||
| devenv.nix | ||
| devenv.yaml | ||
| go.mod | ||
| go.sum | ||
| magefile.go | ||
| main.go | ||
| mise.toml | ||
| nfpm.yaml | ||
| publiccode.yml | ||
| renovate.json | ||
| tsconfig.json | ||
| vikunja.initd | ||
| vikunja.service | ||
README.md
Vikunja
The Todo-app to organize your life.
If Vikunja is useful to you, please consider buying me a coffee, sponsoring me on GitHub or buying a sticker pack. I'm also offering a hosted version of Vikunja if you want a hassle-free solution for yourself or your team.
Table of contents
Security Reports
If you find any security-related issues you don't want to disclose publicly, please use the contact information on our website.
Features
See the features page on our website for a more exhaustive list or try it on try.vikunja.io!
Docs
All docs can be found on the Vikunja home page.
Roadmap
See the roadmap (hosted on Vikunja!) for more!
Contributing
Please check out the contribution guidelines on the website.
License
Most of this repository is licensed under AGPL‑3.0‑or‑later.
The contents of desktop/ are licensed under
GPL‑3.0‑or‑later.
Unsplash Images
Background images from Unsplash are distributed under the Unsplash License. The license requires giving credit to the photographer and Unsplash. See Unsplash’s terms for more information.