Commit Graph

2730 Commits

Author SHA1 Message Date
Jose Diaz-Gonzalez
d00aaf3ff3 Merge pull request #8586 from dokku/assert-output-contains
Count assert_output_contains matches as fixed strings
2026-05-09 16:00:27 -04:00
Jose Diaz-Gonzalez
e78d3bcc78 Merge pull request #8591 from dokku/arbitrary-file-write
Harden archive extraction against symlink traversal
2026-05-09 15:58:31 -04:00
Jose Diaz-Gonzalez
33dd8005dd Merge pull request #8589 from dokku/netrc-permissions 2026-05-09 15:36:10 -04:00
Jose Diaz-Gonzalez
f4213a4bf5 tests: prevent assert_output_contains from aborting on no match
Bats runs tests under `set -eo pipefail`, so when `grep -F -o` finds nothing inside the count pipe it exits 1, the whole pipe fails, errexit fires, and the function aborts before reaching the count comparison. Wrap grep in `{ ... || true; }` so the pipe stays zero when the pattern is absent and the helper falls through to the flunk message.
2026-05-09 13:36:29 -04:00
Jose Diaz-Gonzalez
9decf16ea1 feat: configure archive limits via git properties
Replaces the `DOKKU_ARCHIVE_MAX_SIZE` and `DOKKU_ARCHIVE_MAX_FILES` environment variables with global git properties (`archive-max-size` and `archive-max-files`), configurable via `dokku git:set --global` and surfaced through `dokku git:report --global`. Defaults remain `1073741824` bytes and `10000` entries.
2026-05-09 13:08:23 -04:00
Jose Diaz-Gonzalez
2df0791fcd fix: prevent tar symlink traversal in archive extraction
Archives passed to git:from-archive and certs:add were extracted without symlink or path validation, allowing a crafted archive to write arbitrary files anywhere writable by the dokku user via symlink traversal. Extraction now pre-scans entries for absolute paths, parent traversal, and unsafe symlinks, applies the GNU tar `--no-unsafe-links` flag when available, and validates symlinks after extraction.
2026-05-09 12:54:42 -04:00
Jose Diaz-Gonzalez
6eb8b8632c fix: enforce 0600 permissions on .netrc credentials file
The previous use of `touch` before `netrc set` allowed the file to inherit the umask and be world-readable, exposing stored git credentials to local users. The set and unset paths now explicitly chmod 0600 and chown to the dokku user, and the plugin install hook repairs permissions on already-affected installations.
2026-05-09 12:22:17 -04:00
Jose Diaz-Gonzalez
a70728f61e fix: sanitize openresty include filenames to prevent eval injection
Add defense-in-depth sanitization for OpenResty include files to prevent
OS command injection via malicious filenames that break shell quoting in eval.

- Add filename validation in core-post-extract using regex [^a-zA-Z0-9_.-]
- Validate both http-includes and location-includes paths
- Abort deploy via dokku_log_fail on unsafe filenames
- Skip non-regular files (symlinks, directories) during extraction
- Add security regression test with unsafe filename containing space
- Keep existing guards in docker-args-process-deploy as belt-and-suspenders
- Update documentation to clarify allowed filename characters

