Commit Graph
3114 Commits
Author SHA1 Message Date
kolaente 0d14a05aca feat(projects): expand task counts on the project list
Pass expand=task_counts to get each project's done and undone task
counts. The v2 expand param is now repeatable so it combines with
expand=permissions.
2026-10-02 16:50:34 +02:00
kolaenteandTink d851612413 feat(api): read the current user's general settings on v2
A GET next to the existing PUT lets AutoPatch expose PATCH
/user/settings/general, so clients can change single settings without
re-sending the rest.
2026-10-02 09:47:32 +02:00
Frederick [Bot] 12c1aaeedc [skip ci] Updated yaegi symbols 2026-10-01 15:59:52 +00:00
Frederick [Bot] 879215681a [skip ci] Updated swagger docs 2026-10-01 15:59:52 +00:00
kolaente ecfbd5b7ec fix(routes): send and expose Retry-After on rate-limited responses
Every 429 from the rate limiters now carries Retry-After so clients know
when the window ends. The basic-auth limiter keys on aligned buckets, so
its value comes from the bucket end. Retry-After isn't CORS-safelisted,
so the CORS config exposes it for the desktop app and frontends on
another origin.
2026-10-01 17:34:38 +02:00
kolaente 0bb6a34607 docs(api): declare web.HTTPError and all refresh token 401 codes on v1 refresh
The 401 body is a web.HTTPError with a code, not a models.Message, and
RefreshSession also answers 16002, 16003 and 16004, not only 16005.
2026-10-01 17:34:38 +02:00
kolaenteandTink 82a263cbe9 fix(caldav-tokens): honour page in the v2 token list
The handler returned every token on every page while reporting
total_pages, so paging through the list repeated the same rows.

Fixes #4001
2026-10-01 17:29:11 +02:00
kolaenteandTink 30c468b1d5 fix(bots): order the bot list by id so pages are stable
Without an ORDER BY the paged LIMIT/OFFSET query could return overlapping
or missing bots across pages.
2026-10-01 17:29:11 +02:00
kolaenteandTink 41bb5e1cfb fix(api-tokens): order token list by id before paging
Without an ORDER BY, LIMIT/OFFSET pages are not stable, so tokens could
repeat or go missing across pages.
2026-10-01 17:29:11 +02:00
kolaenteandTink 45001e8827 fix(webhooks): add stable id ordering to Webhook.ReadAll
Webhook.ReadAll paged with Limit/Offset but no ORDER BY, so the row
order (and thus page contents) was undefined across requests.
2026-10-01 17:29:11 +02:00
kolaenteandTink 2fc1d98a42 fix(teams): order team list by relevance and id before paginating
Team.ReadAll had no ORDER BY under LIMIT/OFFSET, so pages could overlap or
skip teams, and an exact search match could fall off the first page the
pickers fetch.
2026-10-01 17:29:10 +02:00
kolaenteandTink 1cd2f5a941 refactor(teams): filter team list by membership subquery instead of DISTINCT join
Prepares for ordering by relevance: Postgres rejects ORDER BY expressions
that are not in a SELECT DISTINCT list.
2026-10-01 17:29:10 +02:00
kolaenteandTink 3a36b2193e fix(admin): match admin user search case-insensitively
Postgres LIKE is case-sensitive, so the admin user picker missed users the
team picker (db.ILIKE) would have found.
2026-10-01 17:29:10 +02:00
kolaenteandTink 36a2a2e56b fix(admin): rank exact and prefix team matches before the page cap
Same cut-off as the user picker for the invite link team picker.
2026-10-01 17:29:10 +02:00
kolaenteandTink 678c387353 fix(admin): rank exact and prefix user matches before the page cap
The user picker fetches one page of 20, so an exact match with a high id
could be cut off by 20 older substring matches.
2026-10-01 17:29:10 +02:00
kolaenteandTink 17adad05ac refactor(db): add search relevance order helper
Preparation for ranking exact and prefix matches ahead of the page
cap in the admin pickers.
2026-10-01 17:29:10 +02:00
kolaente e8e50a5ded fix(notifications): skip mail rendering when the mailer is disabled
Review finding: notifyMail rendered the mail and looked up the recipient only
for mail.SendMail to drop it.
2026-10-01 15:38:27 +02:00
kolaente b781773719 fix(reminders): show due reminders in notifications without email
The reminder cron only ran, and only created the in-app notification,
when the mailer was enabled and the user had email reminders on. The
database notification is now always stored; the mail is skipped in
ReminderDueNotification.ToMail instead.

Fixes #4072
2026-10-01 15:38:27 +02:00
kolaente 927f48fc95 fix(cli): audit user change-status
Refs #3999
2026-10-01 15:27:34 +02:00
kolaente f5c68ac049 fix(bots): 404 unowned bots, require status on PUT, audit owner status changes
- Owners can manage bots in any status (disabled or locked); unowned,
  missing and non-bot ids all return 404 so existence never leaks.
- PUT /api/v2/user/bots/{bot} requires status, so a partial body can no
  longer re-enable a disabled bot. A bot_status validator tag limits it
  to active/disabled.
- BotUser.Status is a pointer: the v1 update route keeps the current
  status when the body omits it instead of unlocking the bot.
- Owner status changes dispatch bot.status.changed for the audit log.
- Regenerate the frontend client and adapt the bot update callers.

