fix(web): gebroken splash-logo door Apache Alias /icons/ shadowing (#1221) #1224

Merged
brenno merged 2 commits from fix/1221-web-splash-icon-apache-shadow into main 2026-08-04 17:40:38 +00:00
Owner

Wat er mis was

Bij het laden van de webdemo verscheen een gebroken-afbeelding-icoon in plaats
van het OciDeck-logo op het laadscherm.

Root cause (anders dan #1221 vermoedde)

De diagnose in het issue noemde base-href en niet-meekopiëren van iconen, maar
geen van beide was het:

  • base href="/" klopte op de live site;
  • de iconen staan wel in de bundel en in de live SHA256SUMS;
  • /favicon.png (root) en /assets/... geven 200, maar /icons/Icon-192.png
    geeft 404 en /icons/ geeft 403;
  • /icons/blank.gif en /icons/a.gif geven 200 — dat zijn standaard
    Apache-systeemiconen uit /usr/share/apache2/icons/.

Debian/Ubuntu Apache levert in mods-enabled/alias.conf een
Alias /icons/ /usr/share/apache2/icons/. Die alias overschaduwt de webroot
icons/ map: de OciDeck-iconen staan op de server maar zijn onbereikbaar. Het
allereerste wat een bezoeker ziet oogt kapot.

Bovendien: deploy_web.sh stap 4 vergelijkt alleen index.html en
SHA256SUMS byte-voor-byte — die controle zegt niet dat de bestanden in
SHA256SUMS ook echt ophaalbaar zijn. Vandaar dat deze deploy groen ging terwijl
het pad gebroken was.

Oplossing

Hernoem web/icons/ naar web/app-icons/ — een pad dat geen standaardserver
aliast. De bundel werkt nu op elke default Apache/Nginx zonder vhost-ingreep.
Een vhost-edit op de live host is daarmee niet meer nodig; een redeploy fixt de
live site.

  • web/index.html: splash-<img> en apple-touch-icon naar app-icons/
  • scripts/regenerate_icons.sh: uitvoerpaden naar web/app-icons/
  • test/platform_icon_branding_test.dart: referenties naar web/app-icons/

Poort

De root cause (Apache-alias-shadowing) kan een flutter test niet bewijzen —
er draait geen Apache onder flutter test. Daarom ligt de ratchet in
tool/check_web_hardening.dart, op de gebouwde bundel: faalt als index.html
een icoon onder icons/ referereert, en als de splash-<img> niet naar een
bestaand bestand in build/web wijst. Een revert naar de Flutter icons/-
conventie gaat dan rood, in plaats van pas op de volgende live deploy.

Bewaker-weging

Deze wijziging raakt een publieke belofte (het eerste wat een bezoeker ziet) en
de draagbaarheid van de bundel. Twee routes waren mogelijk:

  1. Host-config + docs (kleinste repo-diff, houdt de Flutter icons/-
    conventie) — maar elke nieuwe Apache-host met default config loopt weer
    tegen hetzelfde aan; de repo is dan niet draagbaar zonder hostkennis.
  2. Hernoem in de repo (divergeert van de icons/-conventie) — draagbaar
    naar elke default host zonder vhost-ingreep.

Gekozen is 2: soevereiniteit en draagbaarheid (waarden 3/10) wegen hier zwaarder
dan de icons/-conventie, omdat de schaduw-alias een default van twee
mainstream distro's is, geen exotische host-eigenaardigheid. Van gedachten
veranderd als een toekomstige PWA-controle de icons/-mapnaam hard eist — dan
volgt een heroverweging met de bewaker.

Test plan

  • make check groen (8388 tests, 87,7% dekking)
  • make check-full groen (gitleaks, trufflehog, semgrep, web-hardening)
  • tool/check_web_hardening.dart bevestigt de nieuwe poort op de bundel
  • Poort-regex afzonderlijk getoetst: vangt icons/, negeert app-icons/
  • flutter test test/platform_icon_branding_test.dart groen (5/5)
  • Beeldkeuring + liveverificatie na redeploy: curl /app-icons/Icon-192.png -> 200

Generated with Devin

## Wat er mis was Bij het laden van de webdemo verscheen een gebroken-afbeelding-icoon in plaats van het OciDeck-logo op het laadscherm. ## Root cause (anders dan #1221 vermoedde) De diagnose in het issue noemde base-href en niet-meekopiëren van iconen, maar geen van beide was het: - `base href="/"` klopte op de live site; - de iconen staan wel in de bundel en in de live `SHA256SUMS`; - `/favicon.png` (root) en `/assets/...` geven 200, maar `/icons/Icon-192.png` geeft 404 en `/icons/` geeft 403; - `/icons/blank.gif` en `/icons/a.gif` geven 200 — dat zijn standaard Apache-systeemiconen uit `/usr/share/apache2/icons/`. Debian/Ubuntu Apache levert in `mods-enabled/alias.conf` een `Alias /icons/ /usr/share/apache2/icons/`. Die alias overschaduwt de webroot `icons/` map: de OciDeck-iconen staan op de server maar zijn onbereikbaar. Het allereerste wat een bezoeker ziet oogt kapot. Bovendien: `deploy_web.sh` stap 4 vergelijkt alleen `index.html` en `SHA256SUMS` byte-voor-byte — die controle zegt niet dat de bestanden in SHA256SUMS ook echt ophaalbaar zijn. Vandaar dat deze deploy groen ging terwijl het pad gebroken was. ## Oplossing Hernoem `web/icons/` naar `web/app-icons/` — een pad dat geen standaardserver aliast. De bundel werkt nu op elke default Apache/Nginx zonder vhost-ingreep. Een vhost-edit op de live host is daarmee niet meer nodig; een redeploy fixt de live site. - `web/index.html`: splash-`<img>` en `apple-touch-icon` naar `app-icons/` - `scripts/regenerate_icons.sh`: uitvoerpaden naar `web/app-icons/` - `test/platform_icon_branding_test.dart`: referenties naar `web/app-icons/` ## Poort De root cause (Apache-alias-shadowing) kan een `flutter test` niet bewijzen — er draait geen Apache onder `flutter test`. Daarom ligt de ratchet in `tool/check_web_hardening.dart`, op de gebouwde bundel: faalt als `index.html` een icoon onder `icons/` referereert, en als de splash-`<img>` niet naar een bestaand bestand in `build/web` wijst. Een revert naar de Flutter `icons/`- conventie gaat dan rood, in plaats van pas op de volgende live deploy. ## Bewaker-weging Deze wijziging raakt een publieke belofte (het eerste wat een bezoeker ziet) en de draagbaarheid van de bundel. Twee routes waren mogelijk: 1. **Host-config + docs** (kleinste repo-diff, houdt de Flutter `icons/`- conventie) — maar elke nieuwe Apache-host met default config loopt weer tegen hetzelfde aan; de repo is dan niet draagbaar zonder hostkennis. 2. **Hernoem in de repo** (divergeert van de `icons/`-conventie) — draagbaar naar elke default host zonder vhost-ingreep. Gekozen is 2: soevereiniteit en draagbaarheid (waarden 3/10) wegen hier zwaarder dan de `icons/`-conventie, omdat de schaduw-alias een default van twee mainstream distro's is, geen exotische host-eigenaardigheid. Van gedachten veranderd als een toekomstige PWA-controle de `icons/`-mapnaam hard eist — dan volgt een heroverweging met de bewaker. ## Test plan - [x] `make check` groen (8388 tests, 87,7% dekking) - [x] `make check-full` groen (gitleaks, trufflehog, semgrep, web-hardening) - [x] `tool/check_web_hardening.dart` bevestigt de nieuwe poort op de bundel - [x] Poort-regex afzonderlijk getoetst: vangt `icons/`, negeert `app-icons/` - [x] `flutter test test/platform_icon_branding_test.dart` groen (5/5) - [ ] Beeldkeuring + liveverificatie na redeploy: `curl /app-icons/Icon-192.png` -> 200 Generated with [Devin](https://devin.ai)
Drie aanpassingen aan het centrale welkomstscherm:

1. Het versienummer verhuist van het merkpaneel naar de linkerkant van de
   doorlopende voettekstband, waar het samen met de knoppen op één regel
   staat in plaats van alleen onder de welkomtekst.

2. Het OciDeck-logo wisselt van inktkleur bij hover: blauw → EU-geel, geel →
   Italiaans vlaggroen. Nieuw semantisch token italianGreen (#008C45) bij de
   EU-kleuren in app_theme.dart.

3. De links voor gebruikershandleiding en instellingen zijn outlined knoppen
   geworden met icoon, dezelfde vorm als de startknoppen in de middelste
   kolom. De stille tekstlinks waren niet als klikbaar herkenbaar; de dode
   _QuietLink-klasse is verwijderd.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Debian/Ubuntu Apache levert `Alias /icons/ /usr/share/apache2/icons/`
in mods-enabled/alias.conf. Die alias overschaduwt een webroot `icons/`
map: het splash-logo staat wél in de bundel en in SHA256SUMS, maar
404't op een default Apache-host omdat `/icons/...` naar de
systeemiconenmap wijst. Het allereerste wat een bezoeker ziet is dan
een gebroken-afbeelding-icoon.

Hernoem de map naar `app-icons/` — een pad dat geen standaardserver
aliast — zodat de bundel op elke default Apache/Nginx werkt zonder
vhost-ingreep. index.html (splash + apple-touch-icon),
regenerate_icons.sh en de icon-brandingtest verwijzen nu naar
`app-icons/`. base-href en het meekopiëren van de iconen klopten al;
de diagnose in #1221 (base-href / niet meekopiëren) was niet de echte
oorzaak.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
test(web): poort tegen icons/-pad in index.html (Apache shadowing, #1221)
Some checks failed
static-gate / static-gate (pull_request) Failing after 1m3s
scans / scans (pull_request) Successful in 1m26s
2fbb1ce206
Een `flutter test` kan de Apache `Alias /icons/`-shadowing niet
bewijzen — er draait geen Apache onder `flutter test`. Daarom komt de
ratchet in tool/check_web_hardening.dart te liggen, op de gebouwde
bundel, waar hij het pad leest dat de browser werkelijk opvraagt.

De poort faalt als index.html een icoon onder `icons/` referereert
(shadowed door default Debian/Ubuntu Apache) en als de splash-<img>
niet naar een bestaand bestand in build/web wijst. Zo vangt een
welgemeende revert naar de Flutter `icons/`-conventie rood, in plaats
van pas op de volgende live deploy.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno force-pushed fix/1221-web-splash-icon-apache-shadow from 2fbb1ce206
Some checks failed
static-gate / static-gate (pull_request) Failing after 1m3s
scans / scans (pull_request) Successful in 1m26s
to 3950b27e03
All checks were successful
scans / scans (pull_request) Successful in 2m22s
static-gate / static-gate (pull_request) Successful in 5m5s
2026-08-04 17:32:24 +00:00
Compare
brenno merged commit c80b865127 into main 2026-08-04 17:40:38 +00:00
Sign in to join this conversation.
No description provided.