@jantstack/adonis-authz 1.0.2 → 2.0.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/LICENSE +1 -1
- package/README.md +417 -46
- package/build/commands/authz_catalog_diff.d.ts +28 -0
- package/build/commands/authz_catalog_diff.d.ts.map +1 -0
- package/build/commands/authz_catalog_diff.js +67 -0
- package/build/commands/authz_catalog_diff.js.map +1 -0
- package/build/commands/authz_catalog_sync.d.ts +20 -0
- package/build/commands/authz_catalog_sync.d.ts.map +1 -0
- package/build/commands/authz_catalog_sync.js +58 -0
- package/build/commands/authz_catalog_sync.js.map +1 -0
- package/build/commands/main.d.ts +2 -0
- package/build/commands/main.d.ts.map +1 -1
- package/build/commands/main.js +2 -0
- package/build/commands/main.js.map +1 -1
- package/build/commands/openfga_import.d.ts +8 -2
- package/build/commands/openfga_import.d.ts.map +1 -1
- package/build/commands/openfga_import.js +29 -6
- package/build/commands/openfga_import.js.map +1 -1
- package/build/commands/openfga_provision.d.ts.map +1 -1
- package/build/commands/openfga_provision.js +2 -1
- package/build/commands/openfga_provision.js.map +1 -1
- package/build/index.d.ts +51 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +43 -3
- package/build/index.js.map +1 -1
- package/build/src/catalog.d.ts +249 -2
- package/build/src/catalog.d.ts.map +1 -1
- package/build/src/catalog.js +709 -59
- package/build/src/catalog.js.map +1 -1
- package/build/src/catalog_cache.d.ts +300 -0
- package/build/src/catalog_cache.d.ts.map +1 -0
- package/build/src/catalog_cache.js +656 -0
- package/build/src/catalog_cache.js.map +1 -0
- package/build/src/clock.d.ts +24 -0
- package/build/src/clock.d.ts.map +1 -0
- package/build/src/clock.js +7 -0
- package/build/src/clock.js.map +1 -0
- package/build/src/define_config.d.ts +102 -6
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js.map +1 -1
- package/build/src/drivers/backend_guard.d.ts +92 -0
- package/build/src/drivers/backend_guard.d.ts.map +1 -0
- package/build/src/drivers/backend_guard.js +221 -0
- package/build/src/drivers/backend_guard.js.map +1 -0
- package/build/src/drivers/database_driver.d.ts +242 -15
- package/build/src/drivers/database_driver.d.ts.map +1 -1
- package/build/src/drivers/database_driver.js +692 -127
- package/build/src/drivers/database_driver.js.map +1 -1
- package/build/src/drivers/openfga_driver.d.ts +341 -27
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +1052 -264
- package/build/src/drivers/openfga_driver.js.map +1 -1
- package/build/src/drivers/sql_expiry.d.ts +53 -0
- package/build/src/drivers/sql_expiry.d.ts.map +1 -0
- package/build/src/drivers/sql_expiry.js +66 -0
- package/build/src/drivers/sql_expiry.js.map +1 -0
- package/build/src/errors.d.ts +366 -0
- package/build/src/errors.d.ts.map +1 -0
- package/build/src/errors.js +387 -0
- package/build/src/errors.js.map +1 -0
- package/build/src/expiry.d.ts +27 -0
- package/build/src/expiry.d.ts.map +1 -0
- package/build/src/expiry.js +50 -0
- package/build/src/expiry.js.map +1 -0
- package/build/src/hierarchical_resolver.d.ts +56 -0
- package/build/src/hierarchical_resolver.d.ts.map +1 -0
- package/build/src/hierarchical_resolver.js +87 -0
- package/build/src/hierarchical_resolver.js.map +1 -0
- package/build/src/identity.d.ts +155 -0
- package/build/src/identity.d.ts.map +1 -0
- package/build/src/identity.js +359 -0
- package/build/src/identity.js.map +1 -0
- package/build/src/manager.d.ts +225 -7
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +1670 -23
- package/build/src/manager.js.map +1 -1
- package/build/src/memoize_ancestors.d.ts +23 -0
- package/build/src/memoize_ancestors.d.ts.map +1 -0
- package/build/src/memoize_ancestors.js +42 -0
- package/build/src/memoize_ancestors.js.map +1 -0
- package/build/src/middleware/app_access_middleware.d.ts +8 -6
- package/build/src/middleware/app_access_middleware.d.ts.map +1 -1
- package/build/src/middleware/app_access_middleware.js +10 -26
- package/build/src/middleware/app_access_middleware.js.map +1 -1
- package/build/src/models/authz_assignment.d.ts +5 -5
- package/build/src/models/authz_assignment.d.ts.map +1 -1
- package/build/src/models/authz_deny.d.ts +5 -5
- package/build/src/models/authz_deny.d.ts.map +1 -1
- package/build/src/models/authz_permission.d.ts +11 -5
- package/build/src/models/authz_permission.d.ts.map +1 -1
- package/build/src/models/authz_permission.js +4 -0
- package/build/src/models/authz_permission.js.map +1 -1
- package/build/src/models/authz_role.d.ts +13 -6
- package/build/src/models/authz_role.d.ts.map +1 -1
- package/build/src/models/authz_role.js +6 -1
- package/build/src/models/authz_role.js.map +1 -1
- package/build/src/models/authz_role_permission.d.ts +5 -5
- package/build/src/models/authz_role_permission.d.ts.map +1 -1
- package/build/src/openfga.d.ts +13 -0
- package/build/src/openfga.d.ts.map +1 -0
- package/build/src/openfga.js +12 -0
- package/build/src/openfga.js.map +1 -0
- package/build/src/sql_descendants.d.ts +51 -0
- package/build/src/sql_descendants.d.ts.map +1 -0
- package/build/src/sql_descendants.js +129 -0
- package/build/src/sql_descendants.js.map +1 -0
- package/build/src/testing/contract.d.ts +138 -7
- package/build/src/testing/contract.d.ts.map +1 -1
- package/build/src/testing/contract.js +2946 -24
- package/build/src/testing/contract.js.map +1 -1
- package/build/src/testing/main.d.ts +4 -2
- package/build/src/testing/main.d.ts.map +1 -1
- package/build/src/testing/main.js +2 -1
- package/build/src/testing/main.js.map +1 -1
- package/build/src/testing/scope_tree.d.ts +65 -0
- package/build/src/testing/scope_tree.d.ts.map +1 -0
- package/build/src/testing/scope_tree.js +145 -0
- package/build/src/testing/scope_tree.js.map +1 -0
- package/build/src/traits/authz_scopes.d.ts +30 -6
- package/build/src/traits/authz_scopes.d.ts.map +1 -1
- package/build/src/traits/authz_scopes.js +30 -18
- package/build/src/traits/authz_scopes.js.map +1 -1
- package/build/src/traits/has_uuid.d.ts +5 -5
- package/build/src/traits/has_uuid.d.ts.map +1 -1
- package/build/src/types.d.ts +530 -28
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js +10 -4
- package/build/src/types.js.map +1 -1
- package/build/stubs/config/app_acl.stub +4 -2
- package/build/stubs/config/authorization.stub +66 -12
- package/build/stubs/migration.stub +57 -13
- package/package.json +11 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog_cache.js","sourceRoot":"","sources":["../../src/catalog_cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EL reloj del motor (2.5 · J1). Es el ÚNICO sitio de `src/` donde se lee la
|
|
3
|
+
* hora de pared (`new Date()`); lo vigila `tests/clock.spec.ts` con un grep
|
|
4
|
+
* sobre las fuentes. Todo lo que decide con el tiempo —la caducidad en SQL
|
|
5
|
+
* (`whereActive`), el `current_time` de cada check de FGA, el filtro de
|
|
6
|
+
* caducidad en cliente de las enumeraciones y los tres estados de
|
|
7
|
+
* `resolveGrantExpiry`— lo hace con un `now()` inyectable, por defecto este.
|
|
8
|
+
*
|
|
9
|
+
* Por qué: con `new Date()` suelto, la caducidad exacta, la renovación y
|
|
10
|
+
* «expira ahora mismo» solo eran observables durmiendo (el juez esperaba
|
|
11
|
+
* 1,5 s de reloj real). Con el reloj inyectado el juez fija el instante y
|
|
12
|
+
* pregunta; y un consumidor puede congelarlo en sus propios tests.
|
|
13
|
+
*
|
|
14
|
+
* Lo que NO es: no es el reloj MONÓTONO de `forRequest({ maxAgeMs })` ni del
|
|
15
|
+
* memo del catálogo (`everyMs`), que miden ventanas con `performance.now()`
|
|
16
|
+
* y no deben moverse con NTP. Aquí se habla de instantes de pared, que es lo
|
|
17
|
+
* que `expiresAt` significa.
|
|
18
|
+
*/
|
|
19
|
+
export type Clock = () => Date;
|
|
20
|
+
/** Reloj de pared del proceso: el default de ambos drivers. */
|
|
21
|
+
export declare const systemClock: Clock;
|
|
22
|
+
/** `now` tiene que ser una función; se valida al construir (500 `E_AUTHZ_CONFIG` es del llamante). */
|
|
23
|
+
export declare function isClock(value: unknown): value is Clock;
|
|
24
|
+
//# sourceMappingURL=clock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.d.ts","sourceRoot":"","sources":["../../src/clock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,IAAI,CAAA;AAE9B,+DAA+D;AAC/D,eAAO,MAAM,WAAW,EAAE,KAAwB,CAAA;AAElD,sGAAsG;AACtG,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CAEtD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Reloj de pared del proceso: el default de ambos drivers. */
|
|
2
|
+
export const systemClock = () => new Date();
|
|
3
|
+
/** `now` tiene que ser una función; se valida al construir (500 `E_AUTHZ_CONFIG` es del llamante). */
|
|
4
|
+
export function isClock(value) {
|
|
5
|
+
return typeof value === 'function';
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=clock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clock.js","sourceRoot":"","sources":["../../src/clock.ts"],"names":[],"mappings":"AAoBA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAU,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAA;AAElD,sGAAsG;AACtG,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,UAAU,CAAA;AACpC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AuthorizationDriverFactory, AuthzWriteEvent } from './types.js';
|
|
2
|
-
import type {
|
|
1
|
+
import type { AuthorizationDriverFactory, AuthzCatalogWriteEvent, AuthzWriteEvent, HolderTypeMap, ScopeChainResolver, ScopeDescendantsResolver } from './types.js';
|
|
2
|
+
import type { CatalogSource } from './catalog.js';
|
|
3
3
|
/**
|
|
4
4
|
* Config del sistema de autorización. Todo lo específico del consumidor
|
|
5
5
|
* entra por aquí: qué drivers existen, cuál está activo, cómo se llaman sus
|
|
@@ -9,7 +9,7 @@ import type { HolderTypeMap } from './drivers/openfga_driver.js';
|
|
|
9
9
|
* default: env.get('AUTHZ_DRIVER', 'database'),
|
|
10
10
|
* holderTypes: { users: 'user', admins: 'admin' },
|
|
11
11
|
* drivers: {
|
|
12
|
-
* database: () => new DatabaseAuthorizationDriver({
|
|
12
|
+
* database: () => new DatabaseAuthorizationDriver({ resolveChain }),
|
|
13
13
|
* 'mi-driver': () => new MiDriver(),
|
|
14
14
|
* },
|
|
15
15
|
* hooks: { onWrite: auditarEscritura },
|
|
@@ -39,14 +39,110 @@ export interface AuthorizationConfig {
|
|
|
39
39
|
/** Nombre del store al provisionar. */
|
|
40
40
|
storeName?: string;
|
|
41
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* El árbol de scopes del consumidor: la ÚNICA costura entre su dominio y el
|
|
44
|
+
* motor. `resolveChain(scope)` devuelve la cadena canónica `[scope tal
|
|
45
|
+
* como está en tu tabla, ...ancestros]` (del más cercano a la raíz, `app`
|
|
46
|
+
* al final), o `null` si el scope no existe (2.5-B · K1: la identidad de un
|
|
47
|
+
* scope es la que devuelve el resolutor, nunca la forma con la que lo
|
|
48
|
+
* escribió el llamante). El mismo resolutor se pasa a los drivers; aquí lo
|
|
49
|
+
* usa el manager para validar `scopes.attached/moved` (padre existente,
|
|
50
|
+
* sin ciclos) antes de tocar el driver.
|
|
51
|
+
*/
|
|
52
|
+
scopes?: {
|
|
53
|
+
resolveChain: ScopeChainResolver;
|
|
54
|
+
/**
|
|
55
|
+
* Descendientes de un scope (2.1, B2). Solo lo usa `authorizedScopes`;
|
|
56
|
+
* sin él esa primitiva lanza 500 `E_AUTHZ_NO_DESCENDANTS_RESOLVER` (nunca
|
|
57
|
+
* una lista incompleta). `sqlDescendantsOf(...)` lo genera para una tabla
|
|
58
|
+
* con columna padre (PG y SQLite).
|
|
59
|
+
*/
|
|
60
|
+
descendantsOf?: ScopeDescendantsResolver;
|
|
61
|
+
/**
|
|
62
|
+
* Tope de scopes que `authorizedScopes` devuelve (default 1000); superado
|
|
63
|
+
* ⇒ 422 `E_AUTHZ_TOO_MANY_SCOPES`, nunca parcial. Se puede bajar por
|
|
64
|
+
* llamada (`{ maxScopes }`).
|
|
65
|
+
*/
|
|
66
|
+
maxScopes?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Tope de nodos por llamada a `descendantsOf` (default 10 000): es el
|
|
69
|
+
* `maxNodes` que recibe el resolutor, y si devuelve más el manager lanza
|
|
70
|
+
* 422 `E_AUTHZ_TOO_MANY_SCOPES`. Ni esta cota ni `maxScopes` pueden
|
|
71
|
+
* superar `MAX_SCOPE_BOUND` (10 000 000; 500 `E_AUTHZ_CONFIG` si lo
|
|
72
|
+
* hacen, 2.5-B · ⚪6).
|
|
73
|
+
*/
|
|
74
|
+
maxDescendants?: number;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Catálogos de roles/permisos del consumidor (uno por módulo: plataforma,
|
|
78
|
+
* tenant…). Los usan `authz:catalog:sync` (los sincroniza en orden, con
|
|
79
|
+
* poda de vínculos) y `authz:catalog:diff` (falla en CI si la base no
|
|
80
|
+
* coincide con el config). Funciones y no valores: un catálogo puede vivir
|
|
81
|
+
* en otro archivo y cargarse perezosamente.
|
|
82
|
+
*/
|
|
83
|
+
catalogs?: CatalogSource[];
|
|
84
|
+
/**
|
|
85
|
+
* Reloj de pared del motor (2.5 · J1): el `now()` con el que TODO driver
|
|
86
|
+
* resuelto por este manager decide la caducidad (`expires_at` en SQL,
|
|
87
|
+
* `current_time` de FGA, filtros en cliente, los tres estados del
|
|
88
|
+
* re-grant). Default: `new Date()` en el driver. El manager lo aplica al
|
|
89
|
+
* resolver el driver (`driver.withClock(clock)`) y todas sus vistas de
|
|
90
|
+
* `forRequest()` lo comparten; un driver sin `withClock` con `clock`
|
|
91
|
+
* declarado es 500 `E_AUTHZ_CONFIG` (nunca un reloj ignorado en silencio).
|
|
92
|
+
* Para tests del consumidor y para un reloj corregido (NTP en el proceso);
|
|
93
|
+
* NO es el reloj monótono de `forRequest({ maxAgeMs })`.
|
|
94
|
+
*/
|
|
95
|
+
clock?: () => Date;
|
|
96
|
+
/**
|
|
97
|
+
* Toda escritura (`grant`, `revoke`, `deny`, `removeDeny`, `scopes.*`)
|
|
98
|
+
* tiene que llevar `actor` (2.1, B7); sin él, 422 `E_AUTHZ_ACTOR_REQUIRED`
|
|
99
|
+
* antes de tocar el driver. Default `false`: opt-in, y el manager lo avisa
|
|
100
|
+
* al construirse (ver `warnOnOptInSecurity`).
|
|
101
|
+
*/
|
|
102
|
+
requireActor?: boolean;
|
|
103
|
+
/**
|
|
104
|
+
* Las SEIS escrituras (`grant`, `revoke`, `deny`, `removeDeny`,
|
|
105
|
+
* `scopes.attached/moved/detached`) tienen que declarar `within` (2.1, B1;
|
|
106
|
+
* 2D · F2; en `moved`/`attached` contra destino Y origen, 2E · H1): sin él,
|
|
107
|
+
* 422 `E_AUTHZ_WITHIN_REQUIRED`. `within` se toma de la SESIÓN (tenant
|
|
108
|
+
* autenticado), nunca de la misma entrada que el scope. `'non-root'` exige
|
|
109
|
+
* además que `within` no sea `APP_SCOPE` (422 `E_AUTHZ_WITHIN_ROOT_FORBIDDEN`):
|
|
110
|
+
* la raíz contiene todo y como contención no dice nada; la plataforma, que
|
|
111
|
+
* sí escribe en la raíz, usa `manager.driver()` o una config sin el flag.
|
|
112
|
+
* Default `false` (auditor E2, aceptado y nombrado): la contención es
|
|
113
|
+
* opt-in en 2.1; con `false` un call-site que no la declare escribe donde
|
|
114
|
+
* le digan. Ponlo en `true`/`'non-root'` en cuanto todos los call-sites de
|
|
115
|
+
* tenant la pasen.
|
|
116
|
+
*/
|
|
117
|
+
requireWithin?: boolean | 'non-root';
|
|
118
|
+
/**
|
|
119
|
+
* El manager avisa por `console.warn` UNA vez por config cuando
|
|
120
|
+
* `requireWithin`/`requireActor` no están en `true` (seguridad opt-in).
|
|
121
|
+
* `false` lo silencia: es la forma de decir "lo sé y lo asumo".
|
|
122
|
+
*/
|
|
123
|
+
warnOnOptInSecurity?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Lista BLANCA de permisos que la API de delegación puede meter en un rol
|
|
126
|
+
* local (3B · B3): `defineScopedRole`/`updateScopedRole` rechazan (422
|
|
127
|
+
* `E_AUTHZ_PERMISSION_NOT_DELEGABLE`) cualquier permiso fuera de ella,
|
|
128
|
+
* aunque el actor lo tenga. Default `[]`: nadie delega nada hasta que la
|
|
129
|
+
* plataforma declare qué se puede delegar (los permisos de plataforma
|
|
130
|
+
* —`app:*`, ajustes de organización— no deberían estar). Además el actor
|
|
131
|
+
* tiene que tener cada permiso EFECTIVO en el owner (sin deny).
|
|
132
|
+
*/
|
|
133
|
+
delegablePermissions?: string[];
|
|
42
134
|
/**
|
|
43
135
|
* Hooks del consumidor. `onWrite` se llama tras cada escritura del motor
|
|
44
|
-
* (grant/revoke/deny/removeDeny) — el sitio natural
|
|
45
|
-
*
|
|
46
|
-
*
|
|
136
|
+
* (grant/extended/revoke/deny/removeDeny/scope_purged) — el sitio natural
|
|
137
|
+
* para auditar o emitir eventos. `onCatalogWrite` (3B · B3) tras cada
|
|
138
|
+
* escritura del CATÁLOGO por la API de delegación (`role_defined`,
|
|
139
|
+
* `role_updated`, `role_purged`), siempre con actor. Ninguno debe lanzar:
|
|
140
|
+
* una escritura ya aplicada no se revierte por un side-effect fallido (se
|
|
141
|
+
* registra y se sigue).
|
|
47
142
|
*/
|
|
48
143
|
hooks?: {
|
|
49
144
|
onWrite?: (event: AuthzWriteEvent) => Promise<void>;
|
|
145
|
+
onCatalogWrite?: (event: AuthzCatalogWriteEvent) => Promise<void>;
|
|
50
146
|
};
|
|
51
147
|
}
|
|
52
148
|
export declare function defineConfig<T extends AuthorizationConfig>(config: T): T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAEjD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAA;IAEnD;;;;OAIG;IACH,WAAW,CAAC,EAAE,aAAa,CAAA;IAE3B;;;OAGG;IACH,OAAO,CAAC,EAAE;QACR,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,uCAAuC;QACvC,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,CAAA;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE;QACP,YAAY,EAAE,kBAAkB,CAAA;QAChC;;;;;WAKG;QACH,aAAa,CAAC,EAAE,wBAAwB,CAAA;QACxC;;;;WAIG;QACH,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB;;;;;;WAMG;QACH,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,CAAA;IAED;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;IAE1B;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;IAElB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;;;;;;;;;;;;OAaG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;IAEpC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAE7B;;;;;;;;OAQG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE/B;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACnD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAClE,CAAA;CACF;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,mBAAmB,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAExE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAsKA,MAAM,UAAU,YAAY,CAAgC,MAAS;IACnE,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { ScopeChainResolver, ScopeRef } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Clasificación de fallos de dependencias, compartida por ambos drivers.
|
|
4
|
+
*
|
|
5
|
+
* Tres dependencias participan en una pregunta: el catálogo (SQL, en ambos
|
|
6
|
+
* drivers), el árbol del consumidor (`resolveChain`) y el backend de
|
|
7
|
+
* hechos (SQL o FGA). Las tres se clasifican igual: 503 con código propio,
|
|
8
|
+
* la causa original conservada, y NUNCA un `false` ni un error crudo — el
|
|
9
|
+
* invariante 5 tal como está publicado (L0.11, N3).
|
|
10
|
+
*
|
|
11
|
+
* Lo que ya es un error del paquete (422 de catálogo, 500 de programación)
|
|
12
|
+
* pasa intacto: un rol inexistente no es una caída.
|
|
13
|
+
*/
|
|
14
|
+
/** ¿Es un error que este paquete ya clasificó (tiene `code` E_AUTHZ_*)? */
|
|
15
|
+
export declare function isAuthzError(error: unknown): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* ¿Es un error del CLIENTE SQL (pg, mysql2, better-sqlite3, knex) y no del
|
|
18
|
+
* código del consumidor? Por la forma que cada cliente da a sus errores:
|
|
19
|
+
* `pg` un `DatabaseError` con SQLSTATE de 5 caracteres (`25P02`…) y
|
|
20
|
+
* `severity`; `mysql2` un `errno` numérico con `sqlState`; SQLite un `code`
|
|
21
|
+
* `SQLITE_*`; knex un `KnexTimeoutError`. Sirve para clasificar (503) lo que
|
|
22
|
+
* un `fn` del consumidor deja escapar desde dentro de una transacción
|
|
23
|
+
* (2.5-B · K12): un error crudo del cliente nunca cruza la frontera.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isSqlDriverError(error: unknown): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* ¿El error viene de un deadline vencido? knex lanza `KnexTimeoutError` (o, si
|
|
28
|
+
* además falló la cancelación, el error de cancelación con `timeout` puesto);
|
|
29
|
+
* axios usa `ECONNABORTED`/`ETIMEDOUT`, a veces envuelto por el SDK como
|
|
30
|
+
* `cause`. Se mira la cadena entera de causas.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isTimeoutLike(error: unknown): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Ejecuta una consulta SQL con deadline y traduce su fallo. El builder de
|
|
35
|
+
* Lucid es perezoso (se ejecuta al hacer `await`), así que el `timeout` se
|
|
36
|
+
* fija aquí, en el ÚNICO punto por el que pasan todas las consultas: un
|
|
37
|
+
* call-site nuevo lo hereda sin saberlo. `cancel: true` pide a knex que
|
|
38
|
+
* cancele la consulta en el servidor cuando el dialecto lo permite.
|
|
39
|
+
*/
|
|
40
|
+
export declare function guardSql<T>(driver: string, operation: string, timeoutMs: number, fn: () => Promise<T>): Promise<T>;
|
|
41
|
+
/**
|
|
42
|
+
* Deadline TOTAL de una llamada al backend: vencido ⇒ rechaza con el error
|
|
43
|
+
* que fabrique `onTimeout`. El timer no retiene el event loop y se limpia al
|
|
44
|
+
* resolver. La promesa original sigue su curso —la petición en vuelo puede
|
|
45
|
+
* aterrizar después— pero el llamante ya fue liberado: por eso el manager
|
|
46
|
+
* notifica `indeterminate: true` en las escrituras que vencen (D2) y el
|
|
47
|
+
* driver openfga no deja al SDK reintentar por su cuenta (`maxRetry: 0`).
|
|
48
|
+
*/
|
|
49
|
+
export declare function withDeadline<T>(promise: Promise<T>, ms: number, onTimeout: () => Error): Promise<T>;
|
|
50
|
+
/**
|
|
51
|
+
* El resolutor que usa un driver construido SIN `resolveChain`: solo
|
|
52
|
+
* conoce la raíz. Sustituye al default plano de 1.x (`resto → [APP_SCOPE]`),
|
|
53
|
+
* que hacía descender de `app` cualquier scope inventado o borrado (L0.3).
|
|
54
|
+
* No se lanza al construir el driver, sino en la primera pregunta por un
|
|
55
|
+
* scope intermedio: un despliegue que solo usa `app` es legítimo sin árbol.
|
|
56
|
+
*/
|
|
57
|
+
export declare const rootOnlyResolver: ScopeChainResolver;
|
|
58
|
+
/**
|
|
59
|
+
* Cadena CANÓNICA `[scope canónico, ...ancestros]` con el resolutor del
|
|
60
|
+
* consumidor envuelto (2.5-B · K1): el elemento 0 es el scope tal como está
|
|
61
|
+
* en la tabla del consumidor —no tal como lo escribió el llamante—, y es la
|
|
62
|
+
* identidad con la que el paquete lee y escribe TODOS los hechos. Antes se
|
|
63
|
+
* devolvía `[scope del llamante, ...ancestros]`: un alias del uuid (que el
|
|
64
|
+
* árbol fundía con la fila real) resolvía la cadena entera y el grant del
|
|
65
|
+
* ancestro aplicaba, pero el deny —escrito con la forma canónica— no casaba.
|
|
66
|
+
*
|
|
67
|
+
* Si el resolutor lanza, sale como `ScopeResolverError` (503): el árbol es
|
|
68
|
+
* una dependencia más y su caída no es un bug del paquete ni un "sin
|
|
69
|
+
* permiso". `null` = el scope no existe para el consumidor; el llamante decide
|
|
70
|
+
* qué significa (denegar en lectura, 422 en escritura). La raíz no se
|
|
71
|
+
* pregunta: el motor la conoce y su cadena es `[APP_SCOPE]` por definición.
|
|
72
|
+
*
|
|
73
|
+
* La RESPUESTA se valida (D13 + K1): no-array, elemento mal formado
|
|
74
|
+
* (`{app, 'X'}`, `{organization, 'a|b'}`), cadena vacía, o un elemento 0 que
|
|
75
|
+
* no es el scope pedido (otro tipo; un uuid que no es el mismo id salvo
|
|
76
|
+
* mayúsculas/guiones) ⇒ 503 con el motivo como causa. Nunca se acepta en
|
|
77
|
+
* silencio una identidad que el llamante no pidió.
|
|
78
|
+
*/
|
|
79
|
+
export declare function resolveChain(resolver: ScopeChainResolver, scope: ScopeRef, operation: string): Promise<ScopeRef[] | null>;
|
|
80
|
+
/**
|
|
81
|
+
* El scope CANÓNICO para una escritura que no exige que exista (`revoke`,
|
|
82
|
+
* `removeDeny`, `purgeScope`): la fila del árbol si lo conoce (un alias se
|
|
83
|
+
* canoniza y el hecho canónico se encuentra, K1); el scope tal cual si ya no
|
|
84
|
+
* lo conoce (un hecho de un scope borrado sin avisar, D8, sigue siendo
|
|
85
|
+
* alcanzable con su identidad exacta) o si el driver no tiene resolutor (solo
|
|
86
|
+
* existe la raíz: no hay nada con lo que canonizar). Un resolutor que LANZA
|
|
87
|
+
* sigue siendo 503: no se limpia a ciegas cuando el árbol está caído.
|
|
88
|
+
*/
|
|
89
|
+
export declare function canonicalScope(resolver: ScopeChainResolver, scope: ScopeRef, operation: string): Promise<ScopeRef>;
|
|
90
|
+
/** La cadena canónica, o 422 `E_AUTHZ_UNKNOWN_SCOPE` si el scope no existe (para escrituras). */
|
|
91
|
+
export declare function assertKnownScope(resolver: ScopeChainResolver, scope: ScopeRef, operation: string): Promise<ScopeRef[]>;
|
|
92
|
+
//# sourceMappingURL=backend_guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend_guard.d.ts","sourceRoot":"","sources":["../../../src/drivers/backend_guard.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAI/D;;;;;;;;;;;GAWG;AAEH,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQxD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQrD;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAOnG;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,kBAO9B,CAAA;AAeD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CA0C5B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQxH;AAED,iGAAiG;AACjG,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,EAAE,CAAC,CASrB"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { AuthorizationBackendError, AuthorizationBackendTimeoutError, NoScopeResolverError, ScopeResolverError, UnknownScopeError, } from '../errors.js';
|
|
2
|
+
import { APP_SCOPE, APP_SCOPE_TYPE } from '../types.js';
|
|
3
|
+
import { assertScope } from '../identity.js';
|
|
4
|
+
/**
|
|
5
|
+
* Clasificación de fallos de dependencias, compartida por ambos drivers.
|
|
6
|
+
*
|
|
7
|
+
* Tres dependencias participan en una pregunta: el catálogo (SQL, en ambos
|
|
8
|
+
* drivers), el árbol del consumidor (`resolveChain`) y el backend de
|
|
9
|
+
* hechos (SQL o FGA). Las tres se clasifican igual: 503 con código propio,
|
|
10
|
+
* la causa original conservada, y NUNCA un `false` ni un error crudo — el
|
|
11
|
+
* invariante 5 tal como está publicado (L0.11, N3).
|
|
12
|
+
*
|
|
13
|
+
* Lo que ya es un error del paquete (422 de catálogo, 500 de programación)
|
|
14
|
+
* pasa intacto: un rol inexistente no es una caída.
|
|
15
|
+
*/
|
|
16
|
+
/** ¿Es un error que este paquete ya clasificó (tiene `code` E_AUTHZ_*)? */
|
|
17
|
+
export function isAuthzError(error) {
|
|
18
|
+
return typeof error?.code === 'string' && error.code.startsWith('E_AUTHZ_');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* ¿Es un error del CLIENTE SQL (pg, mysql2, better-sqlite3, knex) y no del
|
|
22
|
+
* código del consumidor? Por la forma que cada cliente da a sus errores:
|
|
23
|
+
* `pg` un `DatabaseError` con SQLSTATE de 5 caracteres (`25P02`…) y
|
|
24
|
+
* `severity`; `mysql2` un `errno` numérico con `sqlState`; SQLite un `code`
|
|
25
|
+
* `SQLITE_*`; knex un `KnexTimeoutError`. Sirve para clasificar (503) lo que
|
|
26
|
+
* un `fn` del consumidor deja escapar desde dentro de una transacción
|
|
27
|
+
* (2.5-B · K12): un error crudo del cliente nunca cruza la frontera.
|
|
28
|
+
*/
|
|
29
|
+
export function isSqlDriverError(error) {
|
|
30
|
+
const e = error;
|
|
31
|
+
if (!e || typeof e !== 'object')
|
|
32
|
+
return false;
|
|
33
|
+
if (e.name === 'KnexTimeoutError')
|
|
34
|
+
return true;
|
|
35
|
+
if (typeof e.code === 'string' && /^SQLITE_/.test(e.code))
|
|
36
|
+
return true;
|
|
37
|
+
if (typeof e.errno === 'number' && typeof e.sqlState === 'string')
|
|
38
|
+
return true;
|
|
39
|
+
if (typeof e.code === 'string' && /^[0-9A-Z]{5}$/.test(e.code) && ('severity' in e || 'routine' in e))
|
|
40
|
+
return true;
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* ¿El error viene de un deadline vencido? knex lanza `KnexTimeoutError` (o, si
|
|
45
|
+
* además falló la cancelación, el error de cancelación con `timeout` puesto);
|
|
46
|
+
* axios usa `ECONNABORTED`/`ETIMEDOUT`, a veces envuelto por el SDK como
|
|
47
|
+
* `cause`. Se mira la cadena entera de causas.
|
|
48
|
+
*/
|
|
49
|
+
export function isTimeoutLike(error) {
|
|
50
|
+
let current = error;
|
|
51
|
+
for (let depth = 0; current && depth < 6; depth++) {
|
|
52
|
+
if (current.name === 'KnexTimeoutError' || typeof current.timeout === 'number')
|
|
53
|
+
return true;
|
|
54
|
+
if (current.code === 'ECONNABORTED' || current.code === 'ETIMEDOUT')
|
|
55
|
+
return true;
|
|
56
|
+
current = current.cause;
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Ejecuta una consulta SQL con deadline y traduce su fallo. El builder de
|
|
62
|
+
* Lucid es perezoso (se ejecuta al hacer `await`), así que el `timeout` se
|
|
63
|
+
* fija aquí, en el ÚNICO punto por el que pasan todas las consultas: un
|
|
64
|
+
* call-site nuevo lo hereda sin saberlo. `cancel: true` pide a knex que
|
|
65
|
+
* cancele la consulta en el servidor cuando el dialecto lo permite.
|
|
66
|
+
*/
|
|
67
|
+
export async function guardSql(driver, operation, timeoutMs, fn) {
|
|
68
|
+
try {
|
|
69
|
+
const query = fn();
|
|
70
|
+
if (typeof query?.timeout === 'function') {
|
|
71
|
+
try {
|
|
72
|
+
query.timeout(timeoutMs, { cancel: true });
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// knex rechaza `cancel` al CONSTRUIR la consulta en los dialectos que
|
|
76
|
+
// no saben cancelar (SQLite). El deadline sigue valiendo: vencido, la
|
|
77
|
+
// promesa rechaza y la conexión se descarta; solo no se manda un
|
|
78
|
+
// "cancela" al servidor.
|
|
79
|
+
query.timeout(timeoutMs);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return await query;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (isAuthzError(error))
|
|
86
|
+
throw error;
|
|
87
|
+
if (isTimeoutLike(error)) {
|
|
88
|
+
throw new AuthorizationBackendTimeoutError(driver, operation, timeoutMs, error);
|
|
89
|
+
}
|
|
90
|
+
throw new AuthorizationBackendError(driver, operation, error);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Deadline TOTAL de una llamada al backend: vencido ⇒ rechaza con el error
|
|
95
|
+
* que fabrique `onTimeout`. El timer no retiene el event loop y se limpia al
|
|
96
|
+
* resolver. La promesa original sigue su curso —la petición en vuelo puede
|
|
97
|
+
* aterrizar después— pero el llamante ya fue liberado: por eso el manager
|
|
98
|
+
* notifica `indeterminate: true` en las escrituras que vencen (D2) y el
|
|
99
|
+
* driver openfga no deja al SDK reintentar por su cuenta (`maxRetry: 0`).
|
|
100
|
+
*/
|
|
101
|
+
export function withDeadline(promise, ms, onTimeout) {
|
|
102
|
+
let timer;
|
|
103
|
+
const deadline = new Promise((_, reject) => {
|
|
104
|
+
timer = setTimeout(() => reject(onTimeout()), ms);
|
|
105
|
+
timer.unref?.();
|
|
106
|
+
});
|
|
107
|
+
return Promise.race([promise, deadline]).finally(() => clearTimeout(timer));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* El resolutor que usa un driver construido SIN `resolveChain`: solo
|
|
111
|
+
* conoce la raíz. Sustituye al default plano de 1.x (`resto → [APP_SCOPE]`),
|
|
112
|
+
* que hacía descender de `app` cualquier scope inventado o borrado (L0.3).
|
|
113
|
+
* No se lanza al construir el driver, sino en la primera pregunta por un
|
|
114
|
+
* scope intermedio: un despliegue que solo usa `app` es legítimo sin árbol.
|
|
115
|
+
*/
|
|
116
|
+
export const rootOnlyResolver = async (scope) => {
|
|
117
|
+
if (scope.type === APP_SCOPE_TYPE)
|
|
118
|
+
return [APP_SCOPE];
|
|
119
|
+
throw new NoScopeResolverError(`El driver no tiene 'resolveChain' y se preguntó por un scope de tipo '${scope.type}'. ` +
|
|
120
|
+
`Sin resolutor solo existe la raíz 'app': pasa 'scopes.resolveChain' en el config ` +
|
|
121
|
+
`(y 'resolveChain' al driver) para declarar tu jerarquía.`);
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* ¿Dos uuids nombran, con formas distintas, el mismo id? Un motor que
|
|
125
|
+
* canoniza (el tipo `uuid` de PostgreSQL acepta mayúsculas y guiones
|
|
126
|
+
* quitados; una collation `*_ci` funde mayúsculas) puede devolver la fila real
|
|
127
|
+
* para un alias: aquí se acepta ESA relación y nada más. Cualquier otra
|
|
128
|
+
* diferencia es otro scope, y un resolutor que lo devuelva miente.
|
|
129
|
+
*/
|
|
130
|
+
function sameUuidLoosely(canonical, asked) {
|
|
131
|
+
if (canonical === null || asked === null)
|
|
132
|
+
return canonical === asked;
|
|
133
|
+
const fold = (value) => value.toLowerCase().replaceAll('-', '');
|
|
134
|
+
return fold(canonical) === fold(asked);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Cadena CANÓNICA `[scope canónico, ...ancestros]` con el resolutor del
|
|
138
|
+
* consumidor envuelto (2.5-B · K1): el elemento 0 es el scope tal como está
|
|
139
|
+
* en la tabla del consumidor —no tal como lo escribió el llamante—, y es la
|
|
140
|
+
* identidad con la que el paquete lee y escribe TODOS los hechos. Antes se
|
|
141
|
+
* devolvía `[scope del llamante, ...ancestros]`: un alias del uuid (que el
|
|
142
|
+
* árbol fundía con la fila real) resolvía la cadena entera y el grant del
|
|
143
|
+
* ancestro aplicaba, pero el deny —escrito con la forma canónica— no casaba.
|
|
144
|
+
*
|
|
145
|
+
* Si el resolutor lanza, sale como `ScopeResolverError` (503): el árbol es
|
|
146
|
+
* una dependencia más y su caída no es un bug del paquete ni un "sin
|
|
147
|
+
* permiso". `null` = el scope no existe para el consumidor; el llamante decide
|
|
148
|
+
* qué significa (denegar en lectura, 422 en escritura). La raíz no se
|
|
149
|
+
* pregunta: el motor la conoce y su cadena es `[APP_SCOPE]` por definición.
|
|
150
|
+
*
|
|
151
|
+
* La RESPUESTA se valida (D13 + K1): no-array, elemento mal formado
|
|
152
|
+
* (`{app, 'X'}`, `{organization, 'a|b'}`), cadena vacía, o un elemento 0 que
|
|
153
|
+
* no es el scope pedido (otro tipo; un uuid que no es el mismo id salvo
|
|
154
|
+
* mayúsculas/guiones) ⇒ 503 con el motivo como causa. Nunca se acepta en
|
|
155
|
+
* silencio una identidad que el llamante no pidió.
|
|
156
|
+
*/
|
|
157
|
+
export async function resolveChain(resolver, scope, operation) {
|
|
158
|
+
if (scope.type === APP_SCOPE_TYPE)
|
|
159
|
+
return [APP_SCOPE];
|
|
160
|
+
let chain;
|
|
161
|
+
try {
|
|
162
|
+
chain = await resolver(scope);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
if (isAuthzError(error))
|
|
166
|
+
throw error;
|
|
167
|
+
throw new ScopeResolverError(operation, error);
|
|
168
|
+
}
|
|
169
|
+
if (chain === null || chain === undefined)
|
|
170
|
+
return null;
|
|
171
|
+
if (!Array.isArray(chain)) {
|
|
172
|
+
throw new ScopeResolverError(operation, new TypeError(`resolveChain devolvió ${typeof chain} en vez de ScopeRef[] | null`));
|
|
173
|
+
}
|
|
174
|
+
if (chain.length === 0) {
|
|
175
|
+
throw new ScopeResolverError(operation, new TypeError(`resolveChain devolvió una cadena vacía para ${scope.type}:${scope.uuid ?? ''}: la cadena empieza por el propio scope canónico`));
|
|
176
|
+
}
|
|
177
|
+
for (const element of chain) {
|
|
178
|
+
try {
|
|
179
|
+
assertScope(element);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
throw new ScopeResolverError(operation, error);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const self = chain[0];
|
|
186
|
+
if (self.type !== scope.type || !sameUuidLoosely(self.uuid, scope.uuid)) {
|
|
187
|
+
throw new ScopeResolverError(operation, new TypeError(`resolveChain devolvió ${self.type}:${self.uuid ?? ''} como elemento 0 de la cadena de ` +
|
|
188
|
+
`${scope.type}:${scope.uuid ?? ''}: el primer elemento tiene que ser el propio scope (canónico), no otro`));
|
|
189
|
+
}
|
|
190
|
+
return chain;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* El scope CANÓNICO para una escritura que no exige que exista (`revoke`,
|
|
194
|
+
* `removeDeny`, `purgeScope`): la fila del árbol si lo conoce (un alias se
|
|
195
|
+
* canoniza y el hecho canónico se encuentra, K1); el scope tal cual si ya no
|
|
196
|
+
* lo conoce (un hecho de un scope borrado sin avisar, D8, sigue siendo
|
|
197
|
+
* alcanzable con su identidad exacta) o si el driver no tiene resolutor (solo
|
|
198
|
+
* existe la raíz: no hay nada con lo que canonizar). Un resolutor que LANZA
|
|
199
|
+
* sigue siendo 503: no se limpia a ciegas cuando el árbol está caído.
|
|
200
|
+
*/
|
|
201
|
+
export async function canonicalScope(resolver, scope, operation) {
|
|
202
|
+
try {
|
|
203
|
+
const chain = await resolveChain(resolver, scope, operation);
|
|
204
|
+
return chain ? chain[0] : scope;
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
if (error instanceof NoScopeResolverError)
|
|
208
|
+
return scope;
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/** La cadena canónica, o 422 `E_AUTHZ_UNKNOWN_SCOPE` si el scope no existe (para escrituras). */
|
|
213
|
+
export async function assertKnownScope(resolver, scope, operation) {
|
|
214
|
+
const chain = await resolveChain(resolver, scope, operation);
|
|
215
|
+
if (!chain) {
|
|
216
|
+
throw new UnknownScopeError(`El scope ${scope.type}:${scope.uuid} no existe para el resolutor de la cadena (${operation}). ` +
|
|
217
|
+
`No se escribe sobre un scope que el árbol no reconoce.`);
|
|
218
|
+
}
|
|
219
|
+
return chain;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=backend_guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend_guard.js","sourceRoot":"","sources":["../../../src/drivers/backend_guard.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAE5C;;;;;;;;;;;GAWG;AAEH,2EAA2E;AAC3E,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAQ,KAAa,EAAE,IAAI,KAAK,QAAQ,IAAK,KAAa,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAA;AAC/F,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,MAAM,CAAC,GAAQ,KAAK,CAAA;IACpB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC7C,IAAI,CAAC,CAAC,IAAI,KAAK,kBAAkB;QAAE,OAAO,IAAI,CAAA;IAC9C,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACtE,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC9E,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAClH,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,GAAQ,KAAK,CAAA;IACxB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QAC3F,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAA;QAChF,OAAO,GAAG,OAAO,CAAC,KAAK,CAAA;IACzB,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAc,EACd,SAAiB,EACjB,SAAiB,EACjB,EAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,KAAK,GAAQ,EAAE,EAAE,CAAA;QACvB,IAAI,OAAO,KAAK,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5C,CAAC;YAAC,MAAM,CAAC;gBACP,sEAAsE;gBACtE,sEAAsE;gBACtE,iEAAiE;gBACjE,yBAAyB;gBACzB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,KAAK,CAAA;IACpB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,YAAY,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAA;QACpC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,gCAAgC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;QACjF,CAAC;QACD,MAAM,IAAI,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAI,OAAmB,EAAE,EAAU,EAAE,SAAsB;IACrF,IAAI,KAAgD,CAAA;IACpD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAChD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACjD,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA;IACjB,CAAC,CAAC,CAAA;IACF,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;AAC7E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAuB,KAAK,EAAE,KAAK,EAAE,EAAE;IAClE,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACrD,MAAM,IAAI,oBAAoB,CAC5B,yEAAyE,KAAK,CAAC,IAAI,KAAK;QACtF,mFAAmF;QACnF,0DAA0D,CAC7D,CAAA;AACH,CAAC,CAAA;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,SAAwB,EAAE,KAAoB;IACrE,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,KAAK,KAAK,CAAA;IACpE,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IACvE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAA;AACxC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAA4B,EAC5B,KAAe,EACf,SAAiB;IAEjB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACrD,IAAI,KAAwB,CAAA;IAC5B,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,YAAY,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAA;QACpC,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,kBAAkB,CAC1B,SAAS,EACT,IAAI,SAAS,CAAC,yBAAyB,OAAO,KAAK,8BAA8B,CAAC,CACnF,CAAA;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,kBAAkB,CAC1B,SAAS,EACT,IAAI,SAAS,CACX,+CAA+C,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,kDAAkD,CAChI,CACF,CAAA;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,WAAW,CAAC,OAAO,CAAC,CAAA;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACrB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,kBAAkB,CAC1B,SAAS,EACT,IAAI,SAAS,CACX,yBAAyB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,mCAAmC;YACtF,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,wEAAwE,CAC5G,CACF,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAA4B,EAAE,KAAe,EAAE,SAAiB;IACnG,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;QAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,oBAAoB;YAAE,OAAO,KAAK,CAAA;QACvD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAA4B,EAC5B,KAAe,EACf,SAAiB;IAEjB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAC5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,iBAAiB,CACzB,YAAY,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,8CAA8C,SAAS,KAAK;YAC9F,wDAAwD,CAC3D,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|