Refs #3999
2026-10-01 15:27:34 +02:00
Frederick [Bot] 5f24402290 [skip ci] Updated yaegi symbols 2026-10-01 01:40:53 +00:00
kolaente 76c906bb44 test(admin): make admin project search tests ParadeDB independent 2026-10-01 03:18:23 +02:00
kolaente c650f7ddfe feat(admin): filter and sort the admin project list 2026-10-01 03:18:23 +02:00
kolaenteandTink 49bdd5f160 fix(sessions): break last_active ties by id so pages stay stable
Sessions sharing last_active could swap between LIMIT/OFFSET pages.
2026-10-01 00:06:26 +02:00
kolaente 672133a7e3 test(utils): preserve seconds when stripping nanoseconds 2026-09-30 23:26:55 +02:00
kolaente 7adf63e4a6 test(utils): assert avatar crop source pixels 2026-09-30 23:26:55 +02:00
kolaente 095eb2c1b1 test(utils): preserve fractional duration components 2026-09-30 23:26:55 +02:00
kolaente 1598101c97 test(richtext): normalize CRLF in code blocks 2026-09-30 23:26:55 +02:00
kolaente 38b5c8e514 test(richtext): detect capitalization-only edits 2026-09-30 23:26:55 +02:00
kolaente e6baee4852 test(reminders): exclude notifications for completed tasks 2026-09-30 23:26:55 +02:00
kolaente 3700ea1ba3 test(reminders): include reminders exactly at the cron tick 2026-09-30 23:26:55 +02:00
kolaente f6c8a2d479 test(user): enforce CalDAV token deletion ownership 2026-09-30 23:26:55 +02:00
kolaente 9313e94d83 test(user): reject tokens issued for another purpose 2026-09-30 23:26:55 +02:00
Mohd Quamar TyagiandGitHub 9dffe78277 fix(user): fallback empty user timezone to valid UTC location (#3965) (#3991) 2026-09-30 21:26:06 +00:00
kolaente b9446eec74 fix(filters): respect filter_include_nulls on saved filter views
The gantt view of a saved filter sends filter_include_nulls to show tasks
without dates, but the flag was dropped when merging the request filter into
the saved filter. It now applies to the request filter only, so it does not
leak into the saved filter's own conditions (e.g. pulling in unassigned tasks).

Fixes #4009
2026-09-30 21:33:09 +02:00
kolaente 0990f6f94b fix(kanban): move tasks into saved filter done bucket when done elsewhere
The saved filter view listener only inserted bucket rows for tasks not
yet in a view, so a task completed in its own project stayed in the
filter's default bucket. Move it into the view's done bucket when done,
and back to the default bucket when undone.

Fixes #4018
2026-09-30 21:30:05 +02:00
kolaente dddaf71600 refactor(config): drop the no-op empty license.key default 2026-09-30 20:45:07 +02:00
kolaente dbfdba8ff8 test(e2e): allow non-routable IPs through outgoingrequests config 2026-09-30 20:45:07 +02:00
kolaente 3f547976f8 fix(config): migrate deprecated webhooks.* keys after loading the config
The migration to outgoingrequests.* ran while setting defaults, before
the config file and environment were read, so it only ever saw default
values. webhooks.proxyurl, webhooks.proxypassword and
webhooks.allownonroutableips have been ignored since they were
deprecated.
2026-09-30 20:45:07 +02:00
kolaenteandTink 1bf93c58aa refactor(utils): rename NewHTTPClient to NewUnguardedHTTPClient
Address review comment: make the missing SSRF guard obvious at the call site
2026-09-30 18:26:56 +02:00
kolaenteandTink bff05f2377 fix(utils): stop exempting direct requests to the proxy address from the SSRF guard
The proxy dial exemption was keyed on addresses learned lazily from earlier
proxied requests, so a direct request (loopback, NO_PROXY or an unproxied
scheme) or a redirect to the proxy's host:port was dialed unguarded. Derive
the exempt addresses once from the configured or environment proxy URLs and
reject direct requests to them with ssrf.ErrProhibitedIP.

Address pr-swarm finding: SSRF guard bypass via the proxy address
2026-09-30 18:26:56 +02:00
kolaenteandTink 5dd9500acc fix(doctor): check OIDC discovery through the outgoing proxy 2026-09-30 18:26:56 +02:00
kolaenteandTink 0909a337d3 fix(migration): route Trello API requests through the outgoing client 2026-09-30 18:26:56 +02:00
kolaenteandTink 3ddc89e2c5 feat(auth): route OIDC requests through the outgoing proxy 2026-09-30 18:26:56 +02:00
kolaenteandTink dae98ce948 fix(utils): use the configured proxy without a password
outgoingrequests.proxyurl was silently ignored unless proxypassword was
set too, and the username was hardcoded to vikunja. Credentials in the
proxy url are used now, with proxypassword as the mole-compatible
fallback. Plain http requests through the proxy now authenticate too,
not only CONNECT tunnels. An unparseable proxy url fails requests
instead of connecting directly.
2026-09-30 18:26:56 +02:00
kolaenteandTink ea19fcafe4 refactor(utils): split proxy-aware client from the SSRF guard
NewHTTPClient carries the proxy and timeout settings without the SSRF
guard, for admin-configured endpoints like OIDC providers that often
live on a private network. NewSSRFSafeHTTPClient builds on it.
2026-09-30 18:26:56 +02:00
Frederick [Bot] d6bb209512 [skip ci] Updated swagger docs 2026-09-30 09:09:47 +00:00
kolaenteandTink e2f32c0b32 refactor(client): delete shared legacy infrastructure and Axios 2026-09-30 10:42:35 +02:00
kolaenteandTink 94791debe4 fix(bots): allow owners to manage disabled bots 2026-09-30 10:42:35 +02:00
kolaenteandTink 1f8a45f6a3 test(bots): reproduce disabled bot management failures 2026-09-30 10:42:35 +02:00