# FikoCAD Lisanslama — İşletme Kılavuzu

Offline, imzalı lisans dosyası (`.fkl`) + toleranslı makine kilidi. Online aktivasyon **yok**;
internet gerekmez, sunucu bakımı gerekmez.

İki üretim yolu var:

| Yol | Ne zaman |
|---|---|
| **GUI: Araçlar → 🏭 Lisans Üretici** | Normal satış. Komut kataloğunu görerek tıklamayla paket kurarsın. |
| **CLI: `fiko_lisans`** | Toplu/betikli üretim, şifreli çıktı, doğrulama, anahtar/parmak izi/yapı hash'i. |

İkisi de **aynı gövde biçimini** üretir ve **aynı ayrıştırıcıyla** doğrulanır.

## 0. Tek seferlik kurulum (üretici makine)

```
fiko_lisans anahtar %USERPROFILE%\.fikoyt\lisans_ozel.key
```

(Aynı işi GUI'de **Sağ sütun → İmzalama → 🔑 Yeni anahtar çifti üret** de yapar: özel
anahtarı seçtiğin dosyaya yazar, **açık anahtarı panoya** kopyalar.)

| Anahtar | Nereye |
|---|---|
| **ozel** (192 hane, X‖Y‖d) | Verdiğin dosyaya yazılır — **ekrana basılmaz** (terminal geçmişi/ekran görüntüsü sızıntı yoludur). ⚠️ Yedekle (şifreli disk/kasa). Kaybolursa kestiğin lisanslar doğrulanamaz; sızarsa herkes lisans üretir. |
| **acik** (128 hane) | `uygulama/fikocad/lisans_yukle.cpp` → `LISANS_ACIK_ANAHTAR_HEX` |

`.gitignore` `*.key`, `lisans_ozel*` ve `*.fkl` desenlerini kapsar — anahtar ve kesilmiş
lisanslar depoya giremez.

**Durum:** üretim anahtarı üretildi ve gömüldü (07-20). Özel anahtar:
`%USERPROFILE%\.fikoyt\lisans_ozel.key` — **bunu yedekle**.

Bu, sürüm-paketi imza anahtarından (`guncelleme_indir.cpp`) **ayrı** bir çift olmalı.

> Anahtar gömülmeden yapılan sürümde hiçbir lisans doğrulanamaz. Uygulama bunu
> günlüğe ve Komut Denetim penceresine kırmızı uyarı olarak yazar — sürüm çıkarmadan
> önce o uyarının kaybolduğunu gör.

> **Yeni anahtar çifti üretmek DAHA ÖNCE KESİLMİŞ TÜM LİSANSLARI geçersiz kılar.**
> Yalnız ilk kurulumda veya özel anahtar sızdıysa yap.

## 1. GUI Lisans Üretici (ana yol)

**Araçlar → 🏭 Lisans Üretici**

Menü komutu **yalnız üretici makinede kaydedilir**. Koşul (`belge_penceresi.cpp` →
`lisansUreticiModu()`):

1. `%USERPROFILE%\.fikoyt\lisans_ozel.key` dosyası **var**, veya
2. `FIKO_URETICI` ortam değişkeni dolu ve `0` değil (anahtarı taşınabilir diskte tutuyorsan).

Koşul sağlanmazsa komut **hiç kaydedilmez** → müşteride menüde, şeritte, komut paletinde
ve aramada **yoktur** (gri/gizli değil — yok). Müşteriye giden exe'de arayacak bir şey
kalmaz.

### Üç sütun

**Sol — 📚 Komut Kataloğu.** Uygulamanın kayıtlı tüm komutları, gruplu ve aranabilir
(kimlik / ad / grup üzerinden). Her satırda görünen ad + **lisans kimliği**. Kısayollar:

- `Grubu seç` — gruptaki tüm komutları seçime ekler.
- `+ geometri.*` — grubun tüm komutları aynı öneki paylaşıyorsa **grup jokeri** önerilir.
  Tek satırla grubun tamamı, **gelecekte eklenecek komutlar dahil**. Sürüm başına lisans
  yenilemek istemiyorsan jokeri tercih et.
