Commit Graph
13 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 4.8 7edef3935b fix(dependabot): scan every ecosystem recursively including the repo root
A bare '/' does not recurse for manifest ecosystems, so the npm entry
missed every role-level files/package.json and composer/bundler were
pinned to single hardcoded paths. Use both glob spellings per entry:
'**' is proven in-repo to match root manifests (compose.yml PRs) and
'**/*' is the documented recursive form, so together they cover both
interpretations of the backend's glob expansion.

The commented-out ecosystem stubs stay as the intentional catalogue of
deliberately unscanned ecosystems; the file opts out of the comment lint
to keep them.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 20:01:31 +02:00
kevinveenbirkenbachandClaude Opus 4.7 552b8c6f1b fix(dependabot): disable maven ecosystem (no pom.xml in repo)
The maven ecosystem entry was added for a Bluesky Keycloak
event-listener SPI scaffold that has since been removed. Without a
pom.xml anywhere in the tree, every scheduled run fails with
manifest_not_found, producing a daily red Dependabot job.

Comment the block out in the same style as the other "no X found"
entries, with a note about why so a future re-enabler knows what to
restore.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-20 00:50:26 +02:00
kevinveenbirkenbachandClaude Opus 4.7 2480cd1ce3 ci(deps): cover repo-root package.json + regenerate .dockerignore
Two follow-ups to 2986e8042 (introduces repo-root package.json with the
ESLint dev-deps and adds node_modules/ to .gitignore):

- `.github/dependabot.yml`: add `/` to the existing npm directories
  list. The new package.json was uncovered, so
  `tests/integration/workflows/test_dependabot_coverage.py` failed
  ("ecosystem: npm" required for /package.json).
- `.dockerignore`: regenerated by `make dockerignore` (the Makefile
  target that mirrors .gitignore into .dockerignore plus a trailing
  `.git`); now carries the new `node_modules/` line so build contexts
  don't ship the local install tree into images.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-10 14:55:04 +02:00
kevinveenbirkenbachandClaude Opus 4.7 803ed8451d feat(req-013): variant A+ Bluesky OIDC integration via in-role login-broker
Promotes web-app-bluesky's OIDC integration to a working Keycloak SSO
flow that ends up in the official Bluesky social-app web client
WITHOUT exposing the synthesised PDS app-password to the browser.

* New `login-broker` Node sidecar under
  `roles/web-app-bluesky/files/login-broker/`. The broker sits behind
  `web-app-oauth2-proxy` and in front of the official
  `@bluesky-social/social-app` web client. On a user's first
  OIDC-authenticated visit it:
    1. Looks up the Keycloak user via the Admin REST API.
    2. Provisions a Bluesky PDS account via createAccount if no
       encrypted app-password is recorded yet, encrypts the
       synthesised app-password with AES-256-GCM, and stores the
       ciphertext as the `bluesky_app_password_enc` user attribute.
    3. Decrypts the password and exchanges it for a PDS session via
       createSession.
    4. Renders an HTML handoff page that drops the session JWTs
       into localStorage["BSKY_STORAGE"] (canonical social-app key)
       and redirects to /.
  For subsequent requests carrying the handoff cookie, the broker
  reverse-proxies to the social-app upstream.
* `social-app` is built from a pinned upstream tag (1.121.0) so the
  broker's BSKY_STORAGE schema stays in sync with the upstream
  persistence layer.
* `roles/web-app-bluesky/tasks/05_keycloak_admin_client.yml` adds a
  service-account Keycloak client for the broker (deterministic
  secret from the credentials vault, view-users + manage-users
  realm-management roles). kcadm output is filtered for the JVM
  cgroup-detection warnings on cgroup-v2 hosts.
* `roles/web-app-bluesky/tasks/01_core.yml` switches from
  sys-svc-compose to sys-stk-backend so the oauth2-proxy sidecar is
  auto-included when services.oauth2.enabled is true. A pre-task
  heals the oauth2-proxy bind-mount when a previous deploy left it
  as an empty directory.
