Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 5.5 b358a8bb00 fix(web-app-keycloak): append the admin allowlist only when networks are declared
tasks/00_core.yml built webserver_extra_configuration by concatenating the
helper iframes, the admin allowlist and the logout panel template lookups
with `~`. With the shipped empty `services.keycloak.admin.allowed_networks`
the allowlist template rendered no text, Ansible's template lookup returned
None for it, and `~` wrote the word "None" into the auth vhost. OpenResty
then refused `unknown directive "Nonelocation"` in front of the logout
panel location and every deploy with Keycloak went red.

The role now resolves the declared networks once in KEYCLOAK_ADMIN_NETWORKS
and the task appends the allowlist template only when that list is not
empty, the same guard the logout panel uses. The template renders the
restricted /admin location unconditionally from KEYCLOAK_ADMIN_NETWORKS.

With a list that did not contain the deploy host, the deploy still went
red: Keycloak answers `/` with a redirect to `/admin/`, so the CSP health
check and the front proxy probe, which request `/` from the host, got 403
and hlth-csp failed. While the allowlist is active, `location = /` now
redirects to the account console of the platform realm instead, and the
README no longer claims the deploy needs no entry for any reason.

test_admin_allowlist.py rendered the template with plain Jinja, which
yields '' for an empty template, so it could not see the None. It now
evaluates the task's own webserver_extra_configuration expression through
Ansible's Templar and real template lookup, which reproduces
"HELPER_IFRAMES\nNoneLOGOUT_PANEL" on the old task, and covers the root
redirect.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 08:57:11 +01:00
infinito-nexus-updater[bot] cd6dc48537 update(images): update Docker image versions (web-app-socialhome) 2026-10-30 07:34:47 +00:00
kevinveenbirkenbach 2b88c3f433 Merge pull request #1287 from infinito-nexus/dependabot/pip/ruff-0.17.3
build(deps-dev): Bump ruff from 0.17.2 to 0.17.3
2026-10-30 08:33:51 +01:00
kevinveenbirkenbach 314a343a8a Merge pull request #1286 from infinito-nexus/update/docker-image-versions-web-app-shopware-20261030-64bd454
update(images): update Docker image versions (web-app-shopware)
2026-10-30 08:20:08 +01:00
kevinveenbirkenbach 37cade8df6 Merge pull request #1255 from infinito-nexus/fix/mail/dmarc-rua/1125
feat(mail): publish a DMARC aggregate report address (rua)
2026-10-30 08:19:06 +01:00
kevinveenbirkenbach 102fb47dbf Merge pull request #1277 from infinito-nexus/update/docker-image-versions-web-app-pretix-20261029-df38fa2
update(images): update Docker image versions (web-app-pretix)
2026-10-30 08:15:28 +01:00
dependabot[bot] 6b76872e2d build(deps-dev): Bump ruff from 0.17.2 to 0.17.3
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.17.2 to 0.17.3.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.17.2...0.17.3)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.17.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-30 05:04:33 +00:00
infinito-nexus-updater[bot] 1ba7903f31 update(images): update Docker image versions (web-app-shopware) 2026-10-30 04:58:18 +00:00
kevinveenbirkenbach 8ef7f32914 Merge pull request #1284 from infinito-nexus/update/version-sources-web-app-stalwart-20261029-dd5e824
update(versions): update pins with a declared source (web-app-stalwart)
2026-10-30 00:55:52 +01:00
infinito-nexus-updater[bot] b157205515 update(versions): update pins with a declared source (web-app-stalwart) 2026-10-29 23:09:16 +00:00
kevinveenbirkenbach 5995766f58 Merge pull request #1283 from infinito-nexus/fix/web-app-fider/tenant-without-sso
fix(web-app-fider): bootstrap the tenant without SSO
2026-10-30 00:01:10 +01:00
kevinveenbirkenbach 022abe155e Merge pull request #1259 from infinito-nexus/fix/sys-svc-compose-php/remove-interim-php-mitigations/1126
fix(sys-svc-compose-php): scope memory_limit -1 to unpatched images
2026-10-29 23:59:23 +01:00
kevinveenbirkenbach ab2dd4979e Merge branch 'main' into update/docker-image-versions-web-app-pretix-20261029-df38fa2 2026-10-29 23:55:16 +01:00
kevinveenbirkenbach 87404d62be Merge remote-tracking branch 'origin/main' into feature/sys-ctl-hlth-runtime/vulnerable-runtimes/1127 2026-10-29 23:55:08 +01:00
kevinveenbirkenbach 7404aa4e6a Merge remote-tracking branch 'origin/main' into fix/web-app-fider/tenant-without-sso 2026-10-29 23:55:04 +01:00
kevinveenbirkenbachandClaude Opus 5.5 b5d4391272 style(lint): apply ruff format to the worktree swarm lab subnet lint
tests/lint/filesystem/env/test_worktree_swarm_lab_subnet.py landed on
main with lines ruff format wraps, so every `make autoformat` rewrites it
and leaves an unstaged change behind. Formatter output only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:55:02 +01:00
kevinveenbirkenbachandClaude Opus 5.5 73b21eef98 fix(web-app-fider): bootstrap the tenant without SSO
00_core.yml included 01_setup_oidc.yml only when services.sso.enabled
was true, but that file carried the whole tenant bootstrap: wait for
HTTP, count tenants, POST /_api/tenants, create the admin user and
activate the tenant. Only its last task configured the Keycloak
provider. With SSO off no tenant was ever created.

