Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbach 7e95431208 Update README.md 2026-04-19 22:16:43 +02:00
kevinveenbirkenbach a924a8b0f1 Update README.md 2026-04-19 22:16:42 +02:00
kevinveenbirkenbach 65bb985d1c Update README.md 2026-04-19 22:16:42 +02:00
kevinveenbirkenbach cf846c1822 Update README.md 2026-04-19 22:16:42 +02:00
kevinveenbirkenbach 7b29e5db36 Update README.md 2026-04-19 22:16:42 +02:00
kevinveenbirkenbach 286c6b73d9 Update README.md 2026-04-19 22:04:24 +02:00
kevinveenbirkenbach 374d5175de Update README.md 2026-04-19 22:04:24 +02:00
kevinveenbirkenbach a0a000be82 Update README.md 2026-04-19 22:04:24 +02:00
kevinveenbirkenbach eb5e87ee28 fix(sign-push): allow amending empty commits during re-sign
The re-sign rebase failed on empty commits pulled in from upstream
because git refused the --amend. Adding --allow-empty keeps those
commits in place while still GPG-signing them.
2026-04-19 22:04:24 +02:00
kevinveenbirkenbach da140094a1 docs(agents): split iteration loops and refactor Playwright SPOT
Split docs/agents/action/iteration.md into role.md, playwright.md,
workflow.md, and a scope-focused README. Move Certificate Authority
and Inspect rules into role.md. Rewrite playwright.md as a machine-
oriented state machine with explicit preconditions, procedure, exit
gates, and escape path.

Extract Playwright spec content MUSTs into the new contrib SPOT
docs/contributing/artefact/files/role/playwright.specs.js.md. Reduce
the agent-side spec and env.j2 pages to procedure only. Align the
framework SPOT and the test-e2e-playwright role README with the
central templates/package.json.j2 + files/playwright.config.js model
and images.playwright.version as single source of truth.

Sweep em dashes and sentence-case role headings across all touched
docs per documentation.md and readme_md.md rules.
2026-04-19 22:04:24 +02:00
kevinveenbirkenbach 59844be7a1 Update README.md 2026-04-19 22:04:24 +02:00
kevinveenbirkenbach 46c757f3b6 Update README.md 2026-04-19 22:04:24 +02:00
kevinveenbirkenbach 7ab828b343 Update README.md 2026-04-19 22:04:23 +02:00
kevinveenbirkenbach a315c48895 Update README.md 2026-04-19 20:47:21 +02:00
Prageeth Panicker 43c0c32bd7 fix(web-app-decidim): inline patch_decidim.py into Dockerfile
COPY fails in CI because sys-svc-compose only copies Dockerfile to the
compose directory, not additional files. Inline the patch script using
a heredoc so the build context only needs the Dockerfile itself.
The separate patch_decidim.py file is retained for unit testing.
2026-04-19 17:49:43 +00:00
kevinveenbirkenbach 44c31aac18 Merge branch 'main' into fix/users-applications.yml 2026-04-19 19:46:04 +02:00
kevinveenbirkenbach d8f01d879a Merge branch 'main' into feature/e2e-friendica-joomla-playwright 2026-04-19 19:28:39 +02:00
kevinveenbirkenbach c3da3ce013 fix(scripts): derive Playwright image tag from defaults/main.yml
The old derivation read @playwright/test out of
roles/test-e2e-playwright/files/package.json and assembled the tag
as `v{version}-{distro}`. That package.json no longer exists — the
version+distro tag now lives verbatim in defaults/main.yml under
images.playwright.version, so read it from the single source of
truth instead of rebuilding a broken tag from a missing file. The
TEST_E2E_PLAYWRIGHT_IMAGE_DISTRO fallback is no longer referenced
once the distro suffix is baked into the upstream version string.
2026-04-19 19:12:54 +02:00
kevinveenbirkenbach b472ef6437 fix(web-app-friendica): cast ldap_autocreateaccount to string
Upstream ldapauth.php gates autocreation on `$val == 'true'`. Under
PHP 8 a stored bool round-trips as int, so the comparison never
matched and every LDAP-only login was rejected.

Rework the biber/admin Playwright scenario to cover parallel
isolated logins (exercising the autocreate path for the non-admin
identity) instead of the fragile DM flow, so this regression is
caught end-to-end.
2026-04-19 19:00:10 +02:00
kevinveenbirkenbachandClaude Opus 4.7 34d6121293 refactor(utils): move config_utils to utils.applications.config, rename resolve_app_config -> get
Consolidates application-config helpers under utils/applications/ with a
concise public API (config.get). Updates all plugin, role, and test
imports; removes the legacy get_app_conf filter and its tests.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 18:32:30 +02:00
kevinveenbirkenbachandClaude Opus 4.7 0b25c6646f docs(iam): add OIDC/LDAP design guide, move services.md to design/
Introduce docs/contributing/design/iam/ with a docs README, common.md
for cross-cutting principles, and per-provider pages oidc.md and ldap.md.
The OIDC page documents the OIDC.* variable tree, claim attribute SPOT
(preferred_username), and the rule that app-specific Keycloak protocol
mappers belong in per-client scopes, not the shared default.json.j2.
The LDAP page documents the LDAP.* variable tree, attribute SPOT, and
the paired-identifier rule with OIDC.

Move services.md from docs/contributing/code/ to docs/contributing/design/
so the design/ folder is the SPOT for cross-cutting platform conventions.
Update the two architecture.md cross-links and the requirement doc.

Cross-link the new guides from 13_oidc.yml, 14_ldap.yml, and the
web-app-keycloak and svc-db-openldap role READMEs. Fix nearby README
compliance issues per readme_md.md (svc-db-openldap H1, missing
Credits section in web-app-jira, Credits formatting drift).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 17:18:41 +02:00
kevinveenbirkenbach bd181602da test(e2e): scope Friendica Playwright login submit to the form button
The topbar renders a `btn form-button-search` submit button before the
login form, so `button[type='submit']` would match the search button
first. Target the login form's own "Sign in" button by accessible role
and exact name, and apply the same fix to the DM composer's send
button to survive the same ordering hazard.
2026-04-19 17:06:33 +02:00
kevinveenbirkenbach 2ec283ed77 Merge branch 'main' into fix/users-applications.yml 2026-04-19 16:42:00 +02:00
kevinveenbirkenbachandClaude Opus 4.7 6ec1ed16eb docs(web-app-jira): replace product page URL — old one returned 404
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 16:41:18 +02:00
Prageeth Panicker 7c5660782a fix(web-app-decidim): remove hardcoded fallback URLs from patch_decidim.py
- ENV.fetch without fallback raises KeyError if var missing (fail fast)
- OIDC_ISSUER and APPLICATION_HOST must be set via env (already in env.j2)
2026-04-19 14:35:55 +00:00
kevinveenbirkenbach 50e4cb8422 chore(group_vars/all): renumber files to close 04/05 gap
- Rename 06..19 → 04..17 so the sequence is dense and gap-free.
- Update hard-coded references in cli/, tests/, and PR template.
- Add README.md describing scope, load order, and naming rules
  per docs/contributing/documentation.md standards.
2026-04-19 15:55:52 +02:00
Prageeth Panicker f077b87608 fix(web-app-decidim): fix ruff lint and formatting issues
- Rename ambiguous variable 'l' to 'line' (E741)
- Apply ruff format to patch_decidim.py and test_patch_decidim.py
2026-04-19 13:39:52 +00:00
kevinveenbirkenbach 2d91eb3368 Merge branch 'main' into fix/users-applications.yml 2026-04-19 15:37:37 +02:00
Prageeth Panicker 098ae70f79 fix(web-app-decidim): fix ruff E741 ambiguous variable name in test 2026-04-19 13:29:35 +00:00
kevinveenbirkenbach 528cf59a71 Merge pull request #152 from kevinveenbirkenbach/fix/free-disk-space/138
fix(ci): free disk space before deploy jobs
2026-04-19 15:17:11 +02:00
Prageeth Panicker d25e14e73c fix(web-app-decidim): address reviewer feedback
- Extract inline Dockerfile Python script to files/patch_decidim.py (SRP)
- Add 7 unit tests in tests/test_patch_decidim.py covering all patch functions
- Make patch_secrets_yml idempotent (safe to run multiple times)
- Fix escape sequence warning in OMNIAUTH_INJECTION (raw string)
- Remove unnecessary regex from allowed_hosts.rb.j2 (exact domain match is sufficient)
- Rewrite README.md to follow platform documentation conventions
2026-04-19 13:11:34 +00:00
kevinveenbirkenbach 56254854eb test(e2e): add Playwright specs for Friendica and Joomla
Friendica: admin dashboard login + biber-to-admin direct message flow,
both via the ldapauth addon path (no OIDC redirect). Logout exits
through the universal /logout endpoint.

