Commit Graph
16361 Commits
Author SHA1 Message Date
kolaente d879cb5c19 fix(ldap): keep the login when storing the synced avatar fails
Address pr-swarm finding: a busy decode budget made StoreAvatarFile fail
the whole LDAP login with 503, while OIDC skips the avatar.
2026-10-20 23:05:30 +02:00
kolaente 1ce3df2d60 refactor(imageutils): queue decodes on the caller's context
Address pr-swarm finding: avatar, background and OIDC/LDAP decodes passed
context.Background(), so a disconnected client stayed queued for up to 30s.
2026-10-20 23:05:30 +02:00
kolaente 1edabda41c refactor(imageutils): drop ValidateReader
Every decode site validates through imageutils.Decode now.
2026-10-20 23:05:30 +02:00
kolaente eaecaa53fe fix(oidc): bound avatar decode memory
Identity-provider avatars are cropped through imageutils.Decode. When the
server is busy the avatar is skipped and logged, like any other avatar
sync error, so the login still succeeds.
2026-10-20 23:05:30 +02:00
kolaente 96496e1dce fix(background): bound decode memory
Project background uploads (and migrated backgrounds) are decoded through
imageutils.Decode, which also covers the blur hash computed from the
decoded image. A busy server answers 503. Drops the unused CreateBlurHash,
which decoded without any bound.
2026-10-20 23:05:30 +02:00
kolaente bcdd4c0cba fix(avatar): bound decode memory
Uploaded avatars are decoded through imageutils.Decode on upload and when
resizing per size, so a busy server answers 503 instead of decoding in
parallel. The old avatar file is removed only after the new one decoded,
since a storage delete is not rolled back with the session.
2026-10-20 23:05:30 +02:00
kolaente f930d895c9 refactor(imageutils): move pixel-weighted decode semaphore
Attachment previews now decode through imageutils.Decode, which holds an
image's pixels against one process-wide budget until the caller is done
with the decoded image. Other decode sites move onto it next.
2026-10-20 23:05:30 +02:00
kolaente 818a854c1d chore(deps): update go to 1.27.3 in mise 2026-10-20 22:22:32 +02:00
kolaente f14d7c8182 chore(deps): update ghcr.io/techknowlogick/xgo:go-1.27.x docker digest to 7d5cab9 2026-10-20 22:22:32 +02:00
kolaente 0e1c2c4ca5 chore(deps): update ghcr.io/techknowlogick/xgo:go-1.27.x docker digest to 783cf55 2026-10-20 22:22:32 +02:00
kolaente fdb0a41303 feat(frontend): add project settings dropdown to project cards 2026-10-20 19:07:35 +02:00
Frederick [Bot] 2eb21632d3 [skip ci] Updated yaegi symbols 2026-10-20 13:41:04 +00:00
Frederick [Bot] a37a34e839 [skip ci] Updated swagger docs 2026-10-20 13:41:04 +00:00
kolaente 512b6ab835 test(export): don't assume sequential file ids in the failed export test 2026-10-20 15:13:02 +02:00
kolaente bd7475878a chore(frontend): regenerate api client 2026-10-20 15:13:02 +02:00
kolaente e5a9631be1 chore: better wording 2026-10-20 15:13:02 +02:00
kolaente 3eb76fc774 fix(auth): reject bot credentials while the bot's owner can't authenticate 2026-10-20 15:13:02 +02:00
kolaente ec76dfbb74 refactor(user): use keyvalue.GetInt64 for failed login and TOTP counters
Address pr-swarm finding: both hand-rolled the int64/string parsing that
GetInt64 now does.
2026-10-20 15:13:02 +02:00
kolaente c1f4e5771a fix(veans): request renamed bucket permission keys for bot tokens
Address pr-swarm finding: after the GHSA-j5v7 key rename the server
exposes views_buckets_{create,update} and views_buckets_tasks_update, so
new bot tokens could no longer move tasks between buckets. Old names stay
for older servers.
2026-10-20 15:13:02 +02:00
kolaente 01b0b10a73 fix(migration): count vikunja export items before decoding data.json
Address pr-swarm finding: the item cap ran only after data.json was fully
decoded into tasks, so a file of millions of bare objects still exhausted
memory.
2026-10-20 15:13:02 +02:00
kolaente da41604b64 fix(auth): reject user JWTs whose session was revoked on the HTTP path 2026-10-20 15:13:02 +02:00
kolaente 866789ebad fix(user): enforce the email confirmation cooldown on redis
Redis returns integers as decimal strings, so the cooldown read 0 and was
never enforced. Add keyvalue.GetInt64 that reads either form.
2026-10-20 15:13:02 +02:00
kolaente 5406ad912f fix(webhooks): derive user- vs project-level webhooks from the route, never the body 2026-10-20 15:13:02 +02:00
kolaente 7e77498fa7 fix(webhooks): require project write access to list webhook targets 2026-10-20 15:13:02 +02:00
kolaente a0454051cb fix(auth): refuse email-unconfirmed accounts on every credential path 2026-10-20 15:13:02 +02:00
kolaente 5c4aa4e34d fix(build): pin xgo module version and docker image digest 2026-10-20 15:13:02 +02:00
kolaente 5aec8b21a7 fix(config): re-anchor database, log and plugin paths to the final rootpath 2026-10-20 15:13:02 +02:00
kolaente bdce14da0e fix(webhooks): route task events by the stored task and load payloads as the webhook creator 2026-10-20 15:13:02 +02:00
kolaente 2a8aacd771 fix(frontend): send the oauth callback state with the migration request 2026-10-20 15:13:02 +02:00
kolaente aab38ecc1c fix(migration): rename stored API token permission keys
Maps the old order-dependent keys onto the new action-named ones, using
the v1 meaning the token UI offered them as.
2026-10-20 15:13:02 +02:00
kolaente 2a134005f5 fix(api-tokens): name non-CRUD permission keys by action across v1 and v2
Colliding non-CRUD routes got a method suffix in registration order, per
version, so one key granted different actions on v1 and v2: a read-only
projects.background scope deleted backgrounds through v2, and bucket
create/update keys swapped meaning (GHSA-j5v7-qcwp-5g32). Keys now derive
from the full v1+v2 route set and carry the action (read/create/update/
delete) once a subkey has more than one. Marking all notifications as
read gets its own key on both versions instead of overwriting update.
2026-10-20 15:13:02 +02:00
kolaente 7b100668fe fix(teams): require membership for team self-removal 2026-10-20 15:13:02 +02:00
kolaente fd3e77445f fix(totp): require the current password to enroll and enable totp 2026-10-20 15:13:02 +02:00
kolaente a89f7dd596 fix(migration): bind oauth migration callbacks to the user who requested the auth url 2026-10-20 15:13:02 +02:00
kolaente f2f4451f9b fix(kanban): never dispatch the task object bound from a bucket move body 2026-10-20 15:13:02 +02:00
kolaente 147379947b fix(dump): create the dump archive 0600 and refuse existing paths
The archive holds the config, the full database and every blob, but was
created with the umask mode and followed or clobbered an existing path.

