Commit Graph
14671 Commits
Author SHA1 Message Date
kolaente e31ea2de50 test(e2e): seed hashed user tokens in TokenFactory (GHSA-r6w9-259g-gwrv)
Reset/confirm/deletion tokens (kinds 1-3) are now stored as a SHA-256 hash and
looked up by hash, so the e2e factory must seed the hash while returning the
plaintext to the test. Kind 4 (caldav/bcrypt) is seeded verbatim.
2026-07-19 18:59:34 +02:00
kolaente 6895a7765e fix(security): reject cross-project views in ProjectView Can{Delete,Update} (GHSA-gg93-x632-9ccv) 2026-07-19 18:59:34 +02:00
kolaente 781ffac198 fix(security): require Admin to detach a project from its parent (GHSA-44v6-7fxq-vgf4) 2026-07-19 18:59:34 +02:00
kolaente 1c13624a8e fix(api): reject link shares on reaction and task-read endpoints (consistency; GHSA-vvcv-vpph-h844) 2026-07-19 18:59:34 +02:00
kolaente 3a0ea15d8c fix(security): hash password-reset, email-confirm and deletion tokens at rest (GHSA-r6w9-259g-gwrv) 2026-07-19 18:59:34 +02:00
kolaente 00fd2c6155 fix(security): clear plaintext user tokens for reset/confirm/deletion (GHSA-r6w9-259g-gwrv) 2026-07-19 18:59:34 +02:00
kolaente 4ae2e09301 fix(auth): reject API tokens at the OAuth authorize endpoint (GHSA-v3p6-34mc-hj7v) 2026-07-19 18:59:34 +02:00
kolaente 7854f2729a fix(auth): require verified email before OIDC email-fallback account linking (GHSA-xv7q-fvmc-jx96) 2026-07-19 18:59:34 +02:00
kolaente be36c11e67 fix(api): derive API-token ownership from a verified user principal (GHSA-vvcv-vpph-h844) 2026-07-19 18:59:34 +02:00
kolaente d911caaa11 fix(projects): enforce write permission on target parent when duplicating a project (GHSA-f27p-pw2p-9pr4) 2026-07-19 18:59:34 +02:00
kolaente cfb9c24519 fix(kanban): pin link-share task collection view to the share's project (GHSA-rj9j-8772-4h6c) 2026-07-19 18:59:34 +02:00
kolaente b31d606b88 fix(kanban): prevent cross-tenant bucket relocation via project_view_id mass-assignment (GHSA-569v-q83c-3j3g) 2026-07-19 18:59:34 +02:00
kolaente 36cdc2ce2b fix(kanban): authorize body task_id when moving a task into a bucket (GHSA-5pg6-m483-7vrg) 2026-07-19 18:59:34 +02:00
kolaenteandkolaente 37c35c64fb fix(a11y): make the editor toolbar a single tab stop with roving focus
role=toolbar with a roving tabindex: Arrow keys move between buttons,
one Tab stop, Tab leaves the toolbar, and the tab stop stays valid when
buttons become disabled. Covered by an e2e keyboard-navigation spec.

Also fixes the table-edit :disabled bindings, which referenced
editor.can().X as a property (always truthy) so those buttons never
actually disabled — surfaced by review while testing the roving focus.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente ad6884fb72 fix(a11y): announce comment and attachment counts on task cards and rows
The bare count badges read as just a number to screen readers; they now
carry an accessible name like "2 comments" / "1 attachment".

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 2a823836ee fix(a11y): label the bucket selector with its purpose and current bucket
The trigger announced only the bare bucket name ("To-Do, button");
it now announces "Kanban bucket: To-Do".

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente eb164f8ce9 fix(a11y): keep the auth hero heading readable with a gradient scrim
The white hero heading sat directly on the photo, where its contrast
depends on the image content. A bottom-weighted gradient scrim keeps it
readable across the whole picture.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 5495043861 feat(editor): prompt for alt text when inserting an image
Opens the existing alt-text prompt right after an image is inserted
(upload, paste and URL flows) so every new image gets a description.
Cancelling leaves the image without alt text, and the node is deselected
afterwards so the next insert appends instead of replacing.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente 878d389587 fix(a11y): un-nest the attachment rows
Each attachment row was a button containing the download, copy-URL,
delete and set-cover buttons — interactive elements nested inside an
interactive element, which is invalid and confuses assistive-technology
focus (axe: nested-interactive). The row is now a non-interactive
container: the filename (and thumbnail) is the trigger that opens or
downloads the attachment, and the action buttons are its siblings.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 15:36:05 +00:00
kolaenteandkolaente a980e99c9e test(tasks): pin subtask root placement for fuzzy search and multi-parent scopes
The fuzzy mirror test is ParadeDB-only and fails without the previous
commit (child returned as a second root). The multi-parent test pins the
NOT EXISTS semantics from #3197: one in-scope and one out-of-scope
parent must still nest the child.