Fider's RequireTenant middleware then answers every tenant route,
/api/v1/tags included, with 307 to /signup, and /signup is open to any
visitor, who can claim the fresh installation and become its
administrator. The MCP read fider_list_tags got that 307 in the swarm
SSO-off matrix row.

The tenant bootstrap moves unchanged into tasks/01_tenant.yml, which
00_core.yml includes on the stack host regardless of SSO. The OIDC file
becomes tasks/02_setup_oidc.yml and keeps only the provider upsert,
still gated on services.sso.enabled. The README states which bootstrap
steps run without SSO.

A unit test evaluates the include and task guards for every SSO,
stack-host and deploy-mode state: a fresh stack host posts exactly one
tenant with and without SSO, an existing tenant is never posted again,
the Keycloak provider is written only with SSO, and a non-stack host
runs none of it. The compose matrix row with SSO off stayed green
because nothing there read a tenant route.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:55:01 +01:00
kevinveenbirkenbach 48b571a094 Merge remote-tracking branch 'origin/main' into review/dmarc-rua-1125 2026-10-29 22:24:56 +01:00
kevinveenbirkenbach 065b33c646 Merge pull request #1282 from infinito-nexus/fix/ci/validation-main-merged-base-sha
fix(ci): check the PR head against the main it was tested with
2026-10-29 22:15:04 +01:00
kevinveenbirkenbachandClaude Opus 5.5 7a3f27fc63 style(lint): apply ruff format to the worktree swarm lab subnet lint
tests/lint/filesystem/env/test_worktree_swarm_lab_subnet.py landed on
main with lines ruff format wraps, so every `make autoformat` rewrites it
and leaves an unstaged change behind. Formatter output only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 22:10:46 +01:00
kevinveenbirkenbachandClaude Opus 5.5 6d44e1e28a fix(ci): check the PR head against the main it was tested with
The Validation step "Assert the base branch is fully merged into the PR
head" ran main_merged.sh, which fetches the live tip of main when the job
starts. PR runs wait in the queue for hours while image-update PRs land
on main several times an hour, so nearly every queued run failed
Validation on start and had to be re-pushed after another main merge
(PR #1265: behind_by=0 at push, behind_by=9 while its run still queued).

main_merged.sh takes a new INFINITO_MAIN_COMMIT override: when set, it
fetches that full commit SHA from the remote and requires HEAD to
contain it instead of the live tip; a set but malformed or empty value
exits 2. The Validation step passes github.event.pull_request.base.sha,
the main tip at event time, which the step's pull_request-only guard
always provides. The run tests the merge against that base, so the gate
still guarantees the tested tree contains it.

The local pre-push hook (make test-main-merged) leaves the override
unset and keeps checking the live tip: a push happens right now, so
lagging the current main is the real defect there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 22:10:45 +01:00
kevinveenbirkenbach be28751879 Merge pull request #1281 from infinito-nexus/update/repository-refs-web-app-bookwyrm-20261029-7fb75db
update(repos): bump git refs to latest semver tags (web-app-bookwyrm)
2026-10-29 21:58:35 +01:00
kevinveenbirkenbach b4992c0595 Merge pull request #1280 from infinito-nexus/update/repository-refs-pkgmgr-20261029-76535a5
update(repos): bump git refs to latest semver tags (pkgmgr)
2026-10-29 21:57:55 +01:00
infinito-nexus-updater[bot] 2517b20f15 update(repos): bump git refs to latest semver tags (web-app-bookwyrm) 2026-10-29 20:43:11 +00:00
infinito-nexus-updater[bot] 8d4c03b863 update(repos): bump git refs to latest semver tags (pkgmgr) 2026-10-29 20:43:06 +00:00
kevinveenbirkenbach ae497795ee Merge remote-tracking branch 'origin/main' into feature/sys-ctl-hlth-runtime/vulnerable-runtimes/1127 2026-10-29 18:20:17 +01:00
kevinveenbirkenbach 989eb7c0ea Merge pull request #1256 from infinito-nexus/fix/sys-svc-proxy/per-app-security-headers/1123
feat(proxy): per-app nosniff, Referrer-Policy, Permissions-Policy and HSTS directives
2026-10-29 18:14:28 +01:00
kevinveenbirkenbach 2f83a9d6ff Merge pull request #1273 from infinito-nexus/update/docker-image-versions-web-app-socialhome-20261029-0412126
update(images): update Docker image versions (web-app-socialhome)
2026-10-29 18:06:03 +01:00
kevinveenbirkenbach ebb2e9d6c9 Merge remote-tracking branch 'origin/main' into feature/sys-ctl-hlth-runtime/vulnerable-runtimes/1127 2026-10-29 17:22:06 +01:00
kevinveenbirkenbach 1b21932499 Merge pull request #1279 from infinito-nexus/update/docker-image-versions-web-app-wazuh-20261029-ad9aa5b
update(images): update Docker image versions (web-app-wazuh)
2026-10-29 17:18:10 +01:00
kevinveenbirkenbach 13fe4fe335 Merge pull request #1278 from infinito-nexus/update/docker-image-versions-web-app-prometheus-20261029-c0fc020
update(images): update Docker image versions (web-app-prometheus)
2026-10-29 17:17:48 +01:00
kevinveenbirkenbach 9f2b2fc9a8 Merge pull request #1276 from infinito-nexus/update/docker-image-versions-web-app-pgadmin-20261029-a170872
update(images): update Docker image versions (web-app-pgadmin)
2026-10-29 17:17:16 +01:00
kevinveenbirkenbach f49c4176e0 Merge pull request #1275 from infinito-nexus/update/docker-image-versions-web-app-gitlab-20261029-39e81e5
update(images): update Docker image versions (web-app-gitlab)
2026-10-29 17:16:56 +01:00
infinito-nexus-updater[bot] eebb50d82a update(images): update Docker image versions (web-app-wazuh) 2026-10-29 15:56:53 +00:00
infinito-nexus-updater[bot] 3bbc7ca205 update(images): update Docker image versions (web-app-prometheus) 2026-10-29 15:56:47 +00:00
infinito-nexus-updater[bot] dfb77d3e6e update(images): update Docker image versions (web-app-pretix) 2026-10-29 15:56:42 +00:00
infinito-nexus-updater[bot] bbd54e0077 update(images): update Docker image versions (web-app-pgadmin) 2026-10-29 15:56:37 +00:00
infinito-nexus-updater[bot] 6ec97a09b4 update(images): update Docker image versions (web-app-gitlab) 2026-10-29 15:56:32 +00:00
kevinveenbirkenbach 36a8efc013 Merge pull request #1257 from infinito-nexus/fix/worktree/swarm-lab-subnet-overflow
fix(worktree): derive the swarm lab subnet without an octet overflow
2026-10-29 16:41:37 +01:00
kevinveenbirkenbach 0183bcbbc7 Merge pull request #1266 from infinito-nexus/fix/web-app-dashboard/script-src-no-unsafe-inline/1122
fix(web-app-dashboard): run inline scripts by hash instead of 'unsafe-inline'
2026-10-29 15:37:02 +01:00
kevinveenbirkenbachandClaude Opus 5.5 09fbde704d fix(web-app-mailu): require the DMARC rua forward to land in the provisioned mailbox
CodeRabbit on PR #1255: post_bootstrap_ops.yml points the alias at the
forward target's `email`, while 05_manage_user.yml creates the mailbox at
`<username>@MAILU_DOMAIN`. The rua check only asserted that the forward
target has a mailbox account, so an inventory that overrides the target's
email or the Mailu domain passed the check with an alias that delivers to
no Mailu mailbox.

The forward branch now also requires the target's email to equal
`<username>@MAILU_DOMAIN`. The shipped default (rua_user administrator,
which has its own mailbox) takes the first branch and is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 15:33:01 +01:00
kevinveenbirkenbach 08a32a44fd Merge remote-tracking branch 'origin/main' into feature/sys-ctl-hlth-runtime/vulnerable-runtimes/1127 2026-10-29 15:32:59 +01:00
kevinveenbirkenbachandClaude Opus 5.5 d116dde659 fix(sys-ctl-hlth-runtime): bound the engine calls and catch hidden PHP runtimes
Three CodeRabbit findings on PR #1265:

- script.py listed the running containers with `container ps` and
  `container inspect` without a timeout, so a hung engine kept the daily
  unit active forever and blocked the next timer run. Both calls now use
  EXEC_TIMEOUT_SECONDS; main turns a timeout or engine error into a
  one-line failure and exit 1 instead of a traceback.

- runtime.py's PHP_PACKAGE_PATTERN requires a digit after "php", so an
  image installing an unversioned interpreter package (`php-cli`) and
  setting no PHP_VERSION was reported as PHP-free. The interpreter
  packages php, php-cli, php-fpm, php-cgi, php-phpdbg and
  libapache2-mod-php are now recorded as PhpRuntime.packages and reported
  with an unknown patch level; extension and library packages
  (php-mysql, php-pear, php-common, phpmyadmin) and paths do not count.

- php_finding returned early for a patched PHP_VERSION, so an end-of-life
  package line installed next to it (e.g. php7) was never reported. The
  version only returns a finding now; otherwise the lines are judged too.

Every finding has unit tests that fail on the previous code.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 15:32:57 +01:00
kevinveenbirkenbach c7becd4197 Merge pull request #1264 from infinito-nexus/fix/security/swarm-ingress-verify/1089
fix(swarm): reach gitea, shopware and fider from inside their containers
2026-10-29 12:43:32 +01:00
kevinveenbirkenbach f41454f15f Merge pull request #1274 from infinito-nexus/fix/lint/mbake-final-newline
fix(lint): make mbake format the Makefile the same on every machine
2026-10-29 12:31:48 +01:00
kevinveenbirkenbachandClaude Opus 5.5 618a640d4a fix(lint): make mbake format the Makefile the same on every machine
The repository installs mbake unpinned and shipped no .bake.toml, so the
Makefile's final newline depended on the mbake version:

- mbake 1.4.6 (e.g. the pkgmgr venv that wins on a host PATH) defaults
  to ensure_final_newline = false: `mbake format` strips the newline and
  `mbake format --check` accepts the stripped file.
- mbake 1.5.0 (what pip installs today) rejects the same file with
  "Missing final newline", which is what CI reported on PR #1255.

So a local `make autoformat` could strip the newline, the local
lint-makefile stayed green, and CI failed; 6f653ce633 and #1262 had to
restore the newline by hand.

The tracked .bake.toml sets only ensure_final_newline = true, so every
other formatter rule keeps its default. autoformat.sh and makefile.sh
pass it with --config, so the result no longer depends on the version
or on the directory mbake runs from. Checked with both versions: main's
Makefile passes `--check --config .bake.toml`, and a copy without the
final newline fails it with "Missing final newline".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 12:29:08 +01:00
kevinveenbirkenbach 8f77be767f Merge pull request #1258 from infinito-nexus/fix/svc-net-tor/onion-port-rendezvous/1214
fix(svc-net-tor): let a port probe attempt outlast Tor's SocksTimeout
2026-10-29 11:59:43 +01:00
kevinveenbirkenbach 06f896d231 Merge remote-tracking branch 'origin/main' into feature/sys-ctl-hlth-runtime/vulnerable-runtimes/1127 2026-10-29 11:47:43 +01:00
kevinveenbirkenbachandClaude Opus 5.5 feac35a5ea fix(sys-ctl-hlth-runtime): deploy only on container hosts and drop the bare Docker Hub API literal
Two CI failures on PR #1265 (run 40834164415):

- Chunk 0 / SuiteCRM#2 (swarm): the post-load flush included
  sys-ctl-hlth-runtime on every play host, the NFS server too, which never
  gets sys-svc-container and therefore has no `container` CLI. The unit
  died with FileNotFoundError: 'container'. The role entry now runs only
  where a container runtime exists: in compose mode, or on swarm nodes
  ('svc-swarm-node' in group_names), the same role-entry host scoping that
  sys-ctl-hlth-csp and sys-ctl-hlth-webserver use with IS_STACK_HOST.
  Workers stay covered because PHP replicas can run there.

- Workspace (ubuntu): tests/external/repository/test_urls_reachable.py
  probed the literal "https://hub.docker.com/v2" from
  utils/docker/image/runtime.py:20 and got HTTP 404. The constant is gone;
  the endpoint is written as one f-string at the call site, the way
  utils/update/docker.py:104 and utils/update/source.py do, which the URL
  test skips as a template. With the scheme now visible in the literal,
  ruff reported the noqa: S310 on urllib.request.Request as unused.

Both test files that imported unittest twice (CodeQL) now use one
`from unittest import ...` form.

The run_once queue leak that spreads the stack host's post-load queue to
every host is fixed separately on the updater line (70ed8a2e98); when it
meets main, sys-ctl-hlth-runtime moves into sys-svc-container's queue.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 11:47:41 +01:00
kevinveenbirkenbach 2a67bb86e0 Merge pull request #1263 from infinito-nexus/fix/web-app-fusiondirectory/php-hardening/1120
fix(web-app-fusiondirectory): mount the shared PHP hardening ini
2026-10-29 10:57:52 +01:00