Documentation
¶
Overview ¶
Package verify, bir oturumun kanıtının ne söylediğine karar verir: kaydın zinciri (verify.go) ve kaydın mührüyle defterin uyuşması (journal.go).
⚠️ İKİ EKSEN AYRI DURUYOR ve bu, paketin en önemli özelliği. Zincir "dosya yazıldığından beri değişti mi" sorusunu cevaplıyor; defter kontrolü "kaydın saydığı olayların satırları duruyor ve aynı şeyi söylüyor mu" sorusunu. Birini diğerinin sonucuna bağlamak — örneğin zinciri tutan bir kaydı "defteri de tamdır" diye okumak — hiç yapılmamış bir kontrolü yapılmış saymak olurdu.
⚠️ NİYE AYRI BİR PAKET. Bu kararı iki yer soruyor: `postern session verify` ve panelin doğrulama ucu. İkisi ayrı ayrı yazılsaydı ayrışmaları KAÇINILMAZ olurdu — ve ayrıştıkları gün ortaya çıkan şey, aynı kayıt için farklı iki cevap veren bir denetim aracı. Bir denetçinin en son isteyeceği şey bu.
Paket I/O yapmıyor denecek kadar az yapıyor: kararlar saf, kovaya tek bir HEAD isteği var ve o da bir arayüzün arkasında. Böylece asıl iddialar bir kova ayağa kaldırmadan sınanabiliyor.
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type HeadReader ¶
* HeadReader, nesnenin üstverisini okuyan şey. * * Arayüz TÜKETİCİ tarafında: gerçek bir kova ayağa kaldırmadan "kova ne * derse desin karar doğru mu" sorusu sorulabilsin diye. Bu depoda tekrar * eden ders — somut tiple yazılan bir bağımlılık, pratikte hiç * sınanmayan bir dal bırakıyor.
type JournalResult ¶
type JournalResult struct {
State JournalState
// Events, kaydın mühür satırındaki olay sayısı.
Events int64
// Rows, defterde DURAN, kayıtta da karşılığı olan satır sayısı.
Rows int64
// Lost, postern'in kaybettiğini bildiği olay sayısı.
Lost int64
/*
* DigestChecked, satırların ÖZETİNİN karşılaştırıldığı.
*
* ⚠️ ÇIKTIDA SÖYLENMEK ZORUNDA. Sayı tutan ama özeti hiç
* karşılaştırılmamış bir oturum ile ikisi de tutan bir oturum aynı
* "OK"u alırsa, yapılmamış bir kontrol yapılmış sayılır. Özet
* yalnızca satır sayısı beklenenle aynıyken ve mühürde bir özet
* varken karşılaştırılabiliyor.
*/
DigestChecked bool
// Detail, sonucun tek cümlelik ve iddiasını aşmayan gerekçesi.
Detail string
/*
* Summary, karşılaştırılan iki sayının cümlesi. Ölçülmemiş oturumda
* BOŞ: karşılaştırılan bir şey yok.
*
* ⚠️ CÜMLE BURADA KURULUYOR, ÇAĞIRANLARDA DEĞİL. İki yüzey de aynı
* sayıları yazıyor (`postern session verify` ve panel); metni iki
* yerde kurmak, tekil/çoğul gibi ufak farkların aynı oturum için
* iki farklı cümleye dönüşmesi demekti.
*/
Summary string
}
JournalResult, karşılaştırmanın sonucu ve onu üreten sayılar.
Sayılar dışarı çıkıyor çünkü olay müdahalesinin sorusu "kaç satır" değil "hangi satırlar": kaç tanesinin eksik olduğunu bilmeden, kaydı açıp hangi olayların defterde karşılığı olmadığını aramak mümkün değil.
func JournalOf ¶
func JournalOf(sess model.Session, files []store.SessionFile) JournalResult
* JournalOf, kaydın mührünü defterdeki satırlarla karşılaştırır: hem * SAYIYI hem satırların ÖZETİNİ. * * ⚠️ KARAR TEK YERDE, ÇÜNKÜ İKİ YÜZEY SORUYOR: `postern session verify` * ve panelin oturum ayrıntısı ucu. İki ayrı uygulama ayrışır ve * ayrıştıkları gün ortaya çıkan şey, aynı oturum için farklı iki cevap * veren bir denetim aracı olur — OffBox kararının burada durmasının * gerekçesinin aynısı. * * ⚠️ İKİ SORU, İKİ AYRI MÜDAHALE. Sayı "kaç satır" diyor ve SİLMEYİ * yakalıyor; özet "hangi satırlar" diyor ve DEĞİŞTİRMEYİ yakalıyor. * Yalnızca sayıya bakan bir kontrol, "/etc/shadow" yazan bir satırı * "/tmp/notlar" yapan bir UPDATE'i göremez — ve göremediği için de * "defter tam" der. * * ⚠️ XOR'UN BEDELİ BURADA KAPANIYOR. Özet sıradan bağımsız olsun diye * XOR'lanıyor (bkz. sftpcast.Seal) ve bunun bedeli, aynı satırdan çift * sayıda silmenin özeti değiştirmemesi. Sayı tam da onu görüyor: çift * silme sayıyı iki azaltır. İkisinden birini atmak, ötekinin * yakalayamadığını görünmez yapar. * * ⚠️ NE KANITLAR, NE KANITLAMAZ. Karşılaştırılan iki değer de bu * makinenin veritabanından geliyor; burada root olan biri satırları, * sayıyı ve özeti birlikte yeniden yazabilir. Kapatılan açık daha dar * ve gerçek: defterden satır silmek ya da bir yolu değiştirmek, kaydı * yeniden yazıp zinciri hesaplamaktan çok daha ucuz bir müdahale ve * bugüne kadar hiçbir şey onu görmüyordu. Mühür satırının kendisi * kaydın içinde duruyor ve zincir onu kapsıyor — yani karşılaştırılan * değerlerin kutu dışı bir kopyası da var.
type JournalState ¶
type JournalState int
* JournalState, defterin kaydın mührüyle tutup tutmadığı. * * ⚠️ NEDEN BEŞ DURUM, "TAMAM/DEĞİL" DEĞİL. Aynı aritmetik (satır sayısı * mühürden eksik) üç bambaşka olaydan çıkabiliyor: postern'in kendi * kaybı, sonradan silinmiş satırlar, ve hiç ölçülmemiş bir oturum. * İkiye indirgeyen bir cevap ya eski oturumların tamamını suçlar ya da * gerçek bir kaybı "geçti" diye yutar.
const ( /* * JournalUnmeasured, karşılaştırılacak bir sayı YOK. * * ⚠️ "GEÇTİ" DEĞİL. Göç 037'den önce kapanmış oturumlarda ve kaydı * hiç tutulmamış oturumlarda mühür satırı yok; onları tamam * göstermek, hiç yapılmamış bir kontrolü yapılmış saymak olurdu. * Zincirin "baş yok → doğrulanamaz" kararının aynısı. */ JournalUnmeasured JournalState = iota // JournalIntact, mühürdeki her olayın defterde bir satırı var. JournalIntact /* * JournalIncomplete, postern olayları KENDİ kaybetti ve bunu * biliyor: satır sayısı, kaybettiğini söylediği kadar eksik. * * Kanıt yine eksik — ama sebebi belli ve müdahale değil. */ JournalIncomplete /* * JournalMissing, satırlar postern'in kaybıyla AÇIKLANAMAYACAK * kadar eksik. * * ⚠️ BU, DEFTERDEN SATIR SİLİNDİĞİNİN İŞARETİ. Kaydı yeniden yazan * biri zinciri de yeniden hesaplar (SECURITY.md); ama defterden bir * satır silmek çok daha ucuz bir müdahale ve bugüne kadar hiçbir * şey onu görmüyordu. */ JournalMissing /* * JournalAltered, satır sayısı tutuyor ama satırların ÖZETİ * tutmuyor: en az bir satırın içeriği, kayıttaki karşılığından * farklı. * * ⚠️ SİLMEKTEN DAHA İNCE BİR MÜDAHALE. Silinen satır hiç değilse * bir boşluk bırakıyor ve sayım onu görüyor; değiştirilen bir satır * — "/etc/shadow" yerine "/tmp/notlar" yazan bir UPDATE — tam bir * denetim kaydı gibi duruyor. Sayıya bakan bir kontrol bunu * göremez, ve göremediği için de "defter tam" der. */ JournalAltered /* * JournalExtra, defterde mühürün saymadığından FAZLA satır var. * * ⚠️ SESSİZ GEÇİLMİYOR. Bugün bunun bilinen bir yolu yok: kayda * girmeyen satırlar (kanal düzeyindeki retler) zaten sayıma * girmiyor. Yani bu ya uydurulmuş satır ya da postern'in kendi * muhasebesindeki bir arıza — ikisi de duyurulmayı hak ediyor. */ JournalExtra )
func (JournalState) OK ¶
func (s JournalState) OK() bool
* OK, denetçiye "bu oturumda arayacak bir şey yok" denebilir mi. * * ⚠️ Unmeasured OK SAYILIYOR ve sınırı çağıran SÖYLEMEK ZORUNDA: hiç * yapılmamış bir kontrol bir bulgu değildir, ama onay da değildir. Bu * yüzden Detail her durumda dolu.
func (JournalState) String ¶
func (s JournalState) String() string
type OffBox ¶
type OffBox struct {
State OffBoxState
Detail string
// Chain/Links, kovadaki nesnenin taşıdığı değerler.
Chain string
Links string
// Object, "kova/anahtar" — olay müdahalesinde nereye bakılacağı.
Object string
}
OffBox, arşivdeki kopyanın okunmasının sonucu.
func OffBoxOf ¶
func OffBoxOf(ctx context.Context, client HeadReader, st store.ArchiveState, found bool, wantChain string) OffBox
* OffBoxOf, arşivdeki kopyanın taşıdığı zincir başını okur. * * client nil ise arşiv yapılandırılmamış demektir ve sonuç "bakılmadı" * olur — hata değil. Kayıt henüz yüklenmemişse de aynı: o kaydın kutu * dışı bir kopyası YOK, yani zincirin taşıdığı kanıt şu an yalnızca bu * makinede ve bunu söylemek gerekiyor.
type OffBoxState ¶
type OffBoxState int
OffBoxState, arşivdeki kopyanın söylediği.
const ( // OffBoxMatch, kovadaki baş veritabanındakiyle AYNI. OffBoxMatch OffBoxState = iota /* * OffBoxMismatch, kovadaki baş FARKLI — en güçlü kurcalama işareti. * * Dosya veritabanıyla tutuyorken kovadaki baş tutmuyorsa, ikisini * birden üretebilmenin tek yolu bu makineyi elinde tutmaktır; * kovadaki nesne ise saklama süresi boyunca oradan değiştirilemiyor. */ OffBoxMismatch /* * OffBoxNoChain, nesne var ama zincir başı taşımıyor. * * ⚠️ "FARKLI" DEĞİL. Zincirlerden önce yüklenmiş bir nesne ya da * üstveriyi düşüren bir depo, kurcalanmış bir kayıtla aynı şey * değil — ikisini birleştirmek, kimsenin dokunmadığı eski kayıtları * suçlamak olurdu. */ OffBoxNoChain /* * OffBoxUnchecked, bakılamadı: arşiv kapalı, kayıt henüz yüklenmedi, * ya da kovaya ulaşılamadı. * * ⚠️ "DOĞRULANDI" İLE KARIŞTIRILMAMASI GEREKEN DURUM. Bir kovaya * ulaşamamak kurcalanmışlık kanıtı değil, ama onay da değil. */ OffBoxUnchecked )
func Verdict ¶
func Verdict(archived, want string) (OffBoxState, string)
* Verdict, arşivdeki başın ne söylediğine karar verir. * * I/O'dan AYRI, çünkü asıl iddia burada ve bir kovaya ihtiyaç duymadan * sınanabiliyor: hangi durum "farklı", hangisi "yok".
func (OffBoxState) String ¶
func (s OffBoxState) String() string