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
+13 -10
View File
@@ -1,8 +1,9 @@
---
description: "Gérez les utilisateurs, les rôles intégrés et personnalisés, les permissions, les clés API, les équipes, les sessions et le journal d'audit dans SnapOtter."
i18n_source_hash: 5e28af686c96
i18n_source_hash: bea8955f3aff
i18n_provenance: human
i18n_output_hash: 0ef660e3c9b1
i18n_output_hash: 500026917981
i18n_hash_version: 2
---
# Utilisateurs, rôles et permissions {#users-roles-permissions}
@@ -82,12 +83,12 @@ Les 17 permissions. Contrôle total sur l'instance.
| `pipelines:all` | Consulter et gérer les pipelines de tous les utilisateurs |
| `settings:read` | Consulter les paramètres de l'instance |
| `settings:write` | Modifier les paramètres de l'instance |
| `users:manage` | Créer, mettre à jour et supprimer des comptes utilisateur |
| `users:manage` | Créer et gérer des comptes d'utilisateurs dans les limites d'autorité de l'acteur |
| `teams:manage` | Créer, mettre à jour et supprimer des équipes |
| `features:manage` | Installer et gérer les bundles de fonctionnalités IA |
| `system:health` | Accéder aux points de terminaison de santé et de disponibilité |
| `audit:read` | Consulter le journal d'audit et lister les rôles |
| `compliance:manage` | Gérer le cycle de vie RGPD et les fonctionnalités de conformité |
| `compliance:manage` | Gérer le cycle de vie et les fonctionnalités de conformité du RGPD ; les opérations destructrices des utilisateurs restent limitées à lautorité |
| `webhooks:manage` | Configurer les webhooks sortants |
| `security:manage` | Gérer les paramètres de sécurité (liste d'autorisation d'IP, application du SSO) |
@@ -110,15 +111,17 @@ curl -X POST http://localhost:1349/api/v1/roles \
Les noms de rôle doivent comporter de 2 à 30 caractères, en minuscules alphanumériques avec des tirets et des traits de soulignement.
### Permissions réservées aux administrateurs {#admin-reserved-permissions}
### Limites de l'administration déléguée {#delegated-administration-boundaries}
Trois permissions sont réservées aux rôles intégrés et ne peuvent pas être attribuées à des rôles personnalisés :
Les 17 autorisations peuvent être déléguées via des rôles personnalisés, mais une autorisation administrative ne rend pas ce rôle équivalent au rôle `admin` intégré. Les mutations utilisateur autorisées par `users:manage`, les opérations destructrices autorisées par `compliance:manage` et la gestion des rôles personnalisés autorisées par `security:manage` sont limitées par l'autorité actuelle de l'acteur :
- `compliance:manage`
- `webhooks:manage`
- `security:manage`
- Les rôles intégrés suivent `admin` > `editor` > `user` ; les rôles personnalisés se trouvent sous les rôles intégrés.
- Les autorisations de la cible doivent être contenues dans les autorisations **efficaces** de l'acteur. Une clé API étendue ne peut donc pas exercer d'autorisations omises de sa portée.
- L'accès aux outils d'un rôle cible doit être contenu par le propre accès aux outils de l'acteur.
- Un compte désactivé est comparé à son rôle d'origine lorsque ce rôle est enregistré sous la forme `disabled:<original-role>`.
- La suppression d'un rôle personnalisé nécessite également l'autorisation d'attribuer la solution de secours intégrée `user` ; les membres désactivés restent désactivés sous le nom `disabled:user`.
L'API des rôles rejette toute requête qui inclut ces permissions. Seul le rôle intégré `admin` y a accès.
Les informations d'identification et la configuration globales sont plus strictes : l'émission ou la révocation du jeton SCIM et l'importation de la configuration de l'instance nécessitent le rôle `admin` intégré avec une autorité d'administration effective complète.
### Permissions au niveau des outils {#tool-level-permissions}