audiencepolicy

package
v0.2.0 Latest Latest
Warning

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

Go to latest
Published: Sep 13, 2026 License: AGPL-3.0 Imports: 2 Imported by: 0

Documentation

Overview

Package audiencepolicy — ОДИН предикат выбора адресата выпускаемого токена, общий для всех полос выдачи (задачи #1136, #1184).

Почему общий источник, а не одинаковая проверка в каждой полосе

Полос выдачи по ключу служебной учётки ДВЕ: токен-эндпоинт платформы и докерная полоса реестра. Пока предикат существовал копией у одной из них, вторая писалась под фиксированный адресат — и адресат её токена называл вызывающий. Расхождение никто не решал: оно возникло побочным эффектом.

Две копии предиката разошлись бы снова, и разошлись бы молча: обе полосы по отдельности выглядят исправными, неверна их РАЗНИЦА. Здесь копия одна, и расхождение невозможно by construction — а не удерживается гейтом, который сверял бы две реализации между собой.

Границы ДВЕ, и они не равноправны

ВНЕШНЯЯ (`Landing`) — объявленная посадкой: каким поверхностям эта полоса вообще чеканит удостоверения. Пустая означает «любая», поэтому вызывающий обязан отвергнуть построение выдачи без неё.

ВНУТРЕННЯЯ (`Declared`) — объявленная заказчиком при выдаче ключа: для чего заведён ЭТОТ ключ. Она действует ВНУТРИ внешней и никогда её не расширяет. Иначе заказчик ключа сам решал бы, кому платформа выдаёт токен.

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrOutsideLanding — заказанный адресат вне объявленного посадкой.
	ErrOutsideLanding = errors.New("audiencepolicy: requested audience is outside the landing declaration")
	// ErrOutsideDeclared — заказанный адресат вне объявленного самим ключом.
	ErrOutsideDeclared = errors.New("audiencepolicy: requested audience is outside the audiences declared for the key")
	// ErrNarrowingDisjoint — сужение ключа не пересекается с перечнем посадки:
	// ключ не получит токена НИ ПРИ КАКОМ запросе.
	//
	// Состояние законное и достижимое (ключ выдан под внешнюю федерацию, а эта
	// посадка такого адресата не объявляла), поэтому отказ живёт здесь, а не на
	// выдаче ключа: перечень посадки меняет оператор и после неё. Молчаливый
	// откат на перечень посадки вернул бы сужение, переставшее сужать.
	ErrNarrowingDisjoint = errors.New("audiencepolicy: the audiences declared for the key are none of the ones this deployment declares")
	// ErrNoLanding — перечень посадки пуст. Не отказ вызывающему, а отказ
	// ПОСТРОЕНИЯ: выдача, у которой внешней границы нет, чеканит куда угодно.
	ErrNoLanding = errors.New("audiencepolicy: landing audiences must be declared (empty means 'any')")
)

Отказы ТРИ, и они различаются не ради красоты: «посадка такого адресата не объявляла», «ключ выдавался не под этот адресат» и «ключ выдан под адресата, которого эта посадка не знает вовсе» чинятся в разных местах и разными людьми. Наружу вызывающий отдаёт единый ответ (различимость снаружи была бы оракулом); в журнал — эти.

Functions

func Contains

func Contains(list []string, want string) bool

Contains — членство в перечне, ДОСЛОВНОЕ.

Ни приведения регистра, ни отбрасывания хвостовой косой черты, ни разбора URL: адресат — непрозрачная строка контракта, и всякая нормализация здесь расширяла бы принимаемое молча.

func DefaultWithin

func DefaultWithin(landing []string, def string) bool

DefaultWithin проверяет, что объявленное умолчание входит в объявленный посадкой перечень. Предикат стража построения, а не выдачи.

func Resolve

func Resolve(s Scope, requested []string) ([]string, error)

Resolve выбирает адресатов выпускаемого токена.

`requested` — то, что назвал ЗАПРОС. Пустой срез означает «не назвал»: тогда адресат берётся из сужения ключа, а при его отсутствии — из умолчания посадки. Умолчание посадки НЕ перебивает объявленное ключом: оно есть величина для ключа, о своём назначении не заявившего.

Набор, где хотя бы один адресат вне границ, отвергается ЦЕЛИКОМ: приняв его частично, выдача выпустила бы токен, адресованный туда, куда ключ не объявлялся, — и положительный путь выглядел бы исправным.

Types

type Scope

type Scope struct {
	// Landing — внешняя граница, объявленная посадкой. Обязателен непустым.
	Landing []string
	// Default — адресат для запроса, не назвавшего ни одного. Обязан входить в
	// Landing, иначе умолчание отвергалось бы собственной проверкой и глагол не
	// работал бы НИ ПРИ КАКОМ входе.
	Default string
	// Declared — внутренняя граница, объявленная заказчиком при выдаче ключа.
	// Пустая означает «сужения не объявлено», а не «любой адресат».
	Declared []string
	// Subject — идентификатор ключа для ТЕКСТА ОТКАЗА. В решение не входит.
	Subject string
}

Scope — объявленное о выдаче: обе границы плюс адресат для запроса, ни одного не назвавшего.

Jump to

Keyboard shortcuts

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