- `+ grup=Geometri` — menü grubu whitelist'ine ekler (`grup=` satırı; komut gate'inden
  ayrı ikinci eksen).

**Orta — 📦 Paketler.** `+ Paket` ile satış paketi açarsın; her paketin kendi kimliği,
görünen adı, **kendi bitişi** ve **kendi kotaları** olur. `＋ Seçili komutları ekle`
soldaki seçimi aktif pakete yazar. Altta **Genel (paketsiz) haklar** bölümü: paket
kurmadan doğrudan komut/kota/grup vermek için — bunlar lisans geneli bitişe tabidir.

**Sağ — 🧾 Müşteri · Kilit · Üretim.** Müşteri/seri/ürün/seviye, kısıtlı kip, lisans geneli
bitiş, makine kilidi (müşteriden gelen satırları yapıştır ya da `🖥 Bu makineyi kullan`),
tolerans, yapı kilidi, özel anahtar yolu, çıktı yolu. Altta:

- **🔐 Lisans Üret** — gövdeyi kurar → imzalar → `imza=` satırıyla dosyaya yazar → **geri
  okuyup kendi ayrıştırıcımızla doğrular.** Biçim/sıra hatası müşteriye gitmeden burada
  yakalanır.
- **🔎 Doğrula (yazmadan)** — aynı zinciri dosyaya yazmadan çalıştırır.
- **Önizleme (canlı)** — o an üretilecek gövdenin tam metni. Ne sattığını satır satır gör.

**Zorunlu alanlar:** `seri` ve `urun`. Boşsa üretim reddedilir.

### GUI'nin bugünkü sınırları (bilerek not)

- **GUI çıktısı DÜZ METİN yazar** — zarf (şifreleme) uygulamaz. Şifreli `.fkl` istiyorsan
  şu an CLI ile imzala (bkz. §4). Müşteri gizliliği önemliyse üretimi CLI'dan yap.
- GUI kota dönemi listesi sabit beştir: `toplam / gün / hafta / ay / yıl`. **Serbest
  periyot** (`5saat`, `30dk`, `2gun`) yalnız gövdeyi elle yazıp CLI ile imzalayarak
  verilebilir.

## 2. Müşteriden makine parmak izi al

Müşteri: **Araçlar → 🔒 Komut Denetim → "Bu makinenin parmak izi" → Panoya kopyala**.

