{"id":"c1231","filename":"c1231_korak5_recovery_cuvari.dok.json","weise3_id":"","tip":"implementacija","naziv":"KORAK 5 — Recovery čuvari (Shamir threshold EU+NEW+MAR)","kreator":"CC + Ivan Brtan","datum":"2026-06-01","snippet":"","status":"","prev_weise3":"","bunker_l":"#00d4ff","full":{"tip":"implementacija","naziv":"KORAK 5 — Recovery čuvari (Shamir threshold EU+NEW+MAR)","sto_treba":"Kad korisnik izgubi uređaj, može vratiti identitet pomoću recovery_token-a i K-od-N Shamir čuvara na fizički odvojenim čvorovima.","verzija":"1.0","datum":"2026-06-01","autor":"CC + Ivan Brtan","zakon":["ZAKON 3","ZAKON 26"],"faze":[{"naziv":"Matematika i token logika","status":"DONE","opis":"Shamir GF(P=2^256-189), K=2 od 3 čuvara. recovery_token (64-hex) → SHA3-256 hash u DB. Lokalni test 49/49 prolazi."},{"naziv":"Servisi: recovery.py + genesis_recovery_api.py","status":"DONE","opis":"services/recovery.py: podijeli/rekonstruiraj, LocalCuvar (direktni DB, nema HTTP deadlocka), PraviCuvar (HTTP s X-Genesis-Key bypass). api/genesis_recovery.py: 4 endpointa (udio/daj/postavi/vrati)."},{"naziv":"Migracija DB na sva 3 čvora","status":"DONE","opis":"genesis_recovery_udjeli tablica. genesis_identitet +recovery_token_hash +recovery_salt. EU (ima entities, nema genesis_identitet) — migration handled gracefully."},{"naziv":"Registracija vraća recovery_token","status":"DONE","opis":"genesis_auth.py patched: kreira_recovery_set() + pohrani_recovery_meta() sinhrono, distribucija Shamir udjela u threading.Thread(daemon=True) pozadini. Registracija se ne blokira."},{"naziv":"SudacMiddleware — /recovery/ javni prefiksi","status":"DONE","opis":"Dodano '/api/v1/genesis/recovery/' u _JAVNI_PREFIKSI u sudac_middleware.py. Korisnik može pozvati /vrati bez API ključa. Node-to-node /udio i /daj autoriziraju se X-Genesis-Key headerom."},{"naziv":"E2e test: registracija → izgubljen uređaj → recovery","status":"DONE","opis":"Test prošao: A) registracija vrati recovery_token. B) /vrati skupi 2/2 čuvara (EU HTTPS + NEW LocalCuvar), rekonstruira Lagrange tajnu, upiše novi javni ključ. C) DB: novi ključ prisutan, stari obrisan."}],"arhitektura":{"cuvari":[{"naziv":"eu1","cvor":"EU","tip":"PraviCuvar","url":"https://genesis.limit-connect.com"},{"naziv":"new1","cvor":"NEW","tip":"LocalCuvar","url":"direktni DB (nema HTTP deadlocka)"},{"naziv":"mar1","cvor":"MAR","tip":"PraviCuvar","url":"http://212.227.181.201:8010 (IONOS firewall blokira — K=2 zadovoljen s EU+NEW)"}],"k_threshold":2,"n_cuvari":3,"polje":"GF(2^256-189)","napomene":["MAR port 8010 blokiran IONOS firewallom — nema vanjskog pristupa. System radi s EU+NEW = K=2.","psycopg2 aborted transaction fix: conn.rollback() između pokušaja u zdravlje_servisi.py","EU nema genesis_identitet tablicu (ima entities) — daj_udio_lokalno skip token verifikacije za guardian-only node","nastao kolona ispravljena u registriran (pravi naziv u genesis_identitet)"]},"datoteke":["/var/www/genesis/services/recovery.py","/var/www/genesis/api/genesis_recovery.py","/var/www/genesis/services/sudac_middleware.py","/var/www/genesis/api/genesis_auth.py"],"fenix_seal":"FENIX2026::KORAK5::recovery::cuvari::K2of3::EU+NEW+MAR::DONE"}}