Commit Graph

13662 Commits

Author SHA1 Message Date
kolaente 0b2f625f06 refactor(frontend): inline modal-card-head-padding in Card footer
The --modal-card-head-padding CSS variable is provided by Bulma's
components/modal partial. Inlining Bulma's default (20px) lets us drop that
partial without needing a local redeclaration.
2026-04-15 10:56:48 +00:00
kolaente 35f183979c feat: add license comments for agents and humans 2026-04-15 10:32:37 +00:00
kolaente a82bea567a feat(db): add license_status table migration
Add database migration for the license_status table that stores instance
ID, cached license validation response, and validation timestamps.
2026-04-15 10:32:37 +00:00
kolaente 7dd664fdc4 feat(init): integrate license validation into startup and shutdown
Call license.Init() after database initialization and before the web
server starts. Call license.Shutdown() during graceful shutdown to stop
the background check goroutine.
2026-04-15 10:32:37 +00:00
kolaente ed2632ddb2 feat(license): add license key validation package
Implement the license validation system with:
- Server communication with retry logic and exponential backoff
- In-memory state management for feature flags and user limits
- Cached validation with 72h expiry stored in database
- Background goroutine with adaptive check intervals (24h/1h)
- Graceful degradation to community mode on failure
- Instance ID generation and persistence
2026-04-15 10:32:37 +00:00
kolaente ecc2243513 feat(config): add license.key configuration option
Add license key configuration under the license section. When empty or
absent, Vikunja runs in community mode with no licensed features.
2026-04-15 10:32:37 +00:00
kolaente 9899979ca7 docs(frontend): document styles architecture and token system 2026-04-15 10:02:39 +00:00
kolaente 02ae01ad80 chore(frontend): enable vue/multi-word-component-names with legacy allowlist 2026-04-15 09:58:55 +00:00
kolaente 21609127a1 fix(frontend): guard caldav and totp settings routes when disabled 2026-04-15 09:57:17 +00:00
kolaente 91d5cfb1c0 fix(frontend): render editor popups inside modal dialog top-layer
Native <dialog> elements opened with showModal() render in the browser's
top-layer. Popups appended to document.body end up behind the dialog
regardless of z-index, which broke the slash-command menu and the user
mention suggestion inside the task detail modal.

