registrytokenwire

package
v0.7.0 Latest Latest
Warning

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

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

Documentation

Overview

Package registrytokenwire — composition-root adapters binding the registry `/iam/token` shim use-case to iam infrastructure:

  • LocalMintAdapter (local_minter.go) — НАШ подписант, единственный издатель полосы.

  • SAClientLookupAdapter — обратный резолв ключа служебной учётки по client_id. Живёт ТОЛЬКО ради окна перехода kacho#1143: полоса предъявленного удостоверения принимает базовый токен доступа, а ключевой материал — лишь пока оператор держит окно открытым. Предикат снятия — снятие ручки `api-server.registry-token.key-material-window-until`.

These are thin adapters over already-tested primitives; they carry no policy.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Build

func Build(pool *pgxpool.Pool, cfg BuildConfig) (*http.ServeMux, error)

Build assembles the registry `/iam/token` shim from a pgx pool: the authority on the presented BASIC ACCESS TOKEN (the only credential kind this lane accepts, задача kacho#1143) and OUR signer, the lane's only issuer. The caller mounts the returned mux on an EXTERNAL-reachable HTTP listener.

Composition root only — this is the single wire-up call for serve.go. The shim mints the registry token itself through NewLocalMinter, and the data-plane verifies it against OUR key set published by the cluster-internal key-set listener (internal/handler/jwksproxyhttp, record keyed by our issuer). The shim decrypts no at-rest signing key: key material lives in the signer's keystore, not here.

Без нашего подписанта — отказ в старте (kaname#494)

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

Types

type BuildConfig

type BuildConfig struct {
	// Logger — журнал причин отказа выдачи. Наружу тело фиксировано; без этого
	// поля причина не уходила никуда, и разные по природе отказы выглядели
	// одинаково. nil допустим — тогда журналирования нет.
	Logger *slog.Logger
	// Realm — the WWW-Authenticate realm URL advertised to docker clients
	// (e.g. https://api.kacho.local/iam/token). Must match the data-plane's
	// advertised Bearer realm.
	Realm string
	// Service — the default registry service name (→ requested token audience +
	// WWW-Authenticate service, e.g. registry.kacho.local).
	Service string
	// Scope — объём, который полоса кладёт в выпускаемый токен (пусто — не
	// кладёт).
	Scope string
	// AnonymousClientID — объявленный публичный принципал анонимного чтения
	// (RG-1 D-7): субъект токена, который приёмная сторона резолвит в
	// подстановочного `user:*`. Пусто (умолчание) — анонимный поток ВЫКЛЮЧЕН, и
	// вход без удостоверения получает 401-вызов (secure-by-default).
	AnonymousClientID string
	// AnonymousPerSourcePerSec — темп анонимной выдачи: входов без
	// удостоверения в секунду на источник, на процесс (kaname#928).
	AnonymousPerSourcePerSec int
	// Source — адрес источника запроса по правилу поверхности выдачи
	// (`internal/issuingsource`, Р7): ключ темпа анонимной выдачи.
	Source func(*http.Request) string
	// Signer — НАШ подписант, ЕДИНСТВЕННЫЙ издатель полосы. Обязателен: без него
	// сборка отказывает (kaname#494), другого издателя у полосы нет.
	Signer *tokensigner.Signer
	// TokenTTL — срок выпускаемого токена контура. Слагаемое арифметики
	// отсрочки снятия ключа, поэтому объявлено числом, а не выведено.
	TokenTTL time.Duration

	// KeyMaterialWindowUntil — ОКНО ПЕРЕХОДА ЛОМАЮЩЕГО ИЗМЕНЕНИЯ kacho#1143:
	// мгновение, до которого полоса ПРОДОЛЖАЕТ принимать ключевой материал в
	// поле пароля наряду с базовым токеном доступа. Нулевое — окна нет
	// (умолчание, fail-closed).
	//
	// Приезжает РАЗОБРАННЫМ из настройки: разбор живёт у стража старта, а не
	// здесь, иначе неразборчивое значение доживало бы до первого входа клиента.
	// Разбор нормы, цена обоих умолчаний и предикат снятия —
	// registry_token/key_material_window.go.
	KeyMaterialWindowUntil time.Time

	// CredentialKindObserver — счётчик исходов полос по виду предъявленного
	// удостоверения. nil → счёта нет; решения полосы это не меняет.
	//
	// Единственное НАБЛЮДАЕМОЕ различие между закрытым и открытым окном: наружу
	// оба отвечают одинаково (различимость снаружи была бы оракулом посадки).
	// Без него оператор не знает ни скольких ломает закрытое окно, ни когда
	// открытое можно закрыть.
	CredentialKindObserver registrytokenuc.CredentialKindObserver

	// BasicCredentialTimeout — предел ОДНОГО обращения авторитета о базовом
	// секрете к базе (kaname#379). Обязателен: без него сборка отказывает.
	//
	// Предел подаётся авторитету, а не ставится этой полосой у своего вызова:
	// у авторитета вызывающих больше одного, и оператор у них один. Величину
	// объявляет композиционный корень — ту же, что у полос выдачи токена:
	// для строки удостоверения человека оператор читает и отсечку
	// отзыва-всех.
	BasicCredentialTimeout time.Duration
}

BuildConfig — the composition inputs for the registry `/iam/token` shim.

type LocalMintAdapter

type LocalMintAdapter struct {
	// contains filtered or unexported fields
}

LocalMintAdapter — НАШ подписант с точки зрения контура выдачи докер-токена.

Тонкий переходник без политики: срок берётся настройкой контура, субъект и адресат приходят от use-case, а всё, что делает токен токеном — обязательные `kid`, срок, тип, издатель, — проставляет подписант.

func NewLocalMinter

func NewLocalMinter(s *tokensigner.Signer, ttl time.Duration) *LocalMintAdapter

NewLocalMinter — построитель.

func (*LocalMintAdapter) MintToken

MintToken выпускает токен контура.

type SAClientLookupAdapter

type SAClientLookupAdapter struct {
	// contains filtered or unexported fields
}

SAClientLookupAdapter — resolves the registered SA-key for a client id.

func NewSAClientLookup

func NewSAClientLookup(repo saClientByIDReader) *SAClientLookupAdapter

NewSAClientLookup — builder.

func (*SAClientLookupAdapter) KeyByClientID

func (a *SAClientLookupAdapter) KeyByClientID(ctx context.Context, clientID string) (registrytokenuc.RegisteredKey, error)

KeyByClientID returns the registered key material for a client id, together with whether the owning ServiceAccount may authenticate.

The owner's state is resolved here, on the lookup, because the validator decides on it: a lookup that returned only key material would hand back a zero value for the state, and every docker login in the platform would be refused by a check that never saw a row.

Jump to

Keyboard shortcuts

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