Help us shape the future of Go! Take the 2026 Go Developer Survey

verify

package
v1.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 16, 2026 License: Apache-2.0 Imports: 7 Imported by: 0

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

type HeadReader interface {
	Head(ctx context.Context, key string) (objstore.ObjectInfo, error)
}

* 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

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL