@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,28 @@
|
|
|
1
|
+
import { BaseCommand } from '@adonisjs/core/ace';
|
|
2
|
+
import { CommandOptions } from '@adonisjs/core/types/ace';
|
|
3
|
+
/**
|
|
4
|
+
* Compara los catálogos declarados en `config/authorization.ts` (`catalogs`)
|
|
5
|
+
* con las tablas `authz_*` y sale con código ≠ 0 si hay diferencias: roles o
|
|
6
|
+
* permisos que faltan, vínculos que faltan, vínculos SOBRANTES (un permiso
|
|
7
|
+
* que el config ya no da y la base sigue dando: L0.9) y roles AMBIGUOS (dos
|
|
8
|
+
* homónimos visibles en la misma cadena, 3D · M2). Pensado para CI: un
|
|
9
|
+
* config que no coincide con producción no pasa.
|
|
10
|
+
*
|
|
11
|
+
* node ace authz:catalog:diff
|
|
12
|
+
* node ace authz:catalog:diff --fail-on-shadows
|
|
13
|
+
*
|
|
14
|
+
* Los roles locales ENSOMBRECIDOS por una definición más autorizada (un
|
|
15
|
+
* global, o el de un ancestro) se LISTAN y no cuentan como deriva (3F · S3):
|
|
16
|
+
* un tenant no puede dejar en rojo el gate de CI de la plataforma. El precio
|
|
17
|
+
* es que nadie se entera por CI de que las rutas por slug de ese subárbol
|
|
18
|
+
* están muertas, así que `--fail-on-shadows` lo convierte en deriva para
|
|
19
|
+
* quien sí quiera enterarse (3G · X3).
|
|
20
|
+
*/
|
|
21
|
+
export default class AuthzCatalogDiff extends BaseCommand {
|
|
22
|
+
static commandName: string;
|
|
23
|
+
static description: string;
|
|
24
|
+
static options: CommandOptions;
|
|
25
|
+
failOnShadows: boolean;
|
|
26
|
+
run(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=authz_catalog_diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authz_catalog_diff.d.ts","sourceRoot":"","sources":["../../commands/authz_catalog_diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAuB;IACzC,MAAM,CAAC,WAAW,SAAsF;IAExG,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAMO,aAAa,EAAE,OAAO,CAAA;IAExB,GAAG;CA0BV"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { BaseCommand, flags } from '@adonisjs/core/ace';
|
|
11
|
+
/**
|
|
12
|
+
* Compara los catálogos declarados en `config/authorization.ts` (`catalogs`)
|
|
13
|
+
* con las tablas `authz_*` y sale con código ≠ 0 si hay diferencias: roles o
|
|
14
|
+
* permisos que faltan, vínculos que faltan, vínculos SOBRANTES (un permiso
|
|
15
|
+
* que el config ya no da y la base sigue dando: L0.9) y roles AMBIGUOS (dos
|
|
16
|
+
* homónimos visibles en la misma cadena, 3D · M2). Pensado para CI: un
|
|
17
|
+
* config que no coincide con producción no pasa.
|
|
18
|
+
*
|
|
19
|
+
* node ace authz:catalog:diff
|
|
20
|
+
* node ace authz:catalog:diff --fail-on-shadows
|
|
21
|
+
*
|
|
22
|
+
* Los roles locales ENSOMBRECIDOS por una definición más autorizada (un
|
|
23
|
+
* global, o el de un ancestro) se LISTAN y no cuentan como deriva (3F · S3):
|
|
24
|
+
* un tenant no puede dejar en rojo el gate de CI de la plataforma. El precio
|
|
25
|
+
* es que nadie se entera por CI de que las rutas por slug de ese subárbol
|
|
26
|
+
* están muertas, así que `--fail-on-shadows` lo convierte en deriva para
|
|
27
|
+
* quien sí quiera enterarse (3G · X3).
|
|
28
|
+
*/
|
|
29
|
+
export default class AuthzCatalogDiff extends BaseCommand {
|
|
30
|
+
static commandName = 'authz:catalog:diff';
|
|
31
|
+
static description = 'Compare the catalogs declared in config with the authz_* tables (exit 1 on drift)';
|
|
32
|
+
static options = {
|
|
33
|
+
startApp: true,
|
|
34
|
+
};
|
|
35
|
+
async run() {
|
|
36
|
+
const config = this.app.config.get('authorization');
|
|
37
|
+
const catalogs = config?.catalogs;
|
|
38
|
+
if (!Array.isArray(catalogs) || catalogs.length === 0) {
|
|
39
|
+
this.logger.error('No hay catálogos declarados: añade `catalogs: [() => import(...)]` a config/authorization.ts');
|
|
40
|
+
this.exitCode = 1;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const { runCatalogDiff } = await import('../src/catalog.js');
|
|
44
|
+
// Con el resolutor del config el diff puede juzgar además si dos roles
|
|
45
|
+
// LOCALES homónimos son visibles en la misma cadena (3D · M2 d).
|
|
46
|
+
const { inSync, lines } = await runCatalogDiff(catalogs, {
|
|
47
|
+
resolveChain: config?.scopes?.resolveChain,
|
|
48
|
+
failOnShadows: this.failOnShadows === true,
|
|
49
|
+
});
|
|
50
|
+
for (const line of lines)
|
|
51
|
+
this.logger.log(line);
|
|
52
|
+
if (inSync) {
|
|
53
|
+
this.logger.success('Catálogo en sync con la base.');
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.logger.error('El catálogo NO está en sync: ejecuta `node ace authz:catalog:sync`.');
|
|
57
|
+
this.exitCode = 1;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
__decorate([
|
|
61
|
+
flags.boolean({
|
|
62
|
+
name: 'fail-on-shadows',
|
|
63
|
+
description: 'Exit 1 too when a local role is shadowed by a more authoritative one (global or ancestor)',
|
|
64
|
+
}),
|
|
65
|
+
__metadata("design:type", Boolean)
|
|
66
|
+
], AuthzCatalogDiff.prototype, "failOnShadows", void 0);
|
|
67
|
+
//# sourceMappingURL=authz_catalog_diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authz_catalog_diff.js","sourceRoot":"","sources":["../../commands/authz_catalog_diff.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGvD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,GAAG,oBAAoB,CAAA;IACzC,MAAM,CAAC,WAAW,GAAG,mFAAmF,CAAA;IAExG,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,IAAI;KACf,CAAA;IAQD,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAQ,CAAA;QAC1D,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAA;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8FAA8F,CAC/F,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC5D,uEAAuE;QACvE,iEAAiE;QACjE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE;YACvD,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY;YAC1C,aAAa,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI;SAC3C,CAAC,CAAA;QACF,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAA;YACpD,OAAM;QACR,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAA;QACxF,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;IACnB,CAAC;;AA3BO;IAJP,KAAK,CAAC,OAAO,CAAC;QACb,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,2FAA2F;KACzG,CAAC;;uDAC4B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { BaseCommand } from '@adonisjs/core/ace';
|
|
2
|
+
import { CommandOptions } from '@adonisjs/core/types/ace';
|
|
3
|
+
/**
|
|
4
|
+
* Sincroniza a las tablas `authz_*` los catálogos declarados en
|
|
5
|
+
* `config/authorization.ts` (`catalogs`), en orden. Transaccional por
|
|
6
|
+
* catálogo; con la poda de vínculos activa por defecto (L0.9): un permiso que
|
|
7
|
+
* el config quita de un rol deja de concederse. Nunca borra roles ni
|
|
8
|
+
* permisos.
|
|
9
|
+
*
|
|
10
|
+
* node ace authz:catalog:sync
|
|
11
|
+
* node ace authz:catalog:sync --keep-links # solo aditivo (1.x)
|
|
12
|
+
*/
|
|
13
|
+
export default class AuthzCatalogSync extends BaseCommand {
|
|
14
|
+
static commandName: string;
|
|
15
|
+
static description: string;
|
|
16
|
+
static options: CommandOptions;
|
|
17
|
+
keepLinks: boolean | undefined;
|
|
18
|
+
run(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=authz_catalog_sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authz_catalog_sync.d.ts","sourceRoot":"","sources":["../../commands/authz_catalog_sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAuB;IACzC,MAAM,CAAC,WAAW,SAAiE;IAEnF,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAGO,SAAS,EAAE,OAAO,GAAG,SAAS,CAAA;IAEhC,GAAG;CAmCV"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { BaseCommand, flags } from '@adonisjs/core/ace';
|
|
11
|
+
/**
|
|
12
|
+
* Sincroniza a las tablas `authz_*` los catálogos declarados en
|
|
13
|
+
* `config/authorization.ts` (`catalogs`), en orden. Transaccional por
|
|
14
|
+
* catálogo; con la poda de vínculos activa por defecto (L0.9): un permiso que
|
|
15
|
+
* el config quita de un rol deja de concederse. Nunca borra roles ni
|
|
16
|
+
* permisos.
|
|
17
|
+
*
|
|
18
|
+
* node ace authz:catalog:sync
|
|
19
|
+
* node ace authz:catalog:sync --keep-links # solo aditivo (1.x)
|
|
20
|
+
*/
|
|
21
|
+
export default class AuthzCatalogSync extends BaseCommand {
|
|
22
|
+
static commandName = 'authz:catalog:sync';
|
|
23
|
+
static description = 'Sync the catalogs declared in config into the authz_* tables';
|
|
24
|
+
static options = {
|
|
25
|
+
startApp: true,
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const config = this.app.config.get('authorization');
|
|
29
|
+
const catalogs = config?.catalogs;
|
|
30
|
+
if (!Array.isArray(catalogs) || catalogs.length === 0) {
|
|
31
|
+
this.logger.error('No hay catálogos declarados: añade `catalogs: [() => import(...)]` a config/authorization.ts');
|
|
32
|
+
this.exitCode = 1;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const { syncCatalogs } = await import('../src/catalog.js');
|
|
36
|
+
const { count, shadowedByGlobal, assignableAtViolations } = await syncCatalogs(catalogs, {
|
|
37
|
+
prune: this.keepLinks ? 'none' : 'links',
|
|
38
|
+
});
|
|
39
|
+
// 3E · P1 b / P6: el sync ya no aborta por lo que un tenant hizo en su
|
|
40
|
+
// scope, pero tampoco lo silencia. Un despliegue que ensombrece roles de
|
|
41
|
+
// tenants —o que deja vínculos fuera del `assignableAt` nuevo— tiene que
|
|
42
|
+
// salir por pantalla y quedar en el log del deploy.
|
|
43
|
+
for (const role of shadowedByGlobal) {
|
|
44
|
+
this.logger.warning(`rol local ENSOMBRECIDO por el global del spec: ${role.slug}@${role.scopeType} (uuid ${role.uuid}, owner ${role.owner}). ` +
|
|
45
|
+
`El global gana; en esa cadena el slug pasa a 422 E_AUTHZ_AMBIGUOUS_ROLE hasta que se purgue uno.`);
|
|
46
|
+
}
|
|
47
|
+
for (const violation of assignableAtViolations) {
|
|
48
|
+
this.logger.warning(`vínculo fuera de assignableAt: ${violation.role.slug}@${violation.role.scopeType} (owner ${violation.role.owner}) → ` +
|
|
49
|
+
`${violation.permission}. No se ha borrado (lo asignado sigue concediendo): quítalo o amplía el assignableAt.`);
|
|
50
|
+
}
|
|
51
|
+
this.logger.success(`${count} catálogo(s) sincronizado(s)` + (this.keepLinks ? ' (sin poda de vínculos).' : '.'));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
__decorate([
|
|
55
|
+
flags.boolean({ description: 'Do not prune role→permission links missing from the spec' }),
|
|
56
|
+
__metadata("design:type", Object)
|
|
57
|
+
], AuthzCatalogSync.prototype, "keepLinks", void 0);
|
|
58
|
+
//# sourceMappingURL=authz_catalog_sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authz_catalog_sync.js","sourceRoot":"","sources":["../../commands/authz_catalog_sync.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGvD;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,GAAG,oBAAoB,CAAA;IACzC,MAAM,CAAC,WAAW,GAAG,8DAA8D,CAAA;IAEnF,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,IAAI;KACf,CAAA;IAKD,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAQ,CAAA;QAC1D,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAA;QACjC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,8FAA8F,CAC/F,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC1D,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE;YACvF,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;SACzC,CAAC,CAAA;QACF,uEAAuE;QACvE,yEAAyE;QACzE,yEAAyE;QACzE,oDAAoD;QACpD,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,kDAAkD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,IAAI,WAAW,IAAI,CAAC,KAAK,KAAK;gBACxH,kGAAkG,CACrG,CAAA;QACH,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,sBAAsB,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,kCAAkC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,WAAW,SAAS,CAAC,IAAI,CAAC,KAAK,MAAM;gBACpH,GAAG,SAAS,CAAC,UAAU,uFAAuF,CACjH,CAAA;QACH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,GAAG,KAAK,8BAA8B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,CAC7F,CAAA;IACH,CAAC;;AApCO;IADP,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,0DAA0D,EAAE,CAAC;;mDACrD"}
|
package/build/commands/main.d.ts
CHANGED
|
@@ -4,4 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { default as OpenFgaProvision } from './openfga_provision.js';
|
|
6
6
|
export { default as OpenFgaImport } from './openfga_import.js';
|
|
7
|
+
export { default as AuthzCatalogDiff } from './authz_catalog_diff.js';
|
|
8
|
+
export { default as AuthzCatalogSync } from './authz_catalog_sync.js';
|
|
7
9
|
//# sourceMappingURL=main.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
|
package/build/commands/main.js
CHANGED
|
@@ -4,4 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export { default as OpenFgaProvision } from './openfga_provision.js';
|
|
6
6
|
export { default as OpenFgaImport } from './openfga_import.js';
|
|
7
|
+
export { default as AuthzCatalogDiff } from './authz_catalog_diff.js';
|
|
8
|
+
export { default as AuthzCatalogSync } from './authz_catalog_sync.js';
|
|
7
9
|
//# sourceMappingURL=main.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA"}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
|
|
@@ -12,8 +12,12 @@ import { CommandOptions } from '@adonisjs/core/types/ace';
|
|
|
12
12
|
* 3. node ace openfga:import [--dry-run] → copia los hechos
|
|
13
13
|
* 4. AUTHZ_DRIVER=openfga + reiniciar api/worker.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* No destructivo (las tablas locales quedan intactas → rollback = volver a
|
|
16
|
+
* AUTHZ_DRIVER=database). Sobre un store que YA tiene tuplas exige
|
|
17
|
+
* `--reconcile`: compara tupla a tupla, reescribe las que difieren en
|
|
18
|
+
* caducidad (S7) — nunca "ignora duplicados", porque en FGA la condición no
|
|
19
|
+
* es parte de la clave — y cuenta las que SQL no tiene (`extra`); con
|
|
20
|
+
* `--prune` las borra (D14): es lo que hace que el reconcile converja.
|
|
17
21
|
*/
|
|
18
22
|
export default class OpenFgaImport extends BaseCommand {
|
|
19
23
|
static commandName: string;
|
|
@@ -23,6 +27,8 @@ export default class OpenFgaImport extends BaseCommand {
|
|
|
23
27
|
storeId: string | undefined;
|
|
24
28
|
modelId: string | undefined;
|
|
25
29
|
dryRun: boolean | undefined;
|
|
30
|
+
reconcile: boolean | undefined;
|
|
31
|
+
prune: boolean | undefined;
|
|
26
32
|
run(): Promise<void>;
|
|
27
33
|
}
|
|
28
34
|
//# sourceMappingURL=openfga_import.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openfga_import.d.ts","sourceRoot":"","sources":["../../commands/openfga_import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD
|
|
1
|
+
{"version":3,"file":"openfga_import.d.ts","sourceRoot":"","sources":["../../commands/openfga_import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,WAAW,SAAmB;IACrC,MAAM,CAAC,WAAW,SAAgF;IAElG,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAGO,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAGvB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAG3B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAG3B,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IAM3B,SAAS,EAAE,OAAO,GAAG,SAAS,CAAA;IAG9B,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAE5B,GAAG;CAyCV"}
|
|
@@ -20,8 +20,12 @@ import { BaseCommand, flags } from '@adonisjs/core/ace';
|
|
|
20
20
|
* 3. node ace openfga:import [--dry-run] → copia los hechos
|
|
21
21
|
* 4. AUTHZ_DRIVER=openfga + reiniciar api/worker.
|
|
22
22
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
23
|
+
* No destructivo (las tablas locales quedan intactas → rollback = volver a
|
|
24
|
+
* AUTHZ_DRIVER=database). Sobre un store que YA tiene tuplas exige
|
|
25
|
+
* `--reconcile`: compara tupla a tupla, reescribe las que difieren en
|
|
26
|
+
* caducidad (S7) — nunca "ignora duplicados", porque en FGA la condición no
|
|
27
|
+
* es parte de la clave — y cuenta las que SQL no tiene (`extra`); con
|
|
28
|
+
* `--prune` las borra (D14): es lo que hace que el reconcile converja.
|
|
25
29
|
*/
|
|
26
30
|
export default class OpenFgaImport extends BaseCommand {
|
|
27
31
|
static commandName = 'openfga:import';
|
|
@@ -38,18 +42,27 @@ export default class OpenFgaImport extends BaseCommand {
|
|
|
38
42
|
this.exitCode = 1;
|
|
39
43
|
return;
|
|
40
44
|
}
|
|
41
|
-
|
|
45
|
+
// El subpath `/openfga` es la única puerta al SDK (D9).
|
|
46
|
+
const { importAuthzFactsToOpenFga } = await import('../src/openfga.js');
|
|
42
47
|
const holderTypes = config?.holderTypes ?? {};
|
|
43
48
|
const result = await importAuthzFactsToOpenFga({
|
|
44
49
|
apiUrl,
|
|
45
50
|
storeId,
|
|
46
51
|
modelId: this.modelId ?? config?.openfga?.modelId,
|
|
47
52
|
dryRun: this.dryRun ?? false,
|
|
53
|
+
reconcile: this.reconcile ?? false,
|
|
54
|
+
prune: this.prune ?? false,
|
|
48
55
|
holderTypes,
|
|
49
56
|
});
|
|
50
|
-
const verb = result.dryRun ? 'Se escribirían' : '
|
|
51
|
-
this.logger.success(`${verb} ${result.
|
|
52
|
-
|
|
57
|
+
const verb = result.dryRun ? 'Se escribirían' : 'Escritas';
|
|
58
|
+
this.logger.success(`${verb} ${result.written} tuplas nuevas, ${result.updated} reescritas (caducidad distinta), ` +
|
|
59
|
+
`${result.unchanged} sin cambios; ${result.skippedExpired} asignaciones ya expiradas omitidas.`);
|
|
60
|
+
if (result.extra > 0 && !this.prune) {
|
|
61
|
+
this.logger.warning(`${result.extra} tupla(s) del store no están en SQL y SIGUEN concediendo: vuelve a ejecutar con --reconcile --prune para borrarlas.`);
|
|
62
|
+
}
|
|
63
|
+
else if (this.prune) {
|
|
64
|
+
this.logger.log(`${result.dryRun ? 'Se borrarían' : 'Borradas'} ${result.deleted} tupla(s) que SQL no tiene.`);
|
|
65
|
+
}
|
|
53
66
|
if (!result.dryRun) {
|
|
54
67
|
this.logger.log('Siguiente paso: AUTHZ_DRIVER=openfga y reiniciar api/worker.');
|
|
55
68
|
}
|
|
@@ -71,4 +84,14 @@ __decorate([
|
|
|
71
84
|
flags.boolean({ description: 'Count what would be written, without writing' }),
|
|
72
85
|
__metadata("design:type", Object)
|
|
73
86
|
], OpenFgaImport.prototype, "dryRun", void 0);
|
|
87
|
+
__decorate([
|
|
88
|
+
flags.boolean({
|
|
89
|
+
description: 'Import into a non-empty store: compare tuple by tuple, rewrite the ones that differ and count the ones SQL no longer has (extra)',
|
|
90
|
+
}),
|
|
91
|
+
__metadata("design:type", Object)
|
|
92
|
+
], OpenFgaImport.prototype, "reconcile", void 0);
|
|
93
|
+
__decorate([
|
|
94
|
+
flags.boolean({ description: 'With --reconcile: delete the tuples SQL no longer has (reported as deleted)' }),
|
|
95
|
+
__metadata("design:type", Object)
|
|
96
|
+
], OpenFgaImport.prototype, "prune", void 0);
|
|
74
97
|
//# sourceMappingURL=openfga_import.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openfga_import.js","sourceRoot":"","sources":["../../commands/openfga_import.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGvD
|
|
1
|
+
{"version":3,"file":"openfga_import.js","sourceRoot":"","sources":["../../commands/openfga_import.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openfga_provision.d.ts","sourceRoot":"","sources":["../../commands/openfga_provision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAsB;IACxC,MAAM,CAAC,WAAW,SAAoE;IAEtF,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAGO,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAGvB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAG3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IAE1B,GAAG;
|
|
1
|
+
{"version":3,"file":"openfga_provision.d.ts","sourceRoot":"","sources":["../../commands/openfga_provision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAsB;IACxC,MAAM,CAAC,WAAW,SAAoE;IAEtF,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAGO,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAGvB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAG3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IAE1B,GAAG;CAoCV"}
|
|
@@ -38,7 +38,8 @@ export default class OpenFgaProvision extends BaseCommand {
|
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
const { OpenFgaClient } = await import('@openfga/sdk');
|
|
41
|
-
|
|
41
|
+
// El subpath `/openfga` es la única puerta al SDK (D9).
|
|
42
|
+
const { openFgaAuthorizationModel, provisionOpenFgaStore } = await import('../src/openfga.js');
|
|
42
43
|
// Los holders del consumidor viven en SU config, no en el paquete.
|
|
43
44
|
const holderTypes = config?.holderTypes ?? {};
|
|
44
45
|
if (this.storeId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openfga_provision.js","sourceRoot":"","sources":["../../commands/openfga_provision.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,GAAG,mBAAmB,CAAA;IACxC,MAAM,CAAC,WAAW,GAAG,iEAAiE,CAAA;IAEtF,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,KAAK;KAChB,CAAA;IAWD,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAQ,CAAA;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,OAAO,EAAE,GAAG,CAAA;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAA;YAChG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACtD,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"openfga_provision.js","sourceRoot":"","sources":["../../commands/openfga_provision.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,GAAG,mBAAmB,CAAA;IACxC,MAAM,CAAC,WAAW,GAAG,iEAAiE,CAAA;IAEtF,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,KAAK;KAChB,CAAA;IAWD,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAQ,CAAA;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,OAAO,EAAE,GAAG,CAAA;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAA;YAChG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACtD,wDAAwD;QACxD,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC9F,mEAAmE;QACnE,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,IAAI,EAAE,CAAA;QAE7C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACnE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,CAAA;YAC1F,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAA;YAC/E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAA;YACnE,OAAM;QACR,CAAC;QAED,wEAAwE;QACxE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,qBAAqB,CACtD,MAAM,EACN,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAC3D,WAAW,CACZ,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAA;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;QAChE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,MAAM,EAAE,CAAC,CAAA;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;IAChD,CAAC;;AA3CO;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;;6CAC5C;AAGvB;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;;iDACnD;AAG3B;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;8CAC9D"}
|
package/build/index.d.ts
CHANGED
|
@@ -2,15 +2,61 @@
|
|
|
2
2
|
* Entrada pública del paquete.
|
|
3
3
|
* import { AuthorizationManager, APP_SCOPE } from '@jantstack/adonis-authz'
|
|
4
4
|
*/
|
|
5
|
-
export { AuthorizationManager } from './src/manager.js';
|
|
5
|
+
export { AuthorizationManager, DEFAULT_MAX_SCOPES, DEFAULT_MAX_DESCENDANTS, MAX_SCOPE_BOUND, DEFAULT_VIEW_MAX_AGE_MS, expandExcludedSubtrees } from './src/manager.js';
|
|
6
|
+
export type { AuthorizationView, ForRequestOptions } from './src/manager.js';
|
|
6
7
|
export { defineConfig } from './src/define_config.js';
|
|
7
8
|
export type { AuthorizationConfig } from './src/define_config.js';
|
|
8
|
-
export { syncAuthzCatalog } from './src/catalog.js';
|
|
9
|
+
export { syncAuthzCatalog, diffAuthzCatalog, catalogInSync, formatCatalogDiff, formatScopedRoles, formatShadowedRoles, runCatalogDiff, syncCatalogs, } from './src/catalog.js';
|
|
10
|
+
export type { SyncCatalogOptions, CatalogDiff, CatalogLinkRef, CatalogSource } from './src/catalog.js';
|
|
11
|
+
/**
|
|
12
|
+
* Memo del catálogo (2.1): se revalida contra la versión compartida
|
|
13
|
+
* `authz_catalog_version`, que `syncAuthzCatalog` sube como última sentencia
|
|
14
|
+
* de su transacción. Quien escriba `authz_*` por fuera lo hace con
|
|
15
|
+
* `withAuthzCatalogWrite(async (trx) => …)` (misma transacción, bump al
|
|
16
|
+
* final: todos los procesos lo ven) — `bumpAuthzCatalogVersion(trx)` exige
|
|
17
|
+
* ese trx; `invalidateAuthzCatalog()` solo alcanza a este proceso.
|
|
18
|
+
*/
|
|
19
|
+
export { CatalogCache, invalidateAuthzCatalog, bumpAuthzCatalogVersion, withAuthzCatalogWrite, readAuthzCatalogVersion, CATALOG_VERSION_TABLE, GLOBAL_OWNER_KEY, } from './src/catalog_cache.js';
|
|
20
|
+
export type { CatalogCacheOptions, CatalogRevalidate, CatalogView, CatalogRoleRef, CatalogPermission, AuthzCatalogWriteOptions, CatalogVersionClient, CatalogVersionTransaction, } from './src/catalog_cache.js';
|
|
21
|
+
/**
|
|
22
|
+
* Memo de ancestros de una instancia (2.1), solo para el camino de lectura.
|
|
23
|
+
* `authorization.forRequest()` ya lo aplica por ti.
|
|
24
|
+
*/
|
|
25
|
+
export { memoizeAncestors } from './src/memoize_ancestors.js';
|
|
26
|
+
/**
|
|
27
|
+
* Arbol del consumidor (2.1): `hierarchicalScopeResolver` construye el
|
|
28
|
+
* resolutor de ancestros desde un `parentOf`; `sqlDescendantsOf` genera el
|
|
29
|
+
* `descendantsOf` opt-in (CTE recursiva, PG y SQLite) para `authorizedScopes`.
|
|
30
|
+
*/
|
|
31
|
+
export { hierarchicalScopeResolver } from './src/hierarchical_resolver.js';
|
|
32
|
+
export type { HierarchicalResolverOptions, NodeOf, ScopeNode } from './src/hierarchical_resolver.js';
|
|
33
|
+
export { sqlDescendantsOf } from './src/sql_descendants.js';
|
|
34
|
+
export type { SqlDescendantsOptions } from './src/sql_descendants.js';
|
|
35
|
+
/**
|
|
36
|
+
* El backend de autorización no respondió (503). Tipo PROPIO a propósito: sin
|
|
37
|
+
* él escaparía el error del SDK del driver, y distinguir "backend caído"
|
|
38
|
+
* obligaría a importar ese SDK — acoplando el call-site al backend que este
|
|
39
|
+
* paquete existe para abstraer.
|
|
40
|
+
*/
|
|
41
|
+
export { AuthorizationBackendError, AuthorizationBackendTimeoutError, ScopeResolverError, InvalidIdentityError, InvalidSlugError, AuthorizationConfigError, AuthorizationInternalError, UnknownScopeError, NoScopeResolverError, UnknownRoleError, UnknownPermissionError, CatalogConflictError, RoleIsNotAccessError, ScopeCycleError, PurgeIncompleteError, StoreNotEmptyError, ActorRequiredError, NotWithinError, WithinRequiredError, WithinRootForbiddenError, TooManyScopesError, UnsupportedDialectError, ScopeTooDeepError, UnsupportedOperationError, NoDescendantsResolverError, ViewExpiredError, RoleNotVisibleError, AmbiguousRoleError, RoleImmutableError, RoleLevelAboveOwnerError, RoleNotAssignableAtError, PermissionNotDelegableError, RankExceededError, } from './src/errors.js';
|
|
42
|
+
/**
|
|
43
|
+
* Validación de identidad y de slugs (422). La aplica el manager en cada
|
|
44
|
+
* llamada y los drivers por defensa en profundidad; se exporta para que un
|
|
45
|
+
* consumidor valide en su borde (un formulario, un importador) con la MISMA
|
|
46
|
+
* regla y no con una copia.
|
|
47
|
+
*/
|
|
48
|
+
export { assertIdentity, assertSubject, assertScope, assertValidSlug, assertExpiresAt, assertNoSlugCollisions, normalizeRoleQuery, scopeKey, scopeFromKey, IDENTITY_LIMITS, MAX_SLUG_LENGTH, RESERVED_SLUGS, RESERVED_SLUG_PREFIXES, } from './src/identity.js';
|
|
49
|
+
export type { IdentityParts, SlugKind } from './src/identity.js';
|
|
50
|
+
export { resolveGrantExpiry, isActiveExpiry, sameInstant } from './src/expiry.js';
|
|
9
51
|
export { DatabaseAuthorizationDriver, APP_SCOPE_DB_UUID } from './src/drivers/database_driver.js';
|
|
10
|
-
export {
|
|
11
|
-
|
|
52
|
+
export type { DatabaseDriverOptions } from './src/drivers/database_driver.js';
|
|
53
|
+
/**
|
|
54
|
+
* El driver `openfga` NO se exporta desde aquí: vive en el subpath
|
|
55
|
+
* `@jantstack/adonis-authz/openfga`, que es lo único que importa el peer
|
|
56
|
+
* opcional `@openfga/sdk`. Un consumidor solo-database arranca sin él (D9).
|
|
57
|
+
*/
|
|
12
58
|
export { APP_SCOPE, APP_SCOPE_TYPE } from './src/types.js';
|
|
13
|
-
export type { AuthorizationDriver, AuthorizationDriverFactory, AuthzWriteEvent, CatalogRoleSpec, CatalogSpec, GrantOptions,
|
|
59
|
+
export type { AuthorizationDriver, AuthorizationDriverFactory, AuthorizedScopes, AuthzWriteEvent, AuthzCatalogWriteEvent, CatalogPermissionSpec, CatalogRole, CatalogRoleSpec, CatalogSpec, ScopedRoleChanges, ScopedRoleSpec, DenyOptions, DenyRef, ExcludedSubtree, GrantOptions, GrantOutcome, HolderTypeMap, RoleQuery, ScopeChainResolver, ScopeDescendantsResolver, ScopeDetachOutcome, ScopedWriteOptions, ScopeRef, ScopeType, SubjectRef, WriteOptions, } from './src/types.js';
|
|
14
60
|
export { default as AuthzRole } from './src/models/authz_role.js';
|
|
15
61
|
export { default as AuthzPermission } from './src/models/authz_permission.js';
|
|
16
62
|
export { default as AuthzRolePermission } from './src/models/authz_role_permission.js';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -2,11 +2,51 @@
|
|
|
2
2
|
* Entrada pública del paquete.
|
|
3
3
|
* import { AuthorizationManager, APP_SCOPE } from '@jantstack/adonis-authz'
|
|
4
4
|
*/
|
|
5
|
-
export { AuthorizationManager } from './src/manager.js';
|
|
5
|
+
export { AuthorizationManager, DEFAULT_MAX_SCOPES, DEFAULT_MAX_DESCENDANTS, MAX_SCOPE_BOUND, DEFAULT_VIEW_MAX_AGE_MS, expandExcludedSubtrees } from './src/manager.js';
|
|
6
6
|
export { defineConfig } from './src/define_config.js';
|
|
7
|
-
export { syncAuthzCatalog } from './src/catalog.js';
|
|
7
|
+
export { syncAuthzCatalog, diffAuthzCatalog, catalogInSync, formatCatalogDiff, formatScopedRoles, formatShadowedRoles, runCatalogDiff, syncCatalogs, } from './src/catalog.js';
|
|
8
|
+
/**
|
|
9
|
+
* Memo del catálogo (2.1): se revalida contra la versión compartida
|
|
10
|
+
* `authz_catalog_version`, que `syncAuthzCatalog` sube como última sentencia
|
|
11
|
+
* de su transacción. Quien escriba `authz_*` por fuera lo hace con
|
|
12
|
+
* `withAuthzCatalogWrite(async (trx) => …)` (misma transacción, bump al
|
|
13
|
+
* final: todos los procesos lo ven) — `bumpAuthzCatalogVersion(trx)` exige
|
|
14
|
+
* ese trx; `invalidateAuthzCatalog()` solo alcanza a este proceso.
|
|
15
|
+
*/
|
|
16
|
+
export { CatalogCache, invalidateAuthzCatalog, bumpAuthzCatalogVersion, withAuthzCatalogWrite, readAuthzCatalogVersion, CATALOG_VERSION_TABLE, GLOBAL_OWNER_KEY, } from './src/catalog_cache.js';
|
|
17
|
+
/**
|
|
18
|
+
* Memo de ancestros de una instancia (2.1), solo para el camino de lectura.
|
|
19
|
+
* `authorization.forRequest()` ya lo aplica por ti.
|
|
20
|
+
*/
|
|
21
|
+
export { memoizeAncestors } from './src/memoize_ancestors.js';
|
|
22
|
+
/**
|
|
23
|
+
* Arbol del consumidor (2.1): `hierarchicalScopeResolver` construye el
|
|
24
|
+
* resolutor de ancestros desde un `parentOf`; `sqlDescendantsOf` genera el
|
|
25
|
+
* `descendantsOf` opt-in (CTE recursiva, PG y SQLite) para `authorizedScopes`.
|
|
26
|
+
*/
|
|
27
|
+
export { hierarchicalScopeResolver } from './src/hierarchical_resolver.js';
|
|
28
|
+
export { sqlDescendantsOf } from './src/sql_descendants.js';
|
|
29
|
+
/**
|
|
30
|
+
* El backend de autorización no respondió (503). Tipo PROPIO a propósito: sin
|
|
31
|
+
* él escaparía el error del SDK del driver, y distinguir "backend caído"
|
|
32
|
+
* obligaría a importar ese SDK — acoplando el call-site al backend que este
|
|
33
|
+
* paquete existe para abstraer.
|
|
34
|
+
*/
|
|
35
|
+
export { AuthorizationBackendError, AuthorizationBackendTimeoutError, ScopeResolverError, InvalidIdentityError, InvalidSlugError, AuthorizationConfigError, AuthorizationInternalError, UnknownScopeError, NoScopeResolverError, UnknownRoleError, UnknownPermissionError, CatalogConflictError, RoleIsNotAccessError, ScopeCycleError, PurgeIncompleteError, StoreNotEmptyError, ActorRequiredError, NotWithinError, WithinRequiredError, WithinRootForbiddenError, TooManyScopesError, UnsupportedDialectError, ScopeTooDeepError, UnsupportedOperationError, NoDescendantsResolverError, ViewExpiredError, RoleNotVisibleError, AmbiguousRoleError, RoleImmutableError, RoleLevelAboveOwnerError, RoleNotAssignableAtError, PermissionNotDelegableError, RankExceededError, } from './src/errors.js';
|
|
36
|
+
/**
|
|
37
|
+
* Validación de identidad y de slugs (422). La aplica el manager en cada
|
|
38
|
+
* llamada y los drivers por defensa en profundidad; se exporta para que un
|
|
39
|
+
* consumidor valide en su borde (un formulario, un importador) con la MISMA
|
|
40
|
+
* regla y no con una copia.
|
|
41
|
+
*/
|
|
42
|
+
export { assertIdentity, assertSubject, assertScope, assertValidSlug, assertExpiresAt, assertNoSlugCollisions, normalizeRoleQuery, scopeKey, scopeFromKey, IDENTITY_LIMITS, MAX_SLUG_LENGTH, RESERVED_SLUGS, RESERVED_SLUG_PREFIXES, } from './src/identity.js';
|
|
43
|
+
export { resolveGrantExpiry, isActiveExpiry, sameInstant } from './src/expiry.js';
|
|
8
44
|
export { DatabaseAuthorizationDriver, APP_SCOPE_DB_UUID } from './src/drivers/database_driver.js';
|
|
9
|
-
|
|
45
|
+
/**
|
|
46
|
+
* El driver `openfga` NO se exporta desde aquí: vive en el subpath
|
|
47
|
+
* `@jantstack/adonis-authz/openfga`, que es lo único que importa el peer
|
|
48
|
+
* opcional `@openfga/sdk`. Un consumidor solo-database arranca sin él (D9).
|
|
49
|
+
*/
|
|
10
50
|
export { APP_SCOPE, APP_SCOPE_TYPE } from './src/types.js';
|
|
11
51
|
export { default as AuthzRole } from './src/models/authz_role.js';
|
|
12
52
|
export { default as AuthzPermission } from './src/models/authz_permission.js';
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,eAAe,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEtK,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAA;AAGzB;;;;;;;GAOG;AACH,OAAO,EACL,YAAY,EACZ,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,wBAAwB,CAAA;AAY/B;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAE7D;;;;GAIG;AACH,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3D;;;;;GAKG;AACH,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,kBAAkB,EAClB,oBAAoB,EACpB,gBAAgB,EAChB,wBAAwB,EACxB,0BAA0B,EAC1B,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,EACzB,0BAA0B,EAC1B,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,wBAAwB,EACxB,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,GAClB,MAAM,iBAAiB,CAAA;AAExB;;;;;GAKG;AACH,OAAO,EACL,cAAc,EACd,aAAa,EACb,WAAW,EACX,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,sBAAsB,GACvB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAEjF,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAGjG;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AA8B1D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AACtF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA"}
|