# BenomDesk 1.1.0 — istemci değişiklikleri (AGPL-3.0 §5a) Bu dosya `araclar/kaynak-arsivi.ps1` tarafından **2026-10-02** tarihinde üretildi. Değişiklikler, değiştirilmemiş upstream tabana göre hesaplanmıştır: | | Temel | Paketteki durum | |---|---|---| | RustDesk istemcisi | `1.4.9` — `6c578292e8ebbbec708b76986ba8c4bc7c509747` | HEAD `0050869422795f9fe5f09e9502dad47a003ed861` | | `libs/hbb_common` alt modülü | `7e1c392c62d39c364127307cd408421dd5f8cfb0` | HEAD `bb43ebd1fa7cfe87a86a18745ba3dbce5801796b` | Değiştirilen kaynak dosyalarda değişiklik yerleri `BenomDesk:` ile başlayan yorumlarla işaretlidir. İzlenen dosyalardaki farkın tamamı `istemci-degisiklikleri.patch` dosyasındadır (`git apply` ile upstream tabana uygulanabilir; izlenmeyen yeni dosyalar ağaçta hazırdır, yamada yoktur). ## Elle tutulan liste (`ISTEMCI_DEGISIKLIKLERI.md`) # BenomDesk istemcisi — değişiklik kaydı Upstream: RustDesk 1.4.9 (`6c578292`). Her bölümü ilgili görev yazar. Rust bölümü rust-istemci görevine aittir; bu dosya ilk kez flutter-istemci görevi tarafından oluşturuldu. Upstream dosyalardaki her değişiklik kodda `BenomDesk:` yorumuyla işaretlidir. --- ## Derin bağlantı genişletmesi + kurucu metinleri + tr.rs (2026-10-02) — GÜNCEL Kullanıcı kararı: "Tarafları değiştir" ve çalışan uygulamaya `BenomDesk.exe --connect ` çalışmalı. `MIMARI_BAGIMSIZ.md` §1 derin bağlantı maddesi buna göre güncellendi. git commit yapılmadı. **Kural** (`kBenomDerinBaglantiSuzgeci`, eski `kBenomYalnizKimlikDerinBaglantisi`): `benomdesk://`, `connect/`, `file-transfer/` KABUL; `password=` / `--password` her zaman yok sayılır; `@sunucu`, `?key=`, `:port` RET; `switch_uuid` (UUID biçiminde) yalnız `connect/` yolunda (komut satırında `--connect` ile) geçer; `relay=true` ve `/r` → `--relay`; `config/`, `password/`, `play/`, `view-camera/`, `port-forward/`, `rdp/`, `terminal*/`, `connection/`, `baglan/`, `eslestir/` ve diğer tüm yollar RET (uyarı penceresi). Ayrılmış adlar ID olarak da kabul edilmez. `switch_uuid`'in kendisi Rust'ta ayrıca doğrulanır (`remove_pending_switch_sides_uuid`, 10 sn). | Dosya | Değişiklik | |---|---| | `flutter/lib/benom/benom_servis.dart` | `benomDerinBaglantiKimligi` yerine `benomDerinBaglantiCoz(Uri)` → `BenomBaglantiIstegi{komut, kimlik, relay, switchUuid}`; yeni `benomKomutArgumanlariniSuz(List)` (komut satırı için aynı kural; komut yoksa `[]`, kural dışıysa `null`); `kBenomTarafDegistirmeKapali` kaldırıldı | | `flutter/lib/common.dart` | `urlLinkToCmdArgs` yeni çözücüyü kullanır (mobilde dosya aktarımı/relay ile `connect`); `handleUriLink` tüm argümanları (soğuk açılış `kBootArgs` dahil) süzgeçten geçirir, `--switch_uuid` artık atılmaz, `--password` atılır | | `flutter/lib/common/widgets/toolbar.dart` | "Tarafları değiştir" menü öğesi geri açıldı (upstream koşulları) | | `flutter/lib/benom/benom_akis.dart` | Ret uyarısı metni yeni kurala göre | | `flutter/lib/desktop/pages/server_page.dart` | CM istek metni sabit "Bağlanmak istiyor…" yerine upstream `translate("Request access to your device")` (tr.rs düzeldi) | | `flutter/test/benom_derin_baglanti_test.dart` | 12 test: kabul (``, `connect/`, `file-transfer/`), switch_uuid, password/relay, @sunucu/key/port reddi, diğer yollar reddi, çözücü, komut satırı süzgeci, log maskesi, sabitler, `benom:durum` | | `src/lang/tr.rs` | Düzeltilen: `Disconnect` "Bağlantıyı kes", `Request access to your device` "Cihazınıza erişim isteği", `Continue` "Devam", `elevated_foreground_window_tip` çevrildi, `desk_tip` "Bu bilgisayara bu ID ve parolayla ya da sizin onayınızla bağlanılabilir.", `server-oss-not-support-tip`, `Website`, `Elevate` "Yükselt", `Accept sessions via password/click/both` ("…kabul etme" olumsuz okunuyordu), `Use one-time password`, `Please confirm if you want to share your desktop?`, `ID` "Kimlik" → "ID". Eklenen (Flutter'da kullanılan, sözlükte yok): `File Transfer`, `View Camera`, `End call`, `WOL`, `Token`, `ID already exists` | | `araclar/kurucu/benomdesk.iss` | `AppURL` (→ AppPublisherURL/AppSupportURL) `https://benomdesk.benomcore.com`; UTF-8 BOM korundu | | `araclar/kurucu/kurulum-bilgi.txt` | Bağımsız modele göre yeniden yazıldı (ID + Kabul/şifre, katılımsız için kalıcı şifre, kaynak `https://benomdesk.benomcore.com/kaynak/`, AGPL notu); BOM korundu | **Doğrulama (2026-10-02):** `dart analyze` (değişen 6 Dart dosyası) → 0 hata, 1 uyarı (`common.dart` kullanılmayan `dart:math`, önceden vardı), 22 bilgi (upstream deprecated vb.); `flutter test test/benom_derin_baglanti_test.dart` → 12/12; `cargo check --release --lib --features hwcodec,vram,flutter` → çıkış 0 (2 eski `unused import` uyarısı). ÇALIŞTIRILMADI: iki makineyle "Tarafları değiştir" uçtan uca, çalışan örneğe `BenomDesk.exe --connect ` denemesi, `flutter build windows` / ISCC derlemesi. --- ## Bağımsız sürüm — Flutter (flutter-bagimsiz, 2026-10-02) — GÜNCEL Sözleşme: `MIMARI_BAGIMSIZ.md` §1 (BAĞLAYICI). Aşağıdaki "Flutter/marka" bölümünün BenomCore'a bağlı kısımları (panel, eşleştirme, bilet, destek iste, `benomdesk://baglan|eslestir`, "BenomCore yetkisiyle doğrulandı", parola politikası kartı, elle ID kutusunun gizlenmesi) **tarihçedir**. Rust (`src/`, `libs/`) dosyalarına dokunulmadı; köprü (`generated_bridge.dart`) değişmedi. git commit yapılmadı. Geri dönüş: git etiketi `benomcore-entegre-son`. ### Kaldırılanlar | Yer | Ne | |---|---| | `lib/benom/benom_panel.dart` | **SİLİNDİ**: `BenomCorePaneli`, `BenomBaglantiPolitikasi`, `BenomGidenBaglantiBilgisi`, `kBenomParolaPolitikasi` | | `lib/benom/benom_akis.dart` | Bağlan / eşleştir / destek iste akışları, eşleştirme diyaloğu, kod biçimleyici, 115 sn bilet yeniden denemesi | | `lib/benom/benom_servis.dart` | `eslestir` / `destekIste` / `baglan` FFI çağrıları, bilet/kod biçimi ve maskesi, eşleşme/nabız/firma alanları, BenomCore hata kodları, `kBenomYalnizBiletliBaglanti`, `kBenomElleBaglantiGizli`, `kBenomKimlikIpucu`, `benomUriKomutlari` | | `lib/common.dart` | `handleUriLink`: `--benom-baglan` / `--benom-eslestir` ve "biletsiz bağlantı reddi" | | `lib/desktop/pages/desktop_home_page.dart` | Sağ ve sol bölmedeki BenomCore paneli, parola kartı yerine politika metni, `desk_tip` yerine BenomCore metni (upstream'e döndü) | | `lib/desktop/pages/connection_page.dart` | Elle ID kutusu / son oturumlar yerine "biletli bağlantı" bilgisi (upstream'e döndü) | | `lib/desktop/pages/server_page.dart` (CM) | "BenomCore yetkisiyle doğrulandı" rozeti, açıklama satırı, Kabul düğmesinin her kipte gösterilmesi | | `lib/models/server_model.dart` | `Client.benomAciklama` (dosya upstream 1.4.9 ile birebir aynı) | | `lib/desktop/pages/desktop_setting_page.dart` | Güvenlik'te "Bağlantı onayı" politika kartı; Ağ'da "API sunucusu" satırı ve "BenomCore tarafından yönetilir" metni | ### Upstream'e dönen davranış - **Ana sayfa**: sol bölmede kendi ID kartı + geçici şifre kartı (`buildPasswordBoard`: yenile, kalıcı şifre düğmesi) ve upstream `desk_tip`; sağ bölmede upstream `ConnectionPage` (uzak ID kutusu + Bağlan, son oturumlar / sık kullanılanlar / keşfedilenler) ve alt durum satırı. Adres defteri / grup sekmeleri ve hesap girişi `kBenomHesapKapali` ile gizli kalır. - **Ayarlar › Güvenlik**: upstream "Parola" kartı (onay kipi: şifre / tıkla / ikisi; doğrulama yöntemi: tek seferlik / kalıcı / ikisi; tek seferlik şifre uzunluğu, sayısal tek seferlik şifre, "Kalıcı şifre belirle") ve 2FA kartı geri geldi. Kilitli değiller (Rust `approve-mode` / `verification-method` kilitlerini kaldırdı). "Doğrudan IP erişimi" gizli kalır (`direct-server=N` kilitli). - **CM**: Kabul düğmesi `approve-mode == 'password'` iken gizli (upstream). Etiketler Türkçe kaldı: "Kabul et", "Reddet", "Sonlandır"; istek metni "Bağlanmak istiyor…" (tr.rs'deki "Cihazınıza erişim talep edin" ters okunduğu için; yalnız metin). Karşı tarafın http(s) avatarı indirilmez, yalnız `data:image/` (korundu). ### Yeni / değişen | Dosya | İçerik | |---|---| | `lib/benom/benom_servis.dart` | Yeniden yazıldı. `BenomServis.durum()` / `profilYenile()` (yalnız `benom:durum`, `benom:profil-yenile`); `BenomDurum` yeni şekil: `istemci_surum`, `taban`, `surum_kimligi`, `kaynak_kodu_adresi`, `indirme_adresi`, `profil{surum, donem, kanal, id_sunucu, relay_sunucu, imzalayan, kaynak, sertifika_bitis}`, `rendezvous_kayitli` (`profilMetni`, `profilKaynakMetni`, `surumMetni`); `benomDerinBaglantiKimligi(Uri)`; log maskesi artık URI sorgusunu (`?password=…` → `?…`) ve `--password` değerini gizler; `BenomDurumEsitleyici` (aşağıda); sabitler `kBenomYalnizKimlikDerinBaglantisi`, `kBenomTarafDegistirmeKapali`, `kBenomUriSemasi`; korunanlar: `kBenomHesapKapali`, `kBenomGuncellemeKapali`, `kBenomSunucuAyariKilitli`, `kBenomGuvensizDevamKapali`, `benomDisBaglantiEngelli`, `benomVarsayilanDiliUygula` | | `lib/benom/benom_akis.dart` | Küçüldü: `benomDerinBaglantiReddet()` (desteklenmeyen derin bağlantı uyarısı), `benomProfilYenile()` (bildirim) | | `lib/common.dart` | `urlLinkToCmdArgs`: yalnız `benomdesk://` → `['--connect', ID]` (mobilde doğrudan `connect`); boş `benomdesk://` upstream gibi ana pencereyi açar; diğer her şey `null` + uyarı. `handleUriLink`: `--password` ve `--switch_uuid` dışarıdan alınmaz (şifre bağlantı penceresinde sorulur). Log satırları `benomLogIcinMaskele` ile | | `lib/common/widgets/toolbar.dart` | "Tarafları değiştir" gizli (`kBenomTarafDegistirmeKapali`): karşı taraf `--connect --switch_uuid` çalıştırır, Rust bunu `benomdesk://connect/…` yapar ve bu yol artık reddedilir; düğme kalsaydı oturum kapanıp geri bağlanmazdı | | `lib/desktop/pages/desktop_home_page.dart` | `BenomDurumEsitleyici.baslat()` (initState) / `durdur()` (dispose): `benom:durum` açılışta ve 60 sn'de bir; Rust bu çağrıda arayüz sürecinin ID/relay/anahtarını hizmetteki imzalı profille eşitler (kurulu Windows'ta profil yalnız hizmet sürecindedir; eski panel bunu 10 sn'de bir dolaylı yapıyordu) | | `lib/desktop/pages/desktop_setting_page.dart` | Ağ › "Sunucu" kartı: "Sunucu ayarları BenomDesk tarafından yönetilir.", ID sunucusu, relay sunucusu, sunucu anahtarı, sunucu profili (sürüm · kanal · imzalı/gömülü/yedek), varsa sertifika bitişi, **"Profili şimdi yenile"** (`benom:profil-yenile`). ID/Relay düzenleme ve güvensiz TLS anahtarı gizli kalır | | `lib/benom/benom_lisans.dart` | Hakkında › "Lisans ve Kaynak Kodu": "Sürüm 1.1.0 · RustDesk 1.4.9 tabanlı · Derleme …" (`mainGetVersion` artık ürün sürümü diye gösterilmez; taban olarak kullanılır), kaynak sürüm kimliği, **Sunucu profili** bölümü (profil, ID/relay sunucusu, imzalayan), indirme sayfası bağlantısı, kaynak kodu + değişiklik listesi bağlantıları, AGPL metni, atıf | | `lib/main.dart`, `lib/models/model.dart` | Yalnız yorumlar | | `test/benom_derin_baglanti_test.dart` | Yeniden yazıldı (8 test): `` kabulü (sayısal, özel kimlik, büyük harf şema), parametrelerin yok sayılması (`password`, `key`, `relay`, `switch_uuid`, `@sunucu[:port]`, `/r`, `/r@sunucu`, `#parça`), boş bağlantı, 24 ret örneği (`connect/`, `play/`, `file-transfer/`, `view-camera/`, `port-forward/`, `rdp/`, `terminal[-admin]/`, `connection/new/`, `config[/…]`, `password/`, `baglan/`, `eslestir[/…]`, alt yol, port, `ID:şifre@`, kısa ID, nokta içeren ad, başka şemalar), maskeleme, sabitler, `benom:durum` çözümü | **Derin bağlantı kuralı** (`benomDerinBaglantiKimligi`): şema `benomdesk`; kimlik = `userInfo` varsa o (sunucu kısmı atılır), yoksa `host` (port varsa ret); yol yalnız ``, `/`, `/r`, `/r@…`; ayrılmış adlar (`connect`, `play`, `file-transfer`, `view-camera`, `port-forward`, `rdp`, `terminal`, `terminal-admin`, `connection`, `config`, `password`, `baglan`, `eslestir`) ret; kimlik deseni `^(?:[0-9]{6,16}|[A-Za-z][A-Za-z0-9_-]{5,15})$` (hbb_common `is_valid_custom_id` ile uyumlu). Dart `Uri` host'u küçük harfe çevirir (upstream'de de böyle). **Değişiklik listesi adresi (varsayım):** `benom:durum` `degisiklikler_adresi` vermediğinden `BenomDesk--ISTEMCI_DEGISIKLIKLERI.md` kullanılır (`araclar/site-yayinla.ps1` bu adı yalnız kaynak arşivinde dosya varsa yayımlar). ### Önceki bölümden geçerliliğini koruyanlar Hesap / adres defteri / grup / oturum notu / audit gizleme (`kBenomHesapKapali`), güncelleme denetimi ve kartı kapalı, rustdesk.com / GitHub bağlantı süzgeci, boş `loadPowered`, güvensiz bağlantıya "devam" yok (`kBenomGuvensizDevamKapali`), ilk açılış dili `tr`, kurulum sayfasında lisans diyaloğu, sekme başlığı `BenomDesk`, `Runner.rc` / `main.cpp`, marka varlıkları, `assets/LICENCE.txt`. ### Doğrulama (2026-10-02, Flutter 3.24.5 / Dart 3.5) - `dart analyze lib test/benom_derin_baglanti_test.dart` → **0 hata**; 4 uyarı (hepsi değişiklik öncesinde de vardı ve upstream dosyalarında: `common.dart` kullanılmayan `dart:math`, `terminal_page.dart`, `web_model.dart`, `web/common.dart`). Bilgi düzeyi bulgular satır numarası dışında değişiklik öncesiyle **birebir aynı küme** (241). - `flutter test test/benom_derin_baglanti_test.dart` → **8/8 geçti**. - ÇALIŞTIRILMADI: `flutter build windows` / `istemci-derle.ps1`, arayüzün görsel denemesi, iki makineyle uçtan uca bağlantı (tıkla-kabul, geçici şifre, kalıcı şifre), canlı profil çekimi. ### Açık / ürün kararı bekleyen - **KAPANDI (2026-10-02, yukarıdaki "Derin bağlantı genişletmesi"):** `connect/` yolunun reddi iki upstream davranışı da kapatır: (1) **"Tarafları değiştir"** (düğme gizlendi), (2) çalışan uygulamaya komut satırından `BenomDesk.exe --connect ` (Rust `core_main_invoke_new_connection` bunu `benomdesk://connect/` yapar) — uyarı penceresi açılır. İstenirse: Rust bu çeviriyi `benomdesk://` biçimine getirebilir ya da Dart yalnız `connect/?switch_uuid=` biçimini kabul edebilir (MIMARI_BAGIMSIZ'de değişiklik ister). - **KAPANDI (2026-10-02):** tr.rs çeviri kusurları ("Disconnect" → "Bağlanıyı kes", "Request access to your device" → "Cihazınıza erişim talep edin") Rust alanında; CM'de Dart metniyle aşıldı. - Mobil sayfalar (`lib/mobile/**`) bu görevde de dokunulmadı. --- ## Flutter/marka (flutter-istemci, 2026-09-30) — KISMEN TARİHÇE (BenomCore entegre; güncel: yukarıdaki "Bağımsız sürüm — Flutter") Sözleşme: `MIMARI.md` §8, §11 + `MIMARI_EK_TUR2.md` (D4). Rust dosyalarına (`src/`, `libs/`) dokunulmadı. git commit yapılmadı. ### Yeni dosyalar (`flutter/lib/benom/`) | Dosya | İçerik | |---|---| | `benom_servis.dart` | `bind.mainGetCommon(key:'benom:…')` sarmalayıcısı (`BenomServis.durum/eslestir/destekIste/baglan/profilYenile`), `BenomDurum` modeli, Türkçe hata eşlemesi (`benomHataMetni`), maskeleme (`benomMaskele`, `benomLogIcinMaskele`, `benomArgumanlariMaskele`), URI çözümü (`benomUriKomutlari`), kod biçimi (`benomKoduDuzenle`, `XXXX-XXXX`), dış bağlantı filtresi (`benomDisBaglantiEngelli`: rustdesk.com, github.com/rustdesk), ilk açılış dili (`benomVarsayilanDiliUygula`), politika sabitleri (`kBenomHesapKapali`, `kBenomGuncellemeKapali`, `kBenomSunucuAyariKilitli`, `kBenomYalnizBiletliBaglanti`) | | `benom_akis.dart` | `benomBaglantiBaslat(bilet)`: eşleşmemişse eşleştirme ekranı açılır, eşleşince bilet 115 sn içindeyse yeniden denenir. Başarıda `connectMainDesktop(baglanti_kimligi, isFileTransfer: tur=='dosya')`, hatada Türkçe diyalog gösterilir. Ayrıca: `benomEslestirmeUri` / `benomEslestirDialog` (kod önceden dolu onay), `benomDestekIsteDialog`, `benomProfilYenile`, `benomDogrudanBaglantiReddet`, `BenomKodBicimleyici` | | `benom_panel.dart` | Ana sayfadaki `BenomCorePaneli`. Rozetler: Eşleşti/Eşleşmedi, Çevrimiçi/Çevrimdışı, Pilot. Alanlar: firma ya da sahiplik, cihaz adı, atanan kullanıcı, katılımsız, profil (sürüm·kanal·ID sunucusu), son nabız, son hata. Düğmeler: Bu bilgisayarı eşleştir, Destek iste, Profili yenile, Lisans ve Kaynak Kodu. 10 sn'de bir ve işlem sonrası hemen yenilenir. Ayrıca `BenomBaglantiPolitikasi` ve `kBenomParolaPolitikasi` burada | | `benom_lisans.dart` | `BenomLisansIcerigi` ve `benomLisansDialogGoster`. İçerik: sürüm, derleme tarihi, `surum_kimligi`; telif satırı (Purslane Tech Pte. Ltd. + Benom Yazılım); AGPL-3.0 beyanı ve garanti reddi; "RustDesk açık kaynak projesine dayanır, RustDesk tarafından onaylanmamıştır" atfı (düz metin); `kaynak_kodu_adresi` ve değişiklik listesi bağlantısı; gömülü tam lisans metni; `showLicensePage` (üçüncü taraf lisansları) | Yeni varlık: `flutter/assets/LICENCE.txt` (kök `LICENCE` ile birebir aynı) ve `flutter/assets/icon.png`. Simgeler için bkz. `MARKA_VARLIKLARI.md`. ### Değiştirilen upstream dosyaları | Dosya | Değişiklik | |---|---| | `lib/common.dart` | `handleUriLink`: `--benom-baglan`/`--benom-eslestir` → Benom akışları. D4.3: biletsiz doğrudan bağlantı (`--connect`… ya da `benomdesk://`) reddedilir + açıklama. `urlLinkToCmdArgs`: önce `baglan/`, `eslestir/`; diğer tüm yollar (`[@sunucu]`, `connect/`, `config/`, `password/`) yok sayılır. `initUniLinks`/`listenUniLinks` logları maskeli. `msgBox` içinde RustDesk bağlantıları tıklanamaz, JumpLink düğmesi gizli. `loadPowered` boş. `checkUpdate` no-op | | `lib/main.dart` | Açılış argümanı logu maskeli; `initEnv` → `benomVarsayilanDiliUygula()` | | `lib/desktop/pages/desktop_home_page.dart` | Sağ bölmede `BenomCorePaneli` + `ConnectionPage`. Yalnız gelen modunda panel sol bölmede. Parola kartı yerine politika metni. Güncelleme kartı kaldırıldı. RustDesk "Help" bağlantıları gizli | | `lib/desktop/pages/desktop_setting_page.dart` | Hesap sekmesi, güncelleme denetimi / otomatik güncelleme ve oturum notu seçenekleri gizlendi. Güvenlik sekmesinde parola, tek kullanımlık parola ve 2FA kartları yerine "Bağlantı onayı" açıklaması var; doğrudan IP erişimi gizli. Ağ sekmesinde salt okunur "Sunucu" kartı (`_BenomSunucuBilgisi`: ID/relay/API/anahtar/profil, "Sunucu ayarları BenomCore tarafından yönetilir."), ID/Relay düzenleme ve "güvensiz TLS geri dönüşü" gizli. Hakkında → "Lisans ve Kaynak Kodu" | | `lib/desktop/pages/server_page.dart` (CM) | "BenomCore yetkisiyle doğrulandı" rozeti; isteğe bağlı açıklama satırı; Kabul düğmesi her zaman görünür (parola kipi yok), metinleri `Kabul et` / `Reddet`; aktif oturumda `Sonlandır`. Karşı tarafın http(s) avatarı indirilmez, yalnız `data:image/` kabul edilir (09 §4.4) | | `lib/models/server_model.dart` | `Client.benomAciklama` ← JSON `benom_aciklama` (isteğe bağlı) | | `lib/desktop/pages/connection_page.dart` | "Kendi sunucunu kur" (rustdesk.com/pricing) yönlendirmesi gizli | | `lib/desktop/pages/install_page.dart` | rustdesk.com gizlilik bağlantısı yerine "Lisans ve Kaynak Kodu (AGPL-3.0)" diyaloğu | | `lib/desktop/widgets/tabbar_widget.dart` | Başlık `BenomDesk` | | `lib/models/peer_tab_model.dart`, `ab_model.dart`, `group_model.dart`, `user_model.dart`, `model.dart`, `common/widgets/toolbar.dart` | `kBenomHesapKapali`: adres defteri ve grup sekmeleri, `/api/currentUser`, Pro audit sorgusu ve oturum notu kapalı. Wayland GitHub bağlantısı gizli | | `windows/runner/Runner.rc` | CompanyName "Benom Yazılım", ProductName "BenomDesk", FileDescription "BenomDesk Uzak Masaüstü", OriginalFilename "BenomDesk.exe", LegalCopyright "© Purslane Tech Pte. Ltd. (RustDesk) · Benom Yazılım değişiklikleri — AGPL-3.0"; StringFileInfo bloğu Unicode (`040904b0`, 1200) | | `windows/runner/main.cpp` | Varsayılan ad `BenomDesk`; pencere adları "- Bağlantı Yöneticisi" / "- Kurulum" (ana pencere başlığı = APP_NAME, URI dağıtımı buna bağlı) | | `windows/runner/resources/app_icon.ico`, `res/*`, mobil/macOS simgeleri | Benom marka varlıkları (`MARKA_VARLIKLARI.md`) | | `flutter/pubspec.lock` | `flutter pub get` (Flutter 3.24.5) SDK'ya bağlı 16 paketi yeniden çözdü (`flutter_test` geçişli bağımlılıkları). Elle değişiklik yok | ### Rust tarafına bağımlılıklar / sözleşme varsayımları 1. **FFI** (`main_get_common`): `benom:durum`, `benom:eslestir:` (kod büyük harf, tireli gönderilir), `benom:destek-iste:{"aciklama":…}`, `benom:baglan:`, `benom:profil-yenile`. Boş yanıt "desteklenmiyor" sayılır. 2. **Varsayılan kabuller** (Rust aynı şekilde doldurmalı ya da bildirmeli): - `cevrimici.son_nabiz`: unix sn, unix ms ya da ISO-8601 olabilir; üçü de kabul edilir. - Eşleşmemiş cihazda `benom:baglan` hata kodu `eslesmemis` (ayrıca `eslesme_yok`, `cihaz_eslesmemis`) olmalı; bu kod eşleştirme ekranını açar. - İsteğe bağlı `degisiklikler_adresi`. Yoksa `kaynak_kodu_adresi + "/DEGISIKLIKLER.md"` kullanılır. - CM istemci JSON'unda isteğe bağlı `benom_aciklama`: arka ucun `aciklama` metni; doluysa CM'de görünür. 3. **URI/CLI**: Soğuk açılışta `--benom-baglan ` / `--benom-eslestir ` doğrudan argüman olarak, çalışan uygulamaya ise `benomdesk://baglan/` / `benomdesk://eslestir/` olarak gelmeli. `handleUriLink` URI'yi `bind.mainUriPrefixSync()` ile tanır, bu yüzden APP_NAME="BenomDesk" şart. 4. **Dil**: Flutter ilk açılışta `lang=tr` yazar. Pencere açılmadan çalışan süreçler için Rust varsayılanı gerekir (bkz. `CEVIRI_EKSIKLERI.md`). 5. **Pencere adları**: Dart `getWindowName()` → `mainGetAppNameSync()`. APP_NAME Rust'tan gelir. ### Raporlanan, UYGULANMAYAN - **"Güvenli olmayan bağlantıya devam et"**: `lib/common.dart:1197-1236`, `msgBox` → `insecure-connection` diyaloğundaki **Continue** düğmesi (`continue-insecure-connection = Y`). Benom politikasında (fail-closed, anahtar uyuşmazlığında devam yok) bu düğme kaldırılmalı, yalnız "Bağlantıyı kes" kalmalı. Asıl kapı Rust'ta: `src/client.rs` `insecure-connection-nocancel-hasclose` mesaj kutusu ve `src/flutter_ffi.rs` `continue-insecure-connection` işleyicisi (analiz 02 §0-7). Görev "raporla" dediği için Dart'ta değiştirilmedi. Onay gelirse tek satırlık değişiklik. - `lib/desktop/pages/connection_page.dart`: elle ID girip bağlanma kutusu ve son oturumlar listesi duruyor. Kontrol edilen taraf biletsiz bağlantıyı zaten reddediyor (K3). Kutunun gizlenip gizlenmeyeceği ürün kararı. - Mobil sayfalar (`lib/mobile/**`: rustdesk.com bağlantıları, "About RustDesk", hesap girişi) Faz 2 kapsamında, dokunulmadı. - `flutter/windows/CMakeLists.txt` `BINARY_NAME "rustdesk"` korundu. `build.py` buna bağlı; derleme sonrası `BenomDesk.exe` olarak yeniden adlandırılacak (analiz 04 §2.2). ### Doğrulama - `flutter pub get` (Flutter 3.24.5, `PUB_CACHE=D:/dev/benomdesk-arac/pub-cache`): çıkış 0. - `dart analyze lib`: 13 hata var. 12'si `generated_bridge.dart` eksikliğinden (`model.dart`, `native_model.dart`, `platform_model.dart`). 1'i aynı nedenle dokunulmamış `file_manager_page.dart:1372` (`bind` türü çözülemeyince int/double çıkarımı). `lib/benom/**` ve değiştirilen dosyalarda yeni hata/uyarı yok. `common.dart` `dart:math` kullanılmayan import uyarısı upstream'de de var. - ⚠ `bind` türü köprü dosyası olmadan çözülmediği için `bind.*` çağrılarının imzaları derleyiciyle doğrulanamadı; `src/flutter_ffi.rs`'ten elle karşılaştırıldı (`main_get_common` → `Future`, `main_get_local_option` → senkron `String`, `main_set_local_option` → `Future`). - Derleme ve çalıştırma yapılmadı: Runner.rc/main.cpp derlenmedi, arayüz görsel olarak denenmedi. --- ## Rust — bağımsız mimari (rust-bagimsiz, 2026-10-02) — GÜNCEL Sözleşme: `MIMARI_BAGIMSIZ.md` §1 (BAĞLAYICI). Aşağıdaki "Rust çekirdeği", "Tur 2", "Güvenlik turu A/B/C" bölümlerinin BenomCore'a bağlı kısımları (bilet, kapı A/B, eşleştirme, nabız, olay, oturum yaşam döngüsü, giriş kanıtı, doğrulama yanıtı) **geçersizdir / tarihçedir**; profil zarf/imza/dönem/adres kuralları aynen geçerlidir. Geri dönüş: git etiketi `benomcore-entegre-son` (istemci + `libs/hbb_common`). Flutter/Dart'a dokunulmadı. git commit yapılmadı. **Bağlantı modeli = upstream RustDesk:** gelen bağlantıda Benom kapısı yok; `approve-mode` (varsayılan boş = tıkla-kabul ya da şifre), `verification-method`, geçici şifre, kalıcı şifre (katılımsız), CM kabul/ret ve CM izin anahtarları upstream gibi çalışır ve KİLİTLİ DEĞİLDİR. `LoginRequest.benom` (proto 1001) ve `BenomYetki` mesajı tel uyumu için durur; istemci yazmaz/okumaz. ### `src/benom/` (12 → 4 dosya) | Dosya | İçerik | |---|---| | `mod.rs` | Rendezvous kayıt izlemesi (`kayit_yaniti`, `rendezvous_kayitli`, `kayit_alindi_mi`); sunucu süreci profil döngüsü (açılış + 30 dk, hatada 5 dk; kural 7 denetimi 5 sn); IPC `benom:durum` / `benom:profil-yenile`; FFI `ffi_komutu` (yalnız bu iki komut, diğerleri `bilinmeyen_komut`); arayüz OVERWRITE eşitlemesi | | `ayar.rs` | Kökler (kok-1, kok-2), `BENOMDESK_SURUM = "1.1.0"`, `YAPILANDIRMA_ADRESLERI = ["https://benomdesk.benomcore.com/profil.json"]` (app.benomcore.com adresleri kaldırıldı), yedek sunucular `benomdesk.benomcore.com:21116/21117` + `m096RR…`, `KAYNAK_KODU_ADRESI` / `INDIRME_ADRESI`, `GOMULU_BASLANGIC_PROFILI = include_str!("../../res/benomdesk_baslangic_profili.json")`, `dosya_yaz`, kilitler; `api-server` OVERWRITE'ta hep BOŞ | | `imza.rs` | Yalnız doğrulama: base64 çözme, RFC 3339, P-256 DER doğrulama, zarf + sertifika zinciri, profil yükü (host:port, 32 baytlık anahtar, kanal, dönem, sürüm, üç durumlu adres alanları), `(dönem, sürüm)` kilidi. KALDIRILDI: istek imzası, giriş kanıtı, doğrulama yanıtı (D2/D8), `sha256_hex`, `nonce_uret`. Anahtar üretme / imzalama / base64 kodlama yalnız `#[cfg(test)]` | | `profil.rs` | Kaynak sırası (a) yapılandırma adresleri → (b) yerel son profil (`benom_profil.json` / `_onceki`) → (c) gömülü başlangıç profili (yalnız bellekte; biçimi `benomdesk-imzali/1` değilse — yer tutucu — log + yok sayılır); kural 1-8, D-C taban dönem, adres katmanı (yalnız `yapilandirma_adresleri`; `api_adresi` doğrulanır ama kullanılmaz), 5 dk kayıt olamazsa önceki profile dönüş (gömülü profil yürürlükteyken önceki = gömülü), HTTP GET (yalnız https, rustls → native-tls, 10 sn, ≤256 KB); `sunucu_izinli_mi` (`ID@sunucu` = etkin / yürürlükteki / önceki imzalı profilin ID sunucusu); `ozet()` | | SİLİNDİ | `api.rs`, `bilet.rs`, `destek.rs`, `eslestirme.rs`, `kimlik.rs`, `nabiz.rs`, `olay.rs`, `oturum.rs` (testleriyle) | FFI `benom:durum` → `{istemci_surum, taban, surum_kimligi, kaynak_kodu_adresi, indirme_adresi, profil:{surum, donem, kanal, id_sunucu, relay_sunucu, imzalayan, kaynak, sertifika_bitis?}, rendezvous_kayitli}`; `profil.kaynak` ∈ `imzali` (indirilen / yerelde saklanan) · `gomulu` (derlemeye gömülü) · `yok` (yedek sunucular; `surum`/`donem`/`kanal`/`imzalayan` null); `sertifika_bitis` yalnız sertifikalı (bdp) profilde. `benom:profil-yenile` → `{ok:true, surum}` / `{ok:false, mesaj}`. İç `_ayarlar` (id/relay/key + `onceki_id_sunucu`) Dart'a gitmeden silinir. ### Upstream dosyaları (bu görevde) | Dosya | Değişiklik | |---|---| | `src/server/connection.rs` | Upstream 1.4.9'a döndü; yalnız iki sıkılaştırma kaldı: `avatar` yok sayılır (`handle_login_request_without_validation`), dosya izni kapalıyken `FileAction` reddi (`self.file`, `benom_dosya_is_kimligi`). Kapı A/B, Benom izin haritası, oturum önbelleği, kes/12 sa/15 dk, olaylar, CM açıklaması KALDIRILDI (upstream'e göre +31 satır) | | `src/client.rs` | `benom_yetkisini_ekle` / `LoginRequest.benom` doldurma kaldırıldı (`send_login`, `send_switch_login_request` upstream); `ID@sunucu` denetimi `benom::profil::sunucu_izinli_mi`; güvensiz bağlantıya "devam" yok (korundu); yardım bağlantıları `https://benomdesk.benomcore.com/` | | `src/ui_cm_interface.rs` | Upstream ile AYNI (`benom_aciklama` kaldırıldı; Dart `?? ''` ile okuyor) | | `src/ipc.rs` | `Data::Login.benom_aciklama` kaldırıldı; `benom:` IPC yalnız komut adı (`ipc_komutu(&name)`) | | `src/core_main.rs` | `--benom-baglan` / `--benom-eslestir` ve soğuk açılış sunucu başlatma kaldırıldı; `--benom-test-komut ` (yalnız `benom-test-ornegi`); `--config` kapalı (mesaj "BenomDesk profili") | | `src/common.rs` | `get_api_server_` boş döner (BenomCore API adresi kaldırıldı); audit kapalı; custom.txt okunmaz (korundu) | | `src/hbbs_http/sync.rs` | `baglantilari_kes` kaldırıldı; heartbeat/sysinfo/strategy kapalı (korundu) | | `src/rendezvous_mediator.rs` | `benom::kayit_yaniti` (nabız modülü yerine) | | `src/flutter_ffi.rs`, `src/updater.rs`, `src/platform/windows.rs`, `src/server.rs`, `src/lib.rs` | Yalnız yorum / mesaj metni (BenomCore → BenomDesk sitesi); şifresiz oturum reddi (`server.rs`) korundu | | `src/lang/en.rs`, `src/ui/index.tis`, `src/ui/install.tis` | `app.benomcore.com/uygulamalar/benomdesk` → `https://benomdesk.benomcore.com/` | | `libs/hbb_common/src/config.rs` | `RENDEZVOUS_SERVERS = ["benomdesk.benomcore.com"]` (IP yerine ad; `RS_PUB_KEY` aynı); `LINK_*` → BenomDesk sitesi | | `libs/hbb_common/src/lib.rs` | Kullanılmayan sürüm sorgusu adresi → `https://benomdesk.benomcore.com/indir/` (çağıranlar kapalı) | | `libs/hbb_common/protos/message.proto` | Yalnız yorum: `benom = 1001` / `BenomYetki` KULLANILMIYOR | | `res/benomdesk_baslangic_profili.json` | YENİ — **YER TUTUCU** (`bicim: benomdesk-yer-tutucu/1`); istemci yok sayar. Ana oturum gerçek kök imzalı profille değiştirecek | | `araclar/istemci-derle.ps1` | Başlangıç profili ön denetimi paralel görevce eklendi (`kok-imzala.php dogrula --json`: geçerli + tür profil + imzalayan `kok-N`, yoksa `derleme` adımı DURUR; canlı `profil.json` ile sürüm karşılaştırması). Bu görev yalnız hata iletisine "Bu dosya gercek kok imzali profille degistirilmeli …" ekledi (kendi eklediği yinelenen denetimi geri aldı) | | `araclar/imza-test` | `tests/vektorler.rs`: istek / PKCS#8 / giriş kanıtı / doğrulama yanıtı testleri kaldırıldı; kalan `a_imza_vektorleri`, `a_zarf_vektorleri`, `a_sertifika_ornegi`, `b_zarflar_mimari_kararina_uyar`, `b_php_ve_rust_ayni_karari_verir`; README güncellendi | ### Kilitler (her süreçte, `src/benom/ayar.rs`) - OVERWRITE: `direct-server=N`, `allow-insecure-tls-fallback=N`, `allow-auto-update=N`, `allow-scope-violation-close=Y`, `disable-udp=N`, `allow-websocket=N`; `custom-rendezvous-server` / `relay-server` / `key` (yedek → imzalı profil), `api-server=""`. - BUILTIN: `allow-logon-screen-password=N`, `allow-deep-link-password=N`, `allow-deep-link-server-settings=N`, `default-connect-password=""`, `hide-server-settings=Y`. - HARD: `disable-account=Y`, `disable-ab=Y`. Yerel: varsayılan dil `tr`, `enable-check-update=N`. - KALDIRILAN kilitler (upstream varsayılanına döndü): `approve-mode=click`, `verification-method=use-temporary-password`, `enable-perm-change-in-accept-window=N`, `allow-hide-cm=N` (MIMARI_BAGIMSIZ "kalan sıkılaştırmalar" listesinde yok). ### Doğrulama (2026-10-02, Rust 1.75.0) - `cargo check --release --lib --features hwcodec,vram,flutter` → çıkış 0; `+benom-test-ornegi` → çıkış 0. İkisinde de `src/benom` ve bu görevde değişen dosyalardan uyarı yok (kalan 14 + 4 uyarı upstream dosyalarında, önceden de vardı). - `cargo test --lib --features hwcodec,vram,flutter -- benom::` → 15/15 (ayar 2, imza 7, profil 6; yeni: `gomulu_baslangic_profili`, `sunucu_izin_listesi`). - `araclar/imza-test` `cargo test` → 7 (birim) + 5 (vektör) geçti. - `rustfmt --edition 2021 --check src/benom/*.rs` (4 dosya) → temiz. - `istemci-derle.ps1`: PowerShell ayrıştırıcısı 0 hata, dosya ASCII; yer tutucuya `kok-imzala.php dogrula --json` → `gecerli=False` (yuk/imzalayan/imza/sertifika yok) → denetim derlemeyi durdurur. Betiğin tamamı çalıştırılmadı; gerçek kök imzalı profille DENENMEDİ (kök anahtarı okunmadı). - ÇALIŞTIRILMADI / DOĞRULANMADI: tam derleme (`istemci-derle.ps1`), iki makineyle uçtan uca bağlantı (onay / geçici şifre / kalıcı şifre), canlı `https://benomdesk.benomcore.com/profil.json` çekimi (alan adı / site henüz yayında olmayabilir). --- ## Rust çekirdeği (rust-istemci, 2026-09-30) — TARİHÇE (BenomCore entegre sürüm; bkz. yukarıdaki "bağımsız mimari") Sözleşme: `MIMARI.md` §4.3, §5, §7, §8, §11 (Tur 1 protokolü: `BenomYetki {yetki_id, anahtar}`) + `MIMARI_EK_TUR2.md`'nin protokolü değiştirmeyen maddeleri (D3.1-D3.7, D4.1, D4.2, D5). D1/D2 (challenge'a bağlı giriş imzası, imzalı doğrulama yanıtı) PHP ile birlikte Tur 2'de uygulanacak (UYGULANDI — aşağıda "Tur 2 — protokol"). Flutter/Dart, `res/`, `flutter/windows/runner` dosyalarına dokunulmadı. git commit yapılmadı. ### Yeni dosyalar (`src/benom/`) | Dosya | İçerik | |---|---| | `mod.rs` | Süreç modeli; sunucu döngüsü (profil 30 dk / nabız 60-30 sn / cihaz bilgisi / olay kuyruğu); IPC komutları (`benom:`); FFI `ffi_komutu` (§11); `benom:baglan` → bekleyen yetki | | `ayar.rs` | `KOK_ANAHTARLARI` (kok-1, kok-2), `API_TABANI`, yapılandırma adresleri, pilot sunucu, süreler; her süreçte gömülü kilitler (OVERWRITE/BUILTIN/HARD) | | `imza.rs` | Bağımlılıksız (yalnız `ring`, `serde_json`) çekirdek: base64, P-256 ECDSA DER, zarf + sertifika zinciri, profil yükü kuralları, istek imza metni. `araclar/imza-test` aynı dosyayı `#[path]` ile sınar | | `kimlik.rs` | Cihaz P-256 anahtar çifti; `benom_kimlik.json` (gizli anahtar `encrypt_str_or_original`, makineye bağlı); iptalde silme | | `api.rs` | reqwest (mevcut `create_http_client_async`, sertifika doğrulaması kapatılamaz), 6 sn, §5.1 imza başlıkları, yalnız https; tek denemeli kip (doğrulama) | | `profil.rs` | §4.3 kural 1-8: doğrulama, tekdüze sürüm, OVERWRITE uygulama + mediator yeniden başlatma, `benom_profil.json` / `_onceki`, açılışta yeniden doğrulama, 5 dk kayıt izleme → geri dönüş, 60 dk engel | | `nabiz.rs` | İmzalı nabız, rendezvous kayıt durumu, `kes` → bağlantı kapatma, `durum=iptal` / 401 `cihaz_iptal` → kimlik silme, RustDesk ID değişimi olayı | | `bilet.rs` | Kontrol eden: `/baglanti/al`, bekleyen-yetki tablosu (saf ID, TTL 120 sn, oturuma bağlanma), `@sunucu` izin listesi. Kontrol edilen: `/baglanti/dogrula` (tek deneme, 7 sn, dakikada 20), ControlPermissions haritası, 60 sn oturum önbelleği | | `olay.rs` | İmzalı olay kuyruğu (`benom_olay_kuyrugu.json`, yeniden deneme 5 sn→5 dk, 4xx atılır) | | `eslestirme.rs` | Kod biçimi (`XXXX-XXXX`), her denemede yeni anahtar, `X-BD-Cihaz: 0` imzası | | `destek.rs` | `POST /cihaz/destek-iste`, `GET /cihaz/bilgi` önbelleği | ### Değiştirilen upstream dosyaları | Dosya | Değişiklik | Neden | |---|---|---| | `libs/hbb_common/src/config.rs` | `APP_NAME="BenomDesk"`; `RENDEZVOUS_SERVERS=["87.76.207.130"]`, `RS_PUB_KEY` = Benom pilot anahtarı (macOS `ORG` korundu) | Markalama (yol, servis, IPC, `benomdesk://`); genel RustDesk sunucusuna kayıt olmama (MIMARI §8, rapor 04 §2.1) | | `libs/hbb_common/src/lib.rs` | Sürüm sorgusu adresi `api.rustdesk.com` → BenomCore `/surum` (çağıranlar kapalı) | rustdesk.com'a cihaz parmak izi gitmez (rapor 04 §2.9-1) | | `libs/hbb_common/protos/message.proto` | `LoginRequest.benom = 1001` + `message BenomYetki {yetki_id=1; imza=2}` (Tur 1'deki `anahtar=2` Tur 2'de `imza=2` oldu; aşağıya bakın) | Bağlantı yetkisi taşıma (MIMARI §7.5, EK D1) | | `Cargo.toml`, `Cargo.lock` | `ring = "0.17"` (kilitteki 0.17.14; yalnız bağımlılık kenarı eklendi) | P-256 ECDSA | | `src/lib.rs` | `pub mod benom` (iOS hariç) | Yeni modül | | `src/common.rs` | `load_custom_client`: custom.txt okunmaz → gömülü kilitler + imzalı profil; `read_custom_client` yok sayılır; `get_api_server_`: `http://host:21114` türetme ve `admin.rustdesk.com` yok → BenomCore API; `get_audit_server` hep boş; `do_check_software_update` sorgu yapmaz | K8: custom.txt, kimliksiz audit, düz HTTP API, rustdesk.com uçları | | `src/platform/windows.rs` | `get_license_from_exe_name` her zaman hata | K8: exe adı / `RUSTDESK_APPNAME` ile sunucu değiştirme kapalı | | `src/core_main.rs` | `--benom-baglan ` → `benomdesk://baglan/`, `--benom-eslestir ` → `benomdesk://eslestir/` (`--connect` kalıbı; yalnız `[A-Za-z0-9_-]`, ≤128); `--config` kapalı | MIMARI §7.3, §11; K7/K8 | | `src/updater.rs` | Otomatik/elle güncelleme hiçbir koşulda çalışmaz | Resmî RustDesk ikilisi indirilmez (rapor 02 §0-9) | | `src/flutter_ffi.rs` | `main_get_common`: `benom:*` → `crate::benom::ffi_komutu` (köprü imzası aynı); `main_set_common`: `download-new-version` / `update-me` / `extract-update-dmg` kapalı | §11; K8 | | `src/hbbs_http/sync.rs` | Heartbeat/sysinfo/strategy iş parçacığı başlatılmaz; yayın kanalı yalnız nabız `kes` listesi (`baglantilari_kes`) | K8, rapor 03 §0-1,2 | | `src/ipc.rs` | `Data::Config(("benom:", Some(arg)))` → sunucu sürecinde `benom::ipc_komutu`; `Data::Login.benom_aciklama` | Kimlik sunucu sürecinde; CM açıklaması | | `src/ui_cm_interface.rs` | `Client.benom_aciklama` (Flutter CM JSON), `add_connection` parametresi | CM'de "{ad} bağlanmak istiyor — {açıklama}" (§7.6) | | `src/rendezvous_mediator.rs` | `start_all` → `benom::sunucu_gorevlerini_baslat`; kayıt yanıtında `benom::nabiz::kayit_yaniti` | Nabız/profil görevleri; `rendezvous.kayitli`, profil geri dönüş izlemesi | | `src/server.rs` | Şifresiz oturum (`PublicKey` boş / `secure=false`) reddedilir | EK D3.1 | | `src/server/connection.rs` | **Kapı A** (LoginRequest'te tür kapılarından önce `/baglanti/dogrula`, ret/hata/zaman aşımı → ret + `baglanti_reddedildi`); izin = BenomCore ∧ yerel ayar → `control_permissions` + CONTROL_PERMISSIONS_ARRAY; görünen ad, avatar yok; **mod**: onaylı → CM tıklama (prelogin'de ret), katılımsız → CM onaysız + gösterge; **Kapı B** (`send_logon_response_and_keep_alive` başında: izin, tür, onaylıda CM tıklaması, süre dolduysa yeniden doğrulama); olaylar `oturum_basladi`, `oturum_bitti`, `kullanici_reddetti`, `dosya_aktarimi`, `alarm`, `izin_degisti`; CM `SwitchPermission` izin genişletemez; `FileAction` `self.file` denetimi; `kes` kanalı Türkçe kapanış | K3, K4, K10, §7, EK D3.2-D3.5 | | `src/client.rs` | `create_login_msg` bekleyen yetkiden `LoginRequest.benom`; `_start`: yabancı `@sunucu` yalnız profil sunucusu / BenomCore'un verdiği kimlik; güvensiz bağlantıya "devam" yok | §7.5, EK D4.1, D3.1 | | `src/ui_session_interface.rs` | `access_token` hbbs'e gönderilmez | EK D4.2 | ### Kilitler (her süreçte, `src/benom/ayar.rs`) - OVERWRITE: `direct-server=N`, `allow-insecure-tls-fallback=N`, `allow-auto-update=N`, `allow-hide-cm=N`, `allow-scope-violation-close=Y`, `approve-mode=click`, `verification-method=use-temporary-password`, `custom-rendezvous-server` / `relay-server` / `key` / `api-server` (pilot → imzalı profil). - BUILTIN: `allow-logon-screen-password=N`, `enable-perm-change-in-accept-window=N`, `allow-deep-link-password=N`, `allow-deep-link-server-settings=N`, `default-connect-password=""`, `hide-server-settings=Y`. - HARD: `disable-account=Y`, `disable-ab=Y`. Yerel: varsayılan dil `tr`, `enable-check-update=N` (kilitli). --- ## Tur 2 — protokol: EK D1 / D2, sertifika yetkisi, Rust ekleri (protokol görevi, 2026-10-01) — UYGULANDI Sözleşme: `MIMARI_EK_TUR2.md` D1, D2 (+ D7 kilitleri). PHP ve Rust BİRLİKTE değişti. Flutter/Dart dosyalarına dokunulmadı (FFI yanıt biçimleri aynı; `benom:durum`'a yalnız `taban` ve `sertifika_bitis` eklendi). ### Protokol: bilet taşıyıcı değil (EK D1) - `/baglanti/al` yanıtında **`anahtar` (K) yok**; yetki alım anında çağıran cihaza bağlanır (`kontrol_eden_cihaz_id`). `benomdesk_baglanti_yetkileri.anahtar_hash` kaldırıldı. - `LoginRequest.benom (1001) = BenomYetki { string yetki_id = 1; string imza = 2; }`. - `imza` = kontrol eden cihazın Benom P-256 anahtarıyla şu metnin DER imzası (standart base64); satırlar `\n`, sonda satır sonu YOK (PHP `BenomDeskImza::girisMetni` ile bayt bayt aynı): `BENOMDESK-GIRIS-v1 / yetki_id / hedef_rustdesk_id / Hash.challenge / session_id (ondalık) / baglanti_turu`. Alan kuralları iki tarafta aynı: yetki kanonik pozitif ondalık; hedef `[A-Za-z0-9_-]{1,64}` (`@sunucu`'suz); challenge yazdırılabilir ASCII 1-64; session_id u64 kanonik; tür `uzak_masaustu|dosya_aktarimi|diger`. - **Gizli anahtarın yeri:** cihaz kimliği (`benom_kimlik.json`) yalnız SUNUCU SÜRECİNDE (kurulu Windows'ta hizmetin `--server`'ı; taşınabilir kipte sunucuyu kendi içinde çalıştıran ana süreç). Oturumu açan arayüz süreci kanıtı `create_login_msg`'den hemen sonra ister (`client.rs` `send_login` / `send_switch_login_request` → `benom_yetkisini_ekle`; `Hash` geldiği için challenge ve session_id bellidir): aynı süreçse doğrudan, değilse IPC `Data::Config(("benom:giris-imzala", json))` (5 sn üst süre). Windows ana IPC'si yalnız aynı oturumdaki aynı exe'yi kabul eder (`ipc/auth.rs authorize_windows_main_ipc_connection`). - Sunucu süreci yalnız KENDİ `/baglanti/al` ile aldığı yetkiler için imzalar (`ALINAN` kaydı): kayıtlı hedefe, yetki türüne uyan bağlantı türüyle (`kontrol` → `uzak_masaustu`, `dosya` → `dosya_aktarimi`) ve ilk imzadan sonra yalnız aynı `session_id` için. Kanıt ve challenge loglanmaz. - Kontrol edilen taraf (Kapı A): `lr.username` kendi ID'si olmalı; challenge = bu bağlantıda kendi gönderdiği `Hash.challenge`. `/baglanti/dogrula` gövdesi `{yetki_id, imza, challenge, session_id, baglanti_turu, hedef_rustdesk_id, kontrol_eden_rustdesk_id, kontrol_eden_ip, istek_nonce}` (cihaz imzalı istek, tek deneme, 7 sn). - PHP metni yeniden kurar, yetkinin `kontrol_eden_cihaz_id` açık anahtarıyla doğrular (geçersiz kanıt yetkinin durumunu DEĞİŞTİRMEZ: yetki_id'yi bilen biri meşru bağlantıyı düşüremez); `(yetki_id, sha256(challenge))` tekrarını yeni `benomdesk_giris_kanitlari` tablosuyla (PK) reddeder — challenge düz saklanmaz, 13 sa'ten eskiler fırsatçı silinir. İlk doğrulama alım + 120 sn içinde; sonrakiler aynı `session_id`, `dogrulama_sayisi ≤ 10`, oturum sürdükçe (en çok 12 sa). - 60 sn önbellek (EK D3.7) taşıyıcı değil: imzalı izin yanıtı `kontrol_eden_acik_anahtar` taşır; aynı yetki + oturum + türle 60 sn içinde gelen YENİ bağlantının (yeni challenge) kanıtı bu anahtarla yerelde doğrulanmadan kullanılmaz. - Bilinen sınır (Tur 1'den): dosya aktarımı ayrı bir oturumdur (ayrı `session_id`) → ayrı `tur=dosya` bileti gerekir; `kontrol` yetkisi başka oturumun dosya aktarımı bağlantısına taşınmaz. ### İmzalı doğrulama yanıtı (EK D2) > **D8 (güvenlik turu) ile DEĞİŞTİ:** doğrulayıcı artık yanıtın TAŞIDIĞI sertifikadır (`yanit_sertifikasi`, gömülü > köke karşı); profil/yedek sertifika yalnız taban; profil yoksa da doğrulanır; doğrulama hatasında profil tazelenmez; yanıt > isteğe bağlıdır (bağlam alanları). Aşağıdaki "doğrulayıcı profil sertifikasıdır" ve "profil hemen yeniden çekilir" maddeleri > bu yönleriyle geçersiz — bkz. "Güvenlik turu — Görev A (protokol, D8)". - `B` = imzalanan JSON nesnesi (`istek_nonce` yankısı + `zaman` dahil); gövde = `B[..son-1] + ',"yanit_imzasi":""}'`, imza `B` üzerinde; başlık `X-BD-Yanit-Imzalayan: ` (ör. `bdp-1`). İstemci imza alanını SON alan olarak ayırır, değerleri YALNIZ `B`'den okur; gövdeyi katı UTF-8 bayt olarak alır. - İstemcinin doğrulayıcısı yürürlükteki profil zarfındaki sertifikadır (kök → bdp-N); kök imzalı (sertifikasız) profil yürürlükteyse son sertifikalı profilin sertifikası (`benom_yanit_sertifikasi.json`, açılışta kökle yeniden doğrulanır). Ret: başlık yok/farklı, imza geçersiz, `istek_nonce` farklı, `zaman` ±300 sn dışında, HTTP ≠ 200. - **Fail-closed:** sunucuda profil imza anahtarı/sertifikası yoksa `/baglanti/dogrula` hiçbir durum değiştirmeden **503 `imza_anahtari_yok`** (geçersizse `imza_anahtari_gecersiz`) döner → istemci reddeder. İstemcide hiç sertifikalı profil yoksa (ilk kurulumda profil henüz çekilmemişse) gelen bağlantılar da reddedilir. Yanıt doğrulanamazsa profil hemen yeniden çekilir (en çok 60 sn'de bir): sunucu imza anahtarını yenilediğinde ilk bağlantı reddedilebilir, profil gelince sonrakiler geçer. - **Sertifika süresi (sabit, belgeli):** YENİ profil süresi dolmuş sertifikayla kabul edilmez (`SertifikaKipi::Kati`). Yürürlükteki profil açılışta sertifika süresi yüzünden DÜŞÜRÜLMEZ (`SertifikaKipi::Yururluk`; imza zinciri yine tam doğrulanır). Doğrulama yanıtları sertifika bitişinden sonra **30 gün** daha kabul edilir (`YANIT_SERTIFIKA_TOLERANSI_SN = 2592000`, PHP ve Rust'ta aynı sabit; sunucu da o süre boyunca imzalar). Nabız `sertifika_bitis` (ISO-8601 UTC | null) bildirir → `benomdesk_cihazlar.sertifika_bitis`. ### Sertifika yetkisi - Kök dışı imzalayanın sertifikası TAM OLARAK `["sunucu"]` taşımalı (PHP `BenomDeskImza::sertifikaCoz` + Rust `imza::sertifika_coz`): `"adres"` (ya da başka / yinelenen / boş) yetkili sertifika reddedilir — profilde adres alanı olmasa bile. `yapilandirma_adresleri` / `api_adresi` yalnız kök imzalı (sertifikasız) zarfta kabul edilir. ### Rust ekleri ve değişen dosyalar | Dosya | Değişiklik | |---|---| | `src/benom/ayar.rs` | `BENOMDESK_SURUM = "1.0.0"` (ürün sürümü). `istemci_surum` alanları (eşleştirme, nabız, `benom:durum`) yalnız `"1.0.0"`; RustDesk tabanı ayrı `taban` alanında (`crate::VERSION`; Cargo sürümü 1.4.9 DEĞİŞMEDİ: eşler `LoginRequest.version`'ı özellik uyumu için karşılaştırır). OVERWRITE kilitleri: `disable-udp=N`, `allow-websocket=N` (OSS hbbs UDP kaydı şart, EK D7). | | `libs/hbb_common/src/config.rs` | `LINK_DOCS_HOME`, `LINK_DOCS_X11_REQUIRED`, `LINK_HEADLESS_LINUX_SUPPORT` → `https://app.benomcore.com/uygulamalar/benomdesk`. `benom_test_ornegi()`: yalnız `benom-test-ornegi` özelliğiyle derlenen ikilide `BENOMDESK_TEST_ORNEGI=<[a-z0-9]{1,12}>` → `APP_NAME = "BenomDesk-"` (APP_NAME lazy_static'inin ilk erişiminde, yani her Config erişiminden önce hesaplanır): ayrı yapılandırma dizini, IPC borusu, pencere adı / URI şeması ve ayrı RustDesk ID (makine kimliğinden türeyen ID ada göre karıştırılır). Özelliksiz derlemede değişken yok sayılır. | | `Cargo.toml`, `libs/hbb_common/Cargo.toml` | Özellik `benom-test-ornegi` (yalnız test ikilisi; DAĞITILMAZ). | | `libs/hbb_common/protos/message.proto` | `BenomYetki { yetki_id = 1; imza = 2; }` | | `src/client.rs`, `src/lang/en.rs`, `src/ui/index.tis`, `src/ui/install.tis` | Kalan tıklanabilir rustdesk.com bağlantıları → BenomDesk sayfası (yalnız kod yorumlarında ve upstream test iddialarında rustdesk.com kaldı). `client.rs`: `benom_yetkisini_ekle` (kanıt). | | `src/benom/imza.rs` | Giriş metni / kanıt doğrulama, imzalı yanıt ayırma / doğrulama, `SertifikaBilgisi`, `SertifikaKipi`, yalnız-`sunucu` sertifika kuralı, 30 gün sabiti. | | `src/benom/bilet.rs`, `mod.rs`, `profil.rs`, `api.rs`, `nabiz.rs`, `eslestirme.rs` | Yukarıdaki protokol; `benom:giris-imzala` iç IPC komutu (Dart'a açık değil); yanıtın ham gövdesi + `X-BD-Yanit-Imzalayan`; doğrulama başarısızlığında profil tazeleme. | | `src/server/connection.rs` | Kapı A: `BenomYetki{yetki_id, imza}` + kendi ID / challenge ile doğrulama; aynı bağlantıda yinelenen LoginRequest ve 60 sn önbellek yalnız yerel kanıt doğrulamasıyla. | | `araclar/istemci-derle.ps1` | `-TestOrnegi`: `cargo build --locked --features hwcodec,vram,flutter,benom-test-ornegi --lib --release`, ardından `build.py … --skip-cargo` (build.py'de özellik argümanı yok; `build_flutter_windows` `skip_cargo`'ya uyar); paket `…-TEST-ORNEGI-win-x64`; lisans/kurucu/kaynak/özet zorla atlanır; `target\release\benomdesk-test-ornegi.isaret` varken normal paketleme durur. Varsayılan `-Surum` artık ürün sürümü (`BENOMDESK_SURUM`). | Uçtan uca test (aynı makinede iki örnek): `istemci-derle.ps1 -TestOrnegi` paketindeki `BenomDesk.exe` taşınabilir olarak `BENOMDESK_TEST_ORNEGI=ikinci` ortamıyla açılır; ana örnek normal kurulum ya da taşınabilir. İki örnek ayrı eşleştirilir (ayrı kimlik dosyası, ayrı RustDesk ID). ### Doğrulama (Tur 2, 2026-10-01; Rust 1.75.0, PHP 8.2.34 / OpenSSL 3.0) - `cargo check --release --lib --features hwcodec,vram,flutter` → çıkış 0; `… --features hwcodec,vram,flutter,benom-test-ornegi` → çıkış 0. İkisinde de `rustdesk` 14 uyarı, hepsi değiştirilmemiş upstream kodunda (src/benom ve Tur 2 eklerinden uyarı yok). - `cargo test --lib --features hwcodec,vram,flutter -- benom::` → 14 geçti / 0 kaldı. Aynısı `--features hwcodec,vram,flutter,benom-test-ornegi` ile → 14 geçti (`test_ornegi_degiskeni` özellikli dalı: geçerli ad kabul, geçersiz adlar yok sayılır; özelliksiz derlemede değişken hep yok sayılır). - `rustfmt --edition 2021 --check src/benom/*.rs` → temiz. - `araclar/imza-test` `cargo test` → 8 + 13 geçti (D: PHP giriş kanıtları Rust'ta aynı karar, alan kuralları aynı; E: Rust kanıtları PHP `girisImzasiDogrula`'da geçerli, başka challenge / başka cihaz reddi; F: PHP imzalı 15 doğrulama yanıtı Rust'ta beklenen kararla; B: 29 zarf vektöründe PHP/Rust fark yok, `"adres"` yetkili sertifika iki yönde ret). - `php erp/_kurulum/kripto_yerel_test.php` → TÜM TESTLER GEÇTİ (90 denetim; giriş metni, imzalı yanıt, yalnız-`sunucu` sertifika, 29/31 gün toleransı, imza anahtarı yok/geçersiz → 503). `php -l` erp + araclar altındaki 55 PHP dosyası: 0 hata. - `araclar/istemci-derle.ps1`: PowerShell ayrıştırıcısı 0 hata, ASCII dışı bayt 0; derlemesiz kuru çalıştırma (normal ve `-TestOrnegi`) ve iki koruma (isaret yokken `-TestOrnegi` paketleme, isaret varken normal paketleme) durduğu görüldü; geçici isaret / sahte Release dizini / günlükler silindi. Gerçek `-TestOrnegi` derlemesi (flutter build) ÇALIŞTIRILMADI. - ÇALIŞTIRILMADI: `erp/_kurulum/benomdesk_test.php` (MySQL ister; bilet/al/doğrula senaryoları Tur 2'ye göre güncel: yanıtta K yok, başka cihazın imzası reddi, yeniden oynatılan challenge reddi, 503, session/sayaç/süre). Yerelde MySQL'siz sahte veritabanıyla gerçek `BenomDeskYetkiService::al/dogrula` akışı (scratchpad) 19/19 geçti; gerçek SQL (FOR UPDATE, INTERVAL, PK çakışması) sunucuda denenmeli. - DOĞRULANMADI: iki makine / iki örnekle uçtan uca bağlantı, kurulu Windows hizmeti üzerinden IPC imzalatma, canlı ERP imzalı yanıtı, anahtar yenilemesinde profil tazeleme davranışı. ## Güvenlik turu — Görev A (protokol, D8): doğrulama yanıtı isteğe bağlı + sertifika taşır, session_id 0 yok (2026-10-01) Bulgular: #2 (yüksek — imzalı doğrulama yanıtı isteğe yalnız `istek_nonce` ile bağlıydı: TLS aracısı başka hesabın meşru katılımsız iznini kurbana aktarabiliyordu), #9 (kök imzalı profil yürürlükteyken doğrulayıcı sertifika istemciye ulaşmıyordu → tüm gelen bağlantılar kalıcı ret), #4'ün sunucu tarafı (session_id=0 → oturum kaydı hiç açılmıyordu). Sözleşme: `MIMARI_EK_TUR2.md` "D8+ (güvenlik turu)" → **D8** (BAĞLAYICI; EK D2'yi genişletir). PHP ve Rust BİRLİKTE değişti. `connection.rs`, `nabiz.rs`, `profil.rs`, `client.rs`, `kimlik.rs` DEĞİŞMEDİ (`DogrulamaIstegi` alanları aynı; `client.rs` zaten 0 session_id üretmez). ### Rust (`src/benom/`) | Dosya | Değişiklik | |---|---| | `imza.rs` | `YANIT_SERTIFIKA_ALANI = "yanit_sertifikasi"`; yeni `DogrulamaBaglami {cihaz_id, yetki_id, hedef_rustdesk_id, challenge, session_id, baglanti_turu, istek_nonce, istek_govdesi}`; `dogrulama_yaniti_coz(ham, imzalayan_basligi, kokler, simdi, asgari_sertifika_baslangici, &baglam)` — `SertifikaBilgisi` parametresi KALKTI: sertifika yanıtın `yanit_sertifikasi` zarfından alınır, `sertifika_coz(.., Yururluk)` ile GÖMÜLÜ köklere karşı doğrulanır + `yanit_icin_gecerli` (bitiş + 30 gün) + kimlik = `X-BD-Yanit-Imzalayan` + taban (`baslangic ≥ asgari`); imza; ardından `yanit_baglami_denetle` (nonce, ±300 sn — taşmasız `saturating_*` —, `cihaz_id`, `yetki_id`, `hedef_rustdesk_id`, `challenge_ozeti` = sha256hex, `session_id`, `baglanti_turu`, `istek_ozeti` = sha256hex(gönderilen gövde)). `giris_metni` `session_id == 0`'da hata (PHP `sessionIdGecerli` ile aynı). | | `bilet.rs` | `dogrula`: profil sertifikası ZORUNLU DEĞİL (yoksa "İmzalı BenomCore bağlantı profili yok" reddi kalktı); `profil::yanit_sertifikasi()` yalnız taban (`baslangic`); gövde `api::govde_baytlari` ile BİR KEZ serileştirilir, aynı baytlar `api::istek_tek_bayt` ile gönderilir ve `istek_ozeti` ile karşılaştırılır; bağlam = kendi isteği + `kimlik.cihaz_id`. Doğrulama hatasında profil tazeleme (`profil_tazelemeyi_iste`) KALDIRILDI (sertifika artık yanıtla gelir). Loglanan neden yalnız alan adı / sertifika kimliği taşır. | | `api.rs` | `govde_baytlari(&Value)` (tek serileştirme noktası) + `istek_tek_bayt(metod, yol, Vec, imza)`; iç gönderim `istek_baytla` (ham bayt; `istek_adrese_` ona devreder — davranış aynı). | ### PHP (ERP) - `BenomDeskImza`: `sessionIdGecerli` 0'ı reddeder; `YANIT_SERTIFIKA_ALANI`, `YANIT_BAGLAM_ALANLARI`; `dogrulamaIstegiAlanlari` (tek normalleştirme), `dogrulamaBaglami(cihazId, g, hamGovde)`, `dogrulamaYanitiGovdesi` (ayrılmış adları karar ezemez), `dogrulamaYanitiDogrula` (istemci kuralının PHP eşi; test/araç). - `BenomDeskYetkiService`: `yanitAnahtari()` sertifika ZARFINI da döndürür; `dogrula(hedef, g, hamGovde)` (ham gövde ŞART; zarf yoksa 503 `imza_anahtari_gecersiz`); `dogrulamaKarari` `hedef_rustdesk_id` ≠ çağıranın kayıtlı `rustdesk_id`'si → ret (durum değişmez); `olay()` `oturum_basladi` session_id yok/0 → 422 `eksik_alan`. - `BenomDeskIstemciController::baglantiDogrula` imzası doğrulanan ham gövdeyi geçirir. ### Uyum / yayın sırası ERP ÖNCE: D2 istemcisi yeni alanları yok sayar (profil sertifikasıyla doğrulamaya devam eder). Sonra istemci: D8 istemcisi bağlamsız / sertifikasız (D2 biçimi) yanıtı REDDEDER (fail-closed). `nabiz` `sertifika_bitis` hâlâ PROFİL sertifikasının bitişini bildirir (doğrulayıcı artık yanıt sertifikası; alan yalnız bilgi). ### Doğrulama (Rust 1.75.0, PHP 8.2.34 / OpenSSL 3.0.22) - `php erp/_kurulum/kripto_yerel_test.php` → TÜM TESTLER GEÇTİ (103 denetim; yeni: session_id 0 reddi, bağlam alanları, her bağlam alanının ayrı reddi, #2 aktarım saldırısı reddi, D2 biçimi reddi, sertifika yok / adres / yabancı kök / gerçek köklerde olmayan kök, başlık, sertifika dışı anahtar, taban, ±300 sn, yanıt anahtarı sertifika zarfı). `vektorler.json` yeniden üretildi. - `php araclar/imza-test/php_vektor_uret.php` → 29 zarf, 3 istek, 7 giriş, 19 alan kuralı, 31 yanıt vektörü (PHP farkı 0). - `araclar/imza-test` `cargo test` → 8 + 13 geçti (F: 31 D8 yanıtı PROFİLSİZ, gömülü test köküne karşı, PHP ile aynı karar; E: `session_id 0` kanıtını Rust kurmaz, PHP reddeder; D: 19 alan kuralı aynı). Mutasyon denetimi: `yanit_baglami_denetle` çağrısı devre dışı bırakılınca `imzali_dogrulama_yaniti` KALDI (geri alındı). - `cargo test --lib --features hwcodec,vram,flutter -- benom::` → 14 geçti / 0 kaldı; `cargo check --release --lib --features hwcodec,vram,flutter` → çıkış 0, `src/benom` kaynaklı uyarı yok; `rustfmt --edition 2021 --check` (imza/bilet/api) temiz. - `php -l`: BenomDeskImza, BenomDeskYetkiService, BenomDeskIstemciController, kripto_yerel_test, benomdesk_test, php_vektor_uret → 0 hata. - Yerel MySQL'siz sahte veritabanıyla GERÇEK `BenomDeskYetkiService::dogrula` (scratchpad): D8 8/8 (sertifikasız anahtar 503 + sorgu yok, session 0 ret + bağlanmama, kayıtsız hedef ret + durum değişmez, izin yanıtı bağlam + sertifika, başka cihaz / gövde reddi, challenge düz yok) + Tur 2 akışı 19/19. - ÇALIŞTIRILMADI: `erp/_kurulum/benomdesk_test.php` (MySQL + canlı uygulama ister; bilet bölümüne D8 denetimleri eklendi: session 0, kayıtsız hedef, yanıt bağlamı + sertifika, başka cihaza/gövdeye aktarım reddi, `oturum_basladi` 0/eksik → `eksik_alan`). `http_e2e_test.php` (benim alanım değil) D8 alanlarını denetlemiyor; davranışı bozulmaz. - DOĞRULANMADI: iki makineyle uçtan uca bağlantı, canlı ERP imzalı yanıtı (gizli dizindeki gerçek sertifika zarfıyla). ## Güvenlik turu — Görev C (profil, D-C): kalıcı adres katmanı, (dönem, sürüm) kilidi, pilot çıkarma/reddinde yüksek sürüm (2026-10-02) Bulgular #7 (bdp profili kökün API/yapılandırma adreslerini varsayılana çeviriyordu), #8 (sürüm üst sınırı yok; bdp ele geçirilirse filo kilitlenir, kök aşamıyordu), #10 (pilottan çıkarılan/reddedilen cihaz eski pilot sunucusunda kalıyordu). Sözleşme: `MIMARI_EK_TUR2.md` "D-C" (BAĞLAYICI). Kök gizli anahtarına dokunulmadı; mevcut dönemsiz `bdp-1` sertifikası dönem 1 sayılır, **yeniden imza gerekmez**. ### Rust (`src/benom/`) | Dosya | Değişiklik | |---|---| | `imza.rs` (yalnız sertifika / zarf / profil yükü ayrıştırma; D8 yanıt kodu aynı) | `DONEM_AZAMI` (2^31-1), `SURUM_AZAMI` (4294967295 = ERP kolonu), `ADRES_ZARFLARI_ALANI`; `donem_coz` (yoksa 1); `SertifikaBilgisi.donem`; `AdresAlani {Yok, Temizle, Deger}`; `ProfilYuku.donem` (kökte yükten, sertifikalıda SERTİFİKADAN — yükte farklı dönem → ret), `api_adresi` / `yapilandirma_adresleri` üç durumlu, `kilit()`, `sunucular_ayni()`; `surum > SURUM_AZAMI` → ret; `surum_karari((donem, surum), Option<(donem, surum)>)` sözlük sırası. | | `profil.rs` | Yeniden yazıldı. **Adres katmanı** `AdresKatmani` (alan başına `AdresKaynagi {deger, kilit, zarf}`), `isle` (yalnız daha yeni kök zarfı), `adres_katmani_kur` (kalıcı kaynak zarflarından, kökle yeniden doğrulayarak), `benom_adres.json`; `adres_api()` / `adres_yapilandirma()`. **Saf çekirdek** `degerlendir(zarf, ekler, adres, simdiki, taban, kokler, simdi)` → `{adres, sonuc: Gecersiz/Ayni/Eski/Uygula{yeniden_baslat, id_degisti}}`; `zarf_isle` bunu çağırıp yan etkileri uygular. `adres_eklerini_ayir` (imza dışı `adres_zarflari`; saklanan profil eksiz). Kök imzalı ana zarfın adresleri profil sürüm kararından bağımsız işlenir. **Taban dönem** `benom_durum.json` `kok_donem` (`taban_donemi_yukselt`); `kilit_karari` taban altını ret; açılışta taban altındaki yerel profil ve kural 7'de taban altındaki önceki profile dönüş YOK (`geri_donulebilir`). **Yeniden başlatma** yalnız id/relay/anahtar değiştiyse (`yeniden_baslatma_gerekli`); kural 7 izlemesi yalnız ID değiştiyse. Açılışta D-C öncesi kurulumun yürürlükteki kök profilinin adresleri katmana alınır (geçiş). `profil_uygulandi` olayına `donem`; `ozet()`'e `donem` + `adres{api_adresi, kaynak}`. | | `ayar.rs` | `DOSYA_ADRES = "benom_adres.json"`; `api_tabani()` / `yapilandirma_adresleri()` profilden DEĞİL adres katmanından; `api_ayarini_yaz` (katman profilsiz değişince OVERWRITE `api-server`). | Testler (`cargo test --lib --features hwcodec,vram,flutter -- benom::`): `imza::dc_donem_surum_ve_adres_alanlari`, `profil::dc_bdp_profili_adres_katmanina_dokunamaz` (#7: kök v10 adres → bdp v11 adresleri KORUR; bdp'de null bile ret; kökle alan başına temizleme; eski kök zarfı geri çeviremez), `profil::dc_kacirilan_kok_adres_zarfi_ekle_gelir` (#7: ek yoluyla gelen kök zarfı; bdp/bozuk ek yok sayılır; kalıcı biçim kökle yeniden kurulur), `profil::dc_kok_donemi_ele_gecirilmis_bdp_kilidini_asar` (#8: saldırganın `SURUM_AZAMI` profili → Benom'un aynı dönem yayını Eski → dönem-2 sertifikalı v6 UYGULANIR → saldırgan profili artık Eski; kök dönem-3 profili; taban ve kural 7), `profil::dc_ayni_icerik_yeniden_baslatmaz` (#10: pilottan çıkan cihaz v11'i reddeder, sunucunun v13'ünü uygular; aynı içerik v14 yeniden başlatmaz). ### PHP (ERP) ve araçlar - `BenomDeskImza` (yalnız zarf/sertifika dönem ekleri): `DONEM_AZAMI`, `SURUM_AZAMI`, `donemCoz`; `sertifikaCoz` geçersiz dönemi reddeder; `profilZarfiDogrula(…, $sonUygulanan, $sonDonem = 1)` dönem kuralı + sürüm üst sınırı + (dönem, sürüm) kilidi, dönüşte `donem`. - `BenomDeskProfilService`: `satirDonemi`, `enYuksekDonem`, `donemDenetle` (409 `donem_eski`: pilot/genel/geri al/yeniden imza; kök içe alma + yayın), `imzaAnahtariYukle` → `donem`, `zarfUret` yüke `donem`; `adresZarflari` + `genelZarf` / `cihazZarfi` ek; `kokZarfiCoz` açık null adres kabul, `$tabanDonem`; `geriAl('pilot')` → yeni GENEL sürüm (genel varsa), `kok_gerekli` engeli kalktı (adres katmanı istemcide korunur), adresli kök reddinde `uyari`, geri dönüş kaynağı içeriği FARKLI en yeni arşiv satırı (`oncekiFarkliIcerik`; yeniden imza kopyaları atlanır); yeni `pilottanCikarildi` + `hedefleriYenidenImzala` + `yayinSatiriEkle`; `bicim` → `donem`; `$testKokleri` artık `imzaAnahtariYukle` / `zarfSina`'da da (yalnız süreç içi test). - Denetleyiciler (yalnız profil uçları): yönetim `profilGeriAl` iletisi + `uyari`, `pilotCihazlar` çıkarılanlar için `pilottanCikarildi`; Desk `cihazPilot` (pilot=false) → `profil_yenileme`. - `araclar/kok-imzala.php`: `--donem` (sertifika, kök profil), `--api-adresi-temizle`, `--yapilandirma-adresleri-temizle`, `dogrula --son-donem`, bdp kipinde yük dönemi sertifikadan, `surum` ≤ 4294967295, adresler yalnız https (önceden http yalnız uyarıydı; istemci zaten reddediyordu), `dogrula` `adres_zarflari` ekini denetler. - `araclar/imza-test`: `tests/vektorler.rs` (kilit çifti, `beklenen_donem`, üç durumlu adres), `php_vektor_uret.php` 18 yeni D-C sınır durumu; `vektorler.json` (+9 D-C zarf vektörü) ve `vektorler_ek.json` yeniden üretildi. - `_kurulum/tur2_yerel_test.php`: "api null → ret" beklentisi D-C'ye göre "açık null (temizle) kabul" oldu (1 satır grubu). ### Uyum / yayın sırası ERP önce: eski istemci `donem`'i ve `adres_zarflari`'nı yok sayar, davranışı değişmez. Sonra istemci. ⚠ Kök imzalı ADRES değişikliği ancak filo D-C istemcisindeyken yayınlanmalı (eski istemci bdp profilinde adresleri gömülüye çevirir). Dönem yükseltme yalnız D-C istemcisini korur. ### Doğrulama (Rust 1.75.0, PHP 8.2.34 / OpenSSL 3.0) - `cargo test --lib --features hwcodec,vram,flutter -- benom::` → 29 geçti / 0 kaldı (5'i yeni D-C; diğerleri paralel görevlerin); arada başka görevin yarım `connection.rs` düzenlemesi derlemeyi bir kez kırdı, düzelince yeniden koşuldu; `cargo check --lib --features hwcodec,vram,flutter` → çıkış 0, `src/benom` kaynaklı uyarı yok; `rustfmt --check` (imza/profil/ayar, vektorler.rs) temiz. - `araclar/imza-test` `cargo test` → 9 + 13 geçti (A: 18 zarf vektörü, D-C dönem/kilit dahil; B: 47 ek zarf, PHP farkı 0). Mutasyon denetimi (yalıtılmış kopyada): sertifikalı yük dönem eşitliği kaldırılınca ve kilit dönemi yok sayınca hem birim testi hem PHP vektörleri KALDI. - `php erp/_kurulum/kripto_yerel_test.php` → 117 denetim geçti (14 yeni D-C); `profil_donem_yerel_test.php` (YENİ, SQLite bellek içi Database taklidiyle GERÇEK yayın/geri alma/pilottan çıkarma/adres zarfı akışları) → 38 geçti; `tur2_yerel_test.php` 60, `web_yerel_test.php` 146 geçti. - `kok-imzala.php` uçtan uca, GEÇİCİ kökle (39 denetim): dönemli/dönemsiz sertifika, geçersiz dönem, kök profil dönem + açık null, http ret, sürüm sınırı, (dönem, sürüm) kilidi, bdp dönemi otomatik / farklı dönem ret / adres ret, ek denetimi, araç çıktılarının ERP `profilZarfiDogrula` / `kokZarfiCoz` ile uyumu. Mevcut `gizli/sertifikalar/profil_imza.sertifika.json` `dogrula` → GEÇERLİ, dönem 1. - `php -l`: BenomDeskImza, BenomDeskProfilService, AdminBenomDeskController, DeskBenomDeskController, kok-imzala, php_vektor_uret, kripto_yerel_test, tur2_yerel_test, profil_donem_yerel_test → 0 hata. - ÇALIŞTIRILMADI: MySQL'li `benomdesk_test.php` / `benomdesk_tur2_test.php` (sunucuda; statik incelemede beklentileri bozulmuyor), iki makineyle uçtan uca profil geçişi. ## Güvenlik turu — Görev E (dağıtım betikleri, D-E): ters yamayla geri alma, kendi-hunk commit'i, gizli dizin (2026-10-02) **Rust/istemci değişikliği YOK** — bu görev yalnız ERP paketinin `_kurulum/` betiklerini değiştirdi; sözleşme `MIMARI_EK_TUR2.md` "D-E". Bulgular: #13, #14, #15, #16, #17 (geri alma kısmı). - `yamala.py`: `--kayit ` (yamadan hemen önceki/sonraki hâl + sha256, canlı dosyadan ÖNCE yazılır), `--geri-al ` (yalnız kendi bloklarımızı 3 satır bağlamla çıkarır; bulunamaz/belirsizse dosyaya dokunmaz → "ELLE", çıkış 1); geçici dosyalar `mkstemp` (O_EXCL, rastgele ad), `.bak` `x` kipi; yama sırasında dosya değişirse taze içerikten yeniden üretir. - `yayinla.sh`: geri alma = ters yama; web.php → require yok + php -l + OPcache (yeni rota 404) + /login,/admin/login 200 doğrulanmadan yeni dosyalar SİLİNMEZ (çıkış 5); "+2 satır" denetimi yamanın kendi `once` kaydına göre; migration down "değerli satır" yoksa (nonce + anonim `eslestirme.hatali` sayılmaz); commit geçici `GIT_INDEX_FILE`'da (HEAD + kendi hunk'larımız `git apply --cached` / HEAD+yamala yedeği + paket içeriğinden yeni dosyalar), HEAD CAS + ≤3 yeniden deneme, ortak index'te yalnız kendi yollarımız eşitlenir, betik benomcore'a stdin'den; yedek `/root/benomdesk_yedekler/` (root 0700). - `geri_al.sh`: aynı ters yama + aynı silme kapısı (doğrulanamazsa yazılı "SIL" onayı), eski biçim yedekten kayıt üretme, migration down'da değerli/geçici satır ayrımı, çıkış 5 = kısmen. - `imza_anahtari_kur.sh` / `imza_sertifikasi_yukle.sh`: dizin yalnız sabit ya da `--dizin /home/benomcore/`; DB değeri yol değil (farklıysa DUR); symlink → DUR; var olan dizine chown/chmod yok; gizli dizinde her işlem benomcore (`su`) kimliğiyle; anahtar root'ta yalnız boruda; sertifika değişimi/geri dönüşü `mv -T`; stdin'den (`bash -s`) çalışır (`BASH_SOURCE[0]` unbound hatası giderildi). ### Doğrulama (2026-10-02, Git Bash 5.3 + Python 3.12.10 + PHP 8.2.34; yerel taklit ortam, canlıya dokunulmadı) - `bash -n` 5 betik: temiz. `py_compile yamala.py`: temiz. - `bash _kurulum/dagitim_betik_test.sh ` — yeni regresyon testi (yamala ters yama 15 denetim; yayinla/ geri_al uçtan uca 5 senaryo: başarı+commit, e2e düşer, web.php geri yazılamaz, değerli satır, ortak index hazırlığı; imza betikleri 25 denetim). Sonuç: **85 geçti, 0 HATA**. Ters yama kanıtı: özgün ağaç özeti f2bd084d… → yamalı 48810339… → ters yama sonrası f2bd084d… (web.php aa027a8a… → fd1736d9… → aa027a8a…); başka oturum değişiklikleri (bizim satırın hemen ardı, dosya sonu, solo paket bloğu, dil dosyası) korunarak geri alındı. - Aynı test ESKİ betiklerle (bulgular yeniden üretildi): imza 9 HATA (stdin unbound, DB yolu izlendi, symlink dizin, --dizin yok, sahip/kip zorla değişti); yayin 13 HATA — #14: yedekten sonra gelen başka oturum rotası "farkı 2 satır değil" → yedekten dönüşle SİLİNDİ; #13: require dururken routes/benomdesk.php silindi → /login 500; #17: e2e artığı down'u engelledi; #15: ortak index'te başka oturum hazırlığı varken kurulum hiç yapılamıyordu. - DOĞRULANMADI: gerçek sunucuda (root, CageFS altında `su benomcore`, OPcache) çalıştırma. ## Güvenlik turu — Görev B (oturum yaşam döngüsü, D-B): iptalde kes, önbellek düşürme, yerel ömür, nabız kesintisinde fail-closed (2026-10-02) Bulgular: #3 istemci tarafı (cihaz iptalinde açık oturumlar kesilmiyor, önbellek 60 sn daha yetkilendiriyordu), #4 istemci tarafı (session_id 0), #5 (`kes` ile kapanan bağlantı 60 sn önbellekten sunucuya sorulmadan geri dönüyordu), #6 (açık oturumun iptali ve 12 sa tavanı yalnız nabza bağlıydı; nabız başarısızsa oturum süresiz — fail-open). Sözleşme: `MIMARI_EK_TUR2.md` "D8+ (güvenlik turu)" → **D-B** (BAĞLAYICI). Sunucu değişikliği yok (ERP D9 iptal nabzıyla da, onsuz 401 `cihaz_iptal` ile de çalışır). `bilet.rs`, `imza.rs`, `profil.rs`, `client.rs` DEĞİŞMEDİ (önbellek `bilet.rs`'te kalır; düşürme, kayıt anından ÖNCE doğrulanmış izni reddeden ayrı defterle yapılır). | Dosya | Değişiklik | |---|---| | `src/benom/oturum.rs` (YENİ) | `Defter` (cihaz iptal anı, yetki → iptal anı, (yetki, oturum) → önbellek düşürme anı, genel önbellek düşürme, son başarılı nabız) + süreç geneli `DEFTER`. `izin_denetle`: `dogrulandi + min(gecerlilik, 12 sa)` aşıldı → `SuresiDoldu`; `dogrulandi ≤` cihaz/yetki iptal anı → `CihazIptal` / `YetkiIptal`; `max(son nabız, dogrulandi)`'dan 15 dk → `NabizKesintisi`. `onbellek_denetle` = bunlar + önbellek düşürmeleri. `kapi_b_denetle` (`izin.session_id == lr.session_id ≠ 0` + `izin_denetle`), `session_id_gecerli`, `cihaz_iptal(baglantilar)`, `kes(baglantilar)` (`hbbs_http::sync::baglantilari_kes`), `yetki_iptal`, `onbellek_dusur`, `nabiz_basarili`. Kayıt ömürleri: yetki iptali 12 sa + 2 dk, önbellek düşürme 5 dk; 1024 önbellek kaydında kayıt atılmaz, tüm önbellek düşer. `Gecersizlik::{kod, neden}`. | | `src/benom/nabiz.rs` | Yanıt saf işleve ayrıldı: `yaniti_coz(govde, bildirilen) → NabizKarari {kes, iptal_yetkiler, cihaz_iptal, profil_surum_hedef}` — `kes` elemanı `i32::try_from` (eski `as i32` 2^32+4'ü 4 numaralı bağlantıya çeviriyordu), `durum:"iptal"` → bildirilen TÜM bağlantılar eklenir, profil hedefi uygulanmaz. `gonder`: AKTIF anlık görüntüsü (istek + `kes` → yetki eşlemesi), önce `oturum::yetki_iptal`, iptalde `cihaz_iptali_uygula(neden, kes)`, değilse `oturum::kes` + `oturum::nabiz_basarili`. Yeni `aktif_baglantilar()`. Modül belgesi: yanıt imzasız → yalnız kapatma yönü. | | `src/benom/mod.rs` | `pub mod oturum`; `cihaz_iptal_edildi(neden)` → `cihaz_iptali_uygula(neden, ek_kes)`: ÖNCE `cihaz_iptali_oturumlara_uygula` (genel iptal anı + AKTIF ∪ `kes` kesilir), SONRA kimlik sil / olay kuyruğu / cihaz bilgisi. 401 `cihaz_iptal` veren her yol (nabız, olay, doğrulama) bundan geçer. | | `src/benom/olay.rs` | `kuyrugu_isle` tur başına ≤ 20 sn (`ISLEME_BUTCESI`), dolunca döngü uyandırılır: uzun kuyruk nabzı aç bırakıp yanlış 15 dk kesintisi doğurmasın. | | `src/server/connection.rs` | Ana döngü `second_timer`: `benom_canlilik_denetle()` → geçersiz izinde `send_close_reason_no_retry` + `on_close` (→ `oturum_bitti` nedeniyle); nabız kesintisinde ek `alarm {neden:"nabiz_kesintisi", aciklama, yetkili}`; yetkili ama Benom izni olmayan bağlantı (savunma) kapatılır. Kapı A: `session_id == 0` doğrulamaya gitmeden ret (`benom_yetkisiz_reddet`: olay yalnız bu bağlantıda önceden doğrulanmış yetkiye bağlanır, dakikada en çok bir; eski yetkisiz dalı da bu yardımcıya taşındı); aynı bağlantı izni `oturum::izin_denetle`'den de geçer; 60 sn önbellek yalnız `kimlik::eslesmis_mi()` iken ve `oturum::onbellek_denetle` geçerse; `/baglanti/dogrula` hatası/reddi → `oturum::onbellek_dusur(yetki, session)`. Kapı B: eşleşmiş cihaz + `oturum::kapi_b_denetle(izin, lr.session_id)`. CM "Kapat" (onay öncesi) → `onbellek_dusur` + `kullanici_reddetti`. `benom_oturum_basladi` AKTIF'e doğrulanmış `izin.session_id`'yi yazar. | ### Davranış (kısa) - Cihaz iptali (nabız `durum:"iptal"` ya da 401 `cihaz_iptal`): tüm Benom bağlantıları ≤ 1 sn'de kapanır (yayın + her saniyelik denetim), önbellek ve onay bekleyen bağlantı da geçersiz; kimlik sonra silinir (kapanış olayları kimlik silindiği için gitmez — sunucu kaydı D9 iptal nabzıyla ya da 600 sn sonra kapatır). - `kes`: bağlantı kapanır; o yetkiyle aynı oturumdan 60 sn içinde yeniden bağlanma önbellekten DÖNMEZ, sunucuya sorulur (ret). - Açık oturum, imzalı `gecerlilik_sn` (≤ 12 sa) dolunca nabızdan bağımsız kapanır. - Nabız 15 dk başarısız → açık/bekleyen Benom bağlantıları kapanır, `alarm` + `oturum_bitti` kuyruğa yazılır. - Kalan risk (MIMARI D-B.7): nabız yanıtı imzasız; OS'a kök ekletmiş TLS aracısı sahte başarıyla 15 dk kuralını atlatabilir, imzalı ömür tavanı yine işler. ### Doğrulama (Rust 1.75.0) - `cargo test --lib --features hwcodec,vram,flutter -- benom::` → **29 geçti / 0 kaldı** (yeni 10): `oturum::tests:: yerel_omur_ve_12_saat_tavani` (#6), `nabiz_kesintisi_fail_closed` (#6), `cihaz_iptali_tum_izinleri_dusurur` (#3), `kes_yetkisi_onbellekten_donmez` (#5), `ret_onbellegi_dusurur_acik_baglantiya_dokunmaz` (#5), `onbellek_kayit_siniri_fail_closed`, `session_id_sifir_ve_oturum_eslesmesi` (#4); `nabiz::tests::kes_yetkileri_ve_aralik` (#5), `iptal_tum_bildirilenleri_keser` (#3), `cihaz_iptali_aktif_oturumlari_keser` (#3 — AKTIF + yayın kanalı + süreç defteri; kimlik silme testte çağrılmaz). - `cargo check --release --lib --features hwcodec,vram,flutter` → çıkış 0; `+benom-test-ornegi` → çıkış 0; `src/benom` ve `connection.rs` kaynaklı uyarı yok. - `rustfmt --edition 2021 --check src/benom/*.rs` → 12 dosya temiz. - ÇALIŞTIRILMADI / DOĞRULANMADI: `connection.rs` döngüsünün kendisi birim testte yok (karar `oturum.rs`'te test edildi); iki makineyle uçtan uca kesme, gerçek 15 dk nabız kesintisi, canlı ERP iptal nabzı. ## Güvenlik turu — Görev V (doğrulama + test derlemesi, 2026-10-02) **Rust ya da istemci kaynağında değişiklik YOK.** Tek düzeltme ERP'de, Görev D ile A'nın sınırında kalan eksiğe yapıldı (EK **D-V**): `BenomDeskIstemciController::nabiz`, imzası doğrulanmış ama kaydı iptal edilmiş cihaz için 401 `cihaz_iptal` yerine artık `BenomDeskService::iptalCihazNabzi` sonucunu döndürüyor (200 `{durum:"iptal", kes:[…]}`). İstemci (D-B) iki yanıtı da aynı şekilde keser; istemcide değişiklik gerekmez. Regresyon testi `_kurulum/nabiz_iptal_yerel_test.php` 12/12; bağlantısız eski controller'la aynı test 6 HATA veriyor. `http_e2e_test.php`'nin iptal bölümü artık yalnız 200 `durum:"iptal"` kabul ediyor. - Doğrulama (hepsi geçti): - `cargo test --lib --features hwcodec,vram,flutter -- benom::` → 29/29 - `imza-test` → 9 + 13 - `kripto_yerel_test.php` → 117 - `php_vektor_uret.php` → PHP farkı 0 - `profil_donem_yerel_test.php` 38, `tur2_yerel_test.php` 60, `web_yerel_test.php` 146 - `benomdesk_js_test.js` → 26 - `dagitim_betik_test.sh` → 85 - `kok-imzala` uçtan uca → 39 - `php -l` 57 dosya → 0 hata; `rustfmt --check src/benom` (12 dosya) temiz; `bash -n` 5 betik temiz - Test derlemesi: `istemci-derle.ps1 -TestOrnegi -Atla kopru` (köprü imzası değişmedi). - `dist/BenomDesk-1.0.0-TEST-ORNEGI-win-x64/librustdesk.dll` SHA-256 `7ED9CE08…43C03561BC`. Bu değer bu derlemenin `target/release` çıktısıyla aynı (00:33:11; son kaynak değişikliği 00:03:21). - `BenomDesk.exe` SHA-256 `47C1425B…0943E72E`. - Duman testi: `--version` 1.4.9; `--get-id` kararlı; `BENOMDESK_TEST_ORNEGI=ikinci` farklı ID verdi; kurulum ya da servis yok. - Ayrıntı ve bulgu bazında durum: `GUVENLIK_TURU.md`. ## Otomatik liste — istemci (upstream `1.4.9` tabanına göre) Durum kodu: `M` değiştirildi, `A` eklendi, `D` silindi, `R` yeniden adlandırıldı, `?` izlenmeyen yeni dosya. | Durum | Dosya | `BenomDesk:` işareti | |---|---|---| | M | `Cargo.lock` | 0 | | M | `Cargo.toml` | 2 | | M | `flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-hdpi/ic_stat_logo.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-mdpi/ic_stat_logo.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xhdpi/ic_stat_logo.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xxhdpi/ic_stat_logo.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png` | 0 | | M | `flutter/android/app/src/main/res/mipmap-xxxhdpi/ic_stat_logo.png` | 0 | | A | `flutter/assets/LICENCE.txt` | 0 | | A | `flutter/assets/icon.png` | 0 | | M | `flutter/assets/icon.svg` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png` | 0 | | M | `flutter/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png` | 0 | | A | `flutter/lib/benom/benom_akis.dart` | 2 | | A | `flutter/lib/benom/benom_lisans.dart` | 1 | | A | `flutter/lib/benom/benom_servis.dart` | 12 | | M | `flutter/lib/common.dart` | 13 | | M | `flutter/lib/common/widgets/toolbar.dart` | 3 | | M | `flutter/lib/desktop/pages/connection_page.dart` | 3 | | M | `flutter/lib/desktop/pages/desktop_home_page.dart` | 4 | | M | `flutter/lib/desktop/pages/desktop_setting_page.dart` | 11 | | M | `flutter/lib/desktop/pages/install_page.dart` | 2 | | M | `flutter/lib/desktop/pages/server_page.dart` | 3 | | M | `flutter/lib/desktop/widgets/tabbar_widget.dart` | 2 | | M | `flutter/lib/main.dart` | 2 | | M | `flutter/lib/models/ab_model.dart` | 1 | | M | `flutter/lib/models/group_model.dart` | 1 | | M | `flutter/lib/models/model.dart` | 1 | | M | `flutter/lib/models/peer_tab_model.dart` | 1 | | M | `flutter/lib/models/user_model.dart` | 1 | | M | `flutter/macos/Runner/AppIcon.icns` | 0 | | M | `flutter/pubspec.lock` | 0 | | A | `flutter/test/benom_derin_baglanti_test.dart` | 78 | | M | `flutter/windows/runner/Runner.rc` | 1 | | M | `flutter/windows/runner/main.cpp` | 2 | | M | `flutter/windows/runner/resources/app_icon.ico` | 0 | | M | `res/128x128.png` | 0 | | M | `res/128x128@2x.png` | 0 | | M | `res/32x32.png` | 0 | | M | `res/64x64.png` | 0 | | A | `res/benomdesk_baslangic_profili.json` | 0 | | M | `res/design.svg` | 0 | | M | `res/icon.ico` | 0 | | M | `res/icon.png` | 0 | | M | `res/logo-header.svg` | 0 | | M | `res/logo.svg` | 0 | | M | `res/mac-icon.png` | 0 | | M | `res/mac-tray-dark-x2.png` | 0 | | M | `res/mac-tray-light-x2.png` | 0 | | M | `res/rustdesk-banner.svg` | 0 | | M | `res/scalable.svg` | 0 | | M | `res/tray-icon.ico` | 0 | | A | `src/benom/ayar.rs` | 5 | | A | `src/benom/imza.rs` | 1 | | A | `src/benom/mod.rs` | 4 | | A | `src/benom/profil.rs` | 28 | | M | `src/client.rs` | 2 | | M | `src/common.rs` | 8 | | M | `src/core_main.rs` | 3 | | M | `src/flutter_ffi.rs` | 3 | | M | `src/hbbs_http/sync.rs` | 4 | | M | `src/ipc.rs` | 1 | | M | `src/lang/en.rs` | 0 | | M | `src/lang/tr.rs` | 1 | | M | `src/lib.rs` | 1 | | M | `src/platform/windows.rs` | 2 | | M | `src/rendezvous_mediator.rs` | 3 | | M | `src/server.rs` | 3 | | M | `src/server/connection.rs` | 3 | | M | `src/ui/index.tis` | 0 | | M | `src/ui/install.tis` | 0 | | M | `src/ui_session_interface.rs` | 1 | | M | `src/updater.rs` | 6 | ## Otomatik liste — `libs/hbb_common` | Durum | Dosya | `BenomDesk:` işareti | |---|---|---| | M | `libs/hbb_common/Cargo.toml` | 1 | | M | `libs/hbb_common/protos/message.proto` | 2 | | M | `libs/hbb_common/src/config.rs` | 6 | | M | `libs/hbb_common/src/lib.rs` | 1 | ## Özet (`git diff --stat`) ``` Cargo.lock | 1 + Cargo.toml | 5 + .../app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3479 -> 3926 bytes .../res/mipmap-hdpi/ic_launcher_foreground.png | Bin 6026 -> 10221 bytes .../src/main/res/mipmap-hdpi/ic_launcher_round.png | Bin 5107 -> 3502 bytes .../app/src/main/res/mipmap-hdpi/ic_stat_logo.png | Bin 487 -> 891 bytes .../app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 1987 -> 2243 bytes .../res/mipmap-mdpi/ic_launcher_foreground.png | Bin 3641 -> 5600 bytes .../src/main/res/mipmap-mdpi/ic_launcher_round.png | Bin 3017 -> 2021 bytes .../app/src/main/res/mipmap-mdpi/ic_stat_logo.png | Bin 383 -> 555 bytes .../app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4237 -> 6011 bytes .../res/mipmap-xhdpi/ic_launcher_foreground.png | Bin 7659 -> 15620 bytes .../main/res/mipmap-xhdpi/ic_launcher_round.png | Bin 6202 -> 5236 bytes .../app/src/main/res/mipmap-xhdpi/ic_stat_logo.png | Bin 719 -> 1257 bytes .../app/src/main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7498 -> 11184 bytes .../res/mipmap-xxhdpi/ic_launcher_foreground.png | Bin 22530 -> 30125 bytes .../main/res/mipmap-xxhdpi/ic_launcher_round.png | Bin 10713 -> 9617 bytes .../src/main/res/mipmap-xxhdpi/ic_stat_logo.png | Bin 884 -> 2066 bytes .../src/main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 7409 -> 17313 bytes .../res/mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 31138 -> 48181 bytes .../main/res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 11189 -> 14834 bytes .../src/main/res/mipmap-xxxhdpi/ic_stat_logo.png | Bin 1389 -> 2896 bytes flutter/assets/LICENCE.txt | 661 ++++++++++ flutter/assets/icon.png | Bin 0 -> 46591 bytes flutter/assets/icon.svg | 2 +- .../AppIcon.appiconset/Icon-App-1024x1024@1x.png | Bin 32239 -> 252193 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 511 -> 735 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 989 -> 1677 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1545 -> 2824 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 755 -> 1091 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1510 -> 2640 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 2299 -> 4675 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 989 -> 1677 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 2086 -> 4175 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 3087 -> 7603 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 3087 -> 7603 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 4914 -> 13784 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1964 -> 3874 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 4152 -> 10712 bytes .../AppIcon.appiconset/Icon-App-83.5x83.5@2x.png | Bin 4494 -> 12251 bytes flutter/lib/benom/benom_akis.dart | 82 ++ flutter/lib/benom/benom_lisans.dart | 274 ++++ flutter/lib/benom/benom_servis.dart | 503 ++++++++ flutter/lib/common.dart | 106 +- flutter/lib/common/widgets/toolbar.dart | 9 +- flutter/lib/desktop/pages/connection_page.dart | 8 +- flutter/lib/desktop/pages/desktop_home_page.dart | 15 +- .../lib/desktop/pages/desktop_setting_page.dart | 214 ++-- flutter/lib/desktop/pages/install_page.dart | 29 +- flutter/lib/desktop/pages/server_page.dart | 14 +- flutter/lib/desktop/widgets/tabbar_widget.dart | 5 +- flutter/lib/main.dart | 6 +- flutter/lib/models/ab_model.dart | 4 +- flutter/lib/models/group_model.dart | 4 +- flutter/lib/models/model.dart | 4 +- flutter/lib/models/peer_tab_model.dart | 8 +- flutter/lib/models/user_model.dart | 4 +- flutter/macos/Runner/AppIcon.icns | Bin 27761 -> 530826 bytes flutter/pubspec.lock | 83 +- flutter/test/benom_derin_baglanti_test.dart | 262 ++++ flutter/windows/runner/Runner.rc | 18 +- flutter/windows/runner/main.cpp | 11 +- flutter/windows/runner/resources/app_icon.ico | Bin 1961 -> 44368 bytes libs/hbb_common | 2 +- res/128x128.png | Bin 2978 -> 14298 bytes res/128x128@2x.png | Bin 7689 -> 43803 bytes res/32x32.png | Bin 938 -> 1960 bytes res/64x64.png | Bin 1795 -> 5103 bytes res/benomdesk_baslangic_profili.json | 7 + res/design.svg | 375 +----- res/icon.ico | Bin 99678 -> 44368 bytes res/icon.png | Bin 40256 -> 337091 bytes res/logo-header.svg | 2 +- res/logo.svg | 2 +- res/mac-icon.png | Bin 35842 -> 246476 bytes res/mac-tray-dark-x2.png | Bin 612 -> 1734 bytes res/mac-tray-light-x2.png | Bin 586 -> 1129 bytes res/rustdesk-banner.svg | 2 +- res/scalable.svg | 89 +- res/tray-icon.ico | Bin 4286 -> 21527 bytes src/benom/ayar.rs | 352 ++++++ src/benom/imza.rs | 1124 +++++++++++++++++ src/benom/mod.rs | 219 ++++ src/benom/profil.rs | 1322 ++++++++++++++++++++ src/client.rs | 18 +- src/common.rs | 64 +- src/core_main.rs | 38 +- src/flutter_ffi.rs | 25 + src/hbbs_http/sync.rs | 6 +- src/ipc.rs | 6 + src/lang/en.rs | 4 +- src/lang/tr.rs | 35 +- src/lib.rs | 4 + src/platform/windows.rs | 5 + src/rendezvous_mediator.rs | 6 + src/server.rs | 9 + src/server/connection.rs | 31 + src/ui/index.tis | 12 +- src/ui/install.tis | 2 +- src/ui_session_interface.rs | 4 +- src/updater.rs | 14 +- 101 files changed, 5378 insertions(+), 733 deletions(-) Cargo.toml | 2 ++ protos/message.proto | 10 +++++++++ src/config.rs | 63 ++++++++++++++++++++++++++++++++++++++++++++++------ src/lib.rs | 4 +++- 4 files changed, 71 insertions(+), 8 deletions(-) ```