(Kendi makinen için: `fiko_lisans parmakizi`, ya da GUI'de `🖥 Bu makineyi kullan`.)

Sana şuna benzer satırlar gönderir:

```
makine=3f2a...   (kurulum — Windows MachineGuid)
makine=91be...   (disk — sistem birimi serisi)
makine=c07d...   (cpu — CPUID marka + çekirdek)
makine=5ea4...   (bios — SMBIOS üretici/ürün/anakart)
```

Dördü de bağımsız. Lisans `makineTolerans=3` ile kesilirse müşteri disk değiştirse veya
Windows'u yeniden kursa bile çalışmaya devam eder — destek yükünün en büyük kalemi budur.
Hiç `makine=` satırı yoksa **node-lock uygulanmaz** (lisans her makinede çalışır).

## 3. Lisans gövdesi (biçim referansı)

GUI bu metni senin yerine kurar; CLI kullanıyorsan elle yazarsın. İmza satırını **sen
ekleme**, araç ekler.

```
# FikoCAD Lisans v1
musteri=Akçalı Döküm
seri=FKC-2026-0001
urun=fikocad
seviye=pro
kisitli=1

# --- Genel (paketsiz) haklar: lisans geneli bitişe tabidir ---
komut=geometri.*
komut=dm.pushpull
komut=olcum.*
kota=cam.gkod:500

# --- Süre (unix saniye; satır yoksa süresiz) ---
bitis=2000000000

# --- Makine kilidi (müşteriden gelen satırlar) ---
makine=3f2a...
makine=91be...
makine=c07d...
makine=5ea4...
makineTolerans=3
```

Ayrıştırma kuralları (`motor/cekirdek/src/lisans_dosya.cpp`):

- UTF-8 BOM atılır, satırlar kırpılır, boş satırlar ve `#` yorumları düşer.
- `=` içermeyen satır **biçim hatasıdır** (lisans reddedilir).
- İmza, `imza=` satırı **hariç** kanonik gövde üzerinden doğrulanır → müşteri dosyayı
  Notepad'de açıp kaydetse (BOM/CRLF) imza bozulmaz; içeriği bir karakter değiştirirse
  reddedilir.

`kisitli=0` → tüm komutlar açık (kurumsal/sınırsız/demo). `komut=*` de aynı işi görür.

Komut kimliklerinin tam listesi: GUI'nin sol sütunu, ya da fikocad → **Komut Denetim →
"Katalog CSV"** düğmesi `lisans_katalog.csv` üretir (`kimlik;grup;ad;workbench;altGrup;fiyat`).
Fiyat sütununu sen doldurursun; satış tablon ile lisans dosyası aynı kimlikleri konuşur.

### 3.1 Paketler

`paket=` satırı bir **blok açar**: ondan sonra gelen `komut=` / `kota=` / `paket.bitis=`
satırları **o pakete** yazılır.

```
paket=modelleme
paket.ad=Modelleme Yıllık
paket.bitis=1893456000
komut=geometri.*
komut=feature.*
komut=dm.*

paket=cam
paket.ad=CAM 3 Aylık
paket.bitis=1790000000
komut=cam.*
kota=cam.gkod:100/ay
```

- **Sıra önemli:** paketsiz (genel) haklar **paketlerden ÖNCE** yazılmalı, yoksa son
  açılan pakete düşerler. GUI bunu otomatik doğru sıralar.
- `paket.bitis` yoksa/0 ise paket **lisans geneli bitişi** kullanır.
- **Paket bitişi lisans bitişini AŞAMAZ:** ikisi de doluysa `min(paket.bitis, bitis)`
  uygulanır (`lisansUygula`). "Lisans 1 yıl ama CAM paketi 3 yıl" yazamazsın.
- Aynı lisansta farklı bitişli paketler yaşayabilir — tipik satış: "Modelleme yıllık +
  CAM 3 aylık".
- Kimliksiz `paket=` satırı blok açmaz (GUI zaten atlar).
- **Süresi dolmuş paketin komutları menüde GÖRÜNÜR ama çalışmaz.** Kasıtlı: kullanıcı ne
  kaybettiğini görsün ve yenilesin. Red sebebi "satın al" değil **"süresi doldu"** olur.

### 3.2 Kotalar (serbest periyot)

```
kota=<kimlik|joker>:<adet>[/<periyot>]
```

Periyot metni `<sayı><birim>` — sayı yoksa 1 kabul edilir:

| Birim | Kabul edilen yazımlar | Örnek |
|---|---|---|
| saniye | `sn` `saniye` `s` | `90sn` |
| dakika | `dk` `dakika` `m` | `30dk` |
| saat | `saat` `sa` `h` | `5saat` |
| gün | `gun` `gün` `g` | `2gun`, `gun` (=1 gün) |
| hafta | `hafta` `hf` | `hafta` |
| ay | `ay` `a` | `ay` (30 gün) |
| yıl | `yil` `yıl` `y` | `yil` (365 gün) |

Periyot yoksa veya tanınmayan bir metinse → **0 = ömür boyu toplam** (sıfırlanmaz).
`limit=0` → sınırsız (kural yok sayılır).

> Eski belgelerdeki sabit `donem` (yalnız gun/hafta/ay/yil) biçimi **hâlâ geçerlidir** —
> serbest periyot onun üst kümesidir. `/ay` yazmak `/1ay` demektir.

**Aynı komuta birden çok kota yazılabilir; hepsi ayrı kovadır ve HEPSİ sağlanmalı:**

```
kota=cam.gkod:5/5saat
kota=cam.gkod:30/hafta
```

→ "5 saatte en fazla 5, ayrıca haftada en fazla 30". Biri dolarsa komut reddedilir.
Kova anahtarı `desen#periyot` olduğu için iki kural çakışmaz.

⚠️ **Aynı deseni aynı periyotla iki kez yazma** — ikisi de aynı kovayı artırır, her
kullanım 2 sayılır. GUI'de kota tablosunda tekrar satır oluşturmamaya dikkat et.

**Pencere ANKRAJLIDIR — takvim bloğu DEĞİL.** Sayaç penceresi kullanıcının **ilk
kullanımında** başlar ve tam `periyot` saniye sonra biter; sonra sıfırlanıp yeniden başlar.

> Örnek: `kota=cam.gkod:5/5saat`. Müşteri Salı 14:10'da ilk G-kodu üretti → pencere
> Salı 14:10–19:10 arası. Bu aralıkta 5 hakkı var. 19:10'dan sonraki ilk kullanım **yeni**
> bir 5 saatlik pencere açar. "Takvimde saat 15 oldu, hak yenilendi" **olmaz**.
>
> Aynı şey `/ay` için de geçerli: ayın 1'i değil, ilk kullanımdan 30 gün sonrası.

Kotanın kalanını müşteri **Ayarlar → Lisans → "Kullanım hakları (kota)"** tablosunda görür
(komut · dönem · kullanım/limit · kalan; paketli kotalarda paket adı ipucu olarak).

### 3.3 Merkezi kota sayacı

Sayaçlar **cihaz geneli** tek dosyada yaşar:

```
%ProgramData%\FikoCAD\lisans_sayac.dat
```

- Her artırım **dosya kilidi** altında oku-artır-yaz yapar → süreçler arası atomik.
  İkinci fikocad süreci, yeni belge penceresi ve yeniden açılan uygulama **aynı hakkı
  paylaşır**. (Süreç-içi bellek sayacı yeterli değildi: iki pencere "ayda 50"yi 100
  yapıyordu.)
- Kayıt satırı **HMAC'lidir** ve HMAC anahtarı makine parmak izinden türer → kullanıcı
  sayacı elle düşüremez, dosyayı başka makineye taşıyamaz. Bozuk satır yok sayılır
  (en kötü ihtimal: sayaç sıfırlanmaz — yani red, düşürme değil).
- Dosya silinirse ikinci kaynak (kullanıcı ayarı `lisans_kota`) devreye girer ve **iki
  kaynağın büyüğü** alınır → tek dosyayı silmek hakkı tazelemez.

## 4. İmzala ve doğrula (CLI)

```
fiko_lisans imzala musteri.txt %USERPROFILE%\.fikoyt\lisans_ozel.key AkcaliDokum.fkl
fiko_lisans dogrula AkcaliDokum.fkl <acikHex>
```

`imzala` özel anahtarı hem hex dizge hem **dosya yolu** olarak kabul eder (komut satırına
yapıştırmak zorunda kalma; terminal geçmişine düşer).

`dogrula` çıktısı müşteriye ne sattığını okunur biçimde gösterir — müşteri/seri/ürün/kip/
bitiş, komut hakları, makine sayısı+tolerans, kotalar ve **paket paket** içerik.
**Teslimden önce mutlaka çalıştır.** Şifreli/düz fark etmez, ikisini de açar.

Diğer komutlar:

| Komut | İş |
|---|---|
| `fiko_lisans anahtar [ozel.key]` | ECDSA P-256 çifti üret (özel dosyaya, açık ekrana) |
| `fiko_lisans parmakizi` | BU makinenin `makine=` satırları + önerilen tolerans |
| `fiko_lisans yapi fikocad.exe` | Dağıttığın ikilinin `yapi=` hash'i |

### Şifreleme (zarf)

`.fkl` çıktısı CLI'da **varsayılan olarak şifrelidir**: `FKLE1` başlık satırı + 76 sütuna
kırılmış base64(AES-256-GCM). Tamamı ASCII — e-postayla gönderilebilir.
`--duz` bayrağı eski düz metin biçimini yazar (hata ayıklama).

```
fiko_lisans imzala musteri.txt ozel.key AkcaliDokum.fkl          → şifreli
fiko_lisans imzala musteri.txt ozel.key AkcaliDokum.fkl --duz    → düz metin
```

- **Amaç GİZLİLİK, güvenlik değil.** Zarf anahtarı dağıtılan exe'nin içindedir; tersine
  mühendis bulur ve açar. Sahtelenemezlik tamamen **ECDSA imzasından** gelir — zarf açılsa
  bile kurcalanmış lisans reddedilir. Kazandığın şey: sıradan müşteri `.fkl`'i Notepad'de
  açıp hangi komutları/kotaları/makine hash'lerini aldığını okuyamaz, elle düzenlemeye
  kalkışmaz.
- **Düz metin eski lisanslar çalışmaya devam eder:** dosya `FKLE1` ile başlamıyorsa
  içerik olduğu gibi ayrıştırılır (geriye uyum).
- Zarflı ama çözülemiyorsa (bozuk dosya) lisans "yok" sayılır.

## 5. Müşteriye teslim

Dosya şu yerlerden aranır (bu sırayla):

1. `FIKO_LISANS` ortam değişkeni (tam yol)
2. `fikocad.exe` yanına `lisans.fkl`
3. `%ProgramData%\FikoCAD\lisans.fkl`
4. `fikocad.exe` yanındaki **`lisanslar\`** klasöründeki tüm `*.fkl` (ada göre sıralı)
5. `%ProgramData%\FikoCAD\lisanslar\` içindeki tüm `*.fkl` (ada göre sıralı)

### Çoklu lisans (haklar birleşir)

`lisanslar\` klasöründe kaç `.fkl` varsa hepsi yüklenir ve **haklar BİRLEŞİR**. Müşteri
sonradan paket satın alınca **ikinci dosyayı bırakırsın, eskiye dokunmazsın** — en temiz
yükseltme yolu budur.

- Her dosya **ayrı ayrı** imza + makine + yapı doğrulamasından geçer. Biri geçersizse
  **yalnız o atlanır** (günlüğe yazılır), diğerleri çalışmaya devam eder. En az biri
  geçerliyse oturum geçerlidir.
- Birleştirmede **GENİŞ olan kazanır**: biri `kisitli=0` diyorsa kip serbest olur; biri
  süresizse genel bitiş süresiz olur, aksi hâlde en uzun bitiş alınır.
- İlk geçerli lisans "ana" bilgi sayılır (durum panelinde müşteri/seri o gösterilir);
  hepsi **Ayarlar → Lisans → "Yüklü lisans dosyaları"** listesinde görünür.
- Sıra sabittir (ada göre sıralı) → her açılışta aynı politika oluşur.

Müşteri dosyayı Notepad'de açıp kaydetse bile (BOM/CRLF eklenir) imza bozulmaz.
İçeriği tek karakter değiştirirse lisans reddedilir.

## 6. Süre modelleri — dört kalıp

**a) Yıllık abonelik** (en yaygın). Tek bitiş, her yıl yeni `.fkl` gönderirsin.

```
musteri=Akçalı Döküm
seri=FKC-2026-0001
urun=fikocad
kisitli=1
komut=geometri.*
komut=feature.*
komut=olcum.*
bitis=1893456000
makine=...   (×4)
makineTolerans=3
```

**b) Süresiz (perpetual).** `bitis` satırını **hiç yazma**. Sürüm güncellemesi de dahil
sonsuza kadar çalışır; `yapi=` **koyma** (koyarsan her güncellemede lisans yenilemen gerekir).

```
musteri=Akçalı Döküm
seri=FKC-2026-0002
urun=fikocad
kisitli=1
komut=*
makine=...   (×4)
makineTolerans=3
```

**c) Süresiz çekirdek + yıllık bakım.** Klasik CAD modeli: ana lisans süresiz, bakım/yeni
modüller yıllık pakette. İki paket, tek dosya:

```
musteri=Akçalı Döküm
seri=FKC-2026-0003
urun=fikocad
kisitli=1

paket=cekirdek
paket.ad=Çekirdek (süresiz)
komut=geometri.*
komut=feature.*
komut=dosya.*
komut=olcum.*

paket=bakim
paket.ad=Bakım 2026
paket.bitis=1893456000
komut=cam.*
komut=pafta.*
```

> Bakım paketi bitince CAM/pafta komutları **görünür ama çalışmaz**; çekirdek modelleme
> etkilenmez. Müşteri yenilerse `lisanslar\` klasörüne yeni bir bakım `.fkl`'i bırakman
> yeter (§5 çoklu lisans).
>
> Sürüme kilitli süresiz istiyorsan (`yapi=` ile): bu kalıba `yapi=<hash>` ekle.
> `fiko_lisans yapi fikocad.exe` ile hash'i al. **Her sürümde lisans yenilemek gerekir** —
> bilinçli tercih, varsayılan olarak kullanma.

**d) Deneme + yıllık.** Önce dar/kısa deneme, sonra tam lisans. İki ayrı dosya olarak
gönder; ikincisi geldiğinde `lisanslar\` içinde birleşirler.

```
# deneme.fkl — 30 gün, kotalı
musteri=Deneme
seri=FKC-TRIAL-0007
urun=fikocad
kisitli=1
bitis=<şimdi + 30 gün>

paket=deneme
paket.ad=30 Gün Deneme
komut=geometri.*
komut=dosya.step_ice
kota=dosya.step_disa:5/gun
kota=cam.gkod:3/hafta
```

Denemede **makine kilidi koymayabilirsin** (kurulum kolaylığı) — süre + kota zaten sınırlar.
Satış olunca (a) veya (c) kalıbıyla asıl lisansı kes.

## 7. Lisanssız / geçersiz davranış

`lisans.zorunlu` ayarı (Ayarlar → Lisans):

| Ayar | Lisans yok/geçersizken |
|---|---|
| **Kapalı** (varsayılan) | Hiçbir kısıt — geliştirme/deneme yapısı |
| **Açık** | **Tam kilit** (aşağıdaki tablo). Viewport üstünde kalıcı 🔒 uyarı şeridi, reddedilen işlemde ayrıca toast. |

Tam kilit şu hâllerin **ortak** sonucudur: lisans yok · imza geçersiz · süresi dolmuş ·
başka makine · yamalı yapı. Tek yerde tanımlıdır (`lisans_yukle.cpp` →
`goruntuleyiciKipiUygula`) — bir kanalı unutmak, o durumda gizmoyla modellemenin açık
kalması demekti (yaşandı).

> **2026-08 karar:** önceki davranış ("görüntüleyici kipi" — dosya açma/kaydetme,
> görüntüleme, ölçüm serbest kalırdı) **kaldırıldı**. Artık lisanssızken dosya açma dahil
> hiçbir üretken işlem çalışmaz. Gerekçe: destek/idare hattı hâlâ açık (aşağıya bak),
> bu yeterli görüldü.

### Tam kilitte ne açık, ne kapalı

| Açık | Kapalı |
|---|---|
| `arac.komut_denetim` — lisans/makine kimliği penceresi | **Her şey diğer:** `dosya.*` (yeni/aç/kaydet/step/mesh/apt/webcad dahil), `gorunum.*`, `secim.*`, `olcum.*`, tüm modelleme (`geometri.*`, `dm.*`, `feature.*`, `yuzey.*`, `sketch.*`), `cam.*`, `analiz.*`, `dokum.*`, `pafta.*` |
| `arac.ayarlar` — uygulama ayarları | |
| `arac.guncelleme` — sürüm kontrolü | |
| `arac.geri_bildirim` — destek hattı | |

Sürükle-bırak da aynı kapıdan geçer — hiçbir dosya türü lisanssızken açılmaz.

### Satın alınmayan komutlar görünmez

Lisansta olmayan komut menüde, şeritte, toolbar'da, komut paletinde ve sağ-tık radyal
menüsünde **hiç görünmez** (gri/pasif değil — yok). Tek merkez: `MenuKaydi` görünürlük
kapısı, mevcut `etkinMi` sözleşmesini sarmalar; komutun kendi bağlam koşulu korunur (VE'lenir).

Kullanıcı ne satın alabileceğini **Komut Denetim → "Kilitli komutlar (satın alınabilir)"**
listesinden görür: grup › ad ve kimlik. Müşteri sana o kimliği söyler, sen lisansa
`komut=<kimlik>` satırı eklersin.

Tek kural bilinçli kaldı: **kullanıcı kendini dışarı kilitleyemez.**
`arac.komut_denetim` (lisans yükleme penceresi) her zaman açık — lisansı biten/hiç
olmayan müşteri en azından makine kimliğini gönderip lisans talep edebilir. Bu,
`lisans_goruntuleyici_kipi_step_ucretli_lisans_penceresi_acik` testiyle kilitlidir; liste
değişirse testi de güncelle (`lisans_yukle.cpp` içindeki `TEMEL_IZINLI_KOMUTLAR` dizisi
ile testteki liste ikizdir — test adı eski davranıştan kaldı, yeniden adlandırılmalı).

**Önceden not düşülen risk, artık geçerli değil:** "kaydetmeden çalışan müşterinin verisi
rehin kalmaz" gerekçesiyle `dosya.kaydet` açık tutuluyordu. Bilinçli kaldırıldı — süresi
dolan/lisansı bozulan müşteri kaydedilmemiş çalışmasını kurtaramaz. Bunu isteyen taraf
riski kabul etmiş sayılır.

### Saat geri alma

Offline lisansın klasik açığı: kullanıcı sistem saatini geri alıp süresi dolmuş lisansı
yeniden çalıştırır. Her açılışta görülen **en büyük zaman** kalıcı ayara yazılır
(`lisans_son_zaman`); şimdiki zaman ondan **1 günden fazla** geriyse saat oynanmış sayılır.

- Tolerans 1 gün: saat dilimi/yaz saati/NTP düzeltmesi meşru küçük geri gidişler yapar.
- Tespit edilirse **yalnız SÜRELİ lisanslar** geçersiz sayılır; **süresiz lisans
  etkilenmez** (yanlış pozitifte müşteriyi kilitlememek için).
- Durum panelinde "⚠ Sistem saati geri alınmış" uyarısı çıkar.

## 8. Koruma katmanları (ne yapar, ne yapmaz)

| Katman | Durdurduğu |
|---|---|
| ECDSA P-256 imza | Lisans dosyasını elle düzenleme |
| AES-256-GCM zarf (`FKLE1`) | Müşterinin lisans içeriğini okuması (gizlilik; güvenlik değil) |
| Toleranslı makine kilidi | Lisansı başka makineye kopyalama |
| Yapı kilidi (opsiyonel `yapi=`) | Yamalanmış/başka sürüm ikili ile kullanma |
| Politika mührü | Bellekten hak enjekte etme (debugger) |
| Dağınık kontrol noktaları | Tek bir kontrolü NOP'layarak sökme (her 32 komutta mühür denetimi + kaydet/dışa aktar/CAM üretimi noktalarında sağlık kapısı) |
| Komut + düzenleme kapısı | Komutu atlayan doğrudan modelleme (gizmo/sketch/ağaç/renk bandı) |
| HMAC'li merkezi sayaç | Kota sayacını elle düşürme, dosyayı silerek hak tazeleme, ikinci pencereyle çift hak |
| Saat geri alma tespiti | Sistem saatini geri alıp süreli lisansı diriltme |

Mühür bozulursa politika **sıfırlanır** ve en kısıtlı hâle (tam kilit, §7) düşülür —
sebep günlüğe ve olaya yazılır, sessiz yanlış davranış yok.

**Yapmadığı:** kararlı bir tersine mühendisin ikiliyi tamamen sökmesini engellemez. Hiçbir
native koruma bunu yapmaz. Hedef, kırmayı ekonomik olmaktan çıkarmaktır.

**Bilerek yapılmayan:** lisanssız kopyada geometri/hesap sonucunu bozmak. Yaygın bir teknik
ama sessizce yanlış CAD çıktısı üretir ve o parça gerçekten işlenir. Kısıtlama her zaman
görünür (kalıcı banner + toast) — sessizce yanlış davranmaz.

## 9. Satış öncesi kontrol listesi

1. `urun=fikocad` ve `seri` dolu mu? (zorunlu)
2. Genel haklar paketlerden **önce** mi? (GUI kullanıyorsan otomatik)
3. Paket bitişi lisans bitişini aşıyor mu? (aşarsa sessizce kırpılır — istediğin bu mu?)
4. Aynı desen+periyot ikinci kez yazılmış mı? (çift sayım)
5. `makineTolerans` müşterinin gönderdiği alan sayısından büyük değil mi?
6. `yapi=` gerçekten istiyor musun? (her güncellemede lisans yenileme demek)
7. **`dogrula` çalıştırıldı mı** ve çıktı sattığınla birebir mi?

## 10. Uzaktan lisans kontrolü (kill-switch / izin listesi)

Lisans dosyasını değiştirmeden, İSTEDİĞİN AN uzaktan izin verip engelleyebilirsin.
Mekanizma: imzalı bir **politika dosyasını** herhangi bir statik sunucuda tutarsın;
uygulama açılışta + 6 saatte bir çeker, imzasını doğrular, önbelleğe yazar ve
lisans serilerine karar uygular.

### Nasıl çalışır

| Adım | Kim yapar | Ne olur |
|---|---|---|
| 1. Politika gövdesini yaz | sen | düz metin: `surum/zaman/mod/engelle/izin/mesaj` |
| 2. İmzala | `fiko_lisans politika-imzala` | lisansla AYNI özel anahtar; `imza=` satırı ekler |
| 3. Sunucuya koy | sen | GitHub Pages / web host / S3 — statik dosya, API gerekmez |
| 4. Adresi bildir | sen | istemcide Ayarlar → Lisans → "Uzaktan kontrol" URL'si (veya derlemede göm) |
| 5. Çek + doğrula + önbellek | uygulama | `%ProgramData%\FikoCAD\lisans_uzak.pol` (imzalı → elle düzenlenemez) |
| 6. Karar uygula | uygulama | engelli seri → lisans geçersiz, tam kilit + kırmızı banner |

### Politika biçimi

```
# FikoCAD Uzak Politika v1
surum=3                ← her değişiklikte ARTTIR (geri sarma koruması: eski sürüm reddedilir)
zaman=1756100000       ← unix saniye (bilgi amaçlı)
mod=engelli            ← "engelli" = listedekiler KAPALI (kara liste; varsayılan)
                       ← "izin"    = YALNIZ listedekiler AÇIK (beyaz liste)
engelle=FKC-2026-0001  ← seri no (mod=engelli iken anlamlı)
izin=FKC-2026-0010     ← seri no (mod=izin iken anlamlı)
mesaj=Ödeme gecikmesi  ← engellenen kullanıcıya gösterilecek ileti (opsiyonel)
imza=<base64>          ← araç ekler; ELLE EKLEME
```

Üretim:

```
fiko_lisans politika-imzala politika.txt %USERPROFILE%\.fikoyt\lisans_ozel.key uzak_politika.txt
fiko_lisans politika-dogrula uzak_politika.txt <acikHex>   ← sunucuya koymadan ÖNCE test et
```

### Güvenlik modeli

- Karar yetkisi TAMAMEN ECDSA imzasından gelir — lisansla aynı anahtar çifti.
  URL'yi değiştirmek saldırgana bir şey kazandırmaz: bizim özel anahtarımızla imza atamaz.
- Önbellek imzalıdır → makine çevrimdışıyken bile SON BİLİNEN karar süresiz geçerlidir
  (**kalıcı kill-switch**: bir kez denetlenmiş makineyi sonradan kapatabilirsin).
- Hiç denetlenmemiş makinede (önbellek yok) karar **Belirsiz**'dir → fail-open
  (yanlış pozitif kilitleme yok). Tam kontrol istersen `mod=izin` (beyaz liste) kullan:
  listede olmayan HER seri engellenir.
- Sürüm geri sarma koruması: daha düşük `surum=` kabul edilmez.

### İstemci davranışı

- Denetim: açılışta (önbellek senkron yüklenir) + arka planda 6 saatte bir +
  Komut Denetim'deki "Şimdi denetle" düğmesi.
- Engellenen müşteri: tam kilit + viewport'ta **kırmızı** banner
  ("⛔ Lisansınız satıcı tarafından UZAKTAN ENGELLENDİ") + politikanın `mesaj=` metni.
- Durum: Ayarlar → Lisans (özet satır) ve Araçlar → 🔒 Komut Denetim →
  "Uzaktan lisans kontrolü" bölümü (aktif sürüm, liste, son denetleme, URL ayarı).
- Üretici makinesi (`lisans_ozel.key` var) uzak politikadan muaftır — kendi
  kesmiş olduğun lisansları inceleyebilirsin.