Addresses CVSS 9.9 vulnerability where filenames like poc'$(cmd)'x.conf
could escape shell quoting and execute arbitrary commands during deploy.
2026-05-09 12:20:50 -04:00
Jose Diaz-Gonzalez
25abd38387 tests: use /bin/bash -c to execute commands in init tests 2026-05-09 10:48:29 -04:00
Jose Diaz-Gonzalez
38de83eabf tests: use inverted assert
Also echo the status
2026-05-08 21:39:57 -04:00
Jose Diaz-Gonzalez
01268ebad9 tests: fix count 2026-05-08 21:38:22 -04:00
Jose Diaz-Gonzalez
2cf2846c6b test: count assert_output_contains matches as fixed strings
Replace the bash pattern-substitution loop with grep -F -o piped to wc -l so the helper counts literal substring occurrences instead of treating the expected value as a glob pattern. The old implementation interpreted `[`, `]`, `*`, `?`, and `\` as pattern syntax, which made `assert_output_contains "['task.py', 'test']"` report 17 matches against an output that contained the string exactly once - the inner characters were being matched as a character class. assert_output_not_contains delegates to assert_output_contains and is fixed transitively.
2026-05-08 18:56:33 -04:00
Jose Diaz-Gonzalez
47c8141148 Merge pull request #8578 from dokku/8566-core-post-extract-in-four-builder-plugins-fails-under-bash-5-3
Reference SOURCECODE_WORK_DIR in builder core-post-extract
2026-05-08 17:06:10 -04:00
Jose Diaz-Gonzalez
b8f94dfa7f Merge pull request #8581 from dokku/dependabot/docker/tests/apps/go-fail-predeploy/golang-1.26.3
chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/go-fail-predeploy
2026-05-08 17:00:05 -04:00
Jose Diaz-Gonzalez
4efe0eb9fd Merge pull request #8582 from dokku/dependabot/docker/tests/apps/gogrpc/golang-1.26.3
chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/gogrpc
2026-05-08 16:59:53 -04:00
Jose Diaz-Gonzalez
a6cfe3a2d1 Merge pull request #8584 from dokku/dependabot/docker/tests/apps/go-fail-postdeploy/golang-1.26.3
chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/go-fail-postdeploy
2026-05-08 16:31:33 -04:00
Jose Diaz-Gonzalez
390fe2b35a Merge pull request #8583 from dokku/dependabot/docker/tests/apps/zombies-dockerfile-tini/golang-1.26.3
chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/zombies-dockerfile-tini
2026-05-08 16:28:33 -04:00
dependabot[bot]
1706729cfe chore(deps): bump golang in /tests/apps/zombies-dockerfile-no-tini
Bumps golang from 1.26.2 to 1.26.3.

---
updated-dependencies:
- dependency-name: golang
  dependency-version: 1.26.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 13:53:22 +00:00
dependabot[bot]
51dc7799d0 chore(deps): bump golang in /tests/apps/go-fail-postdeploy
Bumps golang from 1.26.2 to 1.26.3.

---
updated-dependencies:
- dependency-name: golang
  dependency-version: 1.26.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 13:53:11 +00:00
dependabot[bot]
07d301775e chore(deps): bump golang in /tests/apps/zombies-dockerfile-tini
Bumps golang from 1.26.2 to 1.26.3.

---
updated-dependencies:
- dependency-name: golang
  dependency-version: 1.26.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 13:53:10 +00:00
dependabot[bot]
0619338607 chore(deps): bump golang from 1.26.2 to 1.26.3 in /tests/apps/gogrpc
Bumps golang from 1.26.2 to 1.26.3.

---
updated-dependencies:
- dependency-name: golang
  dependency-version: 1.26.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 13:53:04 +00:00
dependabot[bot]
902b7f6af4 chore(deps): bump golang in /tests/apps/go-fail-predeploy
Bumps golang from 1.26.2 to 1.26.3.

---
updated-dependencies:
- dependency-name: golang
  dependency-version: 1.26.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-08 13:53:03 +00:00
Jose Diaz-Gonzalez
25f87164ce Merge pull request #8574 from dokku/dependabot/docker/tests/apps/dockerfile-noexpose/node-26-alpine
chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile-noexpose
2026-05-08 01:35:18 -04:00
Jose Diaz-Gonzalez
67ce12b973 Merge pull request #8575 from dokku/dependabot/docker/tests/apps/dockerfile-procfile-bad/node-26-alpine
chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile-procfile-bad
2026-05-08 01:35:10 -04:00
Jose Diaz-Gonzalez
5d212f3195 test: use BATS_TEST_TMPDIR in core-post-extract regression tests
The previous form set `trap "rm -rf '$TMP_DIR'" RETURN` inside the test, but bats propagates `RETURN` traps to nested function calls, so the trap fired on the first `assert_success` and removed the work directory before the trigger script ran. Switching to bats's per-test `BATS_TEST_TMPDIR` removes the trap entirely and lets bats handle cleanup.
2026-05-08 01:34:05 -04:00
Jose Diaz-Gonzalez
05ffccd7e7 Merge pull request #8577 from dokku/dependabot/docker/tests/apps/dockerfile-app-json-formations/node-26-alpine
chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile-app-json-formations
2026-05-07 15:46:32 -04:00
Jose Diaz-Gonzalez
5dfda450d9 Merge pull request #8576 from dokku/dependabot/docker/tests/apps/dockerfile/node-26-alpine
chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile
2026-05-07 15:28:44 -04:00
Jose Diaz-Gonzalez
a7119ba693 Merge pull request #8573 from dokku/dependabot/docker/tests/apps/dockerfile-procfile/node-26-alpine
chore(deps): bump node from 25-alpine to 26-alpine in /tests/apps/dockerfile-procfile
2026-05-07 15:28:24 -04:00
Jose Diaz-Gonzalez
bc8adfa6e2 test: add run_plugn_trigger and run_plugin_script bats helpers
Both helpers wrap `run /bin/bash -c "..."` with the env vars dokku plugin scripts and `plugn` need, replacing the long inline boilerplate that was duplicated across `tests/unit/resource_3.bats` and the new `core-post-extract` regression tests in the builder bats files.
2026-05-07 12:47:00 -04:00
Jose Diaz-Gonzalez
eb17a383c6 fix: reference SOURCECODE_WORK_DIR in builder core-post-extract
The builder-dockerfile, builder-lambda, builder-nixpacks, builder-pack and builder-railpack `core-post-extract` triggers assigned `$2` to a local `SOURCECODE_WORK_DIR` but called `pushd "$TMP_WORK_DIR"`, which was unset. Bash 5.2 silently accepted `pushd ""`, so the bug stayed dormant. Bash 5.3 (shipped with Ubuntu 26.04) makes it a hard error and `set -e` aborts the trigger, causing every `git push` to fail with `pushd: null directory`.
2026-05-07 12:39:46 -04:00
Jose Diaz-Gonzalez
368a6999c9 Merge pull request #8565 from dokku/dependabot/go_modules/tests/apps/gogrpc/google.golang.org/grpc-1.81.0
chore(deps): bump google.golang.org/grpc from 1.80.0 to 1.81.0 in /tests/apps/gogrpc
2026-05-07 10:37:25 -04:00
dependabot[bot]
1e7df47feb chore(deps): bump node in /tests/apps/dockerfile-app-json-formations
Bumps node from 25-alpine to 26-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 26-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-07 13:55:48 +00:00
dependabot[bot]
39f15930a0 chore(deps): bump node in /tests/apps/dockerfile
Bumps node from 25-alpine to 26-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 26-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-07 13:55:42 +00:00
dependabot[bot]
a8fd9122fe chore(deps): bump node in /tests/apps/dockerfile-procfile-bad
Bumps node from 25-alpine to 26-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 26-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-07 13:55:38 +00:00
dependabot[bot]
09ee789849 chore(deps): bump node in /tests/apps/dockerfile-noexpose
Bumps node from 25-alpine to 26-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 26-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-07 13:55:36 +00:00
dependabot[bot]
117a9b43f9 chore(deps): bump node in /tests/apps/dockerfile-procfile
Bumps node from 25-alpine to 26-alpine.

---
updated-dependencies:
- dependency-name: node
  dependency-version: 26-alpine
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-07 13:55:35 +00:00
Jose Diaz-Gonzalez
2d9521a855 Merge pull request #8568 from dokku/dependabot/pip/tests/apps/multi/gunicorn-26.0.0 2026-05-07 07:55:41 -04:00
Jose Diaz-Gonzalez
0429ecfd98 Merge pull request #8572 from dokku/dependabot/pip/tests/apps/dockerfile-release/django-5.2.14
chore(deps): bump django from 5.2.13 to 5.2.14 in /tests/apps/dockerfile-release
2026-05-07 07:09:01 -04:00
Jose Diaz-Gonzalez
dc6a3690d9 Merge pull request #8570 from dokku/dependabot/pip/tests/apps/dockerfile-release/gunicorn-26.0.0
chore(deps): bump gunicorn from 25.3.0 to 26.0.0 in /tests/apps/dockerfile-release
2026-05-07 07:08:48 -04:00
dependabot[bot]
097b3c5449 chore(deps): bump django in /tests/apps/dockerfile-release
Bumps [django](https://github.com/django/django) from 5.2.13 to 5.2.14.
- [Commits](https://github.com/django/django/compare/5.2.13...5.2.14)

---
updated-dependencies:
- dependency-name: django
  dependency-version: 5.2.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-06 13:56:02 +00:00
dependabot[bot]
5e092caef3 chore(deps): bump gunicorn in /tests/apps/dockerfile-release
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 25.3.0 to 26.0.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/25.3.0...26.0.0)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-version: 26.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-05 13:55:32 +00:00
dependabot[bot]
f8813232d8 chore(deps): bump gunicorn from 25.3.0 to 26.0.0 in /tests/apps/multi
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 25.3.0 to 26.0.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/25.3.0...26.0.0)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-version: 26.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-05 13:52:52 +00:00
dependabot[bot]
824aed042f chore(deps): bump gunicorn in /tests/apps/python-flask
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 25.3.0 to 26.0.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/25.3.0...26.0.0)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-version: 26.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-05 13:52:23 +00:00
dependabot[bot]
91e40634f4 chore(deps): bump google.golang.org/grpc in /tests/apps/gogrpc
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.80.0 to 1.81.0.
- [Release notes](https://github.com/grpc/grpc-go/releases)
- [Commits](https://github.com/grpc/grpc-go/compare/v1.80.0...v1.81.0)

---
updated-dependencies:
- dependency-name: google.golang.org/grpc
  dependency-version: 1.81.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-05-04 17:52:13 +00:00
Jose Diaz-Gonzalez
f0a4a7fc29 chore: remove now invalid tests 2026-05-04 13:16:28 -04:00
Jose Diaz-Gonzalez
49dc1c1e64 fix: correct the assertion 2026-05-04 09:30:00 -04:00
Jose Diaz-Gonzalez
964c0fc4e9 fix: source property-functions where fn-plugin-property-* helpers are used
The release_and_deploy function and several proxy plugin scripts call fn-plugin-property-* helpers without sourcing `plugins/common/property-functions`, producing `command not found` errors during deploys. Source the helpers from `plugins/common/functions` and from each proxy plugin entry point that consumes them.
2026-05-04 06:11:22 -04:00
Jose Diaz-Gonzalez
31ce5a7c48 fix: install cnb pack from github releases instead of ppa
The ppa:cncf-buildpacks/pack-cli launchpad source is currently down, breaking the runtime image build and any bats run that calls install_pack. Pack is now tracked in contrib/dependencies.json and pulled from the buildpacks/pack GitHub release tarball, matching how other binary deps are managed. update-deb-dependencies gains hyphen-aware word-boundary matching so single-word names like pack cannot accidentally rewrite unrelated debian/control lines, keeping pack out of the package's hard requirements.
2026-05-02 09:12:46 -04:00
Jose Diaz-Gonzalez
179d09fdd5 fix: chown migrated legacy storage entries to dokku
`SaveEntry` and `touchMigrationFlag` wrote files via `os.WriteFile` and `os.Create` and never chowned them, so the install-time legacy-mount migration produced root-owned `legacy-*.json` files in `/var/lib/dokku/data/storage-registry/entries/`. The dokku user that runs `ps:rebuild` could not read them and every rebuild on a 0.37.x to 0.38.0 upgrade failed with permission denied. The companion `repairRegistryOwnership` pass in `TriggerInstall` rewrites ownership across the whole registry tree so installs that already ran the buggy code are fixed on the next package upgrade, since the per-app migration flag would otherwise cause `MigrateLegacyMounts` to skip the broken files forever.
2026-05-02 05:37:11 -04:00
Jose Diaz-Gonzalez
60fe2400a9 fix: openresty bats global-flag test uses settable key
The previous regression case selected `--openresty-global-hsts`, but `hsts` is rejected by `openresty:set --global` because it is not in the plugin's GLOBAL_KEYS list. Switch to `--openresty-letsencrypt-server`, which the bats setup already pins to a known staging URL, so the test exercises the same `--global --<info-flag>` parsing path without needing a separate set step.
2026-05-01 04:02:26 -04:00