* `meta/schema.yml` adds `bridge_encryption_key` (AES-256-GCM key)
  and `kc_admin_client_secret` (broker's KC service-account secret).
* `meta/services.yml` enables oauth2 with origin `bluesky-broker:8080`,
  whitelist for /xrpc/ and /.well-known/ so federation traffic to
  api.bluesky.<domain> stays open.
* `meta/variants.yml` adds the LDAP variant so the matrix-deploy
  exercises both auth-flow legs.
* `templates/extra_locations.conf.j2` uses the new
  NETWORK_PUBLIC_DNS_RESOLVERS SPOT and the on_off filter for the
  nginx resolver directive in front of the public ip.bsky.app /
  bsky.app upstreams.
* Documentation:
  - `roles/web-app-bluesky/README.md` rewritten per documentation.md
    and readme_md.md (software-focused description, current SSO
    flow, no em-dashes, canonical Credits format).
  - `roles/web-app-bluesky/files/login-broker/README.md` covers the
    handoff sequence, env contract, and failure modes.
  - `roles/web-app-bluesky/files/keycloak-bluesky-bridge/README.md`
    cleaned up per documentation.md.
  - `docs/requirements/013-alpha-to-beta-promotion.md` bluesky
    per-role-notes updated to reference the variant A+ broker; new
    "Future hardening" section tracks key rotation, an external
    secrets store, the Joomla `?fallback=local` IP allowlist, and
    the still-source-only Keycloak event-listener SPI.
* `.github/dependabot.yml` adds the npm ecosystem entry that covers
  the broker's package.json metadata stub.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 17:46:30 +02:00
kevinveenbirkenbachandClaude Opus 4.7 084e19202d feat(req-013): native OIDC for web-app-joomla via in-role plg_system_keycloak
Promotes web-app-joomla's OIDC integration from "documented future
work" to a working native plugin shipped inside the role.

* New `plg_system_keycloak` Joomla 6 plugin under
  `roles/web-app-joomla/files/joomla-oidc-plugin/`. The plugin's PHP
  dependency `jumbojett/openid-connect-php` is vendored at deploy time
  inside the Joomla container (Composer is baked into the role's
  custom image), then packaged as a ZIP and installed via the Joomla
  CLI. The repo working tree carries no `vendor/` tree.
* Modus 3 per requirement 013 (Force-Frontend, Local-Backup-Backend):
  every visit to `/` and `/administrator` redirects to Keycloak
  unless the request explicitly carries `?fallback=local` AND the
  env-var `JOOMLA_OIDC_FALLBACK_ENABLED` is `true`. The fallback hatch
  is env-toggleable so high-security deployments can flip to Modus 1
  (no local form).
* RBAC group mapping: the plugin maps the Keycloak `groups` claim
  onto Joomla's standard usergroup IDs:
    /roles/web-app-joomla/administrator -> Super Users (id 8)
    /roles/web-app-joomla/editor        -> Editor      (id 4)
    /roles/web-app-joomla               -> Registered  (id 2)
  Users whose Keycloak groups match none of these paths are refused.
* Matrix-deploy variants flip the auth-flow gate: variant 0 is the
  canonical OIDC variant (this commit's primary path), variant 1
  flips OIDC off and LDAP on so Joomla's core LDAP authentication
  plugin against svc-db-openldap is the exercised auth path.
* Role wiring:
  - `tasks/07_oidc_plugin.yml` builds + installs the plugin idempotently.
  - `templates/env.j2` propagates JOOMLA_OIDC_* env into the container.
  - `meta/services.yml` enables `oidc` with `fallback_enabled: true`.
  - `meta/rbac.yml` declares the `editor` role.
  - `templates/playwright.env.j2` keys `OIDC_SERVICE_ENABLED` off
    `services.oidc.enabled` for the Playwright test gate.
* Playwright e2e covers three scenarios:
  - native OIDC redirect from `/` to Keycloak and back to Joomla,
  - `/administrator?fallback=local` hatch bypassing Keycloak,
  - LDAP variant against the core Joomla LDAP plugin.
* Documentation:
  - `roles/web-app-joomla/README.md` rewritten per documentation.md
    and readme_md.md (software-focused description, no em-dashes,
    canonical Credits format).
  - `roles/web-app-joomla/files/joomla-oidc-plugin/README.md` covers
    plugin build, env contract, claimed routes, and watch points.
  - `docs/requirements/013-alpha-to-beta-promotion.md` joomla
    per-role-notes updated to reference the in-role plugin and the
    Modus 3 fallback contract.
* `.github/dependabot.yml` adds the composer ecosystem entry that
  covers the plugin's `composer.json`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 17:42:35 +02:00
kevinveenbirkenbachandClaude Opus 4.7 92951cdaef feat(req-013): wire real OIDC integration for 4 in-scope roles + scaffold Bluesky SPI
Closes the integration gaps left by the prior commit (1489ed4e5):
the OIDC integration on minio, joomla, libretranslate, and postmarks
is now actually exercised end-to-end by Playwright through Keycloak,
not faked via local form-login fallbacks. The capstone
`make deploy-fresh-purged-apps APPS="<all 6>" FULL_CYCLE=true
SERVICES_DISABLED="matomo,email"` finishes `failed=0` with every
role's Playwright suite green.

Per-role:

* MinIO (✅/✅/✅). The upstream MinIO Console pinned by this role
  does not render the SSO button on its login form regardless of
  how the OIDC IdP is registered; `/api/v1/login` returns
  `redirectRules: null` even with a named `mc idp openid add`
  provider. The integrated OIDC login path is therefore exercised
  at the STS API tier: the Playwright spec drives Keycloak's
  password grant for an id_token and exchanges it via MinIO's
  `AssumeRoleWithWebIdentity` STS endpoint, which proves OIDC,
  the policy claim mapping (`MINIO_IDENTITY_OPENID_CLAIM_NAME=
  policy`) and the deploy-time `mc admin policy create` /
  `mc admin policy attach` chain are all working end-to-end.

* Joomla (✅/✅/🛠️). Joomla 6 ships no first-party OIDC adapter
  and the JED community plugins lag the Joomla 6 release. The
  integrated OIDC login path is therefore provided by a sidecar
  `web-app-oauth2-proxy` in front of the Joomla web UI (the
  marker is technically 🛠️ glue, not ✅ native — the doc-013
  table will be updated in follow-up). The Playwright spec
  navigates to Joomla, observes the redirect to Keycloak,
  authenticates, and verifies the post-login state. The
  variant-1 LDAP path keeps the local /administrator form login
  scenario, which Joomla resolves against the local users
  table when oauth2-proxy is disabled by the variant override.

* LibreTranslate (🛠️/❌/❌). Adds a sidecar
  `web-app-oauth2-proxy` in front of the human-facing web UI
  with `services.oauth2.acl.whitelist` exposing `/translate`,
  `/detect`, `/languages`, `/spec`, `/frontend/settings`, and
  `/api`, so API-key callers keep working while the UI is
  OIDC-gated. The Playwright spec exercises the OIDC redirect
  through Keycloak AND verifies the API stays anonymous.

* Postmarks (🛠️/🛠️/❌). Adds a sidecar
  `web-app-oauth2-proxy` in front of the web UI. The Playwright
  spec exercises the full OIDC redirect through Keycloak and
  verifies post-login state.

* Bluesky (🛠️/🛠️/❌). The role now ships the source for the
  Keycloak event-listener SPI bridge that auto-provisions
  Bluesky PDS accounts on REGISTER / LOGIN events and stores
  the synthesised app-password back as a Keycloak user
  attribute (per the requirement-013 per-role notes):

    roles/web-app-bluesky/files/keycloak-bluesky-bridge/
      pom.xml
      README.md
      src/main/java/com/infinito/bluesky/
        BlueskyBridgeEventListener.java
        BlueskyBridgeProviderFactory.java
      src/main/resources/META-INF/services/
        org.keycloak.events.EventListenerProviderFactory

  The SPI implements handle sanitisation to the AT Protocol's
  allowed `[a-z0-9-]` charset, a 3-attempt retry budget for the
  PLC-bound provisioning step, and group-membership gating
  against `/roles/web-app-bluesky`. The Maven build pipeline,
  JAR mount on the Keycloak container, and realm event-listener
  enablement are deferred to follow-up work — the SPI source
  is in place and reviewable but not yet built.

* Bridgy-fed (❌/❌/❌). No code change in this commit; the
  ❌ exceptions remain documented per the prior commit.

Shared infrastructure / tooling:

* `.github/dependabot.yml`: enable Maven coverage for the new
  Bluesky SPI pom.xml.
* `.github/workflows/security-codeql.yml`: enable
  `java-kotlin` in the CodeQL matrix to scan the new Java source.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 08:14:09 +02:00
Environment TestandClaude Sonnet 4.6 c47ac1c4cb feat(playwright): make images.playwright.version the SPOT for version
- Add image_version filter plugin to extract bare semver from image tag
- Derive TEST_E2E_PLAYWRIGHT_VERSION via image_version filter
- Convert files/package.json to templates/package.json.j2 using the
  derived version so image tag and devDependency stay in sync
- Use lookup('image', 'playwright', 'ref') in run_one.yml instead of
  building the image ref manually from package.json
- Add unit tests for image_version filter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-13 12:50:42 +02:00
Environment TestandClaude Sonnet 4.6 402ab2df4e fix(dependabot): use explicit paths for npm and bundler (** not supported)
- npm: /roles/test-e2e-playwright/files
- bundler: /roles/web-app-openproject/files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 01:12:33 +02:00
Environment TestandClaude Sonnet 4.6 7cae9b15fb fix(dependabot): use ** glob for recursive auto-discovery of dependency files
All ecosystems now scan all subdirectories automatically instead of
hardcoded paths, so new dependency files are picked up without
manual configuration.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-10 01:07:27 +02:00
kevinveenbirkenbach 3dc243fb0d fix dependabot coverage and environment test scripts 2026-04-08 18:01:42 +02:00
kevinveenbirkenbachandClaude Sonnet 4.6 cdcd96cb8a feat(dependabot): enable all supported ecosystems with daily schedule at midnight
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 13:32:49 +02:00
kevinveenbirkenbach 36d623b6f6 chore(deps): simplify dependabot config and remove unsupported ansible ecosystem
https://chatgpt.com/share/6943ae58-e578-800f-904e-b3b3d8a37b2e
2025-12-18 08:33:25 +01:00
kevinveenbirkenbach 082195016e Update dependabot.yml with package ecosystems
Added configurations for various package ecosystems including Python, GitHub Actions, Docker, and Ansible.

https://chatgpt.com/share/694367f4-f52c-800f-9b16-04c8db37fd5e
2025-12-18 03:33:39 +01:00