fix: release QA hardening across processing, media, security, and CI gates (#649)

A release-readiness QA pass over the whole product. The commits split into
defects a user would hit and gates that were reporting green while measuring
nothing.

## Fixes that change behaviour

Rate limiting was bypassable on every install: TRUST_PROXY defaulted to true, so
request.ip came from a client-set header and a forged X-Forwarded-For got past
the login limiter. The default is now a private-network trust list.

A transient Postgres outage stranded in-flight jobs, leaving finished output on
disk with no row pointing at it. A reconciler now resolves those rows and adopts
the bytes rather than dropping the work.

A Redis connection that moved to a new address wedged every read-blocked
consumer, so completions stopped signalling while health still answered 200.
Socket timeouts plus subscriber pings recover it.

Installing more than one AI bundle left the shared venv multi-versioned and
silently broke three tools. The installer now reconciles distributions to one
version each.

Converting an image to JXL at quality 1 through 4 returned a 500, because
libjxl 0.7 rejects the distance those values compute. The quality is floored at
what the encoder honours. A missing ffmpeg was also reported to the user as a
corrupt upload; it now says the engine is unavailable.

RAW uploads reached an unpatched LibRaw on arm64, so it is built from source at
0.22.2, and the release scan was split so it can fail on an unfixed critical
instead of hiding it behind ignore-unfixed.

## Gates that could not fail

Two mutation lanes ran zero mutants because Stryker crawled the gitignored docs
build; coverage discarded its whole report on any failing test; the lint gate
skipped root tests, scripts, and two workspaces; and several generated matrices
counted a host missing ffmpeg as a passing tool. Each now measures what it
claims.

Full evidence and the outstanding release items are tracked locally and are not
part of this branch.
This commit is contained in:
SnapOtter
2026-07-27 15:37:30 +08:00
committed by GitHub
parent bc32f86a07
commit d10d0f544f
855 changed files with 54564 additions and 13092 deletions
+12 -7
View File
@@ -1,8 +1,9 @@
---
description: "Настройка провижининга SCIM 2.0 для синхронизации пользователей и групп из вашего поставщика идентификации в SnapOtter. Охватывает Okta, Azure AD / Entra ID и пользовательские интеграции."
i18n_source_hash: bbd50119ec12
i18n_source_hash: 06ee702b386e
i18n_provenance: human
i18n_output_hash: f3e5ab3ebe7f
i18n_output_hash: 9a5a2bfad94c
i18n_hash_version: 2
---
# Провижининг SCIM {#scim-provisioning}
@@ -17,7 +18,7 @@ SnapOtter реализует SCIM 2.0 (System for Cross-domain Identity Manageme
- Работающий экземпляр SnapOtter, доступный по публичному URL
- Ключ лицензии enterprise с функцией `scim`
- Административный доступ к SnapOtter (для генерации или отзыва токена SCIM требуется разрешение `users:manage`)
- Встроенная учетная запись SnapOtter `admin` с полным действующим набором разрешений. Делегированная пользовательская роль или ключ API администратора, у которого отсутствуют какие-либо разрешения администратора, не могут создать или отозвать глобальный токен SCIM.
- Административный доступ к настройкам провижининга вашего поставщика идентификации
## Быстрый старт {#quick-start}
@@ -34,7 +35,7 @@ curl -X POST https://photos.example.com/api/v1/enterprise/scim/token \
```json
{
"token": "a1b2c3d4e5f6...",
"token": "so_scim_v2_a1b2c3d4e5f6...",
"message": "Save this token - it cannot be retrieved again"
}
```
@@ -49,15 +50,19 @@ curl -X POST https://photos.example.com/api/v1/enterprise/scim/token \
### Генерация токена {#generating-a-token}
`POST /api/v1/enterprise/scim/token` генерирует новый токен SCIM. Эта конечная точка требует действующей сессии с разрешением `users:manage`.
`POST /api/v1/enterprise/scim/token` генерирует новый токен SCIM. Поскольку токен может подготавливать и изменять пользователей в экземпляре, для этой конечной точки требуется встроенная роль `admin` с полным набором эффективных разрешений администратора. Удерживать `users:manage` в пользовательской роли недостаточно.
Токен возвращается в открытом виде ровно один раз. SnapOtter хранит только scrypt-хеш. Если вы потеряете токен, отзовите его и сгенерируйте новый.
Одновременно активен только один токен SCIM. Генерация нового токена заменяет предыдущий.
::: warning Перевыпуск токена после обновления
Устаревшие неверсионные токены SCIM отклоняются. После обновления до версии, которая выдает токены `so_scim_v2_...`, создайте новый токен и обновите поставщика удостоверений, прежде чем возобновить подготовку.
:::
### Отзыв токена {#revoking-a-token}
`DELETE /api/v1/enterprise/scim/token` отзывает текущий токен SCIM. Эта конечная точка также требует `users:manage`.
`DELETE /api/v1/enterprise/scim/token` отзывает текущий токен SCIM. Он имеет те же полностью встроенные требования администратора, что и генерация токенов.
### Ограничение частоты запросов {#rate-limiting}
@@ -279,7 +284,7 @@ Azure выполняет провижининг пользователей и г
### 401 "Invalid token" {#_401-invalid-token}
Токен не совпадает с сохранённым хешем. Это происходит, если токен был отозван и перегенерирован. Обновите токен в настройках провижининга вашего IdP.
Токен имеет неверный формат, использует устаревший неверсионный формат или не соответствует сохраненному хешу. Создайте текущий токен `so_scim_v2_...` и обновите его в настройках подготовки IdP.
### 401 "SCIM not configured" {#_401-scim-not-configured}