#pragma once // ── Uzak politika (kill-switch / izin listesi) ─────────────────────────────── // Satıcının İSTEDİĞİ AN uzaktan izin verip engelleyebilmesi için imzalı politika // dosyası. Lisans .fkl'den AYRI bir kanaldır: satıcı küçük bir metin dosyasını // herhangi bir statik sunucuya (web host / GitHub Pages / S3) koyar; uygulama // açılışta + periyodik olarak çeker, ECDSA P-256 imzasını doğrular ve önbelleğe // yazar. Önbellek de imzalı olduğu için elle düzenlenemez → makine çevrimdışı // olsa bile SON BİLİNEN karar geçerli kalır (kalıcı kill-switch). // // Biçim (lisans gövdesiyle aynı kurallar: anahtar=değer, # yorum, son satır imza): // // # FikoCAD Uzak Politika v1 // surum=3 ← her değişiklikte ARTTIR (geri sarma koruması) // zaman=1756100000 ← unix saniye (bilgi amaçlı) // mod=engelli ← "engelli" = listedekiler KAPALI (varsayılan) // ← "izin" = YALNIZ listedekiler AÇIK (beyaz liste) // engelle=FKC-2026-0001 ← seri no (mod=engelli iken anlamlı) // izin=FKC-2026-0010 ← seri no (mod=izin iken anlamlı) // mesaj=Ödeme gecikmesi ← engellenen kullanıcıya gösterilecek ileti (ops.) // imza= ← araç ekler; ELLE EKLEME // // Güvenlik modeli lisansla aynıdır: karar yetkisi tamamen imzadan gelir. URL'yi // değiştirmek bir şeye yaramaz — saldırgan bizim özel anahtarımızla imza atamaz. #include #include #include #include "fiko/core/temel.hpp" namespace fiko { enum class UzakMod : u8 { EngelliListesi = 0, // kara liste: listedeki seriler ENGELLİ, diğerleri serbest IzinListesi // beyaz liste: YALNIZ listedeki seriler geçerli }; struct UzakPolitika { u64 surum = 0; i64 zaman = 0; UzakMod mod = UzakMod::EngelliListesi; std::vector engelliler; std::vector izinliler; std::string mesaj; }; enum class UzakPolitikaDurum : u8 { Gecerli = 0, Bicim, ImzaGecersiz }; const char* uzakPolitikaDurumMetni(UzakPolitikaDurum d); // Metni ayrıştır + imzayı doğrula. Kanonikleştirme lisansla AYNI fonksiyondur // (lisansKanonikGovde): BOM/CRLF/yorum farkları imzayı bozmaz. // surum ve zaman zorunlu; en az bir engelle=/izin= satırı beklenmez (boş politika // da geçerlidir — "herkese açık" ilan etmek için kullanılabilir). UzakPolitikaDurum uzakPolitikaCoz(std::string_view metin, std::string_view acikAnahtarHex, UzakPolitika& out, std::string& hata); enum class UzakKarar : u8 { Izinli = 0, Engelli, Belirsiz }; const char* uzakKararMetni(UzakKarar k); // Seri için karar. p == nullptr veya seri boşsa Belirsiz (bilgi yok → fail-open; // hiç denetlenmemiş bir makineyi kilitlemek yanlış pozitif üretir). UzakKarar uzakPolitikaKarar(const UzakPolitika* p, const std::string& seri); // ── Canlı kanal karar mesajı (WebSocket) ───────────────────────────────────── // Satıcının panosundan TEK MAKİNEYE anında gönderilen karar. Biçim (düz JSON): // // {"tip":"karar","seri":"FKC-2026-0001","engelli":true, // "mesaj":"Ödeme gecikmesi","zaman":1756100000,"imza":""} // // İmza, şu KANONİK gövde üzerinedir (lisansKanonikGovde ile aynı kurallar — // alan SIRASI sabittir, imzalayan sunucu da aynı sırayı kurmalı): // // engelle=<1|0> // seri= // mesaj= // zaman= // // Böylece sahte WS sunucusu / MITM karar enjekte EDEMEZ: istemci gömülü açık // anahtarla imzayı doğrular (politika dosyasıyla aynı güven modeli). struct CanliKarar { std::string seri, mesaj; bool engelli = false; i64 zaman = 0; }; // JSON'u ayrıştır + imzayı doğrula. tip != "karar" → Bicim. UzakPolitikaDurum canliKararCoz(std::string_view json, std::string_view acikAnahtarHex, CanliKarar& out, std::string& hata); // Karardan imzalanan kanonik gövdeyi kur (istemci doğrulaması + sunucu/imza testi ortak). std::string canliKararKanonik(const CanliKarar& k); } // namespace fiko