Part of #2954
2026-07-19 14:16:07 +00:00
kolaenteandkolaente 723ef2dce9 fix(search): mirror ParadeDB BM25 matching into the subtask parent search condition
The parent root-membership mirror always used the ILIKE fallback, so on
ParadeDB a parent matching the search only via fuzzy/token matching kept
its child as a duplicate root, and a substring-only ILIKE match could
hide a child under a parent absent from the results. The assumed
limitation no longer holds: pg_search plans ||| against the aliased
parent_tasks inside the correlated NOT EXISTS as a regular BM25 scan
(verified on 0.24.1), and score-free predicates never triggered the
"unsupported query shape" error on older versions either.

Part of #2954
2026-07-19 14:16:07 +00:00
kolaenteandkolaente d3d69c76ce fix(a11y): render the kanban bucket footer as a list item
The add-task footer renders inside ul.tasks via the draggable footer
slot; as a div it was the one remaining invalid child of the kanban
lists converted in #3234.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 13:43:18 +00:00
TinkandGitHub 60a09f2088 fix(a11y): contrast tokens, empty-title feedback, structure and landmarks (#3234) 2026-07-19 15:15:10 +02:00
TinkandGitHub b5f34ff7da fix(labels): explain why link-share users can't create labels (#3233) 2026-07-19 14:45:37 +02:00
TinkandGitHub 5c2bb6bd2d fix(quick-add): don't abort task creation when a label can't be created (#3232) 2026-07-19 14:45:24 +02:00
kolaenteandkolaente 4ccf5ac4ae fix(a11y): expose expanded, sort, result-count and toggle states to assistive technology
Add disclosure semantics to dropdown/popup triggers (aria-expanded, Escape to
close with focus return, drop the incorrect role=menu), aria-sort plus
per-column labels on the table view, a debounced polite live region announcing
quick-actions result counts, aria-pressed on editor toggle buttons, and an
aria-label on the rich-text editing region.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-19 11:36:25 +00:00
maximilizeandGitHub 4f86f21316 fix(filters): resolve relative and absolute date filters in UTC (#3181) 🤖🤖🤖 (#3229) 2026-07-19 13:31:21 +02:00
kolaente 9e25b36530 chore(deps): update devenv 2026-07-19 12:58:41 +02:00
TinkandGitHub 7afbf86467 fix(a11y): login tab order, announced errors, combobox pattern, named dialogs and selects (#3228) 2026-07-19 12:39:47 +02:00
Evan BakerandGitHub d0dad0437f fix(user): stop double-encoding FrontendSettings on UpdateUser (#2793) 2026-07-19 12:13:35 +02:00
renovate[bot]andkolaente f462187544 chore(deps): update dev-dependencies 2026-07-19 09:06:25 +00:00
renovate[bot]andkolaente 7826aa4bba fix(deps): update tiptap to v3.28.0 2026-07-19 09:00:23 +00:00
renovate[bot]andkolaente 3d501969a4 fix(deps): update font awesome to v7.3.1 2026-07-19 09:00:16 +00:00
TinkandGitHub 0dd27ed2d0 fix(tasks): make subtask root condition NULL-safe and search-aware (#3197) 2026-07-19 10:59:28 +02:00
kolaenteandkolaente f76e405b6c fix: disable echo group 404 auto-registration to keep pre-5.3.0 routing behavior
echo v5.3.0 reverted to v4 behavior where every group with middleware
implicitly registers a 404 route at its prefix. Our route setup creates
multiple groups with the same prefix (rate-limit subgroups of /api/v1),
which now panics with a duplicate-route error at startup.
2026-07-18 17:24:51 +00:00
renovate[bot]andkolaente 293ac5d103 fix(deps): update module github.com/labstack/echo/v5 to v5.3.0 2026-07-18 17:24:51 +00:00
Pierre Christenandkolaente 44ed50d508 docs: fix @Success 200 -> 201 on 5 PUT/Create endpoints
Five PUT-routed "create" endpoints document @Success 200, but they all
dispatch through the shared CreateWeb handler (pkg/web/handler/create.go),
which always responds 201 Created. Every other CreateWeb-routed endpoint
(labels, teams, filters, task relations/comments/assignees/duplicate,
task-labels) already correctly documents 201 - these five are stragglers
with the same stale annotation.

Affected endpoints:
- PUT /tokens
- PUT /projects/{id}/views/{view}/buckets
- PUT /projects/{id}/webhooks
- PUT /{kind}/{id}/reactions
- PUT /projects/{project}/views

Doc-only change, no behavior change. Regenerated pkg/swagger/* via
`swag init -g ./pkg/routes/routes.go --parseDependency -d . -o ./pkg/swagger`
(the command mage generate:swagger-docs runs) so the generated docs match
the annotations.
2026-07-18 17:05:32 +00:00
renovate[bot]andkolaente e10b1fcbb8 fix(deps): update dependency pinia to v4 2026-07-18 16:55:47 +00:00
TowyTowyandGitHub ffcd470adf fix(caldav): parse ISO 8601 week durations in reminder triggers (#3183) 2026-07-18 18:55:17 +02:00
Frederick [Bot] 2b7d31bfbb [skip ci] Updated swagger docs 2026-07-18 15:00:26 +00:00
kolaenteandkolaente fd2815cf73 fix(a11y): add accessible names to all icon-only buttons
Adds translated aria-labels to the 42 icon-only BaseButton/XButton
usages the new lint rule found — attachment actions, assignee/label
remove buttons, multiselect clear buttons, table sort triggers, the
TipTap bubble menu (which only had v-tooltip, which sets no accessible
name), datepicker toggles, and more. Labels reuse the existing tooltip
translation keys where present and interpolate item names where
available (e.g. "Remove {user} as assignee").

With zero remaining violations the rule is raised from warn to error.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-18 14:05:36 +00:00
kolaenteandkolaente 1d17e4cacc chore(a11y): add lint rule flagging icon-only buttons without accessible name
BaseButton renders a bare button and does not enforce a name, so icon-only
usages without aria-label are announced as just "button" — the a11y audit
found this pattern regenerating across the codebase (42 current instances,
including the TipTap bubble menu where v-tooltip provides no accessible
name). The new vikunja/icon-button-accessible-name rule flags icon-only
BaseButton/XButton usages that have no aria-label, aria-labelledby, title,
visible text, or sr-only text; unknown child components are assumed to
render text to avoid false positives.

Set to 'warn' until the existing instances get aria-labels, then raise to
'error'.

Claude-Session: https://claude.ai/code/session_018prq5WqRL38EGhPNQKqZUP
2026-07-18 14:05:36 +00:00
kolaenteandkolaente f405fc5a78 test: cover getErrorText interpolation of i18n_params
Address pr-swarm finding: design (the fixed line itself was untested).
2026-07-18 13:41:15 +00:00
kolaenteandkolaente c34972a6ba test: assert I18nParams keys against en.json translation placeholders 2026-07-18 13:41:15 +00:00
kolaenteandkolaente f388015dda fix: interpolate dynamic values into translated error toasts
Parametrised error translations (invalid api token permission, invalid
timezone, invalid claim data) rendered their placeholders as empty text
because the backend only baked the values into the English message and
the frontend translated the error code without any interpolation params.

Carry the values as i18n_params on error responses, keyed by the
placeholder names of the frontend's error translations, on both v1 and
the v2 problem+json body, and pass them through when translating the
toast. A 14002 toast now reads e.g. "The permission time_entries of
group tasks is invalid." instead of "The permission of group is
invalid."
2026-07-18 13:41:15 +00:00
kolaenteandkolaente 0c3b63c6ee fix(a11y): move focus to main content when the skip link is activated
the target main element was not programmatically focusable, so activation only set the URL hash and screen readers never announced the jump
2026-07-18 12:24:20 +00:00
kolaenteandkolaente 54829da649 fix(a11y): show a keyboard-only focus ring on text inputs and editable titles
The .input:focus reset left text fields and the contenteditable task
title without any focus indication. Because :focus-visible matches mouse
clicks on text fields, keyboard modality is tracked via a user-is-tabbing
class on the root element instead.
2026-07-18 12:24:20 +00:00
kolaenteandkolaente e824657fcd fix(a11y): make kanban cards reachable and openable by keyboard 2026-07-18 12:24:20 +00:00
kolaenteandkolaente f428ab9e00 fix(a11y): fix light theme contrast of success and danger text 2026-07-18 12:24:20 +00:00
kolaenteandkolaente c12757127f fix(a11y): pick label text color by actual WCAG contrast ratio 2026-07-18 12:24:20 +00:00