@jantstack/adonis-authz 2.0.0-alpha.1 → 2.4.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +462 -35
- package/build/commands/authz_catalog_diff.js +1 -1
- package/build/commands/authz_catalog_diff.js.map +1 -1
- package/build/commands/authz_catalog_prune_orphans.d.ts +78 -0
- package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -0
- package/build/commands/authz_catalog_prune_orphans.js +136 -0
- package/build/commands/authz_catalog_prune_orphans.js.map +1 -0
- package/build/commands/authz_catalog_sync.d.ts +17 -0
- package/build/commands/authz_catalog_sync.d.ts.map +1 -1
- package/build/commands/authz_catalog_sync.js +27 -4
- package/build/commands/authz_catalog_sync.js.map +1 -1
- package/build/commands/authz_freeze.d.ts +44 -0
- package/build/commands/authz_freeze.d.ts.map +1 -0
- package/build/commands/authz_freeze.js +95 -0
- package/build/commands/authz_freeze.js.map +1 -0
- package/build/commands/authz_reconcile.d.ts +102 -0
- package/build/commands/authz_reconcile.d.ts.map +1 -0
- package/build/commands/authz_reconcile.js +294 -0
- package/build/commands/authz_reconcile.js.map +1 -0
- package/build/commands/authz_relations_reconcile.d.ts +73 -0
- package/build/commands/authz_relations_reconcile.d.ts.map +1 -0
- package/build/commands/authz_relations_reconcile.js +225 -0
- package/build/commands/authz_relations_reconcile.js.map +1 -0
- package/build/commands/authz_scopes_relay.d.ts +47 -0
- package/build/commands/authz_scopes_relay.d.ts.map +1 -0
- package/build/commands/authz_scopes_relay.js +141 -0
- package/build/commands/authz_scopes_relay.js.map +1 -0
- package/build/commands/authz_unfreeze.d.ts +37 -0
- package/build/commands/authz_unfreeze.d.ts.map +1 -0
- package/build/commands/authz_unfreeze.js +92 -0
- package/build/commands/authz_unfreeze.js.map +1 -0
- package/build/commands/main.d.ts +6 -1
- package/build/commands/main.d.ts.map +1 -1
- package/build/commands/main.js +6 -1
- package/build/commands/main.js.map +1 -1
- package/build/commands/openfga_provision.d.ts +46 -4
- package/build/commands/openfga_provision.d.ts.map +1 -1
- package/build/commands/openfga_provision.js +90 -7
- package/build/commands/openfga_provision.js.map +1 -1
- package/build/configure.d.ts +11 -0
- package/build/configure.d.ts.map +1 -1
- package/build/configure.js +37 -1
- package/build/configure.js.map +1 -1
- package/build/index.d.ts +39 -10
- package/build/index.d.ts.map +1 -1
- package/build/index.js +35 -6
- package/build/index.js.map +1 -1
- package/build/providers/authz_provider.d.ts +26 -2
- package/build/providers/authz_provider.d.ts.map +1 -1
- package/build/providers/authz_provider.js +48 -2
- package/build/providers/authz_provider.js.map +1 -1
- package/build/services/relations.d.ts +14 -0
- package/build/services/relations.d.ts.map +1 -0
- package/build/services/relations.js +17 -0
- package/build/services/relations.js.map +1 -0
- package/build/src/{catalog.d.ts → catalog/catalog.d.ts} +41 -2
- package/build/src/catalog/catalog.d.ts.map +1 -0
- package/build/src/{catalog.js → catalog/catalog.js} +120 -14
- package/build/src/catalog/catalog.js.map +1 -0
- package/build/src/{catalog_cache.d.ts → catalog/catalog_cache.d.ts} +46 -22
- package/build/src/catalog/catalog_cache.d.ts.map +1 -0
- package/build/src/{catalog_cache.js → catalog/catalog_cache.js} +53 -43
- package/build/src/catalog/catalog_cache.js.map +1 -0
- package/build/src/define_config.d.ts +101 -3
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js.map +1 -1
- package/build/src/drivers/database_driver.d.ts +86 -4
- package/build/src/drivers/database_driver.d.ts.map +1 -1
- package/build/src/drivers/database_driver.js +425 -11
- package/build/src/drivers/database_driver.js.map +1 -1
- package/build/src/drivers/database_relations_driver.d.ts +75 -0
- package/build/src/drivers/database_relations_driver.d.ts.map +1 -0
- package/build/src/drivers/database_relations_driver.js +450 -0
- package/build/src/drivers/database_relations_driver.js.map +1 -0
- package/build/src/drivers/openfga_driver.d.ts +713 -119
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +2048 -476
- package/build/src/drivers/openfga_driver.js.map +1 -1
- package/build/src/drivers/openfga_facts.d.ts +369 -0
- package/build/src/drivers/openfga_facts.d.ts.map +1 -0
- package/build/src/drivers/openfga_facts.js +813 -0
- package/build/src/drivers/openfga_facts.js.map +1 -0
- package/build/src/drivers/openfga_relations_driver.d.ts +120 -0
- package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -0
- package/build/src/drivers/openfga_relations_driver.js +466 -0
- package/build/src/drivers/openfga_relations_driver.js.map +1 -0
- package/build/src/errors.d.ts +258 -5
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +238 -7
- package/build/src/errors.js.map +1 -1
- package/build/src/freeze.d.ts +120 -0
- package/build/src/freeze.d.ts.map +1 -0
- package/build/src/freeze.js +172 -0
- package/build/src/freeze.js.map +1 -0
- package/build/src/http/app_access_middleware.d.ts.map +1 -0
- package/build/src/http/app_access_middleware.js.map +1 -0
- package/build/src/http/resource_access_middleware.d.ts +105 -0
- package/build/src/http/resource_access_middleware.d.ts.map +1 -0
- package/build/src/http/resource_access_middleware.js +81 -0
- package/build/src/http/resource_access_middleware.js.map +1 -0
- package/build/src/identity.d.ts +74 -1
- package/build/src/identity.d.ts.map +1 -1
- package/build/src/identity.js +100 -2
- package/build/src/identity.js.map +1 -1
- package/build/src/manager.d.ts +315 -4
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +1187 -181
- package/build/src/manager.js.map +1 -1
- package/build/src/models/authz_assignment.d.ts +6 -6
- package/build/src/models/authz_assignment.d.ts.map +1 -1
- package/build/src/models/authz_deny.d.ts +6 -6
- package/build/src/models/authz_deny.d.ts.map +1 -1
- package/build/src/models/authz_permission.d.ts +6 -6
- package/build/src/models/authz_permission.d.ts.map +1 -1
- package/build/src/models/authz_role.d.ts +6 -6
- package/build/src/models/authz_role.d.ts.map +1 -1
- package/build/src/models/authz_role_permission.d.ts +6 -6
- package/build/src/models/authz_role_permission.d.ts.map +1 -1
- package/build/src/openfga.d.ts +18 -2
- package/build/src/openfga.d.ts.map +1 -1
- package/build/src/openfga.js +15 -1
- package/build/src/openfga.js.map +1 -1
- package/build/src/reconcile.d.ts +37 -0
- package/build/src/reconcile.d.ts.map +1 -0
- package/build/src/reconcile.js +69 -0
- package/build/src/reconcile.js.map +1 -0
- package/build/src/relation_partition_trigger.d.ts +8 -0
- package/build/src/relation_partition_trigger.d.ts.map +1 -0
- package/build/src/relation_partition_trigger.js +85 -0
- package/build/src/relation_partition_trigger.js.map +1 -0
- package/build/src/relations/define_relations_config.d.ts +58 -0
- package/build/src/relations/define_relations_config.d.ts.map +1 -0
- package/build/src/relations/define_relations_config.js +144 -0
- package/build/src/relations/define_relations_config.js.map +1 -0
- package/build/src/relations/manager.d.ts +38 -0
- package/build/src/relations/manager.d.ts.map +1 -0
- package/build/src/relations/manager.js +156 -0
- package/build/src/relations/manager.js.map +1 -0
- package/build/src/relations/reconcile.d.ts +62 -0
- package/build/src/relations/reconcile.d.ts.map +1 -0
- package/build/src/relations/reconcile.js +138 -0
- package/build/src/relations/reconcile.js.map +1 -0
- package/build/src/relations_config_store.d.ts +22 -0
- package/build/src/relations_config_store.d.ts.map +1 -0
- package/build/src/relations_config_store.js +74 -0
- package/build/src/relations_config_store.js.map +1 -0
- package/build/src/scope_outbox.d.ts +69 -0
- package/build/src/scope_outbox.d.ts.map +1 -0
- package/build/src/scope_outbox.js +291 -0
- package/build/src/scope_outbox.js.map +1 -0
- package/build/src/{drivers → shared}/backend_guard.d.ts +14 -0
- package/build/src/shared/backend_guard.d.ts.map +1 -0
- package/build/src/{drivers → shared}/backend_guard.js +26 -1
- package/build/src/shared/backend_guard.js.map +1 -0
- package/build/src/shared/sql_expiry.d.ts.map +1 -0
- package/build/src/shared/sql_expiry.js.map +1 -0
- package/build/src/sql_descendants.d.ts +47 -1
- package/build/src/sql_descendants.d.ts.map +1 -1
- package/build/src/sql_descendants.js +75 -1
- package/build/src/sql_descendants.js.map +1 -1
- package/build/src/testing/contract.d.ts +74 -0
- package/build/src/testing/contract.d.ts.map +1 -1
- package/build/src/testing/contract.js +672 -169
- package/build/src/testing/contract.js.map +1 -1
- package/build/src/testing/main.d.ts +6 -0
- package/build/src/testing/main.d.ts.map +1 -1
- package/build/src/testing/main.js +3 -0
- package/build/src/testing/main.js.map +1 -1
- package/build/src/testing/migration_contract.d.ts +284 -0
- package/build/src/testing/migration_contract.d.ts.map +1 -0
- package/build/src/testing/migration_contract.js +586 -0
- package/build/src/testing/migration_contract.js.map +1 -0
- package/build/src/testing/relations_contract.d.ts +51 -0
- package/build/src/testing/relations_contract.d.ts.map +1 -0
- package/build/src/testing/relations_contract.js +654 -0
- package/build/src/testing/relations_contract.js.map +1 -0
- package/build/src/testing/relations_reconcile_contract.d.ts +24 -0
- package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -0
- package/build/src/testing/relations_reconcile_contract.js +172 -0
- package/build/src/testing/relations_reconcile_contract.js.map +1 -0
- package/build/src/traits/authz_scopes.js +1 -1
- package/build/src/traits/authz_scopes.js.map +1 -1
- package/build/src/traits/has_uuid.d.ts +7 -7
- package/build/src/traits/has_uuid.d.ts.map +1 -1
- package/build/src/types.d.ts +865 -82
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js +10 -0
- package/build/src/types.js.map +1 -1
- package/build/stubs/config/authorization.stub +104 -4
- package/build/stubs/migration.stub +126 -0
- package/build/stubs/scopes_outbox_migration.stub +57 -0
- package/package.json +4 -2
- package/build/commands/openfga_import.d.ts +0 -34
- package/build/commands/openfga_import.d.ts.map +0 -1
- package/build/commands/openfga_import.js +0 -97
- package/build/commands/openfga_import.js.map +0 -1
- package/build/src/catalog.d.ts.map +0 -1
- package/build/src/catalog.js.map +0 -1
- package/build/src/catalog_cache.d.ts.map +0 -1
- package/build/src/catalog_cache.js.map +0 -1
- package/build/src/drivers/backend_guard.d.ts.map +0 -1
- package/build/src/drivers/backend_guard.js.map +0 -1
- package/build/src/drivers/sql_expiry.d.ts.map +0 -1
- package/build/src/drivers/sql_expiry.js.map +0 -1
- package/build/src/middleware/app_access_middleware.d.ts.map +0 -1
- package/build/src/middleware/app_access_middleware.js.map +0 -1
- /package/build/src/{middleware → http}/app_access_middleware.d.ts +0 -0
- /package/build/src/{middleware → http}/app_access_middleware.js +0 -0
- /package/build/src/{drivers → shared}/sql_expiry.d.ts +0 -0
- /package/build/src/{drivers → shared}/sql_expiry.js +0 -0
package/build/src/identity.js
CHANGED
|
@@ -138,6 +138,47 @@ export function assertScope(scope) {
|
|
|
138
138
|
export function assertScopeType(scopeType) {
|
|
139
139
|
assertComponent('Tipo de scope', scopeType, IDENTITY_LIMITS.scopeType, TYPE_FORMAT);
|
|
140
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* Longitud máxima del id de un objeto/holder de RELACIÓN (columna
|
|
143
|
+
* `varchar(64)` de `authz_relations`). Más ancha que `IDENTITY_LIMITS.uuid`
|
|
144
|
+
* (36): el `object.id` de ReBAC lo elige el consumidor y no tiene por qué ser
|
|
145
|
+
* un uuid.
|
|
146
|
+
*/
|
|
147
|
+
export const RELATION_ID_LIMIT = 64;
|
|
148
|
+
/**
|
|
149
|
+
* **La gramática del id de un objeto de RELACIÓN** (R-16, Fase 4 · lote 4-7).
|
|
150
|
+
*
|
|
151
|
+
* Un `object.id` de relaciones va en la columna `varchar(64)` de
|
|
152
|
+
* `authz_relations` y, en el store compartido, en el id de objeto de FGA
|
|
153
|
+
* (`document:<partitionKey>|<object.id>`). El driver `database` ya lo validaba
|
|
154
|
+
* (`RELATION_ID_FORMAT`), pero ni el manager ni el driver `openfga` lo hacían:
|
|
155
|
+
* el `openfga` solo medía la LONGITUD. Un `object.id` con un `|` dentro
|
|
156
|
+
* (`'a|b'`) se ESCRIBÍA y `check` lo honraba, pero al parsear de vuelta (corte
|
|
157
|
+
* por el ÚLTIMO `|`) la partición salía mal, así que `listObjects` lo filtraba
|
|
158
|
+
* y `enumerateRelations` lo descartaba: una relación que concede y que NO se ve
|
|
159
|
+
* en la enumeración ni migra —pérdida SILENCIOSA en `reconcile`, justo lo que
|
|
160
|
+
* el driver promete que no pasa— y una divergencia con `database`, que lo
|
|
161
|
+
* rechaza con 422. Y los caracteres estructurales (`:`/`#`/espacio) salían como
|
|
162
|
+
* 503 mal clasificado, cuando por invariante 5 una entrada malformada es 422.
|
|
163
|
+
*
|
|
164
|
+
* Misma lista blanca que el resto de la identidad (`COMPONENT_FORMAT`):
|
|
165
|
+
* minúsculas, dígitos y `._-`; excluye `|`, `#`, `:`, `@`, `*`, `~`, espacios y
|
|
166
|
+
* control. La aplican el manager (una vez por llamada) Y cada driver (defensa
|
|
167
|
+
* en profundidad), como el resto de la gramática.
|
|
168
|
+
*/
|
|
169
|
+
export function assertRelationId(kind, value) {
|
|
170
|
+
assertComponent(kind, value, RELATION_ID_LIMIT);
|
|
171
|
+
}
|
|
172
|
+
/** Versión booleana para caminos de LECTURA (ids que vienen del backend): no lanza. */
|
|
173
|
+
export function isValidRelationId(value) {
|
|
174
|
+
try {
|
|
175
|
+
assertRelationId('id de relación', value);
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
141
182
|
/* ── Clave de scope ─────────────────────────────────────────────────────── */
|
|
142
183
|
/**
|
|
143
184
|
* Clave textual de un scope: `app` para la raíz, `<tipo>|<uuid>` para el
|
|
@@ -156,6 +197,43 @@ export function scopeKey(scope) {
|
|
|
156
197
|
return APP_SCOPE_TYPE;
|
|
157
198
|
return `${scope.type}|${scope.uuid}`;
|
|
158
199
|
}
|
|
200
|
+
/** Un uuid canónico escrito SIN guiones: 32 dígitos hexadecimales. */
|
|
201
|
+
const DASHLESS_UUID = /^[0-9a-f]{32}$/;
|
|
202
|
+
/**
|
|
203
|
+
* **Las ORTOGRAFÍAS de un scope con las que hay que limpiar cuando ya no hay
|
|
204
|
+
* cadena con la que canonizar** (3b-2h · 🟠 3, auditor R2).
|
|
205
|
+
*
|
|
206
|
+
* La identidad de un scope es la canónica que devuelve el resolutor
|
|
207
|
+
* (invariante 17) y el paquete la usa para TODOS los hechos… mientras la fila
|
|
208
|
+
* del consumidor existe. `scopes.detached` es justo la operación que admite
|
|
209
|
+
* que ya NO exista (3F · S1: se purga igual, con el scope tal cual), y ahí no
|
|
210
|
+
* hay con qué canonizar: se usa la ortografía del llamante. Medido contra
|
|
211
|
+
* PostgreSQL: el tipo `uuid` funde `01a0…-…` con el mismo uuid SIN guiones,
|
|
212
|
+
* así que el `DELETE` del controlador acierta con el alias, el `detached`
|
|
213
|
+
* llega con el alias, `purgeScope` demuestra cero sobre un objeto que no
|
|
214
|
+
* existe y el scope REAL conserva su `parent` y su `binding`: en modo
|
|
215
|
+
* `facts`, **concede para siempre**. En lectura el mismo alias es
|
|
216
|
+
* fail-closed; en escritura era fail-OPEN.
|
|
217
|
+
*
|
|
218
|
+
* La salida es no elegir: una purga sin cadena limpia la ortografía del
|
|
219
|
+
* llamante **y** la canónica de la que puede ser alias. Solo se expande el
|
|
220
|
+
* alias SIN guiones (32 hex ⇒ también la forma 8-4-4-4-12), que es la única
|
|
221
|
+
* que un motor produce fundiendo —PostgreSQL canoniza CON guiones; el alias
|
|
222
|
+
* por mayúsculas ya muere en la puerta (`assertScope`)—; así el consumidor
|
|
223
|
+
* que guarda sus uuids con guiones (el caso normal) no paga NADA, y el que
|
|
224
|
+
* los guarda sin guiones sigue purgando su clave y, además, una que nunca
|
|
225
|
+
* tiene hechos. Normalizar en vez de expandir no vale: sin la fila no se sabe
|
|
226
|
+
* cuál de las dos es la buena, y elegir mal deja los hechos vivos, que es el
|
|
227
|
+
* fallo que se está cerrando.
|
|
228
|
+
*/
|
|
229
|
+
export function scopeSpellings(scope) {
|
|
230
|
+
assertScope(scope);
|
|
231
|
+
const uuid = scope.uuid;
|
|
232
|
+
if (uuid === null || !DASHLESS_UUID.test(uuid))
|
|
233
|
+
return [scope];
|
|
234
|
+
const dashed = `${uuid.slice(0, 8)}-${uuid.slice(8, 12)}-${uuid.slice(12, 16)}-${uuid.slice(16, 20)}-${uuid.slice(20)}`;
|
|
235
|
+
return [scope, { type: scope.type, uuid: dashed }];
|
|
236
|
+
}
|
|
159
237
|
/**
|
|
160
238
|
* La inversa de `scopeKey` para claves que vienen de la BASE (el owner de un
|
|
161
239
|
* rol): `app` ⇒ la raíz; `<tipo>|<uuid>` ⇒ el scope; cualquier otra forma
|
|
@@ -180,7 +258,7 @@ const PERMISSION_FORMAT = /^[a-z0-9][a-z0-9_.-]*(:[a-z0-9][a-z0-9_.-]*)?$/;
|
|
|
180
258
|
const ROLE_FORMAT = /^[a-z0-9][a-z0-9_.-]*$/;
|
|
181
259
|
/**
|
|
182
260
|
* Nombres que el modelo FGA del modo `facts` usa como relaciones propias
|
|
183
|
-
* (`scope#parent`, `role_binding#assignee`, `
|
|
261
|
+
* (`scope#parent`, `role_binding#assignee`, `scope#denied_<P>`…). Un
|
|
184
262
|
* permiso llamado `parent` invalidaría el modelo entero (S14): se rechaza en
|
|
185
263
|
* el núcleo, para ambos drivers, no el día de la migración.
|
|
186
264
|
*/
|
|
@@ -188,6 +266,7 @@ export const RESERVED_SLUGS = new Set([
|
|
|
188
266
|
'parent',
|
|
189
267
|
'binding',
|
|
190
268
|
'ancestor',
|
|
269
|
+
'rooted',
|
|
191
270
|
'role',
|
|
192
271
|
'assignee',
|
|
193
272
|
'denied',
|
|
@@ -199,6 +278,20 @@ export const RESERVED_SLUGS = new Set([
|
|
|
199
278
|
* (S4: `can_docs_write` anulaba el deny de `docs:write`).
|
|
200
279
|
*/
|
|
201
280
|
export const RESERVED_SLUG_PREFIXES = Object.freeze(['can_', 'denied_', 'permits_']);
|
|
281
|
+
/**
|
|
282
|
+
* **Los TIPOS de objeto que el modelo `facts` (y el `group` de relaciones) YA
|
|
283
|
+
* declaran** (Fase 4 · ⚪4). Un tipo de objeto de relaciones que se llame como
|
|
284
|
+
* uno de estos DUPLICARÍA un tipo del store compartido: `role_binding` sobre
|
|
285
|
+
* todo —si el driver de relaciones pudiera declararlo, podría componer el id
|
|
286
|
+
* de un binding real y `relate` sería una escalada a `roles.authorize`—. Vive
|
|
287
|
+
* en `identity.ts` (la gramática compartida) porque lo consumen DOS módulos
|
|
288
|
+
* que la frontera de pureza mantiene disjuntos: el generador del modelo
|
|
289
|
+
* (`src/drivers/openfga_facts.ts`, que no puede depender de `relations/`) y
|
|
290
|
+
* `defineRelationsConfig` (`src/relations/`, que no puede depender de
|
|
291
|
+
* `drivers/`). `deny_binding` sigue reservado aunque el modelo (c2r) ya no lo
|
|
292
|
+
* emita: un catálogo migrado del modo `resolver` no puede resucitarlo.
|
|
293
|
+
*/
|
|
294
|
+
export const RESERVED_FACTS_TYPES = Object.freeze(new Set(['scope', 'role', 'role_binding', 'deny_binding', 'group']));
|
|
202
295
|
/**
|
|
203
296
|
* Longitud máxima de un slug. Un nombre de relación en FGA admite 50
|
|
204
297
|
* caracteres y el modelo deriva `permits_<slug>` (el prefijo más largo, 8):
|
|
@@ -213,8 +306,13 @@ export function assertValidSlug(kind, slug) {
|
|
|
213
306
|
throw new InvalidSlugError(`Slug de ${kind} inválido: se esperaba una cadena no vacía y llegó ${describe(slug)}`);
|
|
214
307
|
}
|
|
215
308
|
if (slug.length > MAX_SLUG_LENGTH) {
|
|
309
|
+
// 3b-2a · A4: se nombra el prefijo que lo desborda y la relación que
|
|
310
|
+
// saldría. La cota es del modo `facts`, y quien lee el error tiene que
|
|
311
|
+
// saber por qué 42 y no 100 (que es lo que admite la columna).
|
|
312
|
+
const longest = RESERVED_SLUG_PREFIXES.reduce((a, b) => (a.length >= b.length ? a : b));
|
|
216
313
|
throw new InvalidSlugError(`Slug de ${kind} inválido: '${slug}' supera los ${MAX_SLUG_LENGTH} caracteres ` +
|
|
217
|
-
`(50 de una relación FGA menos el prefijo derivado más largo
|
|
314
|
+
`(50 de una relación FGA menos el prefijo derivado más largo, '${longest}': ` +
|
|
315
|
+
`'${longest}${slug}' serían ${longest.length + slug.length})`);
|
|
218
316
|
}
|
|
219
317
|
const format = kind === 'permiso' ? PERMISSION_FORMAT : ROLE_FORMAT;
|
|
220
318
|
if (!format.test(slug)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/identity.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/identity.ts"],"names":[],"mappings":"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"}
|
package/build/src/manager.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AuthorizationConfig } from './define_config.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { FreezeKind, FreezeToken } from './freeze.js';
|
|
3
|
+
import type { AuthorizationDriver, AuthorizedScopes, CatalogRole, CatalogRoleRef, DenyOptions, DenyRef, ExcludedSubtree, GrantOptions, GrantOutcome, RoleQuery, ScopedRoleChanges, ScopedRoleSpec, ReconcileOptions, ReconcileReport, ScopedWriteOptions, ScopeRelayReport, ScopeRef, ScopeTreeWriteOptions, ScopeType, SubjectRef } from './types.js';
|
|
3
4
|
/**
|
|
4
5
|
* Lo que devuelve `AuthorizationManager.forRequest()`: la misma API que el
|
|
5
6
|
* manager (lecturas, escrituras, `scopes.*`), con los ancestros memoizados
|
|
@@ -25,6 +26,14 @@ export declare const DEFAULT_MAX_DESCENDANTS = 10000;
|
|
|
25
26
|
* Una cota mayor es config rota (500), nunca una pregunta.
|
|
26
27
|
*/
|
|
27
28
|
export declare const MAX_SCOPE_BOUND = 10000000;
|
|
29
|
+
/**
|
|
30
|
+
* Cotas por defecto de `authz:scopes:relay` (3b-2d). El lote es el tamaño de
|
|
31
|
+
* cada `pending()`; el límite, cuántos cambios aplica una pasada antes de
|
|
32
|
+
* volver (lo que quede sigue pendiente: drenar es reanudable por diseño y
|
|
33
|
+
* una pasada eterna no es reanudable).
|
|
34
|
+
*/
|
|
35
|
+
export declare const DEFAULT_RELAY_BATCH = 100;
|
|
36
|
+
export declare const DEFAULT_RELAY_LIMIT = 10000;
|
|
28
37
|
/** Vida por defecto de una vista de `forRequest()` para LEER (F9): un request, no un módulo. */
|
|
29
38
|
export declare const DEFAULT_VIEW_MAX_AGE_MS = 30000;
|
|
30
39
|
export interface ForRequestOptions {
|
|
@@ -45,6 +54,15 @@ export interface ForRequestOptions {
|
|
|
45
54
|
*/
|
|
46
55
|
now?: () => number;
|
|
47
56
|
}
|
|
57
|
+
/** Lo que `freezeStatus()` responde de un freeze VIVO (la fila, legible por cualquiera). */
|
|
58
|
+
export interface FreezeStatus {
|
|
59
|
+
reason: string;
|
|
60
|
+
holder: string;
|
|
61
|
+
kind: FreezeKind | 'unknown';
|
|
62
|
+
/** Instante (ms de pared) en el que el lease vence, o `null` si no caduca. */
|
|
63
|
+
untilMs: number | null;
|
|
64
|
+
fence: number;
|
|
65
|
+
}
|
|
48
66
|
/**
|
|
49
67
|
* Manager de autorización — la fachada que usan middleware, services y
|
|
50
68
|
* seeders. Resuelve el driver activo del config y notifica cada escritura
|
|
@@ -91,6 +109,67 @@ export declare class AuthorizationManager {
|
|
|
91
109
|
* sin `withClock` con `clock` declarado es 500 `E_AUTHZ_CONFIG`.
|
|
92
110
|
*/
|
|
93
111
|
driver(): Promise<AuthorizationDriver>;
|
|
112
|
+
/**
|
|
113
|
+
* **Congela las ESCRITURAS del motor, DURABLE** (3b-7; decisión del dueño
|
|
114
|
+
* del 2026-08-31 (3b): B + E-analista). Operación de PLATAFORMA, como
|
|
115
|
+
* `driver()`: no se expone por HTTP.
|
|
116
|
+
*
|
|
117
|
+
* El estado ya NO vive en el proceso: vive en la fila `id = 2` de
|
|
118
|
+
* `authz_catalog_version`, así que alcanza a **todos los procesos que
|
|
119
|
+
* comparten las tablas `authz_*`** (invariante 14: el comando ace y los
|
|
120
|
+
* workers hablan con la misma base). Mientras el freeze está vivo, toda
|
|
121
|
+
* escritura del manager —las cuatro de hechos, las tres de árbol, la API
|
|
122
|
+
* de delegación, `pruneOrphanRoles({force})` y `relayScopeChanges`—
|
|
123
|
+
* responde 503 `E_AUTHZ_FROZEN` **reintentable** y no llega al driver; las
|
|
124
|
+
* LECTURAS siguen respondiendo con normalidad (la asimetría deliberada:
|
|
125
|
+
* `authorize` no se congela ni un milisegundo).
|
|
126
|
+
*
|
|
127
|
+
* Devuelve el **token del dueño** (`{ fence, holder }`): `unfreeze(token)`
|
|
128
|
+
* solo levanta el freeze cuyo token coincide — el `finally` de una ventana
|
|
129
|
+
* ajena o rezagada no puede levantar la tuya (auditor A1.3). Un freeze
|
|
130
|
+
* VIVO de otro dueño ⇒ 423 `E_AUTHZ_FREEZE_HELD`, nunca dos dueños.
|
|
131
|
+
*
|
|
132
|
+
* El **lease** (default 15 s) se renueva solo (`leaseMs / 3`, `unref()`)
|
|
133
|
+
* mientras este proceso vive; si el proceso muere (`SIGKILL`, OOM), el
|
|
134
|
+
* lease vence y la flota vuelve a escribir SOLA en ≤ `leaseMs` — nadie
|
|
135
|
+
* limpia nada a mano. `leaseMs: null` = sin caducidad: la ventana del
|
|
136
|
+
* OPERADOR (`authz:freeze`), que dura hasta su `authz:unfreeze`.
|
|
137
|
+
*
|
|
138
|
+
* Lo que el freeze **NO congela**, a propósito y documentado (auditor
|
|
139
|
+
* 🟠 5): `syncAuthzCatalog` (función libre que no ve al manager),
|
|
140
|
+
* `manager.driver()` (la salida documentada de TODAS las barreras) y el
|
|
141
|
+
* árbol SQL del consumidor (sus tablas, su SQL). Y lo que no puede
|
|
142
|
+
* prometer: una escritura que ya pasó su barrera cuando el freeze aterriza
|
|
143
|
+
* ENTRA (no hay atomicidad entre una fila SQL y un backend externo) — la
|
|
144
|
+
* promesa publicada es «otro proceso recibe 503», jamás «ninguna escritura
|
|
145
|
+
* entra en la ventana».
|
|
146
|
+
*/
|
|
147
|
+
freeze(reason?: string, options?: {
|
|
148
|
+
leaseMs?: number | null;
|
|
149
|
+
kind?: FreezeKind;
|
|
150
|
+
}): Promise<FreezeToken>;
|
|
151
|
+
/**
|
|
152
|
+
* Levanta el freeze de ESTE token; uno ajeno o rezagado no toca nada (esa
|
|
153
|
+
* es toda la garantía del fence). Devuelve si de verdad lo levantó.
|
|
154
|
+
*/
|
|
155
|
+
unfreeze(token: FreezeToken): Promise<boolean>;
|
|
156
|
+
/**
|
|
157
|
+
* ¿SOSTIENE este manager un freeze? (proceso-local: su token vive aquí.)
|
|
158
|
+
* Para saber si el MOTOR está congelado —por quien sea— pregunta
|
|
159
|
+
* `freezeStatus()`: eso es la fila, no la memoria.
|
|
160
|
+
*/
|
|
161
|
+
get frozen(): boolean;
|
|
162
|
+
/** El freeze VIVO de la fila compartida, o `null`. Lo lee cualquiera; solo el token lo levanta. */
|
|
163
|
+
freezeStatus(): Promise<FreezeStatus | null>;
|
|
164
|
+
/**
|
|
165
|
+
* `freeze()` + `finally unfreeze(token)`. El `finally` es la parte que
|
|
166
|
+
* importa: una migración que revienta a la mitad no puede dejar la
|
|
167
|
+
* aplicación sin poder escribir (y si además el proceso muere sin
|
|
168
|
+
* `finally`, el lease vence solo). **El anidado corre DENTRO** (auditor
|
|
169
|
+
* A1.1/A1.3): si este manager ya sostiene el freeze, la ventana interior
|
|
170
|
+
* no toma otro ni lo levanta al salir — la exterior sigue en pie.
|
|
171
|
+
*/
|
|
172
|
+
withFrozenWrites<T>(reason: string, fn: () => Promise<T>): Promise<T>;
|
|
94
173
|
/** Solo tests: fuerza re-resolución del driver. */
|
|
95
174
|
clearCachedDriver(): void;
|
|
96
175
|
/**
|
|
@@ -102,8 +181,21 @@ export declare class AuthorizationManager {
|
|
|
102
181
|
* Espía: si la validación falla, cero llamadas al driver.
|
|
103
182
|
*/
|
|
104
183
|
readonly scopes: {
|
|
105
|
-
attached: (child: ScopeRef, parent: ScopeRef, options?:
|
|
106
|
-
|
|
184
|
+
attached: (child: ScopeRef, parent: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<void>;
|
|
185
|
+
/**
|
|
186
|
+
* `moved` NO vuelve a juzgar el catálogo, y no tiene por qué (3b-1 · D3,
|
|
187
|
+
* auditor 3G): mover un scope es un hecho del árbol, no una escritura de
|
|
188
|
+
* catálogo. Lo que hay que tener escrito es la consecuencia: la relación
|
|
189
|
+
* «A ensombrece a B» es función del árbol de HOY, así que un `moved` que
|
|
190
|
+
* mete un subárbol bajo un scope que ya tiene el homónimo **crea la
|
|
191
|
+
* sombra sin que se juzgue ningún rango en ninguna parte** — y el dueño
|
|
192
|
+
* del subárbol movido puede no poder repararla (su rango se mide en la
|
|
193
|
+
* cadena del owner de la sombra). Por eso «sobre un rol solo actúa quien
|
|
194
|
+
* lo supera en rango» (3G · W3) es una comprobación de ESCRITURA y no un
|
|
195
|
+
* invariante del sistema. Es ruidosa: `authz:catalog:diff` la lista como
|
|
196
|
+
* `shadowedByAncestor` (y `--fail-on-shadows` la cuenta como deriva).
|
|
197
|
+
*/
|
|
198
|
+
moved: (child: ScopeRef, newParent: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<void>;
|
|
107
199
|
/**
|
|
108
200
|
* Hechos primero (el driver demuestra cero o lanza), arista después
|
|
109
201
|
* (S6): si la purga muere a medias, el subárbol sigue colgado y los
|
|
@@ -111,9 +203,116 @@ export declare class AuthorizationManager {
|
|
|
111
203
|
* scope exista (el consumidor puede haber borrado ya su fila); con
|
|
112
204
|
* `within` (2D · F2) el hijo tiene que seguir en el árbol para
|
|
113
205
|
* contrastar su cadena: purga ANTES de borrar la fila.
|
|
206
|
+
*
|
|
207
|
+
* **Purga HECHOS y solo hechos** (invariante 11; 3b-0 · Z1). Entre 3D y
|
|
208
|
+
* 3G esta operación arrastraba además los roles LOCALES cuyo owner era
|
|
209
|
+
* ese scope (y, con `descendantsOf`, los de todo el subárbol), con su
|
|
210
|
+
* propia policy de rango, su degradación y un valor de retorno que
|
|
211
|
+
* contaba lo purgado. Cinco lotes la tocaron y TRES de las cuatro
|
|
212
|
+
* regresiones de la Fase 3 nacieron ahí, siempre por COMPOSICIÓN de
|
|
213
|
+
* piezas correctas por separado (3E · P3 + 3F · S1/S2 ⇒ 3G · W1). El
|
|
214
|
+
* requisito que lo pedía —un rol cuyo owner desaparece queda
|
|
215
|
+
* indeleteable y ocupa su `(slug, nivel)`— se resuelve más simple y
|
|
216
|
+
* fuera del camino de un tenant: el rol queda DORMIDO (no concede, no es
|
|
217
|
+
* membresía, no se asigna) y la PLATAFORMA lo retira con
|
|
218
|
+
* `authz:catalog:prune-orphans` (Z2). Así `scopes.detached` vuelve a ser
|
|
219
|
+
* O(1), sin rango que medir, sin árbol que enumerar y sin nada que
|
|
220
|
+
* declarar a medias.
|
|
114
221
|
*/
|
|
115
|
-
detached: (child: ScopeRef, options?:
|
|
222
|
+
detached: (child: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<void>;
|
|
116
223
|
};
|
|
224
|
+
/**
|
|
225
|
+
* **Drena la outbox del árbol y aplica los cambios al driver** (3b-2d).
|
|
226
|
+
* Es lo que hay detrás de `node ace authz:scopes:relay`.
|
|
227
|
+
*
|
|
228
|
+
* Operación de PLATAFORMA, como `pruneOrphanRoles`: se salta `requireActor`
|
|
229
|
+
* y `requireWithin` a propósito —la policy ya se juzgó al ENCOLAR, con el
|
|
230
|
+
* árbol y la sesión de aquel momento— así que **no se expone por HTTP**.
|
|
231
|
+
* Aquí solo se propaga lo que ya se validó.
|
|
232
|
+
*
|
|
233
|
+
* Reanudable y nunca silenciosa: el reporte dice QUÉ se aplicó (no un
|
|
234
|
+
* contador: la pasada no es atómica), qué falló, qué se aplazó y si queda
|
|
235
|
+
* trabajo.
|
|
236
|
+
*
|
|
237
|
+
* **El orden del árbol importa, pero solo entre cambios que se tocan**
|
|
238
|
+
* (3b-2h · 🔴 2, auditor R2). Hasta el 2h la pasada PARABA en el primer
|
|
239
|
+
* fallo, y eso convertía una entrada que ya no se puede aplicar —el padre
|
|
240
|
+
* del `attached` encolado se borró antes del relevo, la arista cerraría
|
|
241
|
+
* ahora un ciclo, el nodo acabó con dos padres— en un **tapón permanente
|
|
242
|
+
* para todos los tenants**: `pending()` devuelve lo no aplicado ordenado
|
|
243
|
+
* por id, así que la envenenada era la cabecera de la cola en TODAS las
|
|
244
|
+
* pasadas siguientes y ningún cambio del árbol volvía a llegar al store
|
|
245
|
+
* (medido: una unit nueva nunca recibía su arista `parent`, el deny de su
|
|
246
|
+
* organization nunca la alcanzaba y un `detached` posterior nunca purgaba).
|
|
247
|
+
* Ahora un fallo **contamina los scopes que nombra**: los cambios
|
|
248
|
+
* posteriores que tocan alguno de ellos se APLAZAN sin intentarse (y
|
|
249
|
+
* contaminan a su vez, así que la dependencia es transitiva), y los demás
|
|
250
|
+
* se aplican. El par ordenado que importaba —`attached(P, org)` antes que
|
|
251
|
+
* `attached(C, P)`, `moved` antes que `detached`— sigue respetado porque
|
|
252
|
+
* comparten scope; lo que ya no pasa es que el tenant A congele el árbol
|
|
253
|
+
* del tenant B.
|
|
254
|
+
*
|
|
255
|
+
* **Escritor ÚNICO** (3b-2h · 🟠 4): si la outbox sabe dar un lease
|
|
256
|
+
* (`acquire`), la pasada lo toma y una segunda pasada simultánea no hace
|
|
257
|
+
* nada y lo dice (`busy`). Sin lease, dos pasadas trabajan sobre el mismo
|
|
258
|
+
* lote —`pending()` no reserva y el lote no se relee— y la rezagada
|
|
259
|
+
* re-aplica cambios viejos sobre el árbol nuevo.
|
|
260
|
+
*
|
|
261
|
+
* Lo que esta pieza NO arregla, y va escrito en el README con estas
|
|
262
|
+
* palabras: entre el commit del consumidor y esta pasada hay un lag
|
|
263
|
+
* (segundos) durante el cual el backend decide con el árbol VIEJO. Es un
|
|
264
|
+
* **fail-open temporal** —el tenant antiguo conserva acceso tras un
|
|
265
|
+
* `moved`, los denies heredados no aplican tras un `attached`—. No hay
|
|
266
|
+
* 2PC; es el precio de tener el árbol en dos sitios.
|
|
267
|
+
*/
|
|
268
|
+
relayScopeChanges(options?: {
|
|
269
|
+
limit?: number;
|
|
270
|
+
batchSize?: number;
|
|
271
|
+
dryRun?: boolean;
|
|
272
|
+
}): Promise<ScopeRelayReport>;
|
|
273
|
+
/**
|
|
274
|
+
* **`authz:reconcile --to=<driver>`** (3b-3a): la ÚNICA primitiva de
|
|
275
|
+
* migración y verificación del paquete, y el motivo de la fase entera —
|
|
276
|
+
* «todo en un driver o todo en otro, con una migración idempotente y
|
|
277
|
+
* bidireccional». Sustituye a `openfga:import`, que el 2k borró.
|
|
278
|
+
*
|
|
279
|
+
* Operación de PLATAFORMA, como `driver()` y `relayScopeChanges`: no lleva
|
|
280
|
+
* actor, no mide rangos y **no se expone por HTTP**.
|
|
281
|
+
*
|
|
282
|
+
* El driver de destino se resuelve **por nombre del registro**
|
|
283
|
+
* (`config.drivers[to]`), no por `config.default`: la migración de verdad
|
|
284
|
+
* es «el motor sigue corriendo con `database` mientras se llena el store de
|
|
285
|
+
* `openfga`», y con el default no habría forma de nombrar al destino. Un
|
|
286
|
+
* driver que no sabe reconstruirse lo dice (500 `E_AUTHZ_UNSUPPORTED`
|
|
287
|
+
* nombrando `reconcile`); el driver `database` es ese caso: sus tablas SON
|
|
288
|
+
* el origen y llenarlas desde un store es la otra dirección (3b-3b).
|
|
289
|
+
*
|
|
290
|
+
* Durante la pasada que ESCRIBE, las escrituras del motor están CONGELADAS
|
|
291
|
+
* (`withFrozenWrites`): un `grant` que aterrizara entre la lectura del
|
|
292
|
+
* origen y la escritura del destino no llegaría al destino y no aparecería
|
|
293
|
+
* en ningún contador. Las lecturas siguen. El `finally` descongela pase lo
|
|
294
|
+
* que pase.
|
|
295
|
+
*
|
|
296
|
+
* **`--dry-run` NO congela** (3b-6, panel 3 · juez §3). El verificador es
|
|
297
|
+
* read-only por contrato: no escribe nada, así que no tiene NADA que
|
|
298
|
+
* proteger, y congelar ahí sería apagar las escrituras a cambio de cero.
|
|
299
|
+
* Está publicado para correrlo en CI y en un cron, o sea justo el sitio
|
|
300
|
+
* desde el que un mecanismo de indisponibilidad se dispara solo — hoy
|
|
301
|
+
* contra el proceso del job, y contra la flota entera el día que el freeze
|
|
302
|
+
* sea durable. El único contraargumento posible —que congelar estabiliza
|
|
303
|
+
* sus números— no vale: los números de un verificador read-only no son una
|
|
304
|
+
* garantía de nada.
|
|
305
|
+
*
|
|
306
|
+
* Lo que añade el manager al reporte del driver es lo único que el driver
|
|
307
|
+
* no puede ver: **la ventana del relay** —los cambios del árbol encolados y
|
|
308
|
+
* sin aplicar, que son la deriva que el store todavía no conoce (decisión
|
|
309
|
+
* del dueño del 2026-08-30, consecuencia 4)— y las entradas APARCADAS, que
|
|
310
|
+
* no son una ventana sino una divergencia permanente.
|
|
311
|
+
*/
|
|
312
|
+
reconcile(options: {
|
|
313
|
+
to: string;
|
|
314
|
+
from?: string;
|
|
315
|
+
} & ReconcileOptions): Promise<ReconcileReport>;
|
|
117
316
|
/**
|
|
118
317
|
* ¿`outer` contiene a `inner`? = `outer ∈ chain(inner)`, inclusive: un scope
|
|
119
318
|
* se contiene a sí mismo y `APP_SCOPE` contiene todo. Un `inner` que el
|
|
@@ -184,6 +383,118 @@ export declare class AuthorizationManager {
|
|
|
184
383
|
* su owner. Notifica `role_purged`. No necesita `listDenies`.
|
|
185
384
|
*/
|
|
186
385
|
deleteScopedRole(actor: SubjectRef, roleUuid: string, options?: ScopedWriteOptions): Promise<void>;
|
|
386
|
+
/**
|
|
387
|
+
* Los roles LOCALES cuyo owner el árbol YA NO conoce, y —con `force`— su
|
|
388
|
+
* purga. Es el motor de `authz:catalog:prune-orphans` (3b-0 · Z2).
|
|
389
|
+
*
|
|
390
|
+
* Un rol así está DORMIDO, y «dormido» significa **exactamente** esto
|
|
391
|
+
* (3b-0b · AA1, auditor 3b-0): no es visible desde ningún scope vivo cuya
|
|
392
|
+
* cadena NO pase por su owner. No significa que no conceda. La regla única
|
|
393
|
+
* de visibilidad (invariante 18) pide que el owner esté en la cadena del
|
|
394
|
+
* scope preguntado, y **un descendiente vivo cuya ruta materializada sigue
|
|
395
|
+
* pasando por el owner la cumple**: ahí el rol concede, es membresía por
|
|
396
|
+
* los seis caminos de lectura y se puede ASIGNAR, por slug y por uuid.
|
|
397
|
+
* Ocurre en cuanto el consumidor borra la fila del owner sin borrar (o sin
|
|
398
|
+
* notificar) la de sus descendientes — el borrado en dos pasos y las rutas
|
|
399
|
+
* materializadas son lo normal. Por eso este barrido es destructivo de
|
|
400
|
+
* verdad y por eso `--dry-run` es el default: puede estar revocando
|
|
401
|
+
* permisos VIVOS, no recogiendo basura inerte. Lo que sí es seguro decir:
|
|
402
|
+
* un rol huérfano SIN asignaciones vigentes no concede nada, y ninguno
|
|
403
|
+
* concede en un scope cuya cadena no pase por el owner.
|
|
404
|
+
*
|
|
405
|
+
* Cada huérfano viene con `assignments` (hechos vigentes) y
|
|
406
|
+
* `stillGranting` (`assignments > 0`), que es la marca CONSERVADORA de
|
|
407
|
+
* «esto no es basura inerte»: cuenta hechos, no comprueba si el scope de
|
|
408
|
+
* cada uno sigue resolviendo. Falso ⇒ no concede seguro; verdadero ⇒
|
|
409
|
+
* míralo antes de `--force`.
|
|
410
|
+
*
|
|
411
|
+
* **Y esos hechos se los cuenta el DRIVER** (3b-2j, decisión del dueño del
|
|
412
|
+
* 2026-08-31 (3)), con `countRoleAssignments` del puerto. Hasta aquí los
|
|
413
|
+
* contaba el propio barrido en `authz_assignments` —la tabla del driver
|
|
414
|
+
* `database`—, así que con `openfga` en modo `facts`, donde los hechos
|
|
415
|
+
* viven en el store, `stillGranting` era SIEMPRE `false`: el barrido
|
|
416
|
+
* declaraba basura inerte, justo antes de un borrado destructivo, un rol
|
|
417
|
+
* que estaba concediendo (medido en el lote 2i). Un driver que no traiga
|
|
418
|
+
* el método deja los DOS campos en **`undefined`**, nunca en `false`: «no
|
|
419
|
+
* lo sé» no puede degradar a «no concede», que es exactamente el bug. Con
|
|
420
|
+
* `undefined` el rol no es demostrablemente inerte y el comando lo lista
|
|
421
|
+
* APARTE, igual que a los que sí conceden.
|
|
422
|
+
*
|
|
423
|
+
* Lo que el rol dormido sí hace en todo caso es ocupar su `(slug, nivel)`
|
|
424
|
+
* dentro del subárbol donde todavía se le vea, y `deleteScopedRole` no lo
|
|
425
|
+
* alcanza (resuelve el owner en fresco y responde 422
|
|
426
|
+
* `E_AUTHZ_UNKNOWN_SCOPE`). Hasta 3G esa limpieza la arrastraba
|
|
427
|
+
* `scopes.detached`, y ahí es donde nacieron tres de las cuatro
|
|
428
|
+
* regresiones de la Fase 3: la operación la dispara un TENANT, sobre un
|
|
429
|
+
* scope que ya no resuelve, así que hubo que inventarle una policy de
|
|
430
|
+
* rango sin cadena donde medirla, una enumeración del subárbol y una
|
|
431
|
+
* degradación — tres piezas que compuestas destruían roles de
|
|
432
|
+
* descendientes VIVOS. Aquí no hay nada de eso: es una operación de
|
|
433
|
+
* PLATAFORMA (una tarea de mantenimiento con acceso al catálogo, como
|
|
434
|
+
* `authz:catalog:sync`), no lleva actor y no mide rangos, exactamente como
|
|
435
|
+
* el `purgeRole` de último recurso que el README ya prometía. Es, junto a
|
|
436
|
+
* `driver()`, **API de plataforma**: se salta `requireActor` y
|
|
437
|
+
* `requireWithin` a propósito, así que no se expone a un controlador.
|
|
438
|
+
*
|
|
439
|
+
* `force: false` (el default, y el del comando: `--dry-run`) NO escribe:
|
|
440
|
+
* devuelve la lista para que un humano la mire. Con `force: true` cada rol
|
|
441
|
+
* se purga con `purgeRole` —atómico: asignaciones + vínculos + fila +
|
|
442
|
+
* versión del catálogo— y se notifica `role_purged` (sin `actor`). El
|
|
443
|
+
* conjunto no es atómico, y por eso el reporte dice QUÉ se purgó
|
|
444
|
+
* (`purged: CatalogRoleRef[]`, 3b-0b · AB3) y no cuántos: si un
|
|
445
|
+
* `purgeRole` falla a mitad, lo anterior ya está borrado —con el hallazgo
|
|
446
|
+
* de AA1 eso puede ser revocación parcial de permisos vivos— y quien
|
|
447
|
+
* recoge el 503 necesita la lista, no un contador. Una pasada
|
|
448
|
+
* interrumpida la recoge la siguiente (el orden es estable por uuid).
|
|
449
|
+
*
|
|
450
|
+
* **Dos seguros contra el barrido a ciegas**, que es el riesgo real
|
|
451
|
+
* (auditor 3b-0):
|
|
452
|
+
*
|
|
453
|
+
* - **Cota de purga masiva** (AA2): si TODOS los owners distintos
|
|
454
|
+
* resultan huérfanos, o si los huérfanos superan el 50 % de los roles
|
|
455
|
+
* locales, `force` es 500 `E_AUTHZ_MASS_PURGE_REFUSED` **antes de
|
|
456
|
+
* borrar nada**. Esa es la firma de un `resolveChain` filtrado por el
|
|
457
|
+
* tenant de la petición o corriendo sin contexto (comando, réplica
|
|
458
|
+
* atrasada): devuelve `null` para todo y la pasada se lleva el catálogo
|
|
459
|
+
* local de TODOS los tenants (medido: 2 de 2 roles vivos). Una poda
|
|
460
|
+
* grande de verdad pasa con `allowMassPurge: true`
|
|
461
|
+
* (`--allow-mass-purge`), que es una decisión humana. El `--dry-run` no
|
|
462
|
+
* lanza —es justo el diagnóstico que hay que poder mirar— pero lo
|
|
463
|
+
* marca en `massPurge`.
|
|
464
|
+
* - **Re-resolución justo antes de cada purga** (AA3): entre la lectura y
|
|
465
|
+
* el borrado cabe un `scopes.attached`/restore concurrente, y la
|
|
466
|
+
* ventana es TODA la pasada (N roles + N `resolveChain`), no un
|
|
467
|
+
* instante. Cada owner se vuelve a resolver en FRESCO inmediatamente
|
|
468
|
+
* antes de su `purgeRole`; si ha vuelto, el rol se salta y se cuenta en
|
|
469
|
+
* `skipped` con `reason: 'owner-came-back'`.
|
|
470
|
+
*
|
|
471
|
+
* Coste: una lectura del catálogo local + un `resolveChain` por OWNER
|
|
472
|
+
* DISTINTO (memoizado) + UNA llamada a `countRoleAssignments` con los
|
|
473
|
+
* uuids de los huérfanos (ninguna si no hay) + un `resolveChain` más por
|
|
474
|
+
* rol purgado (el de AA3). Es O(owners con roles locales) para mirar y
|
|
475
|
+
* O(roles purgados) para borrar, y corre en un comando, no en el camino de
|
|
476
|
+
* una petición.
|
|
477
|
+
*/
|
|
478
|
+
pruneOrphanRoles(options?: {
|
|
479
|
+
force?: boolean;
|
|
480
|
+
allowMassPurge?: boolean;
|
|
481
|
+
}): Promise<{
|
|
482
|
+
orphans: Array<{
|
|
483
|
+
role: CatalogRole;
|
|
484
|
+
owner: ScopeRef;
|
|
485
|
+
permissions: string[];
|
|
486
|
+
assignments: number | undefined;
|
|
487
|
+
stillGranting: boolean | undefined;
|
|
488
|
+
}>;
|
|
489
|
+
purged: CatalogRoleRef[];
|
|
490
|
+
skipped: Array<{
|
|
491
|
+
role: CatalogRoleRef;
|
|
492
|
+
reason: 'owner-came-back';
|
|
493
|
+
}>;
|
|
494
|
+
/** ¿La pasada tiene la firma de un resolutor ciego? Con `force` exige `allowMassPurge`. */
|
|
495
|
+
massPurge: boolean;
|
|
496
|
+
dryRun: boolean;
|
|
497
|
+
}>;
|
|
187
498
|
/**
|
|
188
499
|
* Asigna un rol al holder en un scope. `role` es un `RoleQuery` (3D · M1):
|
|
189
500
|
* un slug, `{ slug, scopeType }` o `{ uuid }` — esta última es la forma
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"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"}
|