Append the popups to the nearest open <dialog> ancestor of the editor
(falling back to document.body) so they join the same top-layer stacking
context.
2026-04-15 08:39:24 +00:00
kolaente a1fbc277be
fix(deps): patch follow-redirects and basic-ftp security vulnerabilities
Update follow-redirects to 1.16.0 (fixes auth header leak on cross-domain
redirects) and basic-ftp to 5.2.2 (fixes CRLF injection in FTP commands).
2026-04-14 20:49:42 +02:00
kolaente 0b45cff583
feat(ci): sign archlinux packages with GPG for pacman verification
Pacman verifies individual package signatures (.sig files). Add GPG
setup and detach-sign step for archlinux packages in the os-package
job. The .sig is uploaded alongside the package to S3.
2026-04-14 19:35:23 +02:00
kolaente c970f87e89
fix(ci): resolve symlinks before upload instead of deleting them
S3 can't store symlinks. Previously all symlinks were deleted, which
removed vikunja.db -> vikunja.db.tar.gz needed by pacman. Now resolve
symlinks into real file copies first, then delete package files.
2026-04-14 17:08:27 +02:00
kolaente fdeacd3eaf
fix(ci): write GPG key directly to file instead of importing and exporting
No need to import the key into GPG and then export it again. Just
write the secret key data directly to a file for nfpm to use.
2026-04-14 16:22:52 +02:00
kolaente f208279dd2 test(editor): add e2e for emoji autocomplete 2026-04-14 13:48:49 +00:00
kolaente c0f05b6277 feat(editor): register emoji autocomplete extension 2026-04-14 13:48:49 +00:00
kolaente 7ab2804129 feat(editor): add emoji TipTap extension 2026-04-14 13:48:49 +00:00
kolaente 02d4dd1631 feat(editor): add emoji suggestion handler 2026-04-14 13:48:49 +00:00
kolaente 88136ed45e feat(editor): add EmojiList popup component 2026-04-14 13:48:49 +00:00
kolaente 542cab5ef6 feat(editor): add lazy emoji data loader and filter 2026-04-14 13:48:49 +00:00
kolaente f6ec5d8e96
feat(ci): sign RPM packages with GPG via nfpm
Add GPG signing configuration to nfpm.yaml for rpm packages. The
os-package job now sets up GPG and exports the key for nfpm to use
during package creation.
2026-04-14 15:47:31 +02:00
kolaente 4d8c37f8ff
fix(ci): exclude package files from repo metadata upload
The dl.vikunja.io worker redirects package file requests under /repos/
to the existing artifacts, so uploading them again is redundant.
Remove .deb, .rpm, .apk, .archlinux, .pacman, .pkg.tar.zst files
and symlinks before uploading to R2.
2026-04-14 14:36:00 +02:00
kolaente 7227c59f5e test(e2e/kanban): seed the view only once with done_bucket_id 2026-04-14 11:32:14 +00:00
kolaente af6923524f test(e2e/kanban): cover recurring task drag to done bucket (#2618) 2026-04-14 11:32:14 +00:00
kolaente d389408618 test(kanban): cover moveTaskToBucket 2026-04-14 11:32:14 +00:00
kolaente 13c4aec461 fix(frontend/kanban): honor server bucket redirect on drag (#2618) 2026-04-14 11:32:14 +00:00
renovate[bot] c68649faf4 chore(deps): update dev-dependencies 2026-04-14 10:51:01 +00:00
kolaente 77167eb356
fix(ci): pin s3-action to main branch 2026-04-14 12:47:18 +02:00
kolaente 3d08a4f78f
fix(ci): update s3-action to skip directories during upload
The s3-action glob matched directories causing EISDIR errors. Fixed
the action to filter with fs.statSync().isFile(). Updated all
s3-action references to the new version.
2026-04-14 12:25:43 +02:00
kolaente 797c813091
fix(ci): revert S3 glob to **/* and clean up directories before upload
The **/*.* glob skipped extensionless files like Release, InRelease,
and Packages. Revert to **/* and instead remove reprepro's internal
db/conf directories and directory symlinks before uploading.
2026-04-14 10:02:50 +02:00
Frederick [Bot] 8bde434676 chore(i18n): update translations via Crowdin 2026-04-14 01:29:51 +00:00
Frederick [Bot] 88528d927e [skip ci] Updated swagger docs 2026-04-13 16:21:02 +00:00
kolaente 85836076be feat(migration/wekan): import attachments from board export
Parse the top-level `attachments` array in WeKan board JSON exports,
group them by card ID, base64-decode the payload, and attach the
resulting files to the generated tasks so they land in Vikunja as
task attachments. Orphaned attachments (cardId with no matching card)
are silently skipped; decode errors are logged and skipped.
2026-04-13 16:04:14 +00:00
kolaente cff690fb5f
fix(ci): skip desktop .apk in APK repo, not a valid Alpine package
The desktop .apk file from electron-builder is not an Alpine APK
package and causes apk index to fail with "v2 package format error".
2026-04-13 16:15:41 +02:00
kolaente a110642093
fix(ci): inline APK repo generation to avoid glibc binary on Alpine
The mage-static binary is compiled with glibc which can't run on
Alpine's musl. Instead of fighting compatibility, inline the APK
repo generation as shell commands since the logic is simple.
2026-04-13 15:18:08 +02:00
kolaente 1eafd31a2a
refactor(projects): use getAllProjectsForUser in getProjectsToDelete (#2616) 2026-04-13 12:32:32 +02:00
renovate[bot] a3ac01346a chore(deps): update dev-dependencies 2026-04-13 10:14:34 +00:00
kolaente 29098aee62
fix(ci): add libc6-compat for Alpine, fix S3 upload glob, add debug
- Install libc6-compat on Alpine so the glibc-linked mage binary runs
- Change S3 upload glob from **/* to **/*.* to skip directories
- Add debug step to inspect mage-static binary on Alpine
2026-04-13 12:13:05 +02:00
kolaente f3aaf27242
fix(ci): set RELEASE_VERSION to avoid git dependency in containers
The mage initVars calls git describe when RELEASE_VERSION is not
set. Setting it avoids needing git in the container images.
2026-04-13 11:45:37 +02:00
kolaente cd61db4415
refactor(ci): split publish-repos into matrix with native containers
Each package format now runs in its native container image:
- apt: ubuntu:noble (reprepro)
- rpm: fedora:latest (createrepo_c)
- pacman: archlinux:latest (repo-add + bsdtar built-in)
- apk: alpine:latest (apk + abuild-sign built-in)

This eliminates cross-distro tool availability issues. Desktop
packages are downloaded and renamed per format to match the mage
target glob patterns. Also adds --allow-untrusted to apk index
since nfpm-produced .apk packages are unsigned.
2026-04-13 11:19:12 +02:00
kolaente 136fafdf37
fix(ci): install libarchive-tools for repo-add bsdtar dependency
repo-add uses bsdtar to validate packages, which requires
libarchive-tools. The .archlinux extension works fine with repo-add
so the rename to .pkg.tar.zst was unnecessary. Also removes debug
steps.
2026-04-13 10:50:56 +02:00
kolaente 2a2b3c787e
fix(ci): add deeper debug for archlinux/pacman package contents 2026-04-13 08:22:18 +02:00
Frederick [Bot] 5ef01965e5 chore(i18n): update translations via Crowdin 2026-04-13 01:48:06 +00:00
kolaente ab6cdf91eb
fix(ci): add debug step to list incoming package files 2026-04-12 19:56:03 +02:00
kolaente 20deac2ce1
fix(ci): rename .archlinux files to .pkg.tar.zst for repo-add
repo-add validates file extensions and rejects .archlinux files.
Rename them to .pkg.tar.zst when symlinking into the repo directory.
2026-04-12 18:32:26 +02:00
kolaente e1fed9e252
fix(ci): install makepkg for repo-add utility scripts
repo-add from pacman-package-manager sources scripts from
/usr/share/makepkg/util/ which are shipped in the separate
makepkg package on Ubuntu.
2026-04-12 17:59:32 +02:00
kolaente 80ecaeb567
fix(ci): sign APT Release files manually instead of via reprepro gpgme
reprepro uses gpgme for signing which fails in CI environments because
gpgme cannot access pinentry. Instead, remove SignWith from the reprepro
distributions config and sign Release files manually with gpg after
reprepro finishes, producing both Release.gpg and InRelease.
2026-04-12 17:32:11 +02:00
renovate[bot] 160495b84e chore(deps): update dependency stylelint to v17.7.0 2026-04-12 14:42:19 +00:00
kolaente e8d12186d1
fix(ci): configure gpg loopback pinentry for reprepro signing
reprepro uses gpgme which bypasses the preset passphrase cache and
tries to launch a pinentry dialog, failing in CI with
"Inappropriate ioctl for device". Adding loopback pinentry mode
allows gpgme to obtain the passphrase without a dialog.
2026-04-12 16:49:36 +02:00
kolaente 010be28249
fix(ci): add mage aliases for pacakge releases 2026-04-12 15:04:10 +02:00