Documentation
¶
Overview ¶
Package tokenrevocation — ПРАВИЛО отзыва наших токенов, объявленное один раз.
Почему правило вынесено, а не повторено ¶
Отзыв читают ДВЕ поверхности: авторитет отзыва, отвечающий на вопрос соседа, и читатель предъявленного на публичном слушателе. Правило у них одно, и оно нетривиально: ключей отсечки несколько, отзыв субъекта и клиента действует ВПЕРЁД, отзыв семейства — по записи выпуска и при любой отметке выпуска, а токен без отметки выпуска не сопоставим ни с какой отсечкой.
Вторая копия разошлась бы молча и разошлась бы там, где расхождение не видно: имя, заведённое в составе утверждений и забытое в одной из копий, даёт клиента, чей отзыв доезжает до одной поверхности и не доезжает до другой, — при том что обе зелены на своих пробах, потому что их фикстуры чеканят состав сами.
Исходов ТРИ, а не два ¶
Отозван · не отозван · СПРОСИТЬ НЕ СМОГЛИ. Третий возвращается ошибкой и никогда не сливается со вторым: смешать их значило бы сделать сбой хранилища неотличимым от отсутствия отзыва, то есть завести мягкий проход при отказе зависимости.
Отзыв семейства — ЧАСТЬ правила, а не второй читатель (kaname#319) ¶
Выпуск собственной церемонии принадлежит семейству, и отзыв семейства снимает каждый его токен. Этот вопрос задаётся ЗДЕСЬ, тем же вызовом, что отсечки по ключам: поверхность, спросившая правило, получила и ответ о семействе — с тем же окном кеша и той же политикой на неответ. Отдельное обращение за семейством у поверхности означало бы два читателя одного решения; порт чтения семейства поэтому зовёт только это правило (гейт `internal/check` `TestFamilyVerdictHasOneReaderAndEverySurfaceAsksTheRule`).
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func FamilyRevoked ¶ added in v0.5.0
FamilyRevoked — половина правила о семействе: отозвано ли семейство выпуска с этим идентификатором.
Материал без идентификатора выпуском семейства не бывает — запись выпуска ключуется идентификатором, — поэтому хранилище о нём не спрашивается, и ответ «нет». Это не мягкий проход: такой материал судят отсечки по ключам (`Revoked`), а семейства, способного его отозвать, у него нет by construction.
func Revoked ¶
Revoked отвечает, отозван ли токен с этим составом утверждений: отсечкой по любому из его ключей либо отзывом семейства, которому принадлежит выпуск.
Возвращаемая ошибка — ТРЕТИЙ исход, «спросить не смогли»: вызывающий обязан закрыться сам, а не читать её как «не отозван».
Токен БЕЗ отметки выпуска считается отозванным. Он не сопоставим ни с какой отсечкой — ни с уже стоящей, ни с будущей, — поэтому принять его значило бы завести материал, который отозвать нечем; при сомнении отказ.
Types ¶
type FamilyReader ¶ added in v0.5.0
FamilyReader — хранилище принадлежности выпуска семейству.
Отвечает «отозвано ли семейство, которому принадлежит выпуск с этим идентификатором». Отозвано — и когда семейство отозвано, и когда его строки больше нет: снятое семейство живых выпусков не оставляет. Выпуск, семейству не принадлежащий, — законный ответ «нет», а не ошибка.
type Reader ¶
type Reader interface {
RevokedBefore(ctx context.Context, subject string) (time.Time, bool, error)
FamilyReader
// PersonMarks — второй вопрос правила (kaname#456, Р5а): токен, чей
// субъект — человек с неподтверждённым адресом, недействителен. Вопрос
// задаётся тому же предикату допуска, что у двери решения (`admission`);
// своего чтения отметки у правила нет, и копии в поверхности нет.
admission.Marks
}
Reader — хранилище отсечек.
Отвечает «с какого момента токены субъекта недействительны». Отсутствие записи — законный ответ «отзыва нет», а НЕ ошибка: пустое обязано означать пусто.
Хранилище отвечает и о СЕМЕЙСТВЕ выпуска: порт встроен, а не отдельный, чтобы поверхность не могла получить правило без ответа о семействе — непровязанный ответ о семействе был бы непровязанным отзывом, неотличимым от «не отозван».