Joomla: admin control-panel login at /administrator using the local
account provisioned from users.administrator.*, with the universal
/logout confirmed by re-rendering of the admin login form. Joomla is
a CMS, so no cross-user messaging scenario is covered.

Both roles gain templates/playwright.env.j2 (the discovery marker for
test-e2e-playwright) and files/playwright.spec.js.
2026-04-19 15:11:29 +02:00
kevinveenbirkenbach 0ff22ab9a9 test(web-svc-cdn): drop cross-role shared-asset assertions
The shared /_shared/css/default.css and /_shared/js/logout.js are
populated by sys-front-inj-css / sys-front-inj-logout, not by
web-svc-cdn itself. Testing their availability from the CDN spec
conflates two roles' responsibilities and fails on solo CDN deploys
where no asset-producing app is enabled. Keep only the genuine CDN
contract: index served under canonical domain with TLS + HSTS.
2026-04-19 14:36:11 +02:00
kevinveenbirkenbach a533cba874 fix(web-app-matomo): inline domain lookup in trusted_hosts argv
Task-local `domain:` override does NOT shield against eager evaluation
of the role-layer `domain = lookup('domain', application_id)` template
when application_id is polluted in the role-vars layer by nested
include_role chains. Reverting to inline literal lookup in the shell
arg; task-local `application_id` pin stays (still needed for lazy
MATOMO_* var resolution).
2026-04-19 14:35:25 +02:00
kevinveenbirkenbach 3a553c0731 fix(web-app-matomo): pin application_id + domain task-locally for trusted_hosts
Nested include_role chains (sys-stk-front-base → web-opt-rdr-domains /
svc-prx-openresty) pollute the role-vars layer and make {{ domain }} /
{{ MATOMO_* }} resolve against the wrong application_id. Task-level
vars take precedence over role vars, so pinning them here shields the
lookups from pollution.
2026-04-19 13:43:05 +02:00
kevinveenbirkenbach b561c331a4 fix(web-app-bigbluebutton): use host network for etherpad prebuild
BuildKit's private network fails to reach registry.npmjs.org /
raw.githubusercontent.com from inside nested docker-in-docker;
host-net inherits the outer container's working network.
2026-04-19 13:39:12 +02:00
kevinveenbirkenbach 902c022efd fix(web-app-friendica): wait for autoloader, retry addon sync
Replace the v1 wait-for-bin/console file-existence probe with a
`bin/console list` invocation, which boots Friendica's full Composer
autoloader and therefore only returns rc=0 once the entrypoint rsync
from /usr/src/friendica/ into /var/www/html has copied every required
vendor file. The v1 probe returned too early: bin/console lands before
vendor/ is complete, so the next invocation failed with

  PHP Fatal error: Failed opening required
  '.../vendor/composer/../symfony/deprecation-contracts/function.php'

Also adds defence-in-depth retries on the addon-sync loop itself, so
an individual addon command can still absorb a slow final piece of the
rsync or a just-reloaded autoloader.

Refs #161
2026-04-19 13:37:56 +02:00
kevinveenbirkenbach dd040e90f2 chore(claude): sort allowedDomains ASCII-correct
Swap *.nextcloud.com / *.nektosact.com to satisfy sorted-allowedDomains lint.
2026-04-19 13:37:41 +02:00
kevinveenbirkenbach fa5bc94378 Merge branch 'main' into fix/free-disk-space/138 2026-04-19 13:07:57 +02:00
kevinveenbirkenbachandClaude Opus 4.7 85c008a90b chore(ci): add weekly CodeQL cron to backstop idle periods
Restores the weekly scan coverage previously provided by Default Setup,
so CodeQL analysis still runs when no CI triggers land on main.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 13:05:23 +02:00
kevinveenbirkenbachandClaude Opus 4.7 50bc41b449 chore(ci): route CodeQL through orchestrator only, dedupe CI docs
Remove the direct push-on-main trigger from security-codeql.yml so that
the concurrency group no longer cancels the orchestrator-invoked scan.
CodeQL now runs exactly once per CI run via ci-orchestrator.yml, and
its failure continues to block code-quality-gate and all downstream
deploy, install, and environment tests.

