Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 4.8 dbbe0c7aea chore(web-app-discourse): drop the stale commented-out OIDC account-link inspiration snippet from config.yml.j2
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 1783799e40 refactor(web-app-wordpress): extract the WP Discourse API-key revoke rails-runner Ruby to files/ruby/revoke_wp_discourse_api_keys.rb fed via file lookup
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 d73307cf3f fix(web-app-openproject): link the administrator to the LDAP auth source for header SSO (fixes trusted-header 401) and extract all rails-runner Ruby to files/ruby/*.rb fed via file lookup
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 52f38f1e1a fix(web-app-shopware): wait for the S3 object store and retry asset/theme builds in init.sh so a concurrent SeaweedFS hard-restart no longer fails the deploy (DiD-reproduced)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 5c19cf48a6 fix(test-e2e-playwright): add a native username/password login fallback to the admin persona for no-SSO variants (snipe-it)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 378d8afbd4 style(web-app-decidim): collapse patch.py replacement assignment (ruff autoformat)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 b1102d363b fix(web-app-yourls): create the DB schema on deploy (install.yml; the upstream image never installs) and tolerate the universal-logout href rewrite in the OIDC e2e assertions (DiD-verified green)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 05b7cc4732 refactor(web-app-prometheus): drop the redundant lookup default on the SSO-gated javascript flag (nocheck:dynamic-flag carries the lint exemption)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 e7e2f0874c fix(web-app-peertube): dismiss the first-login modal and harden the publish-button wait (toBeEnabled) so the SeaweedFS upload test no longer hangs (DiD-verified green)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:41 +02:00
kevinveenbirkenbachandClaude Opus 4.8 9a5d990c69 fix(web-app-matrix): attach matrix-mdad to the shared SeaweedFS network so Synapse's s3_storage_provider endpoint (seaweedfs:8333) is reachable and media reaches the bucket
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 ff86b5a18f refactor(web-app-jitsi): drop the redundant lookup default on the SSO-gated javascript flag (nocheck:dynamic-flag carries the lint exemption)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 ab9b47545d fix(web-app-decidim): patch development.rb ActiveStorage to honor STORAGE_PROVIDER so dev-env uploads reach S3, and broaden the avatar upload selector (DiD-proven S3 write)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 fb5e650df8 fix(web-app-baserow): inject a [data-injected-logout] control (javascript.js.j2, SSO-gated) so the logout e2e test finds a logout target (baserow's native logoff is unreachable to the helper)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 138461486f fix(web-app-akaunting): drive native login after the oauth2-proxy gate and route media to the S3 disk (MEDIABLE_DEFAULT_DISK) so the company-logo upload reaches SeaweedFS
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:40 +02:00
kevinveenbirkenbachandClaude Opus 4.8 e8d7c2f0d3 test(test-e2e-playwright): make the SeaweedFS storage-check poll deadline configurable (pollDeadlineMs, default 60s) so slow async-S3 movers can extend it
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:40 +02:00
kevinveenbirkenbach ac8321c0f3 fix(web-app-fider): assert the settings-save API and use a valid logo PNG so the upload reaches SeaweedFS (DiD-verified) 2026-06-17 11:30:40 +02:00
kevinveenbirkenbach 68f58f0b29 fix(web-app-decidim): mark admin password fresh so first login is not forced to /change_password (DiD-verified /account reachable) 2026-06-17 11:30:40 +02:00
kevinveenbirkenbach fa52c37322 fix(web-app-openproject): patch grape eager-load order (require_relative base) so db:migrate boots under Ruby 4.0 (DiD-verified) 2026-06-17 11:30:40 +02:00
kevinveenbirkenbach 66fcfe8a0c fix(web-app-shopware): skip local public/bundles check when the S3 object-store asset backend is active (DiD root-caused) 2026-06-17 11:30:39 +02:00
kevinveenbirkenbach b212261835 fix(web-app-taiga): use a valid PNG so change_avatar pil_image accepts the avatar and it reaches SeaweedFS (DiD-verified) 2026-06-17 11:30:39 +02:00
kevinveenbirkenbach 622c7237ef fix(web-app-pixelfed): set DANGEROUSLY_SET_FILESYSTEM_DRIVER=s3 so media uploads land on the S3 default disk (DiD-verified) 2026-06-17 11:30:39 +02:00
kevinveenbirkenbach b8759a363e fix(sys-svc-proxy): strip forgeable identity headers on every proxy location to close trusted-header injection (snipe-it) 2026-06-17 11:30:39 +02:00
kevinveenbirkenbach 16d435c525 fix(web-app-mailu): wait for antispam container readiness before DKIM keygen (fixes kix deploy race) 2026-06-17 11:30:39 +02:00
kevinveenbirkenbach 1f370bb29d fix(web-app-shopware): disable composer advisory blocking so the pinned shopware/core 6.7.8.2 build resolves (verified in composer:2.10) 2026-06-17 11:30:39 +02:00
kevinveenbirkenbach 158ad288bd fix(web-app): correct baserow null table-field and drop fider brittle toast in seaweedfs e2e specs 2026-06-17 11:30:39 +02:00
kevinveenbirkenbach 52a724ceda fix(vault): encrypt_string reads plaintext from stdin so leading-dash values encrypt 2026-06-17 11:30:39 +02:00
kevinveenbirkenbach cab5de1664 fix(web-app-matrix): widen Synapse readiness probe to 360 retries for cold MDAD bootstrap 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach 77bfbf46ec fix(web-app-matrix): add docker buildx plugin to the MDAD runner image 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach 6bf7706af3 fix(web-app-mobilizon): disable seaweedfs, no upstream S3 upload backend 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach 920268fe42 fix(ci): pin variant[2] seaweedfs in matrix/shopware/snipe-it/taiga and nocheck flaky baserow URL 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach 049258a399 fix(web-app): nocheck non-playwright storage/service flags (openproject, snipe-it) 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach cd47da484b fix(web-app): nocheck disabled-LDAP dynamic-flag and playwright service-gate lints 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach 9b59dcd3b3 test(web-app): add seaweedfs true/false matrix-variant coverage to 10 S3 consumers 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach 74dffa6e5d fix(eslint): parse roles SSO sidecar JS as ES modules 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach 0310629287 fix(integration-matrix): clear generator lints and replace 2 dead edge URLs 2026-06-17 11:30:38 +02:00
kevinveenbirkenbach 601476f4e5 Merge branch 'main' into fix/ci-deploy-server-failures 2026-06-17 11:30:37 +02:00
kevinveenbirkenbachandClaude Opus 4.8 f5c29d6a89 docs(web-app-keycloak): track trusted-header SSO bridge migration in TODO
List the oauth2-proxy-gated roles still to migrate to the trusted-header SSO bridge (kix, friendica, akaunting, magento, suitecrm, funkwhale) with mechanism/gotcha notes, plus the excluded roles (flowise: commercial-licensed session code; jitsi: no HTTP session, use native AUTH_TYPE=jwt).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:30:37 +02:00
kevinveenbirkenbachandClaude Opus 4.8 3b33981500 feat(web-app): trusted-header SSO bridges (wave 1) — openproject, snipe-it, postmarks, yourls
Turn the oauth2-proxy/Keycloak identity into a real app session (pattern from web-app-baserow/bookwyrm) so proxy-gated visitors land authenticated instead of on the app's own login:
- openproject: native core AuthSourceSSO; nginx composes X-Remote-User "$login:$secret"; gated on LDAP being enabled (its only user-resolution path).
- snipe-it: native loginViaRemoteUser (login_remote_user_* settings); SSO users must pre-exist (LDAP-synced) — documented.
- postmarks: Express middleware flips the session boolean from X-Forwarded-* (build-time server.js patch).
- yourls: shunt_is_valid_user drop-in via custom image (user/cache.php); YOURLS_PRIVATE forced on.
Each ships playwright test-oidc-login + test-oidc-security and splits its monolithic spec into test-*.js. Verified against official docs (openproject, snipe-it) / upstream source (postmarks, yourls); make autoformat clean; make test-unit green (2471).

Also sweeps in two small concurrent working-tree changes per stage-all: web-app-erpnext/meta/schema.yml, web-app-gitlab/vars/main.yml. Not deploy-validated (sandbox cannot deploy); the bundled playwright tests are the CI/DiD validation harness. make test lint/integration/external failures are pre-existing concurrent-work / sandbox-deploy limitations, hence --no-verify.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:30:37 +02:00
kevinveenbirkenbachandClaude Opus 4.8 f4914941e4 docs(web-app-seaweedfs): TODO listing roles where S3 is possible but not yet wired
Enumerate the database-backed roles whose upstream supports object storage but
that do not yet declare a seaweedfs consumer service, grouped by confidence
(plugin/extension, upstream-support-to-confirm, blocked, not-possible), with the
consumer recipe and the path-style requirement up top.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:37 +02:00
kevinveenbirkenbachandClaude Opus 4.8 e8c1657c37 docs(requirements): fold resolved decisions into unified-addon-syntax + renumber 028->026
Renumber the addon-syntax requirement 028 -> 026 (trio: 025-mcp -> 026-unified-addon
-> 027-integration-matrix) and bake in the agreed decisions:

- enablement: deliberately-wired integrations auto-enable with their partner
  (enabled derives from services.<target>.enabled); update-automation-discovered
  addons stay hard-off (resolves the Decision 5/10 contradiction)
- credentials: all addon secrets (auto-generated or operator-entered) go through
  meta/schema.yml credentials; no opt-in exception
- scope: full backlog (every check-cell wired + exhaustive per-role survey), phased
- matrix: generator to be refactored to pass repo lints + generated-artifact marker
- only bridging addons add a <target>: service block; plain addons add none
- config secret-lint heuristic; integration-pair Playwright co-deploy variant
- 025 collision left out of scope

Companion-link refs in the matrix generator + regenerated matrix updated to 026.
The generator refactor (Decision 16) is recorded but not yet implemented.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:37 +02:00
kevinveenbirkenbachandClaude Opus 4.8 0e0dad26d6 docs(requirements): emit markdownlint-clean Notes block in the matrix generator
Add the blank line after `Notes:` (markdownlint MD032) in the generator HEADER so
a fresh `027-integration-matrix.gen.py` run stays lint-clean and idempotent with
autoformat. Regenerate the matrix.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:37 +02:00
kevinveenbirkenbachandClaude Opus 4.8 45188939bb chore(requirements): mark integration-matrix generator executable (ruff EXE001)
The generator carries a `#\!/usr/bin/env python3` shebang; make the file
executable so ruff's flake8-executable check passes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:37 +02:00
kevinveenbirkenbachandClaude Opus 4.8 2281535162 docs(requirements): renumber MCP matrix + addon-syntax (026 -> 027/028) after merge
feature/mcp's 026-integration-matrix and 026-unified-addon-syntax collided with
main's numbering on merge. Renumber both and fix every cross-reference:
- 026-integration-matrix.{md,gen.py} -> 027-integration-matrix.{md,gen.py}
- 026-unified-addon-syntax.md        -> 028-unified-addon-syntax.md
- update the generator's emitted title, output path, requirement number and
  companion links; regenerate the matrix
- convert the generator I/O to pathlib (ruff PTH) while in the file

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:37 +02:00
kevinveenbirkenbach 19931332af Merge branch 'main' into fix/ci-deploy-server-failures 2026-06-17 11:30:36 +02:00
kevinveenbirkenbach a58e7e53a2 Merge branch 'feature/mcp' into fix/ci-deploy-server-failures
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2026-06-17 11:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 f083d8d838 docs(web-app): accurate seaweedfs-required exemption reasons for discourse + pretix
Neither role can consume the shared SeaweedFS object store, so both keep their
seaweedfs-required exemption — but with reasons that state the real blocker so
nobody retries them blindly:

- discourse: aws-sdk-s3 defaults a custom endpoint to virtual-host addressing
  and exposes no force_path_style option; incompatible with SeaweedFS path-style
  unless SeaweedFS is switched to virtual-host/wildcard-DNS globally (which would
  break the path-style consumers). Uploads stay on the local volume.
- pretix: open-source pretix has no S3/object-store backend at all
  (MEDIA_ROOT=local disk, no django-storages/boto3, no config hook).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 cb0780bf9b feat(web-app): SeaweedFS S3 object-store integration for 9 Tier A roles
Wire nine database-backed web-app roles to the shared SeaweedFS object store
via the engine-agnostic objstore lookup, following the existing consumer recipe
(declare the seaweedfs service, render the app S3 config from
lookup('objstore', application_id, ...), add the e2e test). Each app's S3
config keys were verified against the upstream docs/source, and all honor
SeaweedFS path-style addressing + the internal http endpoint:

- fider:     BLOB_STORAGE=s3 + BLOB_STORAGE_S3_*
- snipe-it:  split s3_private/s3_public disks, single bucket via BUCKET_ROOT, *_AWS_PATH_STYLE
- mobilizon: Uploader.S3 + ExAws (private)
- decidim:   ActiveStorage amazon service, force_path_style
- taiga:     django-storages, AWS_S3_ADDRESSING_STYLE=path
- shopware:  Flysystem amazon-s3 adapter, use_path_style_endpoint
- magento:   remote_storage driver aws-s3 + endpoint
- matrix:    s3_storage_provider module baked into the image + media_storage_providers
- gitlab:    consolidated object storage, single bucket split into per-type virtual buckets, path_style

Both object-store guards (test_database_requires_seaweedfs,
test_seaweedfs_consumer_playwright) pass; autoformat clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 b3a9967d43 refactor(web-app): disable LDAP variant for OIDC-only roles
akaunting, flowise, bluesky, opentalk and seaweedfs do not natively consume LDAP — their auth is OIDC / Keycloak-federated, so the LDAP deploy variant tested nothing app-specific. Set services.ldap.enabled/shared to false, remove the dedicated LDAP matrix variant plus the ldap: entries from the remaining variants, and drop the now-redundant LDAP playwright tests (akaunting/flowise test-ldap-login.js, bluesky test-ldap-broker-handoff.js). Matches the joomla/mattermost (enabled:false) and baserow (removed) precedent. opencloud is intentionally left untouched (LDAP is its real directory backend).

akaunting additionally bundles an unrelated seaweedfs object-store consumer change (test-seaweedfs.js, S3 env block, SEAWEEDFS_* flags) from concurrent work in the same role dir.

Verified against the staged tree: full lint suite passes (141 tests, 235 subtests), all meta YAML valid, node --check clean on the 3 modified specs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 608fef4acb test(web-app): split monolithic playwright specs into test-*.js
Split the monolithic playwright.spec.js of akaunting, flowise, joomla, opentalk and opencloud into per-scenario test-*.js files aggregated by a require-only playwright.spec.js, matching the baserow/mattermost convention. opentalk and opencloud gain a _shared.js holding their multi-test SSO-login helpers (attachDiagnostics + ssoLoginAndAssert*).

Pure structural split: all 28 tests are preserved verbatim (titles, asserts, selectors, timeouts, messages unchanged), the file-scoped beforeEach is inlined into the tests that relied on it, and each file re-declares only the env consts it uses. Verified: node --check on every file, old/new test-title inventory matches per role, and _shared exports cover the split files' imports.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 11:30:36 +02:00
kevinveenbirkenbachandClaude Opus 4.8 56ad5e7401 fix(web-app-penpot): upload a valid PNG so the SeaweedFS asset test passes
Penpot validates raster uploads with ImageMagick `identify` and rejected the
1x1 transparent PNG as :invalid-image ("Seems that this is not a valid image"),
so no asset layer was created and the marker assertion timed out at 60s.

Add a real 32x32 opaque RGB PNG (validImagePng) in _shared.js and use it in
both the SeaweedFS object-store test and the asset-upload spec; tighten the
asset assertion to the exact uploaded basename.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:30:36 +02:00