@authup/server-core 1.0.0-beta.59 → 1.0.0-beta.61
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/dist/adapters/database/domains/client/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client/entity.mjs +58 -30
- package/dist/adapters/database/domains/client/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/client-permission/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client-permission/entity.mjs +48 -24
- package/dist/adapters/database/domains/client-permission/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/client-role/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client-role/entity.mjs +37 -17
- package/dist/adapters/database/domains/client-role/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/client-scope/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/client-scope/entity.mjs +30 -14
- package/dist/adapters/database/domains/client-scope/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/consent/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/consent/entity.mjs +34 -18
- package/dist/adapters/database/domains/consent/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/event/entity.d.ts +1 -0
- package/dist/adapters/database/domains/event/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/event/entity.mjs +48 -23
- package/dist/adapters/database/domains/event/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider/entity.mjs +43 -23
- package/dist/adapters/database/domains/identity-provider/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-account/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-account/entity.mjs +50 -22
- package/dist/adapters/database/domains/identity-provider-account/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute/entity.mjs +14 -6
- package/dist/adapters/database/domains/identity-provider-attribute/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.mjs +5 -1
- package/dist/adapters/database/domains/identity-provider-attribute-mapping/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.mjs +18 -6
- package/dist/adapters/database/domains/identity-provider-permission-mapping/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/identity-provider-role-mapping/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/identity-provider-role-mapping/entity.mjs +34 -14
- package/dist/adapters/database/domains/identity-provider-role-mapping/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/key/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/key/entity.mjs +35 -19
- package/dist/adapters/database/domains/key/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/permission/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/permission/entity.mjs +35 -19
- package/dist/adapters/database/domains/permission/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/permission-policy/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/permission-policy/entity.mjs +37 -17
- package/dist/adapters/database/domains/permission-policy/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/policy/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/policy/entity.mjs +51 -27
- package/dist/adapters/database/domains/policy/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/policy-attribute/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/policy-attribute/entity.mjs +14 -6
- package/dist/adapters/database/domains/policy-attribute/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/realm/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/realm/entity.mjs +36 -20
- package/dist/adapters/database/domains/realm/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/role/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/role/entity.mjs +44 -24
- package/dist/adapters/database/domains/role/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/role-attribute/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/role-attribute/entity.mjs +30 -14
- package/dist/adapters/database/domains/role-attribute/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/role-permission/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/role-permission/entity.mjs +45 -21
- package/dist/adapters/database/domains/role-permission/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/scope/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/scope/entity.mjs +35 -19
- package/dist/adapters/database/domains/scope/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/session/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/session/entity.mjs +63 -31
- package/dist/adapters/database/domains/session/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/session-token/entity.d.ts +4 -1
- package/dist/adapters/database/domains/session-token/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/session-token/entity.mjs +40 -11
- package/dist/adapters/database/domains/session-token/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/trust-anchor/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/trust-anchor/entity.mjs +25 -13
- package/dist/adapters/database/domains/trust-anchor/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user/entity.mjs +58 -34
- package/dist/adapters/database/domains/user/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user-attribute/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user-attribute/entity.mjs +27 -11
- package/dist/adapters/database/domains/user-attribute/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user-authenticator/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user-authenticator/entity.mjs +43 -23
- package/dist/adapters/database/domains/user-authenticator/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user-permission/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user-permission/entity.mjs +45 -21
- package/dist/adapters/database/domains/user-permission/entity.mjs.map +1 -1
- package/dist/adapters/database/domains/user-role/entity.d.ts.map +1 -1
- package/dist/adapters/database/domains/user-role/entity.mjs +37 -17
- package/dist/adapters/database/domains/user-role/entity.mjs.map +1 -1
- package/dist/adapters/database/errors/driver.d.ts +9 -0
- package/dist/adapters/database/errors/driver.d.ts.map +1 -1
- package/dist/adapters/database/errors/driver.mjs +20 -1
- package/dist/adapters/database/errors/driver.mjs.map +1 -1
- package/dist/adapters/database/errors/index.mjs +2 -2
- package/dist/adapters/database/helpers/index.mjs +2 -2
- package/dist/adapters/database/helpers/is-supported.d.ts +7 -0
- package/dist/adapters/database/helpers/is-supported.d.ts.map +1 -1
- package/dist/adapters/database/helpers/is-supported.mjs +9 -1
- package/dist/adapters/database/helpers/is-supported.mjs.map +1 -1
- package/dist/adapters/database/index.mjs +3 -3
- package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.d.ts +66 -0
- package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.d.ts.map +1 -0
- package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.mjs +181 -0
- package/dist/adapters/database/migrations/mysql/1785871780234-AlignSchemaWithEntityMetadata.mjs.map +1 -0
- package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.d.ts +44 -0
- package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.d.ts.map +1 -0
- package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.mjs +1294 -0
- package/dist/adapters/database/migrations/mysql/1786436332251-QueryIndexes.mjs.map +1 -0
- package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.d.ts +43 -0
- package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.d.ts.map +1 -0
- package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.mjs +120 -0
- package/dist/adapters/database/migrations/postgres/1785871780234-AlignSchemaWithEntityMetadata.mjs.map +1 -0
- package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.d.ts +44 -0
- package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.d.ts.map +1 -0
- package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.mjs +987 -0
- package/dist/adapters/database/migrations/postgres/1786436332251-QueryIndexes.mjs.map +1 -0
- package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts +22 -4
- package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +190 -47
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/types.d.ts +5 -2
- package/dist/adapters/http/controllers/entities/identity-provider/types.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider-account/index.d.ts.map +1 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/index.mjs +5 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/module.d.ts +15 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/module.d.ts.map +1 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/module.mjs +94 -0
- package/dist/adapters/http/controllers/entities/identity-provider-account/module.mjs.map +1 -0
- package/dist/adapters/http/controllers/entities/index.d.ts +2 -0
- package/dist/adapters/http/controllers/entities/index.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/index.mjs +5 -1
- package/dist/adapters/http/controllers/entities/session-token/index.d.ts +2 -0
- package/dist/adapters/http/controllers/entities/session-token/index.d.ts.map +1 -0
- package/dist/adapters/http/controllers/entities/session-token/index.mjs +5 -0
- package/dist/adapters/http/controllers/entities/session-token/module.d.ts +23 -0
- package/dist/adapters/http/controllers/entities/session-token/module.d.ts.map +1 -0
- package/dist/adapters/http/controllers/entities/session-token/module.mjs +112 -0
- package/dist/adapters/http/controllers/entities/session-token/module.mjs.map +1 -0
- package/dist/adapters/http/controllers/index.mjs +3 -1
- package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs +1 -0
- package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs.map +1 -1
- package/dist/adapters/http/index.mjs +3 -1
- package/dist/adapters/http/middleware/built-in/error.d.ts.map +1 -1
- package/dist/adapters/http/middleware/built-in/error.mjs +4 -3
- package/dist/adapters/http/middleware/built-in/error.mjs.map +1 -1
- package/dist/adapters/http/request/event-context.d.ts.map +1 -1
- package/dist/adapters/http/request/event-context.mjs +2 -0
- package/dist/adapters/http/request/event-context.mjs.map +1 -1
- package/dist/app/index.mjs +4 -2
- package/dist/app/modules/database/index.mjs +2 -1
- package/dist/app/modules/database/repositories/identity-provider-account/index.d.ts +2 -0
- package/dist/app/modules/database/repositories/identity-provider-account/index.d.ts.map +1 -0
- package/dist/app/modules/database/repositories/identity-provider-account/index.mjs +5 -0
- package/dist/app/modules/database/repositories/identity-provider-account/repository.d.ts +18 -0
- package/dist/app/modules/database/repositories/identity-provider-account/repository.d.ts.map +1 -0
- package/dist/app/modules/database/repositories/identity-provider-account/repository.mjs +69 -0
- package/dist/app/modules/database/repositories/identity-provider-account/repository.mjs.map +1 -0
- package/dist/app/modules/database/repositories/index.d.ts +1 -0
- package/dist/app/modules/database/repositories/index.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/index.mjs +3 -1
- package/dist/app/modules/database/repositories/key/repository.d.ts +23 -0
- package/dist/app/modules/database/repositories/key/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/key/repository.mjs +39 -3
- package/dist/app/modules/database/repositories/key/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/schema-validation.d.ts +14 -6
- package/dist/app/modules/database/repositories/schema-validation.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/schema-validation.mjs +18 -6
- package/dist/app/modules/database/repositories/schema-validation.mjs.map +1 -1
- package/dist/app/modules/http/modules/controller.d.ts +3 -1
- package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
- package/dist/app/modules/http/modules/controller.mjs +39 -2
- package/dist/app/modules/http/modules/controller.mjs.map +1 -1
- package/dist/app/modules/identity/constants.d.ts +2 -1
- package/dist/app/modules/identity/constants.d.ts.map +1 -1
- package/dist/app/modules/identity/constants.mjs +1 -0
- package/dist/app/modules/identity/constants.mjs.map +1 -1
- package/dist/app/modules/identity/index.mjs +3 -2
- package/dist/app/modules/identity/module.d.ts.map +1 -1
- package/dist/app/modules/identity/module.mjs +9 -2
- package/dist/app/modules/identity/module.mjs.map +1 -1
- package/dist/app/modules/identity/repositories/constants.d.ts +4 -0
- package/dist/app/modules/identity/repositories/constants.d.ts.map +1 -0
- package/dist/app/modules/identity/repositories/constants.mjs +12 -0
- package/dist/app/modules/identity/repositories/constants.mjs.map +1 -0
- package/dist/app/modules/identity/repositories/index.d.ts +1 -0
- package/dist/app/modules/identity/repositories/index.d.ts.map +1 -1
- package/dist/app/modules/identity/repositories/index.mjs +3 -2
- package/dist/app/modules/identity/repositories/provider/index.d.ts +1 -1
- package/dist/app/modules/identity/repositories/provider/index.d.ts.map +1 -1
- package/dist/app/modules/identity/repositories/provider/index.mjs +2 -3
- package/dist/app/modules/identity/repositories/provider/link.d.ts +9 -0
- package/dist/app/modules/identity/repositories/provider/link.d.ts.map +1 -0
- package/dist/app/modules/identity/repositories/provider/link.mjs +34 -0
- package/dist/app/modules/identity/repositories/provider/link.mjs.map +1 -0
- package/dist/app/modules/index.mjs +4 -2
- package/dist/app/modules/logger/module.d.ts.map +1 -1
- package/dist/app/modules/logger/module.mjs +1 -0
- package/dist/app/modules/logger/module.mjs.map +1 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts +25 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.d.ts.map +1 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.mjs +70 -1
- package/dist/app/modules/oauth2/repositories/session-token/repository.mjs.map +1 -1
- package/dist/app/modules/provisioning/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/module.mjs +3 -1
- package/dist/app/modules/provisioning/module.mjs.map +1 -1
- package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/sources/default/module.mjs +1 -0
- package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
- package/dist/core/entities/client/schema.d.ts.map +1 -1
- package/dist/core/entities/client/schema.mjs +29 -10
- package/dist/core/entities/client/schema.mjs.map +1 -1
- package/dist/core/entities/client-permission/schema.d.ts.map +1 -1
- package/dist/core/entities/client-permission/schema.mjs +29 -6
- package/dist/core/entities/client-permission/schema.mjs.map +1 -1
- package/dist/core/entities/client-role/schema.d.ts.map +1 -1
- package/dist/core/entities/client-role/schema.mjs +27 -6
- package/dist/core/entities/client-role/schema.mjs.map +1 -1
- package/dist/core/entities/client-scope/schema.d.ts.map +1 -1
- package/dist/core/entities/client-scope/schema.mjs +19 -5
- package/dist/core/entities/client-scope/schema.mjs.map +1 -1
- package/dist/core/entities/consent/schema.d.ts.map +1 -1
- package/dist/core/entities/consent/schema.mjs +28 -6
- package/dist/core/entities/consent/schema.mjs.map +1 -1
- package/dist/core/entities/event/entity-event-handler.d.ts.map +1 -1
- package/dist/core/entities/event/entity-event-handler.mjs +2 -0
- package/dist/core/entities/event/entity-event-handler.mjs.map +1 -1
- package/dist/core/entities/event/sanitize.d.ts.map +1 -1
- package/dist/core/entities/event/sanitize.mjs +7 -4
- package/dist/core/entities/event/sanitize.mjs.map +1 -1
- package/dist/core/entities/event/schema.d.ts.map +1 -1
- package/dist/core/entities/event/schema.mjs +45 -16
- package/dist/core/entities/event/schema.mjs.map +1 -1
- package/dist/core/entities/event/service.d.ts.map +1 -1
- package/dist/core/entities/event/service.mjs +2 -0
- package/dist/core/entities/event/service.mjs.map +1 -1
- package/dist/core/entities/event/types.d.ts +2 -0
- package/dist/core/entities/event/types.d.ts.map +1 -1
- package/dist/core/entities/identity-provider/schema.d.ts.map +1 -1
- package/dist/core/entities/identity-provider/schema.mjs +29 -11
- package/dist/core/entities/identity-provider/schema.mjs.map +1 -1
- package/dist/core/entities/identity-provider-account/error.d.ts +7 -0
- package/dist/core/entities/identity-provider-account/error.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/error.mjs +24 -0
- package/dist/core/entities/identity-provider-account/error.mjs.map +1 -0
- package/dist/core/entities/identity-provider-account/index.d.ts +5 -0
- package/dist/core/entities/identity-provider-account/index.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/index.mjs +8 -0
- package/dist/core/entities/identity-provider-account/schema.d.ts +3 -0
- package/dist/core/entities/identity-provider-account/schema.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/schema.mjs +52 -0
- package/dist/core/entities/identity-provider-account/schema.mjs.map +1 -0
- package/dist/core/entities/identity-provider-account/service.d.ts +24 -0
- package/dist/core/entities/identity-provider-account/service.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/service.mjs +129 -0
- package/dist/core/entities/identity-provider-account/service.mjs.map +1 -0
- package/dist/core/entities/identity-provider-account/types.d.ts +69 -0
- package/dist/core/entities/identity-provider-account/types.d.ts.map +1 -0
- package/dist/core/entities/identity-provider-account/types.mjs +17 -0
- package/dist/core/entities/identity-provider-account/types.mjs.map +1 -0
- package/dist/core/entities/identity-provider-role-mapping/schema.d.ts.map +1 -1
- package/dist/core/entities/identity-provider-role-mapping/schema.mjs +27 -6
- package/dist/core/entities/identity-provider-role-mapping/schema.mjs.map +1 -1
- package/dist/core/entities/index.d.ts +2 -0
- package/dist/core/entities/index.d.ts.map +1 -1
- package/dist/core/entities/index.mjs +9 -1
- package/dist/core/entities/key/schema.d.ts.map +1 -1
- package/dist/core/entities/key/schema.mjs +39 -17
- package/dist/core/entities/key/schema.mjs.map +1 -1
- package/dist/core/entities/key/service.d.ts.map +1 -1
- package/dist/core/entities/key/service.mjs +1 -0
- package/dist/core/entities/key/service.mjs.map +1 -1
- package/dist/core/entities/permission/schema.d.ts.map +1 -1
- package/dist/core/entities/permission/schema.mjs +34 -13
- package/dist/core/entities/permission/schema.mjs.map +1 -1
- package/dist/core/entities/permission-policy/schema.d.ts.map +1 -1
- package/dist/core/entities/permission-policy/schema.mjs +27 -6
- package/dist/core/entities/permission-policy/schema.mjs.map +1 -1
- package/dist/core/entities/policy/schema.d.ts.map +1 -1
- package/dist/core/entities/policy/schema.mjs +31 -12
- package/dist/core/entities/policy/schema.mjs.map +1 -1
- package/dist/core/entities/realm/schema.d.ts.map +1 -1
- package/dist/core/entities/realm/schema.mjs +26 -12
- package/dist/core/entities/realm/schema.mjs.map +1 -1
- package/dist/core/entities/role/schema.d.ts.map +1 -1
- package/dist/core/entities/role/schema.mjs +36 -14
- package/dist/core/entities/role/schema.mjs.map +1 -1
- package/dist/core/entities/role-attribute/schema.d.ts.map +1 -1
- package/dist/core/entities/role-attribute/schema.mjs +28 -14
- package/dist/core/entities/role-attribute/schema.mjs.map +1 -1
- package/dist/core/entities/role-permission/schema.d.ts.map +1 -1
- package/dist/core/entities/role-permission/schema.mjs +29 -6
- package/dist/core/entities/role-permission/schema.mjs.map +1 -1
- package/dist/core/entities/scope/schema.d.ts.map +1 -1
- package/dist/core/entities/scope/schema.mjs +28 -12
- package/dist/core/entities/scope/schema.mjs.map +1 -1
- package/dist/core/entities/session/schema.d.ts.map +1 -1
- package/dist/core/entities/session/schema.mjs +41 -9
- package/dist/core/entities/session/schema.mjs.map +1 -1
- package/dist/core/entities/session-token/index.d.ts +4 -0
- package/dist/core/entities/session-token/index.d.ts.map +1 -0
- package/dist/core/entities/session-token/index.mjs +6 -0
- package/dist/core/entities/session-token/schema.d.ts +12 -0
- package/dist/core/entities/session-token/schema.d.ts.map +1 -0
- package/dist/core/entities/session-token/schema.mjs +66 -0
- package/dist/core/entities/session-token/schema.mjs.map +1 -0
- package/dist/core/entities/session-token/service.d.ts +70 -0
- package/dist/core/entities/session-token/service.d.ts.map +1 -0
- package/dist/core/entities/session-token/service.mjs +216 -0
- package/dist/core/entities/session-token/service.mjs.map +1 -0
- package/dist/core/entities/session-token/types.d.ts +37 -0
- package/dist/core/entities/session-token/types.d.ts.map +1 -0
- package/dist/core/entities/session-token/types.mjs +4 -0
- package/dist/core/entities/trust-anchor/schema.d.ts.map +1 -1
- package/dist/core/entities/trust-anchor/schema.mjs +27 -13
- package/dist/core/entities/trust-anchor/schema.mjs.map +1 -1
- package/dist/core/entities/trust-anchor/service.d.ts.map +1 -1
- package/dist/core/entities/trust-anchor/service.mjs +1 -0
- package/dist/core/entities/trust-anchor/service.mjs.map +1 -1
- package/dist/core/entities/user/schema.d.ts.map +1 -1
- package/dist/core/entities/user/schema.mjs +29 -12
- package/dist/core/entities/user/schema.mjs.map +1 -1
- package/dist/core/entities/user-attribute/schema.d.ts.map +1 -1
- package/dist/core/entities/user-attribute/schema.mjs +28 -14
- package/dist/core/entities/user-attribute/schema.mjs.map +1 -1
- package/dist/core/entities/user-authenticator/schema.d.ts.map +1 -1
- package/dist/core/entities/user-authenticator/schema.mjs +29 -12
- package/dist/core/entities/user-authenticator/schema.mjs.map +1 -1
- package/dist/core/entities/user-authenticator/service.d.ts +2 -1
- package/dist/core/entities/user-authenticator/service.d.ts.map +1 -1
- package/dist/core/entities/user-authenticator/service.mjs +5 -0
- package/dist/core/entities/user-authenticator/service.mjs.map +1 -1
- package/dist/core/entities/user-authenticator/types.d.ts +7 -1
- package/dist/core/entities/user-authenticator/types.d.ts.map +1 -1
- package/dist/core/entities/user-authenticator/types.mjs.map +1 -1
- package/dist/core/entities/user-permission/schema.d.ts.map +1 -1
- package/dist/core/entities/user-permission/schema.mjs +29 -6
- package/dist/core/entities/user-permission/schema.mjs.map +1 -1
- package/dist/core/entities/user-role/schema.d.ts.map +1 -1
- package/dist/core/entities/user-role/schema.mjs +27 -6
- package/dist/core/entities/user-role/schema.mjs.map +1 -1
- package/dist/core/identity/index.mjs +3 -1
- package/dist/core/identity/provider/account/constants.d.ts +10 -0
- package/dist/core/identity/provider/account/constants.d.ts.map +1 -0
- package/dist/core/identity/provider/account/constants.mjs +16 -0
- package/dist/core/identity/provider/account/constants.mjs.map +1 -0
- package/dist/core/identity/provider/account/error.d.ts +7 -0
- package/dist/core/identity/provider/account/error.d.ts.map +1 -0
- package/dist/core/identity/provider/account/error.mjs +24 -0
- package/dist/core/identity/provider/account/error.mjs.map +1 -0
- package/dist/core/identity/provider/account/index.d.ts +2 -0
- package/dist/core/identity/provider/account/index.d.ts.map +1 -1
- package/dist/core/identity/provider/account/index.mjs +3 -1
- package/dist/core/identity/provider/account/module.d.ts +2 -0
- package/dist/core/identity/provider/account/module.d.ts.map +1 -1
- package/dist/core/identity/provider/account/module.mjs +30 -0
- package/dist/core/identity/provider/account/module.mjs.map +1 -1
- package/dist/core/identity/provider/account/types.d.ts +44 -7
- package/dist/core/identity/provider/account/types.d.ts.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/module.d.ts +19 -0
- package/dist/core/identity/provider/authentication/protocols/oauth2/module.d.ts.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs +60 -3
- package/dist/core/identity/provider/authentication/protocols/oauth2/module.mjs.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/oauth2/types.d.ts +9 -0
- package/dist/core/identity/provider/authentication/protocols/oauth2/types.d.ts.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/open-id/module.d.ts +0 -3
- package/dist/core/identity/provider/authentication/protocols/open-id/module.d.ts.map +1 -1
- package/dist/core/identity/provider/authentication/protocols/open-id/module.mjs +0 -17
- package/dist/core/identity/provider/authentication/protocols/open-id/module.mjs.map +1 -1
- package/dist/core/identity/provider/index.mjs +3 -1
- package/dist/core/index.mjs +11 -2
- package/dist/core/oauth2/authorization/code-request/verifier/module.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +2 -1
- package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
- package/dist/core/oauth2/authorization/module.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/module.mjs +2 -0
- package/dist/core/oauth2/authorization/module.mjs.map +1 -1
- package/dist/core/oauth2/authorization/state/types.d.ts +11 -0
- package/dist/core/oauth2/authorization/state/types.d.ts.map +1 -1
- package/dist/core/oauth2/end-session/service.mjs +2 -2
- package/dist/core/oauth2/end-session/service.mjs.map +1 -1
- package/dist/core/oauth2/grant-types/authorize.d.ts.map +1 -1
- package/dist/core/oauth2/grant-types/authorize.mjs +1 -5
- package/dist/core/oauth2/grant-types/authorize.mjs.map +1 -1
- package/dist/core/oauth2/grant-types/password.mjs +2 -5
- package/dist/core/oauth2/grant-types/password.mjs.map +1 -1
- package/dist/core/oauth2/grant-types/refresh-token.d.ts.map +1 -1
- package/dist/core/oauth2/grant-types/refresh-token.mjs +37 -24
- package/dist/core/oauth2/grant-types/refresh-token.mjs.map +1 -1
- package/dist/core/oauth2/index.mjs +3 -1
- package/dist/core/oauth2/mfa-login/module.d.ts.map +1 -1
- package/dist/core/oauth2/mfa-login/module.mjs +4 -7
- package/dist/core/oauth2/mfa-login/module.mjs.map +1 -1
- package/dist/core/oauth2/session-token/error.d.ts +36 -0
- package/dist/core/oauth2/session-token/error.d.ts.map +1 -0
- package/dist/core/oauth2/session-token/error.mjs +49 -0
- package/dist/core/oauth2/session-token/error.mjs.map +1 -0
- package/dist/core/oauth2/session-token/index.d.ts +1 -0
- package/dist/core/oauth2/session-token/index.d.ts.map +1 -1
- package/dist/core/oauth2/session-token/index.mjs +2 -1
- package/dist/core/oauth2/session-token/types.d.ts +40 -0
- package/dist/core/oauth2/session-token/types.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/access/module.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/access/module.mjs +1 -0
- package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
- package/dist/core/oauth2/token/issuer/base.d.ts +1 -1
- package/dist/core/oauth2/token/issuer/base.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/base.mjs.map +1 -1
- package/dist/core/oauth2/token/issuer/refresh/module.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/refresh/module.mjs +1 -0
- package/dist/core/oauth2/token/issuer/refresh/module.mjs.map +1 -1
- package/dist/core/query/index.mjs +2 -2
- package/dist/core/query/module.d.ts +19 -9
- package/dist/core/query/module.d.ts.map +1 -1
- package/dist/core/query/module.mjs +22 -10
- package/dist/core/query/module.mjs.map +1 -1
- package/dist/index.mjs +8 -4
- package/dist/swagger.json +961 -132
- package/dist/utils/error.d.ts +20 -3
- package/dist/utils/error.d.ts.map +1 -1
- package/dist/utils/error.mjs +102 -5
- package/dist/utils/error.mjs.map +1 -1
- package/dist/utils/index.mjs +2 -2
- package/package.json +23 -21
- package/dist/app/modules/identity/repositories/provider/account/index.d.ts.map +0 -1
- package/dist/app/modules/identity/repositories/provider/account/index.mjs +0 -5
- package/dist/app/modules/identity/repositories/provider/account/module.d.ts +0 -10
- package/dist/app/modules/identity/repositories/provider/account/module.d.ts.map +0 -1
- package/dist/app/modules/identity/repositories/provider/account/module.mjs +0 -28
- package/dist/app/modules/identity/repositories/provider/account/module.mjs.map +0 -1
- /package/dist/{app/modules/identity/repositories/provider/account → adapters/http/controllers/entities/identity-provider-account}/index.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.mjs","names":["defineSchema","EntityType","SESSION_FILTER_KEYS","createRelationsReadGate","schemaMapping","realm","REALM","sessionSchema","name","SESSION","fields","allowed","filters","relations","validate","
|
|
1
|
+
{"version":3,"file":"schema.mjs","names":["defineSchema","EntityType","SESSION_FILTER_KEYS","createRelationsReadGate","schemaMapping","realm","REALM","user","USER","client","CLIENT","sessionSchema","name","SESSION","indexes","fields","allowed","filters","indexed","relations","validate","sorts","pagination","maxLimit"],"sources":["../../../../src/core/entities/session/schema.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { defineSchema } from '@rapiq/core';\nimport type { Session } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport { SESSION_FILTER_KEYS } from '../../authentication/session/types.ts';\nimport { createRelationsReadGate } from '../../query/relations.ts';\n\nconst schemaMapping = {\n realm: EntityType.REALM,\n user: EntityType.USER,\n client: EntityType.CLIENT,\n};\n\nexport const sessionSchema = defineSchema<Session>({\n name: EntityType.SESSION,\n indexes: [\n ['id'],\n ['sub'],\n ['subKind'],\n ['userId'],\n ['clientId'],\n ['realmId'],\n ['seenAt'],\n ['expiresAt'],\n ['userId', 'seenAt'],\n ['realmId', 'seenAt'],\n ['createdAt'],\n ['updatedAt'],\n ],\n fields: {\n allowed: [\n 'id',\n 'sub',\n 'subKind',\n 'ipAddress',\n 'userAgent',\n 'authMethod',\n 'mfaAt',\n 'expiresAt',\n 'refreshedAt',\n 'seenAt',\n 'createdAt',\n 'updatedAt',\n 'userId',\n 'clientId',\n 'realmId',\n ],\n },\n filters: { allowed: [...SESSION_FILTER_KEYS, 'expiresAt', 'seenAt'], indexed: true },\n relations: { allowed: ['realm', 'user', 'client'], validate: createRelationsReadGate(schemaMapping) },\n sorts: { allowed: ['seenAt', 'expiresAt', 'createdAt', 'updatedAt'], indexed: true },\n pagination: { maxLimit: 50 },\n schemaMapping,\n});\n"],"mappings":";;;;;;;;AAaA,MAAMI,gBAAgB;CAClBC,OAAOJ,WAAWK;CAClBC,MAAMN,WAAWO;CACjBC,QAAQR,WAAWS;AACvB;AAEA,MAAaC,gBAAgBX,aAAsB;CAC/CY,MAAMX,WAAWY;CACjBC,SAAS;EACL,CAAC,IAAK;EACN,CAAC,KAAM;EACP,CAAC,SAAU;EACX,CAAC,QAAS;EACV,CAAC,UAAW;EACZ,CAAC,SAAU;EACX,CAAC,QAAS;EACV,CAAC,WAAY;EACb,CAAC,UAAU,QAAS;EACpB,CAAC,WAAW,QAAS;EACrB,CAAC,WAAY;EACb,CAAC,WAAY;CAChB;CACDC,QAAQ,EACJC,SAAS;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH,EACL;CACAC,SAAS;EAAED,SAAS;GAAId,GAAAA;GAAqB;GAAa;EAAS;EAAEgB,SAAS;CAAK;CACnFC,WAAW;EAAEH,SAAS;GAAC;GAAS;GAAQ;EAAS;EAAEI,UAAUjB,wBAAwBC,aAAAA;CAAe;CACpGiB,OAAO;EAAEL,SAAS;GAAC;GAAU;GAAa;GAAa;EAAY;EAAEE,SAAS;CAAK;CACnFI,YAAY,EAAEC,UAAU,GAAG;CAC3BnB;AACJ,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/session-token/index.ts"],"names":[],"mappings":"AAOA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { sessionTokenSchema } from "./schema.mjs";
|
|
5
|
+
import { SESSION_TOKEN_FILTER_KEYS, SessionTokenService } from "./service.mjs";
|
|
6
|
+
export { SESSION_TOKEN_FILTER_KEYS, SessionTokenService, sessionTokenSchema };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SessionToken } from '@authup/core-kit';
|
|
2
|
+
/**
|
|
3
|
+
* The token inventory as a query surface.
|
|
4
|
+
*
|
|
5
|
+
* The rows carry no realm or subject of their own, so both the ownership
|
|
6
|
+
* check and the realm gate resolve through `session`. The repository joins it
|
|
7
|
+
* unconditionally for that reason: a projection must never be able to strip
|
|
8
|
+
* the columns the gate reads (the plan-039 discipline, applied through a
|
|
9
|
+
* relation instead of a column).
|
|
10
|
+
*/
|
|
11
|
+
export declare const sessionTokenSchema: import("@rapiq/core").Schema<SessionToken, any>;
|
|
12
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/session-token/schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAMrD;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,iDAoD7B,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { createRelationsReadGate } from "../../query/relations.mjs";
|
|
5
|
+
import { EntityType } from "@authup/core-kit";
|
|
6
|
+
import { defineSchema } from "@rapiq/core";
|
|
7
|
+
//#region src/core/entities/session-token/schema.ts
|
|
8
|
+
const schemaMapping = { session: EntityType.SESSION };
|
|
9
|
+
/**
|
|
10
|
+
* The token inventory as a query surface.
|
|
11
|
+
*
|
|
12
|
+
* The rows carry no realm or subject of their own, so both the ownership
|
|
13
|
+
* check and the realm gate resolve through `session`. The repository joins it
|
|
14
|
+
* unconditionally for that reason: a projection must never be able to strip
|
|
15
|
+
* the columns the gate reads (the plan-039 discipline, applied through a
|
|
16
|
+
* relation instead of a column).
|
|
17
|
+
*/ const sessionTokenSchema = defineSchema({
|
|
18
|
+
name: EntityType.SESSION_TOKEN,
|
|
19
|
+
indexes: [
|
|
20
|
+
["id"],
|
|
21
|
+
["sessionId"],
|
|
22
|
+
["clientId"],
|
|
23
|
+
["kind"],
|
|
24
|
+
["expiresAt"],
|
|
25
|
+
["sessionId", "createdAt"],
|
|
26
|
+
["createdAt"]
|
|
27
|
+
],
|
|
28
|
+
fields: { allowed: [
|
|
29
|
+
"id",
|
|
30
|
+
"sessionId",
|
|
31
|
+
"clientId",
|
|
32
|
+
"kind",
|
|
33
|
+
"parentId",
|
|
34
|
+
"refreshTokenId",
|
|
35
|
+
"ipAddress",
|
|
36
|
+
"userAgent",
|
|
37
|
+
"consumedAt",
|
|
38
|
+
"revokedAt",
|
|
39
|
+
"expiresAt",
|
|
40
|
+
"createdAt"
|
|
41
|
+
] },
|
|
42
|
+
filters: {
|
|
43
|
+
allowed: [
|
|
44
|
+
"id",
|
|
45
|
+
"sessionId",
|
|
46
|
+
"clientId",
|
|
47
|
+
"kind",
|
|
48
|
+
"expiresAt"
|
|
49
|
+
],
|
|
50
|
+
indexed: true
|
|
51
|
+
},
|
|
52
|
+
relations: {
|
|
53
|
+
allowed: ["session"],
|
|
54
|
+
validate: createRelationsReadGate(schemaMapping)
|
|
55
|
+
},
|
|
56
|
+
sorts: {
|
|
57
|
+
allowed: ["createdAt", "expiresAt"],
|
|
58
|
+
indexed: true
|
|
59
|
+
},
|
|
60
|
+
pagination: { maxLimit: 50 },
|
|
61
|
+
schemaMapping
|
|
62
|
+
});
|
|
63
|
+
//#endregion
|
|
64
|
+
export { sessionTokenSchema };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=schema.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.mjs","names":["defineSchema","EntityType","createRelationsReadGate","schemaMapping","session","SESSION","sessionTokenSchema","name","SESSION_TOKEN","indexes","fields","allowed","filters","indexed","relations","validate","sorts","pagination","maxLimit"],"sources":["../../../../src/core/entities/session-token/schema.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { defineSchema } from '@rapiq/core';\nimport type { SessionToken } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport { createRelationsReadGate } from '../../query/relations.ts';\n\nconst schemaMapping = { session: EntityType.SESSION };\n\n/**\n * The token inventory as a query surface.\n *\n * The rows carry no realm or subject of their own, so both the ownership\n * check and the realm gate resolve through `session`. The repository joins it\n * unconditionally for that reason: a projection must never be able to strip\n * the columns the gate reads (the plan-039 discipline, applied through a\n * relation instead of a column).\n */\nexport const sessionTokenSchema = defineSchema<SessionToken>({\n name: EntityType.SESSION_TOKEN,\n indexes: [\n ['id'],\n ['sessionId'],\n ['clientId'],\n ['kind'],\n ['expiresAt'],\n ['sessionId', 'createdAt'],\n ['createdAt'],\n ],\n fields: {\n allowed: [\n 'id',\n 'sessionId',\n 'clientId',\n 'kind',\n 'parentId',\n 'refreshTokenId',\n 'ipAddress',\n 'userAgent',\n 'consumedAt',\n 'revokedAt',\n 'expiresAt',\n 'createdAt',\n ],\n },\n // Plain columns only. Ownership and realm are NOT client-supplied filters:\n // the service resolves them from the joined session per row, so a caller\n // cannot widen its own reach by filtering. These four cover the use cases:\n // `clientId` answers \"which sessions did this application serve\",\n // `sessionId` answers \"which applications rode this session\" (the\n // back-channel logout audience), and the pair scopes a per-application\n // revoke to one session.\n filters: {\n allowed: [\n 'id',\n 'sessionId',\n 'clientId',\n 'kind',\n 'expiresAt',\n ],\n indexed: true,\n },\n // `client` is deliberately absent: the repository always joins a client\n // SUMMARY (id / name / displayName — the consent-list shape), so a raw\n // `?include=client` cannot force the full-column join and a self-service\n // reader still gets application names without CLIENT_READ.\n relations: { allowed: ['session'], validate: createRelationsReadGate(schemaMapping) },\n sorts: { allowed: ['createdAt', 'expiresAt'], indexed: true },\n pagination: { maxLimit: 50 },\n schemaMapping,\n});\n"],"mappings":";;;;;;;AAYA,MAAMG,gBAAgB,EAAEC,SAASH,WAAWI,QAAQ;;;;;;;;;GAWpD,MAAaC,qBAAqBN,aAA2B;CACzDO,MAAMN,WAAWO;CACjBC,SAAS;EACL,CAAC,IAAK;EACN,CAAC,WAAY;EACb,CAAC,UAAW;EACZ,CAAC,MAAO;EACR,CAAC,WAAY;EACb,CAAC,aAAa,WAAY;EAC1B,CAAC,WAAY;CAChB;CACDC,QAAQ,EACJC,SAAS;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACH,EACL;CAQAC,SAAS;EACLD,SAAS;GACL;GACA;GACA;GACA;GACA;EACH;EACDE,SAAS;CACb;CAKAC,WAAW;EAAEH,SAAS,CAAC,SAAU;EAAEI,UAAUb,wBAAwBC,aAAAA;CAAe;CACpFa,OAAO;EAAEL,SAAS,CAAC,aAAa,WAAY;EAAEE,SAAS;CAAK;CAC5DI,YAAY,EAAEC,UAAU,GAAG;CAC3Bf;AACJ,CAAA"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { ICondition } from '@rapiq/core';
|
|
2
|
+
import { PermissionName } from '@authup/core-kit';
|
|
3
|
+
import type { SessionToken } from '@authup/core-kit';
|
|
4
|
+
import { AbstractEntityService } from '@authup/server-kit';
|
|
5
|
+
import type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';
|
|
6
|
+
import type { IOAuth2TokenRepository, ISessionTokenRepository } from '../../oauth2/index.ts';
|
|
7
|
+
import type { ISessionTokenService, SessionTokenDeleteManyResult } from './types.ts';
|
|
8
|
+
/**
|
|
9
|
+
* Filter keys that make a bulk revoke a TARGETED one. A query carrying none of
|
|
10
|
+
* them is rejected rather than treated as "everything": unlike the session
|
|
11
|
+
* bulk revoke, there is no meaningful self-service fallback here, so an
|
|
12
|
+
* unrecognized filter must fail loudly instead of silently widening.
|
|
13
|
+
*/
|
|
14
|
+
export declare const SESSION_TOKEN_FILTER_KEYS: readonly ["id", "sessionId", "clientId"];
|
|
15
|
+
export type SessionTokenServiceContext = {
|
|
16
|
+
repository: ISessionTokenRepository;
|
|
17
|
+
tokenRepository?: IOAuth2TokenRepository;
|
|
18
|
+
};
|
|
19
|
+
export declare class SessionTokenService extends AbstractEntityService implements ISessionTokenService {
|
|
20
|
+
protected repository: ISessionTokenRepository;
|
|
21
|
+
protected tokenRepository?: IOAuth2TokenRepository;
|
|
22
|
+
constructor(ctx: SessionTokenServiceContext);
|
|
23
|
+
/**
|
|
24
|
+
* A token row carries no subject of its own, so ownership resolves through
|
|
25
|
+
* the joined session. A row whose session did not load fails closed.
|
|
26
|
+
*/
|
|
27
|
+
protected isOwnedBy(entity: SessionToken, actor: ActorContext): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* The realm the row belongs to, taken from its session. Absent when the
|
|
30
|
+
* session did not load, which leaves the realm factor neutral, so the
|
|
31
|
+
* per-row permission check below is what denies.
|
|
32
|
+
*/
|
|
33
|
+
protected tokenRealmMatch(entity: SessionToken): Record<string, any>;
|
|
34
|
+
getMany(query: Record<string, any>, actor: ActorContext): Promise<EntityRepositoryFindManyResult<SessionToken>>;
|
|
35
|
+
getOne(id: string, actor: ActorContext): Promise<SessionToken>;
|
|
36
|
+
delete(id: string, actor: ActorContext): Promise<SessionToken>;
|
|
37
|
+
deleteMany(query: Record<string, any>, actor: ActorContext): Promise<SessionTokenDeleteManyResult>;
|
|
38
|
+
protected loadOneForActor(id: string, actor: ActorContext, permission: `${PermissionName}`): Promise<SessionToken>;
|
|
39
|
+
/**
|
|
40
|
+
* Revoke, not delete. The row is stamped and the jti is blocklisted with a
|
|
41
|
+
* TTL pinned to the token's real expiry, so an in-flight access token stops
|
|
42
|
+
* introspecting as active instead of surviving to its own `exp`.
|
|
43
|
+
*/
|
|
44
|
+
protected revoke(entity: SessionToken): Promise<void>;
|
|
45
|
+
protected hasTargetFilter(query?: Record<string, any>): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Whether the condition BOUNDS the query to a target scope.
|
|
48
|
+
*
|
|
49
|
+
* The question is not "does a target key appear somewhere" but "is the
|
|
50
|
+
* result set constrained by one". Those differ, and the difference is a
|
|
51
|
+
* mass revoke:
|
|
52
|
+
*
|
|
53
|
+
* - `and` is bounded when ANY conjunct is: the others can only narrow it.
|
|
54
|
+
* - `or` is bounded only when EVERY branch is. `or(eq(id,x), eq(kind,access))`
|
|
55
|
+
* names a target key and still selects every access token.
|
|
56
|
+
* - `not` is never a scope. A negation of a scoped predicate is its
|
|
57
|
+
* complement, which is nearly everything.
|
|
58
|
+
*
|
|
59
|
+
* The expression dialect is what makes the last two reachable: rapiq
|
|
60
|
+
* collapses `not(eq(...))` into an `ne` leaf, but `not(and(...))` stays a
|
|
61
|
+
* compound node, and `or(...)` has no bracket-dialect spelling at all.
|
|
62
|
+
*/
|
|
63
|
+
protected hasTargetCondition(condition: ICondition): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Schemaless decode — dialect detection only. The allow-list is enforced
|
|
66
|
+
* downstream by the schema-bound decode.
|
|
67
|
+
*/
|
|
68
|
+
protected static queryCodec: import("@rapiq/codec-url").URLCodec;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/session-token/service.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,KAAK,EAAE,sBAAsB,EAAE,uBAAuB,EAAG,MAAM,uBAAuB,CAAC;AAG9F,OAAO,KAAK,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAErF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,0CAI5B,CAAC;AAEX,MAAM,MAAM,0BAA0B,GAAG;IACrC,UAAU,EAAE,uBAAuB,CAAC;IACpC,eAAe,CAAC,EAAE,sBAAsB,CAAC;CAC5C,CAAC;AAEF,qBAAa,mBAAoB,SAAQ,qBAAsB,YAAW,oBAAoB;IAC1F,SAAS,CAAC,UAAU,EAAE,uBAAuB,CAAC;IAE9C,SAAS,CAAC,eAAe,CAAC,EAAE,sBAAsB,CAAC;gBAEvC,GAAG,EAAE,0BAA0B;IAM3C;;;OAGG;IACH,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO;IASvE;;;;OAIG;IACH,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,YAAY;IASxC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,YAAY,CAAC,CAAC;IA6DlD,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAM9D,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAQ9D,UAAU,CACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,4BAA4B,CAAC;cA4DxB,eAAe,CAC3B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,EACnB,UAAU,EAAE,GAAG,cAAc,EAAE,GAChC,OAAO,CAAC,YAAY,CAAC;IAqBxB;;;;OAIG;cACa,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3D,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAmB/D;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO;IA6C5D;;;OAGG;IACH,SAAS,CAAC,MAAM,CAAC,UAAU,sCAAoB;CAClD"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import "node:path";
|
|
2
|
+
import "node:url";
|
|
3
|
+
import.meta.url;
|
|
4
|
+
import { sessionTokenSchema } from "./schema.mjs";
|
|
5
|
+
import { appendQueryConditions, decodeQuery } from "../../query/module.mjs";
|
|
6
|
+
import "../../query/index.mjs";
|
|
7
|
+
import { isObject } from "@authup/kit";
|
|
8
|
+
import { PermissionName } from "@authup/core-kit";
|
|
9
|
+
import { AbstractEntityService } from "@authup/server-kit";
|
|
10
|
+
import { BuiltInPolicyType, definePolicyData } from "@authup/access";
|
|
11
|
+
import { AuthupError, EntityNotFoundError, ErrorCode } from "@authup/errors";
|
|
12
|
+
import { FilterCompoundOperator, FilterFieldOperator, and, eq, isFilter, isFilters } from "@rapiq/core";
|
|
13
|
+
import { createURLCodec } from "@rapiq/codec-url";
|
|
14
|
+
//#region src/core/entities/session-token/service.ts
|
|
15
|
+
/**
|
|
16
|
+
* Filter keys that make a bulk revoke a TARGETED one. A query carrying none of
|
|
17
|
+
* them is rejected rather than treated as "everything": unlike the session
|
|
18
|
+
* bulk revoke, there is no meaningful self-service fallback here, so an
|
|
19
|
+
* unrecognized filter must fail loudly instead of silently widening.
|
|
20
|
+
*/ const SESSION_TOKEN_FILTER_KEYS = [
|
|
21
|
+
"id",
|
|
22
|
+
"sessionId",
|
|
23
|
+
"clientId"
|
|
24
|
+
];
|
|
25
|
+
var SessionTokenService = class SessionTokenService extends AbstractEntityService {
|
|
26
|
+
repository;
|
|
27
|
+
tokenRepository;
|
|
28
|
+
constructor(ctx) {
|
|
29
|
+
super();
|
|
30
|
+
this.repository = ctx.repository;
|
|
31
|
+
this.tokenRepository = ctx.tokenRepository;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A token row carries no subject of its own, so ownership resolves through
|
|
35
|
+
* the joined session. A row whose session did not load fails closed.
|
|
36
|
+
*/ isOwnedBy(entity, actor) {
|
|
37
|
+
const session = entity.session;
|
|
38
|
+
return !!actor.identity && !!session && session.sub === actor.identity.data.id && session.subKind === actor.identity.type;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The realm the row belongs to, taken from its session. Absent when the
|
|
42
|
+
* session did not load, which leaves the realm factor neutral, so the
|
|
43
|
+
* per-row permission check below is what denies.
|
|
44
|
+
*/ tokenRealmMatch(entity) {
|
|
45
|
+
const session = entity.session;
|
|
46
|
+
if (!session) return {};
|
|
47
|
+
return this.resourceRealmMatch({ realmId: session.realmId });
|
|
48
|
+
}
|
|
49
|
+
async getMany(query, actor) {
|
|
50
|
+
const parsed = await decodeQuery(query, {
|
|
51
|
+
schema: sessionTokenSchema,
|
|
52
|
+
actor
|
|
53
|
+
});
|
|
54
|
+
let canReadAll = true;
|
|
55
|
+
try {
|
|
56
|
+
await actor.permissionEvaluator.preEvaluate({ name: PermissionName.SESSION_READ });
|
|
57
|
+
} catch (e) {
|
|
58
|
+
if (!actor.identity) throw e;
|
|
59
|
+
canReadAll = false;
|
|
60
|
+
}
|
|
61
|
+
if (!canReadAll) {
|
|
62
|
+
const scoped = appendQueryConditions(parsed, and(eq("session.sub", actor.identity.data.id), eq("session.subKind", actor.identity.type)));
|
|
63
|
+
return this.repository.findMany(scoped);
|
|
64
|
+
}
|
|
65
|
+
const { data: entities, meta } = await this.repository.findMany(parsed);
|
|
66
|
+
const data = [];
|
|
67
|
+
let { total } = meta;
|
|
68
|
+
for (const entity of entities) {
|
|
69
|
+
if (this.isOwnedBy(entity, actor)) {
|
|
70
|
+
data.push(entity);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
await actor.permissionEvaluator.evaluate({
|
|
75
|
+
name: PermissionName.SESSION_READ,
|
|
76
|
+
data: definePolicyData({
|
|
77
|
+
[BuiltInPolicyType.ATTRIBUTES]: entity,
|
|
78
|
+
...this.tokenRealmMatch(entity)
|
|
79
|
+
})
|
|
80
|
+
});
|
|
81
|
+
data.push(entity);
|
|
82
|
+
} catch {
|
|
83
|
+
total -= 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
data,
|
|
88
|
+
meta: {
|
|
89
|
+
...meta,
|
|
90
|
+
total
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async getOne(id, actor) {
|
|
95
|
+
return await this.loadOneForActor(id, actor, PermissionName.SESSION_READ);
|
|
96
|
+
}
|
|
97
|
+
async delete(id, actor) {
|
|
98
|
+
const entity = await this.loadOneForActor(id, actor, PermissionName.SESSION_DELETE);
|
|
99
|
+
await this.revoke(entity);
|
|
100
|
+
return entity;
|
|
101
|
+
}
|
|
102
|
+
async deleteMany(query, actor) {
|
|
103
|
+
if (!actor.identity) throw new AuthupError({
|
|
104
|
+
code: ErrorCode.IDENTITY_UNAUTHORIZED,
|
|
105
|
+
message: "Authentication required."
|
|
106
|
+
});
|
|
107
|
+
if (!this.hasTargetFilter(query)) throw new AuthupError({
|
|
108
|
+
code: ErrorCode.BAD_REQUEST,
|
|
109
|
+
message: "A bulk revoke must be scoped by id, sessionId or clientId."
|
|
110
|
+
});
|
|
111
|
+
const parsed = await decodeQuery(query, {
|
|
112
|
+
schema: sessionTokenSchema,
|
|
113
|
+
parameters: ["filters"],
|
|
114
|
+
actor
|
|
115
|
+
});
|
|
116
|
+
let canDeleteAll = true;
|
|
117
|
+
try {
|
|
118
|
+
await actor.permissionEvaluator.preEvaluate({ name: PermissionName.SESSION_DELETE });
|
|
119
|
+
} catch {
|
|
120
|
+
canDeleteAll = false;
|
|
121
|
+
}
|
|
122
|
+
const scoped = canDeleteAll ? parsed : appendQueryConditions(parsed, and(eq("session.sub", actor.identity.data.id), eq("session.subKind", actor.identity.type)));
|
|
123
|
+
const entities = await this.repository.findAllByQuery(scoped);
|
|
124
|
+
let count = 0;
|
|
125
|
+
for (const entity of entities) {
|
|
126
|
+
if (!this.isOwnedBy(entity, actor)) try {
|
|
127
|
+
await actor.permissionEvaluator.evaluate({
|
|
128
|
+
name: PermissionName.SESSION_DELETE,
|
|
129
|
+
data: definePolicyData({
|
|
130
|
+
[BuiltInPolicyType.ATTRIBUTES]: entity,
|
|
131
|
+
...this.tokenRealmMatch(entity)
|
|
132
|
+
})
|
|
133
|
+
});
|
|
134
|
+
} catch {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
await this.revoke(entity);
|
|
138
|
+
count += 1;
|
|
139
|
+
}
|
|
140
|
+
return { count };
|
|
141
|
+
}
|
|
142
|
+
async loadOneForActor(id, actor, permission) {
|
|
143
|
+
const entity = await this.repository.findOneWithSessionById(id);
|
|
144
|
+
if (!entity) throw new EntityNotFoundError();
|
|
145
|
+
if (!this.isOwnedBy(entity, actor)) {
|
|
146
|
+
await actor.permissionEvaluator.preEvaluate({ name: permission });
|
|
147
|
+
await actor.permissionEvaluator.evaluate({
|
|
148
|
+
name: permission,
|
|
149
|
+
data: definePolicyData({
|
|
150
|
+
[BuiltInPolicyType.ATTRIBUTES]: entity,
|
|
151
|
+
...this.tokenRealmMatch(entity)
|
|
152
|
+
})
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return entity;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Revoke, not delete. The row is stamped and the jti is blocklisted with a
|
|
159
|
+
* TTL pinned to the token's real expiry, so an in-flight access token stops
|
|
160
|
+
* introspecting as active instead of surviving to its own `exp`.
|
|
161
|
+
*/ async revoke(entity) {
|
|
162
|
+
const at = (/* @__PURE__ */ new Date()).toISOString();
|
|
163
|
+
await this.repository.revokeById(entity.id, at);
|
|
164
|
+
entity.revokedAt = at;
|
|
165
|
+
if (this.tokenRepository) await this.tokenRepository.setInactive(entity.id, Math.floor(new Date(entity.expiresAt).getTime() / 1e3));
|
|
166
|
+
}
|
|
167
|
+
hasTargetFilter(query) {
|
|
168
|
+
if (!isObject(query)) return false;
|
|
169
|
+
let parsed;
|
|
170
|
+
try {
|
|
171
|
+
parsed = SessionTokenService.queryCodec.decode(query);
|
|
172
|
+
} catch {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
if (!parsed) return false;
|
|
176
|
+
return this.hasTargetCondition(parsed.filters);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Whether the condition BOUNDS the query to a target scope.
|
|
180
|
+
*
|
|
181
|
+
* The question is not "does a target key appear somewhere" but "is the
|
|
182
|
+
* result set constrained by one". Those differ, and the difference is a
|
|
183
|
+
* mass revoke:
|
|
184
|
+
*
|
|
185
|
+
* - `and` is bounded when ANY conjunct is: the others can only narrow it.
|
|
186
|
+
* - `or` is bounded only when EVERY branch is. `or(eq(id,x), eq(kind,access))`
|
|
187
|
+
* names a target key and still selects every access token.
|
|
188
|
+
* - `not` is never a scope. A negation of a scoped predicate is its
|
|
189
|
+
* complement, which is nearly everything.
|
|
190
|
+
*
|
|
191
|
+
* The expression dialect is what makes the last two reachable: rapiq
|
|
192
|
+
* collapses `not(eq(...))` into an `ne` leaf, but `not(and(...))` stays a
|
|
193
|
+
* compound node, and `or(...)` has no bracket-dialect spelling at all.
|
|
194
|
+
*/ hasTargetCondition(condition) {
|
|
195
|
+
if (isFilters(condition)) {
|
|
196
|
+
if (condition.operator === FilterCompoundOperator.NOT) return false;
|
|
197
|
+
if (condition.operator === FilterCompoundOperator.OR) return condition.value.length > 0 && condition.value.every((child) => this.hasTargetCondition(child));
|
|
198
|
+
return condition.value.some((child) => this.hasTargetCondition(child));
|
|
199
|
+
}
|
|
200
|
+
if (isFilter(condition)) {
|
|
201
|
+
if (!SESSION_TOKEN_FILTER_KEYS.includes(condition.field)) return false;
|
|
202
|
+
if (condition.operator === FilterFieldOperator.EQUAL) return condition.value !== "" && condition.value !== null && typeof condition.value !== "undefined";
|
|
203
|
+
if (condition.operator === FilterFieldOperator.IN) return Array.isArray(condition.value) && condition.value.length > 0;
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Schemaless decode — dialect detection only. The allow-list is enforced
|
|
210
|
+
* downstream by the schema-bound decode.
|
|
211
|
+
*/ static queryCodec = createURLCodec();
|
|
212
|
+
};
|
|
213
|
+
//#endregion
|
|
214
|
+
export { SESSION_TOKEN_FILTER_KEYS, SessionTokenService };
|
|
215
|
+
|
|
216
|
+
//# sourceMappingURL=service.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.mjs","names":["BuiltInPolicyType","definePolicyData","AuthupError","EntityNotFoundError","ErrorCode","isObject","createURLCodec","FilterCompoundOperator","FilterFieldOperator","and","eq","isFilter","isFilters","PermissionName","AbstractEntityService","appendQueryConditions","decodeQuery","sessionTokenSchema","SESSION_TOKEN_FILTER_KEYS","SessionTokenService","repository","tokenRepository","ctx","isOwnedBy","entity","actor","session","identity","sub","data","id","subKind","type","tokenRealmMatch","resourceRealmMatch","realmId","getMany","query","parsed","schema","canReadAll","permissionEvaluator","preEvaluate","name","SESSION_READ","e","scoped","findMany","entities","meta","total","push","evaluate","ATTRIBUTES","getOne","loadOneForActor","delete","SESSION_DELETE","revoke","deleteMany","code","IDENTITY_UNAUTHORIZED","message","hasTargetFilter","BAD_REQUEST","parameters","canDeleteAll","findAllByQuery","count","permission","findOneWithSessionById","at","Date","toISOString","revokeById","revokedAt","setInactive","Math","floor","expiresAt","getTime","queryCodec","decode","hasTargetCondition","filters","condition","operator","NOT","OR","value","length","every","child","some","includes","field","EQUAL","IN","Array","isArray"],"sources":["../../../../src/core/entities/session-token/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, definePolicyData } from '@authup/access';\nimport { AuthupError, EntityNotFoundError, ErrorCode } from '@authup/errors';\nimport { isObject } from '@authup/kit';\nimport { createURLCodec } from '@rapiq/codec-url';\nimport type { ICondition } from '@rapiq/core';\nimport {\n FilterCompoundOperator,\n FilterFieldOperator,\n and,\n eq,\n isFilter,\n isFilters,\n} from '@rapiq/core';\nimport { PermissionName } from '@authup/core-kit';\nimport type { Session, SessionToken } from '@authup/core-kit';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IOAuth2TokenRepository, ISessionTokenRepository } from '../../oauth2/index.ts';\nimport { appendQueryConditions, decodeQuery } from '../../query/index.ts';\nimport { sessionTokenSchema } from './schema.ts';\nimport type { ISessionTokenService, SessionTokenDeleteManyResult } from './types.ts';\n\n/**\n * Filter keys that make a bulk revoke a TARGETED one. A query carrying none of\n * them is rejected rather than treated as \"everything\": unlike the session\n * bulk revoke, there is no meaningful self-service fallback here, so an\n * unrecognized filter must fail loudly instead of silently widening.\n */\nexport const SESSION_TOKEN_FILTER_KEYS = [\n 'id',\n 'sessionId',\n 'clientId',\n] as const;\n\nexport type SessionTokenServiceContext = {\n repository: ISessionTokenRepository,\n tokenRepository?: IOAuth2TokenRepository,\n};\n\nexport class SessionTokenService extends AbstractEntityService implements ISessionTokenService {\n protected repository: ISessionTokenRepository;\n\n protected tokenRepository?: IOAuth2TokenRepository;\n\n constructor(ctx: SessionTokenServiceContext) {\n super();\n this.repository = ctx.repository;\n this.tokenRepository = ctx.tokenRepository;\n }\n\n /**\n * A token row carries no subject of its own, so ownership resolves through\n * the joined session. A row whose session did not load fails closed.\n */\n protected isOwnedBy(entity: SessionToken, actor: ActorContext): boolean {\n const session = entity.session as Session | undefined;\n\n return !!actor.identity &&\n !!session &&\n session.sub === actor.identity.data.id &&\n session.subKind === actor.identity.type;\n }\n\n /**\n * The realm the row belongs to, taken from its session. Absent when the\n * session did not load, which leaves the realm factor neutral, so the\n * per-row permission check below is what denies.\n */\n protected tokenRealmMatch(entity: SessionToken) {\n const session = entity.session as Session | undefined;\n if (!session) {\n return {};\n }\n\n return this.resourceRealmMatch({ realmId: session.realmId });\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<SessionToken>> {\n const parsed = await decodeQuery(query, { schema: sessionTokenSchema, actor });\n\n let canReadAll = true;\n try {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.SESSION_READ });\n } catch (e) {\n if (!actor.identity) {\n throw e;\n }\n canReadAll = false;\n }\n\n if (!canReadAll) {\n // Self-service: mandatory ownership scope through the session,\n // AND-injected so a client filter cannot displace it.\n const scoped = appendQueryConditions(\n parsed,\n and(\n eq('session.sub', actor.identity!.data.id),\n eq('session.subKind', actor.identity!.type),\n ),\n );\n\n return this.repository.findMany(scoped);\n }\n\n const { data: entities, meta } = await this.repository.findMany(parsed);\n\n const data: SessionToken[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n if (this.isOwnedBy(entity, actor)) {\n data.push(entity);\n continue;\n }\n\n try {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.SESSION_READ,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: entity,\n ...this.tokenRealmMatch(entity),\n }),\n });\n data.push(entity);\n } catch {\n total -= 1;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total,\n },\n };\n }\n\n async getOne(id: string, actor: ActorContext): Promise<SessionToken> {\n const entity = await this.loadOneForActor(id, actor, PermissionName.SESSION_READ);\n\n return entity;\n }\n\n async delete(id: string, actor: ActorContext): Promise<SessionToken> {\n const entity = await this.loadOneForActor(id, actor, PermissionName.SESSION_DELETE);\n\n await this.revoke(entity);\n\n return entity;\n }\n\n async deleteMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<SessionTokenDeleteManyResult> {\n if (!actor.identity) {\n throw new AuthupError({ code: ErrorCode.IDENTITY_UNAUTHORIZED, message: 'Authentication required.' });\n }\n\n if (!this.hasTargetFilter(query)) {\n throw new AuthupError({\n code: ErrorCode.BAD_REQUEST,\n message: 'A bulk revoke must be scoped by id, sessionId or clientId.',\n });\n }\n\n const parsed = await decodeQuery(query, {\n schema: sessionTokenSchema,\n parameters: ['filters'],\n actor,\n });\n\n let canDeleteAll = true;\n try {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.SESSION_DELETE });\n } catch {\n canDeleteAll = false;\n }\n\n const scoped = canDeleteAll ? parsed : appendQueryConditions(\n parsed,\n and(\n eq('session.sub', actor.identity.data.id),\n eq('session.subKind', actor.identity.type),\n ),\n );\n\n const entities = await this.repository.findAllByQuery(scoped);\n\n let count = 0;\n for (const entity of entities) {\n if (!this.isOwnedBy(entity, actor)) {\n try {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.SESSION_DELETE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: entity,\n ...this.tokenRealmMatch(entity),\n }),\n });\n } catch {\n continue;\n }\n }\n\n await this.revoke(entity);\n count += 1;\n }\n\n return { count };\n }\n\n // -----------------------------------------------------\n\n protected async loadOneForActor(\n id: string,\n actor: ActorContext,\n permission: `${PermissionName}`,\n ): Promise<SessionToken> {\n const entity = await this.repository.findOneWithSessionById(id);\n\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (!this.isOwnedBy(entity, actor)) {\n await actor.permissionEvaluator.preEvaluate({ name: permission });\n await actor.permissionEvaluator.evaluate({\n name: permission,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: entity,\n ...this.tokenRealmMatch(entity),\n }),\n });\n }\n\n return entity;\n }\n\n /**\n * Revoke, not delete. The row is stamped and the jti is blocklisted with a\n * TTL pinned to the token's real expiry, so an in-flight access token stops\n * introspecting as active instead of surviving to its own `exp`.\n */\n protected async revoke(entity: SessionToken): Promise<void> {\n const at = new Date().toISOString();\n\n await this.repository.revokeById(entity.id, at);\n\n // Stamp the in-memory row too: `delete()` returns this object as the\n // response body, and without it a just-revoked token reports\n // `revokedAt: null` until the client reads it again.\n entity.revokedAt = at;\n\n if (this.tokenRepository) {\n await this.tokenRepository.setInactive(\n entity.id,\n Math.floor(new Date(entity.expiresAt).getTime() / 1000),\n );\n }\n }\n\n protected hasTargetFilter(query?: Record<string, any>): boolean {\n if (!isObject(query)) {\n return false;\n }\n\n let parsed;\n try {\n parsed = SessionTokenService.queryCodec.decode(query);\n } catch {\n return false;\n }\n\n if (!parsed) {\n return false;\n }\n\n return this.hasTargetCondition(parsed.filters);\n }\n\n /**\n * Whether the condition BOUNDS the query to a target scope.\n *\n * The question is not \"does a target key appear somewhere\" but \"is the\n * result set constrained by one\". Those differ, and the difference is a\n * mass revoke:\n *\n * - `and` is bounded when ANY conjunct is: the others can only narrow it.\n * - `or` is bounded only when EVERY branch is. `or(eq(id,x), eq(kind,access))`\n * names a target key and still selects every access token.\n * - `not` is never a scope. A negation of a scoped predicate is its\n * complement, which is nearly everything.\n *\n * The expression dialect is what makes the last two reachable: rapiq\n * collapses `not(eq(...))` into an `ne` leaf, but `not(and(...))` stays a\n * compound node, and `or(...)` has no bracket-dialect spelling at all.\n */\n protected hasTargetCondition(condition: ICondition): boolean {\n if (isFilters(condition)) {\n if (condition.operator === FilterCompoundOperator.NOT) {\n return false;\n }\n\n if (condition.operator === FilterCompoundOperator.OR) {\n return condition.value.length > 0 &&\n condition.value.every((child) => this.hasTargetCondition(child));\n }\n\n return condition.value.some((child) => this.hasTargetCondition(child));\n }\n\n if (isFilter(condition)) {\n if (!(SESSION_TOKEN_FILTER_KEYS as readonly string[]).includes(condition.field)) {\n return false;\n }\n\n // The OPERATOR decides, not just the field. A negation or a range\n // names a target key while selecting nearly every row.\n //\n // Note this guard is inverted relative to the session bulk revoke,\n // which was the model for it: there, failing the check falls back\n // to the SELF-service path, so a permissive check is the safe\n // direction. Here, passing it IS the destructive path.\n if (condition.operator === FilterFieldOperator.EQUAL) {\n return condition.value !== '' &&\n condition.value !== null &&\n typeof condition.value !== 'undefined';\n }\n\n if (condition.operator === FilterFieldOperator.IN) {\n // An empty membership set is not a scope: it decodes to a\n // predicate nothing satisfies, but it would still authorize the\n // admin path alongside whatever else the query carries.\n return Array.isArray(condition.value) && condition.value.length > 0;\n }\n\n return false;\n }\n\n return false;\n }\n\n /**\n * Schemaless decode — dialect detection only. The allow-list is enforced\n * downstream by the schema-bound decode.\n */\n protected static queryCodec = createURLCodec();\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { SessionToken } from '@authup/core-kit';
|
|
2
|
+
import type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';
|
|
3
|
+
export type SessionTokenDeleteManyResult = {
|
|
4
|
+
count: number;
|
|
5
|
+
};
|
|
6
|
+
export interface ISessionTokenService {
|
|
7
|
+
/**
|
|
8
|
+
* List issued tokens. An actor without `SESSION_READ` is scoped to the
|
|
9
|
+
* tokens of its own sessions; an actor with it sees what its realm reach
|
|
10
|
+
* permits.
|
|
11
|
+
*/
|
|
12
|
+
getMany(query: Record<string, any>, actor: ActorContext): Promise<EntityRepositoryFindManyResult<SessionToken>>;
|
|
13
|
+
/**
|
|
14
|
+
* Read one token row by its jti. Own tokens need no permission.
|
|
15
|
+
*/
|
|
16
|
+
getOne(id: string, actor: ActorContext): Promise<SessionToken>;
|
|
17
|
+
/**
|
|
18
|
+
* REVOKE one token. Own tokens need no permission.
|
|
19
|
+
*
|
|
20
|
+
* Revoke, not delete: the row is stamped `revokedAt` and the jti is
|
|
21
|
+
* blocklisted in cache. Dropping the row would block refresh (the row is
|
|
22
|
+
* the authority for refresh validity since plan 016) while leaving an
|
|
23
|
+
* already-issued access token verifying against a stateless JWKS adapter
|
|
24
|
+
* until its own expiry.
|
|
25
|
+
*/
|
|
26
|
+
delete(id: string, actor: ActorContext): Promise<SessionToken>;
|
|
27
|
+
/**
|
|
28
|
+
* Revoke every token matching a query. This is what "sign out of this
|
|
29
|
+
* application" needs: scoped to one client it leaves the session alive, so
|
|
30
|
+
* the other applications riding it stay signed in.
|
|
31
|
+
*
|
|
32
|
+
* Requires a recognized target filter, so it can never degenerate into an
|
|
33
|
+
* unscoped mass revoke.
|
|
34
|
+
*/
|
|
35
|
+
deleteMany(query: Record<string, any>, actor: ActorContext): Promise<SessionTokenDeleteManyResult>;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/session-token/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEvF,MAAM,MAAM,4BAA4B,GAAG;IACvC,KAAK,EAAE,MAAM,CAAA;CAChB,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACjC;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,YAAY,CAAC,CAAC,CAAC;IAEhH;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/D;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE/D;;;;;;;OAOG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC;CACtG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/trust-anchor/schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/trust-anchor/schema.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD,eAAO,MAAM,iBAAiB,gDA0B5B,CAAC"}
|
|
@@ -8,6 +8,14 @@ import { defineSchema } from "@rapiq/core";
|
|
|
8
8
|
const schemaMapping = { realm: EntityType.REALM };
|
|
9
9
|
const trustAnchorSchema = defineSchema({
|
|
10
10
|
name: EntityType.TRUST_ANCHOR,
|
|
11
|
+
indexes: [
|
|
12
|
+
["id"],
|
|
13
|
+
["name", "realmId"],
|
|
14
|
+
["enabled"],
|
|
15
|
+
["realmId"],
|
|
16
|
+
["createdAt"],
|
|
17
|
+
["updatedAt"]
|
|
18
|
+
],
|
|
11
19
|
fields: { allowed: [
|
|
12
20
|
"id",
|
|
13
21
|
"name",
|
|
@@ -17,23 +25,29 @@ const trustAnchorSchema = defineSchema({
|
|
|
17
25
|
"createdAt",
|
|
18
26
|
"updatedAt"
|
|
19
27
|
] },
|
|
20
|
-
filters: {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
filters: {
|
|
29
|
+
allowed: [
|
|
30
|
+
"id",
|
|
31
|
+
"name",
|
|
32
|
+
"enabled",
|
|
33
|
+
"realmId"
|
|
34
|
+
],
|
|
35
|
+
indexed: true
|
|
36
|
+
},
|
|
26
37
|
relations: {
|
|
27
38
|
allowed: ["realm"],
|
|
28
39
|
validate: createRelationsReadGate(schemaMapping)
|
|
29
40
|
},
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
sorts: {
|
|
42
|
+
allowed: [
|
|
43
|
+
"id",
|
|
44
|
+
"name",
|
|
45
|
+
"enabled",
|
|
46
|
+
"createdAt",
|
|
47
|
+
"updatedAt"
|
|
48
|
+
],
|
|
49
|
+
indexed: true
|
|
50
|
+
},
|
|
37
51
|
pagination: { maxLimit: 50 },
|
|
38
52
|
schemaMapping
|
|
39
53
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.mjs","names":["defineSchema","EntityType","createRelationsReadGate","schemaMapping","realm","REALM","trustAnchorSchema","name","TRUST_ANCHOR","fields","allowed","filters","relations","validate","
|
|
1
|
+
{"version":3,"file":"schema.mjs","names":["defineSchema","EntityType","createRelationsReadGate","schemaMapping","realm","REALM","trustAnchorSchema","name","TRUST_ANCHOR","indexes","fields","allowed","filters","indexed","relations","validate","sorts","pagination","maxLimit"],"sources":["../../../../src/core/entities/trust-anchor/schema.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { defineSchema } from '@rapiq/core';\nimport type { TrustAnchor } from '@authup/core-kit';\nimport { EntityType } from '@authup/core-kit';\nimport { createRelationsReadGate } from '../../query/relations.ts';\n\nconst schemaMapping = { realm: EntityType.REALM };\n\nexport const trustAnchorSchema = defineSchema<TrustAnchor>({\n name: EntityType.TRUST_ANCHOR,\n indexes: [\n ['id'],\n ['name', 'realmId'],\n ['enabled'],\n ['realmId'],\n ['createdAt'],\n ['updatedAt'],\n ],\n fields: {\n allowed: [\n 'id',\n 'name',\n 'certificate',\n 'enabled',\n 'realmId',\n 'createdAt',\n 'updatedAt',\n ],\n },\n filters: { allowed: ['id', 'name', 'enabled', 'realmId'], indexed: true },\n relations: { allowed: ['realm'], validate: createRelationsReadGate(schemaMapping) },\n sorts: { allowed: ['id', 'name', 'enabled', 'createdAt', 'updatedAt'], indexed: true },\n pagination: { maxLimit: 50 },\n schemaMapping,\n});\n"],"mappings":";;;;;;;AAYA,MAAMG,gBAAgB,EAAEC,OAAOH,WAAWI,MAAM;AAEhD,MAAaC,oBAAoBN,aAA0B;CACvDO,MAAMN,WAAWO;CACjBC,SAAS;EACL,CAAC,IAAK;EACN,CAAC,QAAQ,SAAU;EACnB,CAAC,SAAU;EACX,CAAC,SAAU;EACX,CAAC,WAAY;EACb,CAAC,WAAY;CAChB;CACDC,QAAQ,EACJC,SAAS;EACL;EACA;EACA;EACA;EACA;EACA;EACA;CACH,EACL;CACAC,SAAS;EAAED,SAAS;GAAC;GAAM;GAAQ;GAAW;EAAU;EAAEE,SAAS;CAAK;CACxEC,WAAW;EAAEH,SAAS,CAAC,OAAQ;EAAEI,UAAUb,wBAAwBC,aAAAA;CAAe;CAClFa,OAAO;EAAEL,SAAS;GAAC;GAAM;GAAQ;GAAW;GAAa;EAAY;EAAEE,SAAS;CAAK;CACrFI,YAAY,EAAEC,UAAU,GAAG;CAC3Bf;AACJ,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/trust-anchor/service.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAEH,SAAS,EAGT,oBAAoB,EACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,KAAK,EACR,sBAAsB,EACtB,mBAAmB,EACnB,6BAA6B,EAChC,MAAM,YAAY,CAAC;AAIpB,MAAM,MAAM,yBAAyB,GAAG;IACpC,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,mBAAmB,GAAG,SAAS,CAAC;CAC1D,CAAC;AAQF,qBAAa,kBAAmB,SAAQ,qBAAsB,YAAW,mBAAmB;IACxF,SAAS,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAE7C,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC;IAE1C,SAAS,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IAEvC,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,mBAAmB,GAAG,SAAS,CAAC;gBAErD,GAAG,EAAE,yBAAyB;IAQpC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,6BAAkC,GAC5C,OAAO,CAAC,8BAA8B,CAAC,WAAW,CAAC,CAAC;IAqDjD,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC;IAmBjB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC;IA6CjB,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC;IAuCjB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC;IA2BvB;;;;;;OAMG;cACa,WAAW,CACvB,IAAI,EAAE,GAAG,SAAS,EAAE,EACpB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,YAAY,EACnB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/trust-anchor/service.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAEH,SAAS,EAGT,oBAAoB,EACvB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,KAAK,EACR,sBAAsB,EACtB,mBAAmB,EACnB,6BAA6B,EAChC,MAAM,YAAY,CAAC;AAIpB,MAAM,MAAM,yBAAyB,GAAG;IACpC,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,mBAAmB,GAAG,SAAS,CAAC;CAC1D,CAAC;AAQF,qBAAa,kBAAmB,SAAQ,qBAAsB,YAAW,mBAAmB;IACxF,SAAS,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAE7C,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC;IAE1C,SAAS,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;IAEvC,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,mBAAmB,GAAG,SAAS,CAAC;gBAErD,GAAG,EAAE,yBAAyB;IAQpC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,6BAAkC,GAC5C,OAAO,CAAC,8BAA8B,CAAC,WAAW,CAAC,CAAC;IAqDjD,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC;IAmBjB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC;IA6CjB,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC;IAuCjB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,WAAW,CAAC;IA2BvB;;;;;;OAMG;cACa,WAAW,CACvB,IAAI,EAAE,GAAG,SAAS,EAAE,EACpB,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,YAAY,EACnB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;IA2BhB,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAMtE"}
|
|
@@ -167,6 +167,7 @@ var TrustAnchorService = class extends AbstractEntityService {
|
|
|
167
167
|
actorType: actor.identity?.type ?? null,
|
|
168
168
|
actorId: actor.identity?.data.id ?? null,
|
|
169
169
|
actorName: actor.identity?.data.name ?? null,
|
|
170
|
+
sessionId: requestContext?.sessionId ?? null,
|
|
170
171
|
requestPath: requestContext?.requestPath ?? null,
|
|
171
172
|
requestMethod: requestContext?.requestMethod ?? null,
|
|
172
173
|
requestIpAddress: requestContext?.requestIpAddress ?? null,
|