Skip to content

Promote: staging -> develop#645

Merged
TaprootFreak merged 1 commit into
developfrom
staging
Jun 2, 2026
Merged

Promote: staging -> develop#645
TaprootFreak merged 1 commit into
developfrom
staging

Conversation

@github-actions
Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot commented Jun 2, 2026

Automatic Staging PR

This PR was automatically created after changes were pushed to staging.

Commits: 1 new commit(s)

Checklist

  • Review all changes
  • Verify CI passes
  • Approve and merge to promote into develop

## What

Implements #634 + its
[scope-extension](#634 (comment)):
drive the App Store + Play Store **listing** (metadata text,
screenshots, icon, featureGraphic) from git via Fastlane
`deliver`/`supply`, and make the handbook a **generated downstream
export** of that same metadata.

### Store metadata (#634)
- iOS `ios/fastlane/metadata/de-DE/` (10 .txt) + Android
`android/fastlane/metadata/android/de-DE/` (title, short/full
description, changelog, `video.txt`, `images/icon.png`). German text
from Dani; subtitle trimmed to `Sicher. Einfach. Unabhängig.` (28/30).
- `ios/fastlane/Deliverfile` (shared deliver defaults; team IDs stay in
`Appfile`).
- `beta` lanes push the listing alongside the binary; new metadata-only
`store_metadata` lane per platform (Android hard-pinned to the
`internal` track).
- `.github/workflows/store-metadata.yaml`: push-to-`main` +
`workflow_dispatch`; `preflight` job runs
`scripts/check-store-metadata.sh`. Reuses existing secrets — **no new
secrets**.
- `release.yaml` runs the same preflight in a gating
`store-metadata-preflight` job before either deploy lane, so a tag can
never ship a `FIXME-`/oversize/invalid-URL field to the live consoles.
- README workflow table + release section updated.
- 26 screenshots + featureGraphic delivered (alpha-stripped, dimensions
verified); privacy/support URLs resolved to
`https://realunit.ch/datenschutz/` + `…/kontakt/`.

### Handbook export (scope-extension)
- `scripts/assemble-handbook-store-listing.py` (stdlib only): copies the
PNGs under `/store/…` and renders
`scripts/templates/store-listing.html.tmpl` into the `<!--
BEGIN/END:store-listing -->` block of `docs/handbook/de/index.html` in
place (idempotent, single-pass substitution).
- New "S App Store / Play Store Listing" handbook section with a TOC
entry, CSS, and a **per-element `↗` source link** on every metadata
field and every image to its exact file at `…/blob/main/…`.
- `Dockerfile.handbook` `store-listing-builder` stage serves the PNGs +
the substituted page.
- `handbook-build-check.yaml` + `handbook-deploy.yaml` triggers extended
to the Fastlane metadata/screenshots/generator/template; build-check
adds a **sync gate** (re-run generator → fail if the committed handbook
is stale).

### Security hardening (review P0)
- The Android long description is rendered **unescaped** in the handbook
(Google Play allows an HTML subset). An allowlist sanitizer
(`sanitize_play_html`, stdlib `html.parser`) reduces it to the
Play-allowed tags, drops everything else, strips attributes except a
scheme-validated `href` on `<a>`, and balances the output — so a
`</details><script>…` payload can neither break the DOM nor inject
script. CI regression test included.

## Local validation
- `ruby -c` (both Fastfiles + Deliverfile), `python3 -m ast`
(generator), `bash -n` (checks) all pass; all touched workflows are
valid YAML.
- Preflight passes on current metadata; verified it fails on FIXME /
oversize / invalid-URL.
- Sanitizer: PoC `</details><script>…<a href="javascript:…">` →
neutralized; legitimate `<b>` formatting preserved byte-for-byte
(handbook stays in sync).
- `docker build -f Dockerfile.handbook` green; container serves
`/store/…` + the rendered section; generator idempotent.

Base branch: `staging` (per CONTRIBUTING.md). DE-only v1 — EN metadata
is a follow-up.

Refs #634
@TaprootFreak TaprootFreak merged commit 142f92c into develop Jun 2, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant