De app kijkt naar zijn eigen voordeur, en meet minder dan het plan beloofde
Open punt 5 van Webinterface, goedgekeurd en gebouwd. De agent verbindt met de eigen TLS-poort, maakt de handdruk af en vergelijkt het getoonde certificaat byte voor byte met het gekozen bestand. Die vergelijking blijkt waardevoller dan de handdruk. Ze vangt een certificaatwissel die nginx nooit heeft toegepast, en dat is precies het geval waar een controle op vertrouwen blind voor is. Er wordt daarom bewust niet tegen de certificaatwinkel van het besturingssysteem geverifieerd: een zelfondertekend certificaat uploaden is een ondersteunde bron en die opstelling zou dan als kapot gemeld worden. Twee dingen liepen anders dan het plan zei en staan nu rechtgezet in PLAN 4a2, OPEN punt 5 en de changelog. De belofte "luisteren, certificaat en doorverbinding in een keer" klopt voor twee van de drie: na de handdruk wordt er niets verstuurd. Een echt verzoek zou de sessie bytes geven, en sessies met bytes worden nooit uit het activiteitenlog gefilterd, want die kunnen een storing zijn. En dat filteren was de tweede verrassing. Elke meting is voor nginx een gewone sessie en levert dus een logregel op; zonder rem ging het log over onszelf in plaats van over wallets. Er zit nu een rem van vijf minuten op, er wordt niet gemeten vlak na een herlading omdat het vorige certificaat er dan nog staat, en de eigen regels worden weggelaten op grond van het moment. Tests: 22 nieuw, met de nadruk op de niet-gelukkige paden en op de rem, want dat is wat het log bruikbaar houdt. Alle vier de beslissende regels mutatie-getest. De changelog kreeg ook de ontbrekende 0.0.15 erbij. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,60 @@ Wat er nog moet gebeuren staat **niet** hier maar in de plannen; zie [CONTINUE_H
|
||||
Een lijst met geplande features op twee plekken loopt uit elkaar, en dan is geen van beide meer te
|
||||
vertrouwen.
|
||||
|
||||
## [0.0.16] - 2026-08-27
|
||||
|
||||
### Added
|
||||
|
||||
- **De zelfcontrole: de agent verbindt met de eigen TLS-poort.** Tot nu toe keek de app of de
|
||||
Electrum-server antwoordde, maar niet of hij zélf antwoordde, en dat laatste is zijn enige taak. De agent
|
||||
zet nu een TLS-verbinding op naar poort 50022 van de nginx-container ernaast, maakt de handdruk af en
|
||||
vergelijkt het getoonde certificaat **byte voor byte** met het gekozen bestand.
|
||||
|
||||
Die vergelijking is het punt, en niet de handdruk. Een certificaatwissel die nginx nooit heeft toegepast
|
||||
ziet er van buiten goed uit en loopt pas bij de wallet stuk op naamverificatie; dat is precies het geval
|
||||
waar een controle op vertrouwen blind voor is. Er wordt daarom bewust **niet** tegen de certificaatwinkel
|
||||
van het besturingssysteem geverifieerd: een zelfondertekend certificaat uploaden is een ondersteunde
|
||||
bron, en die opstelling zou dan als kapot gemeld worden.
|
||||
|
||||
De uitkomst staat in `status.json` onder `tls.self_check`, met vier toestanden: `off` (geen certificaat
|
||||
gekozen, dus geen poort), `ok`, `wrong-certificate` en `failed`. Bij een **wijziging** komt er een regel
|
||||
in het activiteitenlog; elke ronde dezelfde regel zou ruis zijn.
|
||||
|
||||
**Wat het niet bewijst, en dat is minder dan het plan beloofde.** Er wordt na de handdruk niets
|
||||
verstuurd, dus de doorverbinding naar de Electrum-server zit er niet in; die wordt apart bevraagd. En de
|
||||
verbinding loopt van container naar container, dus de poortmapping naar de host en de doorstuurregel in
|
||||
de router blijven ongetest.
|
||||
|
||||
### Changed
|
||||
|
||||
- **De controle draait niet elke ronde, en zijn eigen sessies worden uit het activiteitenlog gefilterd.**
|
||||
Elke verbinding met poort 50022 is voor nginx een gewone sessie en levert dus een logregel op. Zonder rem
|
||||
zou het log elke minuut over onszelf gaan in plaats van over wallets. Er wordt daarom hoogstens elke vijf
|
||||
minuten gemeten, en de agent onthoudt wanneer hij zelf verbond om de bijbehorende regel weg te laten.
|
||||
|
||||
Twee eigenschappen van die filter horen erbij: hij laat **alleen** regels weg waarin niets is doorgegeven,
|
||||
want een sessie met verkeer kan een storing zijn en die verbergen is erger; en hij kan een échte scan
|
||||
missen die toevallig in hetzelfde venster van twee seconden eindigde.
|
||||
|
||||
- **Vlak na een certificaatwissel wordt er juist niet gemeten.** nginx herlaadt binnen tien seconden, dus
|
||||
een meting op dat moment ziet nog het vorige certificaat en zou dat als storing melden. De meting schuift
|
||||
één ronde op, en dan is het meteen de interessantste die er is.
|
||||
|
||||
## [0.0.15] - 2026-08-25
|
||||
|
||||
Deze regel is op 27-08-2026 alsnog toegevoegd; bij de verhuizing is de changelog overgeslagen.
|
||||
|
||||
### Changed
|
||||
|
||||
- **De app store is verhuisd naar `UmbrelApps`**, en `website`, `repo`, `support`, `submission` en `icon`
|
||||
wijzen daarheen. De app zelf is ongewijzigd: het app-id hangt aan het store-id `whatsnext` en niet aan de
|
||||
URL. Aanleiding was Evolu Relay, want umbrelOS leest per store één repo en een tweede app maakte een naam
|
||||
naar deze ene app onhoudbaar.
|
||||
|
||||
Wat hierbij geleerd is en verder gaat dan deze release: **een geïnstalleerde app overleeft een wisseling
|
||||
van store-URL niet.** umbrelOS tóónde de update wel en voerde hem niet uit, zonder foutmelding.
|
||||
Deïnstalleren plus opnieuw installeren loste het op, en de prijs daarvan is de certificaatkeuze.
|
||||
|
||||
## [0.0.14] - 2026-08-20
|
||||
|
||||
### Added
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
| Plan | App | Volgende stap | Status |
|
||||
|-|-|-|-|
|
||||
| [Webinterface](Plannen/Actief/005-Webinterface/TAKEN.md) | Gate | **Fase 6, de tweede indeling** (opgegeven 27-08-2026): vijf kleine widgets op de bovenste rij, de certificaatkeuze naar een dialoog achter een menu, log over de volle breedte, en het instelkader dichtgeklapt en compacter. Begint met de zelfcontrole op de eigen TLS-poort, want dat is het enige nieuwe werk en het levert de vijfde widget | 🔶 |
|
||||
| [Webinterface](Plannen/Actief/005-Webinterface/TAKEN.md) | Gate | **Fase 6, de tweede indeling** (opgegeven 27-08-2026): vijf kleine widgets op de bovenste rij, de certificaatkeuze naar een dialoog achter een menu, log over de volle breedte, en het instelkader dichtgeklapt en compacter. De zelfcontrole eronder is gebouwd in 0.0.16 (27-08-2026), dus wat er nu ligt is de verbouwing zelf | 🔶 |
|
||||
| [Umbrelapp](Plannen/Actief/008-Umbrelapp/TAKEN.md) | Relay | **Hij draait sinds 25-08-2026, maar kan in de kern niet werken.** Uit de broncode van Suite: bij een eigen relay-URL registreert de cliënt geen eigenaar, terwijl Trezor's relay iedereen zonder limietenrij weigert. Volgende stap is de kále Evolu-relay proberen (`docker.io/evoluhq/relay:latest`, één container, gepubliceerde image) en waarschijnlijk daarnaartoe verbouwen. Zie open punt 6 | 🔶 |
|
||||
| [Proefopstelling](Plannen/Actief/007-Proefopstelling/TAKEN.md) | Relay | **Eerst beslissen of dit plan nog bestaansrecht heeft.** Fase 1 is af, maar fase 2 en 3 zijn ingehaald: het pakket draait al op de Umbrel, dus een lokale opstelling ernaast meet minder en kost meer. Wat overblijft zijn twee vragen die al als blokkade in **Umbrelapp** staan, en die horen op één plek | 🔶 |
|
||||
|
||||
|
||||
@@ -39,8 +39,17 @@
|
||||
de einddatum van het actieve certificaat gelezen wordt.
|
||||
|
||||
Het lag stil omdat de agent nog nooit gedraaid had, en die reden is vervallen. De uitkomst wordt de
|
||||
vijfde widget van de bovenste rij uit [PLAN.md](PLAN.md) §4a2. Staat als eerste taak in fase 6, want
|
||||
het is het enige echte nieuwe werk in die fase en de rest is opmaak eromheen.
|
||||
vijfde widget van de bovenste rij uit [PLAN.md](PLAN.md) §4a2.
|
||||
|
||||
**Gebouwd in 0.0.16, diezelfde dag, en het bewijst minder dan hierboven staat.** De zin "bewijst het
|
||||
luisteren, het certificaat en de doorverbinding in één keer" klopte voor de eerste twee en niet voor de
|
||||
derde: er wordt na de handdruk niets verstuurd. Een echt verzoek zou de sessie bytes geven, en sessies
|
||||
met bytes worden nooit uit het activiteitenlog gefilterd, want die kunnen een storing zijn. De backend
|
||||
wordt apart bevraagd, dus wat overblijft is alleen de `proxy_pass`.
|
||||
|
||||
Wat er in de plaats kwam is scherper dan verwacht: het getoonde certificaat wordt byte voor byte
|
||||
vergeleken met het gekozen bestand, en dát vangt een herlading die nginx nooit heeft toegepast. Dat is
|
||||
precies het geval waar een controle op vertrouwen blind voor is.
|
||||
|
||||
3. **Komt het activiteitenlog er?** - **Ja, en gebouwd** (opgemerkt 27-08-2026; het besluit is nooit als
|
||||
zodanig opgeschreven, het werk is gewoon gedaan en uitgerold in 0.0.6 en verfijnd in 0.0.14).
|
||||
|
||||
@@ -284,9 +284,20 @@ bijna verlopen certificaat: dat staat al als waarschuwing bovenaan en die verhui
|
||||
- **De dialoog met het `dialog`-element**, om dezelfde reden: focus en Escape zitten erin. Wat er in moet
|
||||
gebeuren is precies wat het certificaatkader nu doet, inclusief het uploaden en de melding dat de pagina
|
||||
níet zelf zegt dat het gelukt is (§4b en fase 4b van `TAKEN.md`).
|
||||
- **De zelfcontrole-widget is nieuw werk in de agent**, geen opmaak. Zie open punt 5: de agent zet een
|
||||
TLS-verbinding naar zijn eigen poort op en maakt de handdruk af. Dat bewijst luisteren, certificaat en
|
||||
doorverbinding in één keer.
|
||||
- **De zelfcontrole-widget is nieuw werk in de agent**, geen opmaak. Zie open punt 5. **Gebouwd in 0.0.16;
|
||||
de widget zelf hoort bij deze fase.** Wat er te tonen is, staat in `status.json` onder `tls.self_check`,
|
||||
met vier toestanden: `off` (geen certificaat gekozen, dus geen poort, en dat is geen storing), `ok`,
|
||||
`wrong-certificate` en `failed` met een reden.
|
||||
|
||||
**Bij het bouwen bleek de belofte hierboven te ruim**, en de widget moet niet meer beweren dan er
|
||||
gemeten wordt. Hier stond dat de controle luisteren, certificaat en doorverbinding in één keer bewijst.
|
||||
De eerste twee kloppen; de doorverbinding niet. Er wordt na de handdruk niets verstuurd, want een
|
||||
verzoek zou de sessie bytes geven en sessies met bytes worden nooit uit het activiteitenlog gefilterd.
|
||||
De backend wordt apart bevraagd, dus wat tussen wal en schip valt is alleen de `proxy_pass` zelf.
|
||||
|
||||
Evenmin gemeten: de weg van buiten naar binnen. De verbinding loopt van container naar container, dus
|
||||
een router die de poort niet meer doorstuurt leest hier als in orde. Een widget met de tekst "reachable"
|
||||
zou dus liegen; hij gaat over de voordeur en niet over de weg ernaartoe.
|
||||
|
||||
### 4b. Waarschuwen op een aflopend certificaat
|
||||
|
||||
|
||||
@@ -1,5 +1,29 @@
|
||||
# Voortgang - Webinterface
|
||||
|
||||
## 27-08-2026 - de app kijkt eindelijk naar zijn eigen voordeur, en meet minder dan beloofd
|
||||
|
||||
Open punt 5 is goedgekeurd en gebouwd in 0.0.16. De agent verbindt met de eigen TLS-poort, maakt de
|
||||
handdruk af en vergelijkt het getoonde certificaat byte voor byte met het gekozen bestand. Dat laatste
|
||||
bleek waardevoller dan de handdruk zelf: het vangt een certificaatwissel die nginx nooit heeft toegepast,
|
||||
en dat is precies het geval waar een controle op vertrouwen blind voor is.
|
||||
|
||||
**Twee dingen liepen anders dan het plan zei, en allebei zijn ze in de documentatie rechtgezet.** De
|
||||
belofte "bewijst luisteren, certificaat en doorverbinding in één keer" klopte voor twee van de drie: na de
|
||||
handdruk wordt er niets verstuurd. Een echt verzoek zou de sessie bytes geven, en sessies met bytes worden
|
||||
nooit uit het activiteitenlog gefilterd, want dat zou een storing kunnen verbergen.
|
||||
|
||||
En dat filteren was de tweede verrassing: elke meting is voor nginx een gewone sessie en levert dus een
|
||||
logregel op. Zonder rem en zonder filter ging het activiteitenlog over onszelf in plaats van over wallets.
|
||||
Er zit nu een rem op van vijf minuten, er wordt niet gemeten vlak na een herlading (dan staat het vorige
|
||||
certificaat er nog), en de eigen regels worden weggelaten op grond van het moment.
|
||||
|
||||
De widget zelf komt bij fase 6; tot die tijd is een wijziging zichtbaar als regel in het activiteitenlog.
|
||||
|
||||
**Geraakt:** `agent.py.template`, `docker-compose.yml`, `umbrel-app.yml` (0.0.16),
|
||||
`tests/test_agent_zelfcontrole.py` (nieuw), dit plan, de changelog (waar 0.0.15 nog ontbrak).
|
||||
**Tests:** 22 goed 0 fout nieuw, plus 54, 39 en 32 goed 0 fout bestaand. Alle vier de beslissende regels
|
||||
mutatie-getest.
|
||||
|
||||
## 20-08-2026 - scans zijn geen weigeringen, en meer lucht tussen de kaders
|
||||
|
||||
De gebruiker vroeg wat een logregel `refused ... status 500` met nul bytes betekende. Antwoord: een
|
||||
|
||||
@@ -231,11 +231,20 @@ deze indeling zelf oproept.
|
||||
**Volgorde: eerst de zelfcontrole, dan de opmaak.** Die eerste is het enige echte nieuwe werk en hij levert
|
||||
de vijfde widget; de rest is de pagina verbouwen om wat er dan staat.
|
||||
|
||||
- [ ] **De zelfcontrole bouwen (open punt 5, goedgekeurd 27-08-2026).** De agent zet een TLS-verbinding naar
|
||||
zijn eigen poort 50022 op en maakt de handdruk af. Dat bewijst luisteren, certificaat en
|
||||
doorverbinding in één keer. Raakt de agent, dus **mét test, en de test gaat over het niet-gelukkige
|
||||
pad**: geen certificaat, poort niet open, handdruk geweigerd. Wat de widget bij een mislukking toont,
|
||||
hoort bij het bouwen bedacht te worden en niet erna
|
||||
- [x] **De zelfcontrole gebouwd in 0.0.16 (27-08-2026).** De agent verbindt met poort 50022 van de
|
||||
nginx-container ernaast, maakt de handdruk af en vergelijkt het getoonde certificaat byte voor byte
|
||||
met het gekozen bestand. Die vergelijking is het punt: een herlading die niet aankwam ziet er van
|
||||
buiten goed uit. Vier toestanden in `status.json` onder `tls.self_check`: `off`, `ok`,
|
||||
`wrong-certificate`, `failed`. Bij een wijziging komt er een regel in het activiteitenlog
|
||||
|
||||
**Twee dingen die bij het bouwen anders liepen dan het plan zei.** Ten eerste bewijst de controle de
|
||||
doorverbinding naar de Electrum-server **niet**; zie §4a2 voor waarom dat een bewuste ruil is. Ten
|
||||
tweede bleek elke meting een sessieregel op te leveren, dus er zit nu een rem op (vijf minuten) en
|
||||
een filter die de eigen regels weglaat. Zonder die twee ging het activiteitenlog over onszelf
|
||||
|
||||
Getest in `tests/test_agent_zelfcontrole.py`, 22 toetsen, met de nadruk op de niet-gelukkige paden:
|
||||
geen certificaat, dichte poort, iets dat luistert maar geen TLS spreekt, en een ander certificaat aan
|
||||
de lijn. Alle vier de beslissende regels zijn mutatie-getest
|
||||
- [ ] Rij 1 wordt vijf gelijke widgets: Electrum-server, blokhoogte, reactietijd, certificaat, zelfcontrole
|
||||
- [ ] Een eigen raster van vijf kolommen voor die rij, en beslissen wat er tussen "vijf naast elkaar" en
|
||||
"gestapeld op mobiel" gebeurt. Vijf valt niet netjes in twaalf kolommen; dit is nieuw werk
|
||||
|
||||
Reference in New Issue
Block a user