Refs GHSA-rp64-xg8g-9mpr
2026-10-20 15:13:02 +02:00
kolaente 9599ca2b0e fix(totp): require a current passcode to disable totp 2026-10-20 15:13:02 +02:00
kolaente 22374d73a5 fix(migration): bound todoist and microsoft todo api responses and item counts 2026-10-20 15:13:02 +02:00
kolaente bf881194ca fix(migration): cap trello and todoist downloads at files.maxsize 2026-10-20 15:13:02 +02:00
kolaente 6c3ba90ec3 fix(kanban): only move tasks into buckets of their own project's view 2026-10-20 15:13:02 +02:00
kolaente 46f8ef9899 fix(systemd): set UMask=0077 in vikunja.service
Covers the SQLite database, which the driver creates with the default mode.

Refs GHSA-9rfw-7hv4-3vv3
2026-10-20 15:13:02 +02:00
kolaente 52f9da005a fix(files): store local blobs 0600 in 0700 directories
Stored attachments, backgrounds and exports were readable by every OS user
on the host. Existing files keep their mode.

Refs GHSA-9rfw-7hv4-3vv3
2026-10-20 15:13:02 +02:00
kolaente 0b788b83d2 fix(user): throttle password re-checks per user on sensitive account actions 2026-10-20 15:13:02 +02:00
kolaente 07a4853876 fix(user): put account tokens in the email link fragment 2026-10-20 15:13:02 +02:00
kolaente 1852e3b873 fix(migration): reject wekan boards with duplicate ids or too many items 2026-10-20 15:13:02 +02:00
kolaente 2bb52b6b4d fix(teams): ignore client-set external_id on team create and update 2026-10-20 15:13:02 +02:00
kolaente 836320cff5 fix(user): remove export and avatar files on account deletion
Refs GHSA-7gmh-4fw6-8xc5
2026-10-20 15:13:02 +02:00
kolaente 1c0d8ac11e fix(export): remove replaced and failed export archives
A re-export only moved the pointer, leaving the previous archive on disk
forever. A failed export rolled back the row but kept the blob, and the OS
temp zip was only removed on success.

Refs GHSA-7gmh-4fw6-8xc5
2026-10-20 15:13:02 +02:00
kolaente 4069873723 fix(routes): reject form-encoded bodies outside the OAuth token endpoint
A cross-site <form> needs no CORS preflight, and v2 decoded form bodies
API-wide, so a form POST to /login or the OIDC callback minted a session
in the victim's browser (GHSA-frf4-3prf-3vch). Form decoding is now
scoped to /oauth/token, and both API groups answer 415 elsewhere.
2026-10-20 15:13:02 +02:00
kolaente 2dd4ab14be fix(avatar): round requested size up to a fixed allowlist
Providers cache each size without eviction, so arbitrary, zero and
negative sizes minted unbounded cache entries.

Resolves GHSA-3x3m-2j93-w46j
2026-10-20 15:13:02 +02:00