SPIKE 4 — push z dešifriranjem v SW

Najpomembnejši spike (BRIEF v7, razdelek 13 / FAZA 0, razdelek 6): ali service worker na iOS ob pushu dešifrira payload in prikaže berljivo obvestilo — tudi pri popolnoma zaprti aplikaciji. Zaženi na obeh iPhonih (celoten tok lahko najprej preveriš v namiznem Chromu z nameščeno PWA). Rezultat prilepi v spike/REZULTATI.md; vsak neuspeh dokumentiraj z verzijo iOS.

Aplikacija ne teče kot PWA z domačega zaslona (display-mode ni standalone) — testi so ustavljeni.
Push na iOS deluje samo v nameščeni PWA (iOS 16.4+):
1. Odpri to stran v Safariju → tapni Deli (kvadrat s puščico) → Dodaj na začetni zaslonDodaj.
2. Aplikacijo odpri z ikone na začetnem zaslonu, ne iz Safarija.
Na namizju: v Chromu namesti aplikacijo (ikona za namestitev v naslovni vrstici) in jo odpri kot okno.
Nastavitve
Ta naprava je partner:

Ustvari AES-256-GCM ključ (extractable: false) in ga shrani v IndexedDB (baza mateleni-spike, shramba keys). Če ključ že obstaja, se obdrži.

Zahteva dovoljenje za obvestila, se naroči na push (VAPID ključ zgoraj) in naročnino pošlje na /api/subscribe → KV sub:<partner>.

Šifrira »Večerja z Ano · čez 1 uro« s ključem iz IndexedDB (AAD spike:s4, naključen 96-bitni IV) in pošlje prek /api/send-test. SW mora obvestilo dešifrirati — preveri, da obvestilo prikazuje berljivo besedilo, ne kode.

  1. Klikni gumb — strežnik bo push poslal čez 20 sekund.
  2. TAKOJ popolnoma zapri aplikacijo (pregled aplikacij → podrsaj navzgor).
  3. Obvestilo mora prispeti v ~25 s z berljivim besedilom »Večerja z Ano · čez 1 uro«.
  4. Odpri aplikacijo — dnevnik spodaj izpiše zadnje stanje SW. Razsodbo označi ročno zgoraj.
(e) Test po 48 h brez odpiranja
  1. Po opravljenem (a)–(d) aplikacije 48 ur ne odpiraj.
  2. Po 48 h odpri aplikacijo in klikni samo »(c) Pošlji šifriran push« — ne klikaj »Naroči se« (to bi naročnino obnovilo in test izničilo).
  3. Obvestilo prispe → naročnina še živi → PASS. Strežnik vrne napako »naročnina potekla (410)« ali obvestila ni → FAIL (zapiši v opombe, z verzijo iOS).

Enako kot (c), a z enim pokvarjenim bajtom šifropisa. GCM mora pasti — obvestilo mora biti generično »Mateleni · Opomnik«, nikoli surov payload.

PodtestIzid
(a) testni ključ v IndexedDB (non-extractable)
(b) naročnina + zapis v KV (/api/subscribe)
(c) šifriran push → SW dešifrira in prikaže
(d) push pri popolnoma zaprti aplikaciji (ročno)
(e) naročnina po 48 h brez odpiranja (ročno)
(f) pokvarjen ct → generično obvestilo
Skupni izid