#include "fiko/cekirdek/olay.hpp" #include #include #include namespace fiko { const char* olayTuruAdi(OlayTuru tur) { switch (tur) { case OlayTuru::VarlikEklendi: return "VarlikEklendi"; case OlayTuru::VarlikSilindi: return "VarlikSilindi"; case OlayTuru::DonusumDegisti: return "DonusumDegisti"; case OlayTuru::BrepDegisti: return "BrepDegisti"; case OlayTuru::GorunurlukDegisti: return "GorunurlukDegisti"; case OlayTuru::RenkDegisti: return "RenkDegisti"; case OlayTuru::SecimDegisti: return "SecimDegisti"; case OlayTuru::KipDegisti: return "KipDegisti"; case OlayTuru::DokumanAcildi: return "DokumanAcildi"; case OlayTuru::DokumanKaydedildi: return "DokumanKaydedildi"; case OlayTuru::VurguDegisti: return "VurguDegisti"; case OlayTuru::GorevBasladi: return "GorevBasladi"; case OlayTuru::GorevBitti: return "GorevBitti"; case OlayTuru::OlcumEklendi: return "OlcumEklendi"; case OlayTuru::OlcumSilindi: return "OlcumSilindi"; case OlayTuru::WorkbenchDegisti: return "WorkbenchDegisti"; case OlayTuru::SketchGirildi: return "SketchGirildi"; case OlayTuru::SketchCikildi: return "SketchCikildi"; case OlayTuru::ParametreDegisti: return "ParametreDegisti"; case OlayTuru::HesaplamaBitti: return "HesaplamaBitti"; case OlayTuru::SketchCozuldu: return "SketchCozuldu"; case OlayTuru::CamIslemEklendi: return "CamIslemEklendi"; case OlayTuru::CamIslemSilindi: return "CamIslemSilindi"; case OlayTuru::CamYoluHesaplandi: return "CamYoluHesaplandi"; case OlayTuru::CamOpEklendi: return "CamOpEklendi"; case OlayTuru::CamOpSilindi: return "CamOpSilindi"; case OlayTuru::CamParcaOpEklendi: return "CamParcaOpEklendi"; case OlayTuru::CamParcaOpSilindi: return "CamParcaOpSilindi"; case OlayTuru::FeatureEklendi: return "FeatureEklendi"; case OlayTuru::FeatureGuncellendi: return "FeatureGuncellendi"; case OlayTuru::FeatureSilindi: return "FeatureSilindi"; case OlayTuru::FeatureHesaplandi: return "FeatureHesaplandi"; case OlayTuru::TelEklendi: return "TelEklendi"; case OlayTuru::YuzeyEklendi: return "YuzeyEklendi"; case OlayTuru::CamSecimBasladi: return "CamSecimBasladi"; case OlayTuru::CamSecimBitti: return "CamSecimBitti"; case OlayTuru::CamSecimYapildi: return "CamSecimYapildi"; case OlayTuru::CamOpYoluHesaplandi: return "CamOpYoluHesaplandi"; case OlayTuru::AlanSecimYapildi: return "AlanSecimYapildi"; case OlayTuru::AptYazildi: return "AptYazildi"; case OlayTuru::RefSecimYapildi: return "RefSecimYapildi"; case OlayTuru::OlcumSecimYapildi: return "OlcumSecimYapildi"; case OlayTuru::AptOkundu: return "AptOkundu"; case OlayTuru::SketchSecimDegisti: return "SketchSecimDegisti"; case OlayTuru::AnalizEklendi: return "AnalizEklendi"; case OlayTuru::AnalizHesaplandi: return "AnalizHesaplandi"; case OlayTuru::AnalizBayatladi: return "AnalizBayatladi"; case OlayTuru::AnalizSilindi: return "AnalizSilindi"; case OlayTuru::KesitEklendi: return "KesitEklendi"; case OlayTuru::KesitDegisti: return "KesitDegisti"; case OlayTuru::AnalizSecimYapildi: return "AnalizSecimYapildi"; case OlayTuru::TemaDegisti: return "TemaDegisti"; case OlayTuru::FareJestiOldu: return "FareJestiOldu"; case OlayTuru::DokunmaJestiOldu: return "DokunmaJestiOldu"; case OlayTuru::HoverDegisti: return "HoverDegisti"; case OlayTuru::AracCubuguGorunurlukDegisti: return "AracCubuguGorunurlukDegisti"; case OlayTuru::AracCubuguDocklandi: return "AracCubuguDocklandi"; case OlayTuru::AracCubuguOzellestirildi: return "AracCubuguOzellestirildi"; case OlayTuru::DokumBasladi: return "DokumBasladi"; case OlayTuru::DokumBitti: return "DokumBitti"; case OlayTuru::DolumBasladi: return "DolumBasladi"; case OlayTuru::AyarDegisti: return "AyarDegisti"; case OlayTuru::DolumBitti: return "DolumBitti"; case OlayTuru::KomutCalisti: return "KomutCalisti"; case OlayTuru::BaglamCozuldu: return "BaglamCozuldu"; case OlayTuru::SurecKatildi: return "SurecKatildi"; case OlayTuru::SurecAyrildi: return "SurecAyrildi"; case OlayTuru::SurecDurumDegisti: return "SurecDurumDegisti"; case OlayTuru::SurecOlayAlindi: return "SurecOlayAlindi"; case OlayTuru::SurecKomutuAlindi: return "SurecKomutuAlindi"; case OlayTuru::DosyaAcildi: return "DosyaAcildi"; case OlayTuru::DosyaKaydedildi: return "DosyaKaydedildi"; case OlayTuru::DosyaHatasi: return "DosyaHatasi"; case OlayTuru::IceAktarildi: return "IceAktarildi"; case OlayTuru::DisaAktarildi: return "DisaAktarildi"; case OlayTuru::RenderHatasi: return "RenderHatasi"; case OlayTuru::GpuCihazKayboldu: return "GpuCihazKayboldu"; case OlayTuru::KareDustu: return "KareDustu"; case OlayTuru::IstisnaYakalandi: return "IstisnaYakalandi"; case OlayTuru::AssertBasarisiz: return "AssertBasarisiz"; case OlayTuru::PencereAcildi: return "PencereAcildi"; case OlayTuru::PencereKapandi: return "PencereKapandi"; case OlayTuru::PanelAcildi: return "PanelAcildi"; case OlayTuru::LisansYuklendi: return "LisansYuklendi"; case OlayTuru::LisansReddedildi: return "LisansReddedildi"; case OlayTuru::LisansUyarisi: return "LisansUyarisi"; case OlayTuru::LisansDegisti: return "LisansDegisti"; case OlayTuru::GuncellemeMevcut: return "GuncellemeMevcut"; case OlayTuru::GuncellemeIlerleme: return "GuncellemeIlerleme"; case OlayTuru::GuncellemeIndirildi: return "GuncellemeIndirildi"; case OlayTuru::GuncellemeHatasi: return "GuncellemeHatasi"; case OlayTuru::GuncellemeKuruldu: return "GuncellemeKuruldu"; case OlayTuru::HiyerarsiDegisti: return "HiyerarsiDegisti"; case OlayTuru::NavKipDegisti: return "NavKipDegisti"; case OlayTuru::GeriBildirimGonderildi: return "GeriBildirimGonderildi"; case OlayTuru::GeriBildirimHatasi: return "GeriBildirimHatasi"; case OlayTuru::PaftaGirildi: return "PaftaGirildi"; case OlayTuru::PaftaCikildi: return "PaftaCikildi"; case OlayTuru::PmiEklendi: return "PmiEklendi"; case OlayTuru::PmiDegisti: return "PmiDegisti"; case OlayTuru::PmiSilindi: return "PmiSilindi"; case OlayTuru::AracKipiGirildi: return "AracKipiGirildi"; case OlayTuru::AracKipiCikildi: return "AracKipiCikildi"; case OlayTuru::ZekaGrafGuncellendi: return "ZekaGrafGuncellendi"; case OlayTuru::NodeKatildi: return "NodeKatildi"; case OlayTuru::NodeAyrildi: return "NodeAyrildi"; case OlayTuru::NodeDurumDegisti: return "NodeDurumDegisti"; case OlayTuru::IsKayitDegisti: return "IsKayitDegisti"; case OlayTuru::IsKralBaglandi: return "IsKralBaglandi"; case OlayTuru::IsKralKoptu: return "IsKralKoptu"; case OlayTuru::Diger: return "Diger"; default: return "Bilinmeyen"; } } const char* olaySiddetAdi(OlaySiddet s) { switch (s) { case OlaySiddet::Iz: return "Iz"; case OlaySiddet::Bilgi: return "Bilgi"; case OlaySiddet::Uyari: return "Uyari"; case OlaySiddet::Hata: return "Hata"; case OlaySiddet::Kritik: return "Kritik"; default: return "Bilgi"; } } const char* olayKaynakAdi(OlayKaynak k) { switch (k) { case OlayKaynak::Sistem: return "Sistem"; case OlayKaynak::Kullanici: return "Kullanici"; case OlayKaynak::Makro: return "Makro"; case OlayKaynak::Plugin: return "Plugin"; case OlayKaynak::Ipc: return "Ipc"; case OlayKaynak::Ag: return "Ag"; default: return "Sistem"; } } namespace { // strncpy benzeri, hedef her zaman null-terminli. Tahsis yok. void kopyalaOzet(char* hedef, std::size_t boyut, const char* kaynak) { std::size_t i = 0; for (; i + 1 < boyut && kaynak[i] != '\0'; ++i) { hedef[i] = kaynak[i]; } hedef[i] = '\0'; } } // namespace OlayGunlugu::OlayGunlugu() { halka_.resize(KAPASITE); // önden ayır: yayın sıcak yolu tahsissiz. gorunum_.reserve(KAPASITE); // Varsayılan disk kalıcılığı: yüksek-frekanslı geçici olaylar hariç hepsi. kalici_.fill(true); kalici_[static_cast(OlayTuru::SecimDegisti)] = false; kalici_[static_cast(OlayTuru::SketchSecimDegisti)] = false; kalici_[static_cast(OlayTuru::VurguDegisti)] = false; kalici_[static_cast(OlayTuru::WorkbenchDegisti)] = false; kalici_[static_cast(OlayTuru::HesaplamaBitti)] = false; kalici_[static_cast(OlayTuru::SketchCozuldu)] = false; kalici_[static_cast(OlayTuru::FeatureHesaplandi)] = false; kalici_[static_cast(OlayTuru::AnalizHesaplandi)] = false; kalici_[static_cast(OlayTuru::KesitDegisti)] = false; kalici_[static_cast(OlayTuru::FareJestiOldu)] = false; // Dokunma jesti FareJestiOldu ile ayni sinifta: kullanici-hizinda ama sik → diske yazma. kalici_[static_cast(OlayTuru::DokunmaJestiOldu)] = false; kalici_[static_cast(OlayTuru::HoverDegisti)] = false; kalici_[static_cast(OlayTuru::BaglamCozuldu)] = false; // Forward edilen olaylar yüksek frekans + döngü guard'ı → diske yazılmaz. kalici_[static_cast(OlayTuru::SurecOlayAlindi)] = false; kalici_[static_cast(OlayTuru::Diger)] = false; // Platform servisleri Dalga 1: yüksek-frekans/gürültü türleri diske yazılmaz. kalici_[static_cast(OlayTuru::KareDustu)] = false; kalici_[static_cast(OlayTuru::LisansReddedildi)] = false; // sayaç LisansSistemi'nde kalici_[static_cast(OlayTuru::GuncellemeIlerleme)] = false; } bool OlayGunlugu::kalici(OlayTuru tur) const { const std::size_t idx = static_cast(tur); return idx < OLAY_TURU_SAYISI ? kalici_[idx] : false; } void OlayGunlugu::kaliciAyarla(OlayTuru tur, bool deger) { const std::size_t idx = static_cast(tur); if (idx < OLAY_TURU_SAYISI) kalici_[idx] = deger; } const OlayKaydi& OlayGunlugu::kayitYaz(OlayTuru tur, u32 varlik, const char* ozet, OlaySiddet siddet, OlayKaynak kaynak) { const std::size_t yer = (bas_ + adet_) % KAPASITE; OlayKaydi& k = halka_[yer]; k.sira = sonrakiSira_++; k.zaman = zaman_; k.tur = tur; k.varlik = varlik; k.siddet = siddet; k.kaynak = kaynak; k.korelasyon = korelasyonGuncel_; kopyalaOzet(k.ozet, sizeof(k.ozet), ozet ? ozet : olayTuruAdi(tur)); if (adet_ < KAPASITE) { ++adet_; } else { // Tampon dolu: en eskiyi ez, başı ilerlet. bas_ = (bas_ + 1) % KAPASITE; } gorunumKirli_ = true; // düz görünüm okunduğunda kurulacak (yayın O(1) kalır) return k; } void OlayGunlugu::filtreliVeOtomasyon(const OlayKaydi& k) { // Filtreli/çoklu-tür aboneler (denetim panelleri, makro gözlem). for (auto& a : filtreliAboneler_) { if (a.pred && a.fn && a.pred(k)) a.fn(k); } // Olay-güdümlü otomasyon (döngü guard'ı: sınırlı özyineleme derinliği). if (kurallar_.empty() || otomasyonDerinlik_ >= OTOMASYON_MAX_DERINLIK) return; ++otomasyonDerinlik_; // Aksiyon yeni kural ekleyebilir → indeksle gez (iterator invalidasyonu yok); // eşleşmeyi kopyala (aksiyon kuralı silebilir). const std::size_t n = kurallar_.size(); for (std::size_t i = 0; i < n && i < kurallar_.size(); ++i) { if (kurallar_[i].pred && kurallar_[i].aksiyon && kurallar_[i].pred(k)) { auto aksiyon = kurallar_[i].aksiyon; // kopya: aksiyon kuralı yıkarsa UB'siz aksiyon(); } } --otomasyonDerinlik_; } void OlayGunlugu::gorunumuGuncelle() const { if (!gorunumKirli_) return; gorunum_.clear(); for (std::size_t i = 0; i < adet_; ++i) { gorunum_.push_back(halka_[(bas_ + i) % KAPASITE]); } gorunumKirli_ = false; } const std::vector& OlayGunlugu::kayitlar() const { gorunumuGuncelle(); return gorunum_; } void OlayGunlugu::diskeYaz(std::string_view yol) { // Yazılacak yeni kayıt yoksa dosyayı hiç açma. if (sonYazilanSira_ >= sonrakiSira_) return; // string_view null-termine olmayabilir; güvenli kopya. std::string yolStr(yol); std::FILE* f = nullptr; if (fopen_s(&f, yolStr.c_str(), "a") != 0 || !f) { return; } // Halka tamponu kronolojik gez; yalnız sonYazilanSira_ ve sonrasındaki // (tampon ezmesiyle kaybolmamış) KALICI kayıtları append et. for (std::size_t i = 0; i < adet_; ++i) { const OlayKaydi& k = halka_[(bas_ + i) % KAPASITE]; if (k.sira < sonYazilanSira_) continue; // zaten yazılmış (veya ezilmiş boşluk) if (!kalici_[static_cast(k.tur)]) continue; // filtre: diske yazma if (k.siddet < diskEsigi_) continue; // şiddet eşiği altı: gürültü süz std::fprintf(f, "%llu\t%.6f\t%s\t%u\t%s\n", static_cast(k.sira), k.zaman, olayTuruAdi(k.tur), k.varlik, k.ozet); } std::fflush(f); std::fclose(f); sonYazilanSira_ = sonrakiSira_; // imleci ilerlet: sonrakiler yeni sayılır } // ---- Kalıcı audit trail (§B.4) — zincirli-hash tahrif direnci ---- // FNV-1a tabanlı; `onceki` başlangıç bazı → her satır önceki hash'e zincirlenir. u64 OlayGunlugu::auditKarma(u64 onceki, const char* satirGovde) { u64 h = onceki; for (const unsigned char* p = reinterpret_cast(satirGovde); *p; ++p) { h ^= static_cast(*p); h *= 1099511628211ull; } return h; } void OlayGunlugu::auditYaz(std::string_view yol) { if (sonAuditSira_ >= sonrakiSira_) return; std::string yolStr(yol); std::FILE* f = nullptr; if (fopen_s(&f, yolStr.c_str(), "a") != 0 || !f) return; char govde[256]; for (std::size_t i = 0; i < adet_; ++i) { const OlayKaydi& k = halka_[(bas_ + i) % KAPASITE]; if (k.sira < sonAuditSira_) continue; if (!kalici_[static_cast(k.tur)]) continue; // filtre if (k.siddet < diskEsigi_) continue; // şiddet eşiği std::snprintf(govde, sizeof(govde), "%llu\t%.6f\t%s\t%u\t%s\t%s", static_cast(k.sira), k.zaman, olayTuruAdi(k.tur), k.varlik, olaySiddetAdi(k.siddet), k.ozet); auditHash_ = auditKarma(auditHash_, govde); // zincir ilerlet std::fprintf(f, "%s\t%016llx\n", govde, static_cast(auditHash_)); } std::fflush(f); std::fclose(f); sonAuditSira_ = sonrakiSira_; } bool OlayGunlugu::auditDogrula(std::string_view yol) { const std::string yolStr(yol); std::ifstream in(yolStr); // not: (std::string(yol)) → vexing parse if (!in) return false; u64 h = AUDIT_HASH_BASLANGIC; std::string satir; char bekleyen[32]; while (std::getline(in, satir)) { if (satir.empty()) continue; const std::size_t p = satir.rfind('\t'); if (p == std::string::npos) return false; const std::string govde = satir.substr(0, p); const std::string kayitliHex = satir.substr(p + 1); h = auditKarma(h, govde.c_str()); std::snprintf(bekleyen, sizeof(bekleyen), "%016llx", static_cast(h)); if (kayitliHex != bekleyen) return false; // tahrif tespiti } return true; } } // namespace fiko