Split the CI documentation along SPOT lines: workflows.md owns the
per-workflow catalog (trigger, inputs, short description); pipeline.md
owns the flow (stages, gates, concurrency, fork handling). Drop the
duplicated entry-points table and per-stage workflow bullet lists from
pipeline.md in favour of cross-references. Fix the stale "push to
latest" wording that pre-dated the current branch prefix list.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 12:46:26 +02:00
kevinveenbirkenbach 8466b968f5 Merge remote-tracking branch 'upstream' 2026-04-19 12:17:59 +02:00
kevinveenbirkenbachandClaude Opus 4.7 5e75a4b0ad feat(git): add make sign-push and deny direct push in sandbox
Route pushes through scripts/git/sign-push.sh so the operator's GPG key
stays outside the sandbox. Script signs only @{u}..HEAD (or merge-base
with origin/main|master on first push), skips re-signing when all
commits already carry a good signature, and uses --force-with-lease on
rewritten history. settings.json denies git push*, git send-pack*, and
make sign-push* so the agent cannot trigger a push path directly.
CLAUDE.md instructs the agent to hand off to the operator instead.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 12:15:44 +02:00
kevinveenbirkenbach a133737c8b Merge pull request #170 from infinito-nexus/chore/update-docker-image-versions-20260418
chore(images): update Docker image versions
2026-04-19 11:46:34 +02:00
kevinveenbirkenbachandClaude Opus 4.7 ad414c4e12 docs(claude): forbid trailing & background operator in shell invocations
Add `&` to the explicit list of forbidden statement separators and
point operators at the Bash tool's run_in_background parameter as the
correct substitute.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 11:40:15 +02:00
kevinveenbirkenbachandClaude Opus 4.7 b715dcfb4e chore(claude): allow *.nextcloud.com for NC appstore probing
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 11:37:39 +02:00
kevinveenbirkenbachandClaude Opus 4.7 e4d4ee3b88 feat(ipv6): centralize IPv6 toggle via NETWORK_IPV6_ENABLED
Introduce a single global flag in group_vars/all/10_networks.yml and wire
the previously hardcoded IPv6 settings in nextcloud, bigbluebutton, and
matrix through it. Matches the host-level `make disable-ipv6` policy so
containers no longer stall on AAAA-first lookups (e.g. Nextcloud's
DnsPinMiddleware) while keeping a single knob to flip when v6 is wanted.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 11:31:53 +02:00
Prageeth Panicker 0a5ab9bddd fix(web-app-decidim): add OIDC SSO via custom image and fix Playwright tests
- Add custom Dockerfile to install omniauth_openid_connect gem and patch
  Decidim's OmniAuth initializer for OpenID Connect provider registration
- Patch secrets.yml to add openid_connect section to all environments
- Patch omniauth_helper.rb to return correct icon for openid_connect
- Fix redirect_uri to use APPLICATION_HOST env var for correct callback URL
- Fix SSL cert trust by relying on compose.ca.override.yml at runtime
- Add OIDC omniauth settings to organization (enabled + icon only, no
  encrypted credentials - credentials read from env vars at runtime)
- Add biber OIDC login/logout Playwright test and profile access test
- Add SSO button visibility test when OIDC is enabled
- Fix SSO button selector to use href-based locator
- Use form.evaluate() POST with CSRF token for data-method=post links
- Add OIDC_ENABLED to playwright.env.j2
- Add DECIDIM_CUSTOM_IMAGE var for custom built image
- Update compose.yml.j2 to build custom image with OIDC patches
2026-04-19 08:00:26 +00:00
kevinveenbirkenbach ccb3e8a96c Merge branch 'main' of github.com:infinito-nexus/core into fix/users-applications.yml 2026-04-19 03:29:31 +02:00
kevinveenbirkenbachandClaude Opus 4.7 2abfc64636 chore(claude): broaden make allow shapes, per-domain WebFetch, deny git -C
Three related settings.json changes:

1. Replace narrow `Bash(*=* make *)` with three broader rules covering
   any prefix + make, plus composites with `> /tmp/*` redirect and
   `2>&1` stderr-merge. Needed so multi-env invocations with quoted
   multi-word values (e.g. `FOO=a BAR=b APPS="x y z" make target > /tmp/log 2>&1`)
   auto-allow without prompting — the prior single-env rule and the
   generic `* > /tmp/*` rules did not compose for this shape.

2. Replace inert `WebFetch(domain:*)` with explicit per-domain entries
   for `github.com` and `raw.githubusercontent.com`. Tested empirically:
   the wildcard form does not suppress the permission prompt, so a
   per-domain allowlist is the only mechanism that works.

3. Add `Bash(git -C *)` to deny. Blocks cross-repo escapes via the
   `-C <path>` flag, which otherwise lets the agent reach into other
   working trees under `additionalDirectories`. Operators needing a
   second repo must open a dedicated session there.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-19 03:27:04 +02:00