@authup/server-core 1.0.0-beta.37 → 1.0.0-beta.39
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/data-source/options/module.mjs +16 -16
- package/dist/adapters/database/domains/client/index.d.ts +0 -1
- package/dist/adapters/database/domains/client/index.d.ts.map +1 -1
- package/dist/adapters/database/domains/client/index.mjs +1 -2
- package/dist/adapters/database/domains/index.mjs +26 -28
- package/dist/adapters/database/domains/policy/repository.mjs +1 -1
- package/dist/adapters/database/domains/robot/index.d.ts +0 -1
- package/dist/adapters/database/domains/robot/index.d.ts.map +1 -1
- package/dist/adapters/database/domains/robot/index.mjs +1 -2
- package/dist/adapters/database/domains/role/repository.d.ts +0 -6
- package/dist/adapters/database/domains/role/repository.d.ts.map +1 -1
- package/dist/adapters/database/domains/role/repository.mjs +1 -58
- package/dist/adapters/database/domains/role/repository.mjs.map +1 -1
- package/dist/adapters/database/domains/role-permission/entity.mjs +1 -1
- package/dist/adapters/database/domains/user/repository.d.ts +1 -5
- package/dist/adapters/database/domains/user/repository.d.ts.map +1 -1
- package/dist/adapters/database/domains/user/repository.mjs +0 -60
- package/dist/adapters/database/domains/user/repository.mjs.map +1 -1
- package/dist/adapters/database/extra-attribute-repository/tree/repository.d.ts.map +1 -1
- package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs +1 -0
- package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs.map +1 -1
- package/dist/adapters/database/index.mjs +18 -20
- package/dist/adapters/http/adapters/index.mjs +2 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.d.ts +2 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs +10 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs +5 -13
- package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/index.mjs +2 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts +2 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +11 -2
- package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.d.ts +5 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs +19 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts +6 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts +15 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts.map +1 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs +57 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs.map +1 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/guess.mjs +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.d.ts +1 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.mjs +2 -1
- package/dist/adapters/http/adapters/oauth2/index.mjs +2 -1
- package/dist/adapters/http/controllers/entities/client/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/client/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/client/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/permission/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/policy/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/policy/utils/attributes-validator.mjs +1 -1
- package/dist/adapters/http/controllers/entities/policy/utils/validation.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/policy/utils/validation.mjs +1 -1
- package/dist/adapters/http/controllers/entities/policy/utils/validation.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/robot/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/robot/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/robot/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/authorize/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/authorize/module.mjs +5 -6
- package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/token/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/token/module.mjs +4 -1
- package/dist/adapters/http/controllers/workflows/token/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/token/types.d.ts +2 -1
- package/dist/adapters/http/controllers/workflows/token/types.d.ts.map +1 -1
- package/dist/adapters/http/index.mjs +2 -1
- package/dist/adapters/http/middleware/built-in/assets.mjs +3 -3
- package/dist/adapters/http/middleware/built-in/assets.mjs.map +1 -1
- package/dist/app/modules/database/repositories/bindings.d.ts +17 -0
- package/dist/app/modules/database/repositories/bindings.d.ts.map +1 -0
- package/dist/app/modules/database/repositories/bindings.mjs +40 -0
- package/dist/app/modules/database/repositories/bindings.mjs.map +1 -0
- package/dist/app/modules/database/repositories/client/repository.d.ts +5 -1
- package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/client/repository.mjs +69 -1
- package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/permission/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/permission/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/policy/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/policy/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/realm/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/robot/repository.d.ts +5 -1
- package/dist/app/modules/database/repositories/robot/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/robot/repository.mjs +61 -1
- package/dist/app/modules/database/repositories/robot/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/role/repository.d.ts +3 -0
- package/dist/app/modules/database/repositories/role/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/role/repository.mjs +17 -1
- package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/scope/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/scope/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/user/repository.d.ts +4 -1
- package/dist/app/modules/database/repositories/user/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/user/repository.mjs +31 -2
- package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
- package/dist/app/modules/http/modules/controller.d.ts +1 -2
- package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
- package/dist/app/modules/http/modules/controller.mjs +32 -34
- package/dist/app/modules/http/modules/controller.mjs.map +1 -1
- package/dist/app/modules/http/modules/middleware.d.ts.map +1 -1
- package/dist/app/modules/http/modules/middleware.mjs +2 -15
- package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
- package/dist/app/modules/identity/constants.d.ts +3 -1
- package/dist/app/modules/identity/constants.d.ts.map +1 -1
- package/dist/app/modules/identity/constants.mjs +2 -0
- package/dist/app/modules/identity/constants.mjs.map +1 -1
- package/dist/app/modules/identity/module.d.ts.map +1 -1
- package/dist/app/modules/identity/module.mjs +42 -5
- package/dist/app/modules/identity/module.mjs.map +1 -1
- package/dist/app/modules/identity/repositories/client.d.ts +2 -2
- package/dist/app/modules/identity/repositories/client.d.ts.map +1 -1
- package/dist/app/modules/identity/repositories/client.mjs.map +1 -1
- package/dist/app/modules/identity/repositories/robot.d.ts +2 -2
- package/dist/app/modules/identity/repositories/robot.d.ts.map +1 -1
- package/dist/app/modules/identity/repositories/robot.mjs.map +1 -1
- package/dist/app/modules/oauth2/module.d.ts.map +1 -1
- package/dist/app/modules/oauth2/module.mjs +5 -2
- package/dist/app/modules/oauth2/module.mjs.map +1 -1
- package/dist/app/modules/provisioning/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/module.mjs +14 -9
- 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 +66 -10
- package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
- package/dist/components/database/unique-entries/module.mjs +1 -1
- package/dist/core/entities/client/service.d.ts +1 -1
- package/dist/core/entities/client/service.d.ts.map +1 -1
- package/dist/core/entities/client/service.mjs +27 -23
- package/dist/core/entities/client/service.mjs.map +1 -1
- package/dist/core/entities/client/types.d.ts +6 -2
- package/dist/core/entities/client/types.d.ts.map +1 -1
- package/dist/core/entities/client-scope/service.d.ts.map +1 -1
- package/dist/core/entities/client-scope/service.mjs +2 -0
- package/dist/core/entities/client-scope/service.mjs.map +1 -1
- package/dist/core/entities/identity-provider-role-mapping/service.d.ts.map +1 -1
- package/dist/core/entities/identity-provider-role-mapping/service.mjs +2 -0
- package/dist/core/entities/identity-provider-role-mapping/service.mjs.map +1 -1
- package/dist/core/entities/permission/service.mjs +1 -1
- package/dist/core/entities/policy/attributes-validator.mjs +1 -1
- package/dist/core/entities/policy/service.mjs +1 -1
- package/dist/core/entities/realm/service.mjs +1 -1
- package/dist/core/entities/robot/service.d.ts +1 -1
- package/dist/core/entities/robot/service.d.ts.map +1 -1
- package/dist/core/entities/robot/service.mjs +41 -26
- package/dist/core/entities/robot/service.mjs.map +1 -1
- package/dist/core/entities/robot/types.d.ts +6 -2
- package/dist/core/entities/robot/types.d.ts.map +1 -1
- package/dist/core/entities/role/service.mjs +1 -1
- package/dist/core/entities/role/types.d.ts +3 -0
- package/dist/core/entities/role/types.d.ts.map +1 -1
- package/dist/core/entities/role-attribute/service.d.ts +2 -0
- package/dist/core/entities/role-attribute/service.d.ts.map +1 -1
- package/dist/core/entities/role-attribute/service.mjs +7 -3
- package/dist/core/entities/role-attribute/service.mjs.map +1 -1
- package/dist/core/entities/scope/service.mjs +1 -1
- package/dist/core/entities/user/service.d.ts.map +1 -1
- package/dist/core/entities/user/service.mjs +20 -25
- package/dist/core/entities/user/service.mjs.map +1 -1
- package/dist/core/entities/user/types.d.ts +4 -1
- package/dist/core/entities/user/types.d.ts.map +1 -1
- package/dist/core/entities/user-attribute/service.d.ts +3 -1
- package/dist/core/entities/user-attribute/service.d.ts.map +1 -1
- package/dist/core/entities/user-attribute/service.mjs +44 -17
- package/dist/core/entities/user-attribute/service.mjs.map +1 -1
- package/dist/core/identity/index.d.ts +1 -0
- package/dist/core/identity/index.d.ts.map +1 -1
- package/dist/core/identity/index.mjs +2 -1
- package/dist/core/identity/password-recovery/service.d.ts.map +1 -1
- package/dist/core/identity/password-recovery/service.mjs +4 -4
- package/dist/core/identity/password-recovery/service.mjs.map +1 -1
- package/dist/core/identity/permission/module.d.ts +12 -6
- package/dist/core/identity/permission/module.d.ts.map +1 -1
- package/dist/core/identity/permission/module.mjs +11 -19
- package/dist/core/identity/permission/module.mjs.map +1 -1
- package/dist/core/identity/permission/types.d.ts +11 -13
- package/dist/core/identity/permission/types.d.ts.map +1 -1
- package/dist/core/identity/provider/account/module.d.ts.map +1 -1
- package/dist/core/identity/provider/account/module.mjs +3 -2
- package/dist/core/identity/provider/account/module.mjs.map +1 -1
- package/dist/core/identity/role/index.d.ts +3 -0
- package/dist/core/identity/role/index.d.ts.map +1 -0
- package/dist/core/identity/role/index.mjs +2 -0
- package/dist/core/identity/role/module.d.ts +15 -0
- package/dist/core/identity/role/module.d.ts.map +1 -0
- package/dist/core/identity/role/module.mjs +27 -0
- package/dist/core/identity/role/module.mjs.map +1 -0
- package/dist/core/identity/role/types.d.ts +14 -0
- package/dist/core/identity/role/types.d.ts.map +1 -0
- package/dist/core/identity/role/types.mjs +1 -0
- package/dist/core/index.mjs +3 -1
- package/dist/core/oauth2/authorization/code/verifier/module.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/code/verifier/module.mjs +8 -4
- package/dist/core/oauth2/authorization/code/verifier/module.mjs.map +1 -1
- package/dist/core/oauth2/authorization/code/verifier/types.d.ts +2 -0
- package/dist/core/oauth2/authorization/code/verifier/types.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/code-request/verifier/module.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +7 -1
- package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
- package/dist/core/oauth2/client/authenticator.d.ts +17 -0
- package/dist/core/oauth2/client/authenticator.d.ts.map +1 -0
- package/dist/core/oauth2/client/authenticator.mjs +34 -0
- package/dist/core/oauth2/client/authenticator.mjs.map +1 -0
- package/dist/core/oauth2/client/index.d.ts +1 -0
- package/dist/core/oauth2/client/index.d.ts.map +1 -1
- package/dist/core/oauth2/client/index.mjs +2 -1
- package/dist/core/oauth2/grant-types/password.d.ts +7 -3
- package/dist/core/oauth2/grant-types/password.d.ts.map +1 -1
- package/dist/core/oauth2/grant-types/password.mjs +9 -7
- package/dist/core/oauth2/grant-types/password.mjs.map +1 -1
- package/dist/core/oauth2/index.mjs +3 -1
- package/dist/core/oauth2/token/issuer/access/module.d.ts +4 -1
- package/dist/core/oauth2/token/issuer/access/module.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/access/module.mjs +24 -2
- package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
- package/dist/core/oauth2/token/issuer/base.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/base.mjs +3 -2
- package/dist/core/oauth2/token/issuer/base.mjs.map +1 -1
- package/dist/core/provisioning/entities/permission/types.d.ts +8 -0
- package/dist/core/provisioning/entities/permission/types.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/permission/module.d.ts +5 -1
- package/dist/core/provisioning/synchronizer/permission/module.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/permission/module.mjs +23 -0
- package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
- package/dist/core/provisioning/synchronizer/permission/types.d.ts +4 -1
- package/dist/core/provisioning/synchronizer/permission/types.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/policy/module.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/policy/module.mjs +4 -2
- package/dist/core/provisioning/synchronizer/policy/module.mjs.map +1 -1
- package/dist/index.mjs +19 -20
- package/dist/path.d.ts +2 -1
- package/dist/path.d.ts.map +1 -1
- package/dist/path.mjs +3 -2
- package/dist/path.mjs.map +1 -1
- package/dist/swagger.json +14 -0
- package/dist/ui/client/.vite/ssr-manifest.json +2777 -0
- package/dist/ui/client/assets/fa-brands-400-BP5tdqmh.woff2 +0 -0
- package/dist/ui/client/assets/fa-regular-400-nyy7hhHF.woff2 +0 -0
- package/dist/ui/client/assets/fa-solid-900-DRAAbZTg.woff2 +0 -0
- package/dist/ui/client/assets/index-BVfayRKv.css +1 -0
- package/dist/ui/client/assets/index-Noe7uiOY.js +41 -0
- package/dist/ui/client/index.html +22 -0
- package/dist/ui/server/assets/multipart-parser-pHQi-kA6.js +166 -0
- package/dist/ui/server/server.js +79116 -0
- package/package.json +30 -13
- package/dist/adapters/database/domains/client/repository.d.ts +0 -13
- package/dist/adapters/database/domains/client/repository.d.ts.map +0 -1
- package/dist/adapters/database/domains/client/repository.mjs +0 -75
- package/dist/adapters/database/domains/client/repository.mjs.map +0 -1
- package/dist/adapters/database/domains/robot/repository.d.ts +0 -13
- package/dist/adapters/database/domains/robot/repository.d.ts.map +0 -1
- package/dist/adapters/database/domains/robot/repository.mjs +0 -75
- package/dist/adapters/database/domains/robot/repository.mjs.map +0 -1
- package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.d.ts +0 -4
- package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.d.ts.map +0 -1
- package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.mjs +0 -35
- package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["OAuth2SubKind","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","OAuth2ScopeAttributesResolver","ForceLoggedInMiddleware","isSelfToken","buildActorContext","useRequestIdentity","useRequestScopes","ClientController","service","repository","ctx","getMany","req","res","actor","data","meta","get","id","identity","isMe","type","attributesResolver","attributes","resolveFor","CLIENT","entity","findOneByIdOrName","attribute","attr","withSecret","findOneWithSecret","secret","getOne","add","create","edit","update","put","created","save","undefined","drop","delete"],"sources":["../../../../../../src/adapters/http/controllers/entities/client/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 { OAuth2SubKind } from '@authup/specs';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { NotFoundError } from '@ebec/http';\nimport type { Client } from '@authup/core-kit';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IClientRepository, IClientService } from '../../../../../core/index.ts';\nimport { OAuth2ScopeAttributesResolver } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n useRequestScopes,\n} from '../../../request/index.ts';\n\nexport type ClientControllerContext = {\n service: IClientService,\n repository: IClientRepository,\n};\n\n@DTags('oauth2')\n@DController('/clients')\nexport class ClientController {\n protected service: IClientService;\n\n protected repository: IClientRepository;\n\n constructor(ctx: ClientControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n }\n\n @DGet('', [])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DGet('/:id', [])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const identity = useRequestIdentity(req);\n\n let isMe = false;\n if (\n identity &&\n identity.type === 'client'\n ) {\n isMe = isSelfToken(id) || identity.id === id;\n }\n\n if (isMe) {\n const attributesResolver = new OAuth2ScopeAttributesResolver();\n const attributes = attributesResolver.resolveFor(OAuth2SubKind.CLIENT, useRequestScopes(req));\n\n const entity = await this.repository.findOneByIdOrName(\n identity!.id,\n useRequestParam(req, 'realmId'),\n );\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n for (const attribute of attributes) {\n const attr = attribute as keyof Client;\n if (attr === 'secret') {\n const withSecret = await this.repository.findOneWithSecret({ id: entity.id });\n if (withSecret) {\n entity.secret = withSecret.secret;\n }\n }\n }\n\n return send(res, entity);\n }\n\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(id
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["OAuth2SubKind","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","OAuth2ScopeAttributesResolver","ForceLoggedInMiddleware","isSelfToken","buildActorContext","useRequestIdentity","useRequestScopes","ClientController","service","repository","ctx","getMany","req","res","actor","data","meta","get","id","identity","isMe","type","attributesResolver","attributes","resolveFor","CLIENT","entity","findOneByIdOrName","attribute","attr","withSecret","findOneWithSecret","secret","getOne","add","create","edit","update","put","created","save","undefined","drop","delete"],"sources":["../../../../../../src/adapters/http/controllers/entities/client/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 { OAuth2SubKind } from '@authup/specs';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { NotFoundError } from '@ebec/http';\nimport type { Client } from '@authup/core-kit';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { IClientRepository, IClientService } from '../../../../../core/index.ts';\nimport { OAuth2ScopeAttributesResolver } from '../../../../../core/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n useRequestScopes,\n} from '../../../request/index.ts';\n\nexport type ClientControllerContext = {\n service: IClientService,\n repository: IClientRepository,\n};\n\n@DTags('oauth2')\n@DController('/clients')\nexport class ClientController {\n protected service: IClientService;\n\n protected repository: IClientRepository;\n\n constructor(ctx: ClientControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n }\n\n @DGet('', [])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DGet('/:id', [])\n async get(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const identity = useRequestIdentity(req);\n\n let isMe = false;\n if (\n identity &&\n identity.type === 'client'\n ) {\n isMe = isSelfToken(id) || identity.id === id;\n }\n\n if (isMe) {\n const attributesResolver = new OAuth2ScopeAttributesResolver();\n const attributes = attributesResolver.resolveFor(OAuth2SubKind.CLIENT, useRequestScopes(req));\n\n const entity = await this.repository.findOneByIdOrName(\n identity!.id,\n useRequestParam(req, 'realmId'),\n );\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n for (const attribute of attributes) {\n const attr = attribute as keyof Client;\n if (attr === 'secret') {\n const withSecret = await this.repository.findOneWithSecret({ id: entity.id });\n if (withSecret) {\n entity.secret = withSecret.secret;\n }\n }\n }\n\n return send(res, entity);\n }\n\n const actor = buildActorContext(req);\n const entity = await this.service.getOne(\n id,\n actor,\n useRequestQuery(req),\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.create(data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.update(id, data, actor);\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,IAAauB,mBAAb,MAAaA;CACCC;CAEAC;CAEV,YAAYC,KAA8B;AACtC,OAAKF,UAAUE,IAAIF;AACnB,OAAKC,aAAaC,IAAID;;CAG1B,MACME,QACF,KACA,KACY;EACZ,MAAMG,QAAQV,kBAAkBQ,IAAAA;EAChC,MAAM,EACFG,MACAC,SACA,MAAM,KAAKR,QAAQG,QAAQX,gBAAgBY,IAAAA,EAAME,MAAAA;AAErD,SAAOlB,KAAKiB,KAAK;GACbE;GACAC;GACJ,CAAA;;CAGJ,MACMC,IACF,IACA,KACA,KACY;EACZ,MAAME,WAAWd,mBAAmBO,IAAAA;EAEpC,IAAIQ,OAAO;AACX,MACID,YACAA,SAASE,SAAS,SAElBD,QAAOjB,YAAYe,GAAAA,IAAOC,SAASD,OAAOA;AAG9C,MAAIE,MAAM;GAEN,MAAMG,aAAaD,IADYrB,+BACZqB,CAAmBE,WAAWxC,cAAcyC,QAAQnB,iBAAiBM,IAAAA,CAAAA;GAExF,MAAMc,SAAS,MAAM,KAAKjB,WAAWkB,kBACjCR,SAAUD,IACVnB,gBAAgBa,KAAK,UAAA,CAAA;AAGzB,OAAI,CAACc,OACD,OAAM,IAAI/B,eAAAA;AAGd,QAAK,MAAMiC,aAAaL,WAEpB,KAAIM,cAAS,UAAU;IACnB,MAAMC,aAAa,MAAM,KAAKrB,WAAWsB,kBAAkB,EAAEb,IAAIQ,OAAOR,IAAG,CAAA;AAC3E,QAAIY,WACAJ,QAAOM,SAASF,WAAWE;;AAKvC,UAAOpC,KAAKiB,KAAKa,OAAAA;;EAGrB,MAAMZ,QAAQV,kBAAkBQ,IAAAA;AAQhC,SAAOhB,KAAKiB,KAAKa,MAPI,KAAKlB,QAAQyB,OAC9Bf,IACAJ,OACAd,gBAAgBY,IAAAA,EAChBb,gBAAgBa,KAAK,UAAA,CAAA,CAGRc;;CAGrB,MACMQ,IACF,MACA,KACA,KACY;EACZ,MAAMpB,QAAQV,kBAAkBQ,IAAAA;AAGhC,SAAOd,YAAYe,KAAKa,MAFH,KAAKlB,QAAQ2B,OAAOpB,MAAMD,MAAAA,CAEvBY;;CAG5B,MACMU,KACF,IACA,MACA,KACA,KACY;EACZ,MAAMtB,QAAQV,kBAAkBQ,IAAAA;AAGhC,SAAOf,aAAagB,KAAKa,MAFJ,KAAKlB,QAAQ6B,OAAOnB,IAAIH,MAAMD,MAAAA,CAE1BY;;CAG7B,MACMY,IACF,IACA,MACA,KACA,KACY;EACZ,MAAMxB,QAAQV,kBAAkBQ,IAAAA;EAChC,MAAM,EACFc,QACAa,YACA,MAAM,KAAK/B,QAAQgC,KACnBtB,MAAMuB,KAAAA,GACN1B,MACAD,MAAAA;AAGJ,MAAIyB,QACA,QAAOzC,YAAYe,KAAKa,OAAAA;AAG5B,SAAO7B,aAAagB,KAAKa,OAAAA;;CAG7B,MACMgB,KACF,IACA,KACA,KACY;EACZ,MAAM5B,QAAQV,kBAAkBQ,IAAAA;AAGhC,SAAOf,aAAagB,KAAKa,MAFJ,KAAKlB,QAAQmC,OAAOzB,IAAIJ,MAAAA,CAEpBY;;;;;;;;;;;;;;;;;;;;;;;;;YA1DjBxB,wBAAAA,CAAAA;;;;;;;;;;;;;gBAYIA,wBAAAA,CAAAA;;;;;;;;;;;;;;;eAaDA,wBAAAA,CAAAA;;;;;;;;;;;;;;;kBAwBGA,wBAAAA,CAAAA"}
|
|
@@ -9,8 +9,8 @@ import "../../../request/index.mjs";
|
|
|
9
9
|
import { ForceLoggedInMiddleware } from "../../../middleware/built-in/loggedin/module.mjs";
|
|
10
10
|
import "../../../middleware/index.mjs";
|
|
11
11
|
import { IdentityProviderAttributesValidator, IdentityProviderValidator, IdentityType, PermissionName, ValidatorGroup, isOAuth2IdentityProvider, isOpenIDIdentityProvider } from "@authup/core-kit";
|
|
12
|
-
import { BuiltInPolicyType, PolicyData } from "@authup/access";
|
|
13
12
|
import { base64URLDecode, isUUID } from "@authup/kit";
|
|
13
|
+
import { BuiltInPolicyType, PolicyData } from "@authup/access";
|
|
14
14
|
import { OAuth2Error } from "@authup/specs";
|
|
15
15
|
import { BadRequestError, NotFoundError } from "@ebec/http";
|
|
16
16
|
import { getRequestHeader, getRequestIP, send, sendAccepted, sendCreated, sendRedirect, useRequestParam } from "routup";
|
|
@@ -5,8 +5,8 @@ import { buildActorContext } from "../../../request/helpers/actor.mjs";
|
|
|
5
5
|
import "../../../request/index.mjs";
|
|
6
6
|
import { ForceLoggedInMiddleware } from "../../../middleware/built-in/loggedin/module.mjs";
|
|
7
7
|
import "../../../middleware/index.mjs";
|
|
8
|
-
import { BuiltInPolicyType, PermissionEvaluator, PolicyData } from "@authup/access";
|
|
9
8
|
import { isUUID } from "@authup/kit";
|
|
9
|
+
import { BuiltInPolicyType, PermissionEvaluator, PolicyData } from "@authup/access";
|
|
10
10
|
import { NotFoundError } from "@ebec/http";
|
|
11
11
|
import { send, sendAccepted, sendCreated, useRequestParam } from "routup";
|
|
12
12
|
import { useRequestQuery } from "@routup/basic/query";
|
|
@@ -5,8 +5,8 @@ import { buildActorContext } from "../../../request/helpers/actor.mjs";
|
|
|
5
5
|
import "../../../request/index.mjs";
|
|
6
6
|
import { ForceLoggedInMiddleware } from "../../../middleware/built-in/loggedin/module.mjs";
|
|
7
7
|
import "../../../middleware/index.mjs";
|
|
8
|
-
import { BuiltInPolicyType, PolicyData, definePolicyEvaluationContext } from "@authup/access";
|
|
9
8
|
import { isUUID } from "@authup/kit";
|
|
9
|
+
import { BuiltInPolicyType, PolicyData, definePolicyEvaluationContext } from "@authup/access";
|
|
10
10
|
import { NotFoundError } from "@ebec/http";
|
|
11
11
|
import { send, sendAccepted, sendCreated, useRequestParam } from "routup";
|
|
12
12
|
import { useRequestQuery } from "@routup/basic/query";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AttributeNamesPolicyValidator, AttributesPolicyValidator, BuiltInPolicyType, DatePolicyValidator, TimePolicyValidator } from "@authup/access";
|
|
2
1
|
import { omitRecord } from "@authup/kit";
|
|
2
|
+
import { AttributeNamesPolicyValidator, AttributesPolicyValidator, BuiltInPolicyType, DatePolicyValidator, TimePolicyValidator } from "@authup/access";
|
|
3
3
|
import { Container } from "validup";
|
|
4
4
|
//#region src/adapters/http/controllers/entities/policy/utils/attributes-validator.ts
|
|
5
5
|
var PolicyAttributesValidator = class extends Container {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../../../src/adapters/http/controllers/entities/policy/utils/validation.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAI7E,qBAAa,eAAgB,SAAQ,SAAS,CAAC,YAAY,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;IACxF,SAAS,CAAC,UAAU;
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../../../src/adapters/http/controllers/entities/policy/utils/validation.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAI7E,qBAAa,eAAgB,SAAQ,SAAS,CAAC,YAAY,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;IACxF,SAAS,CAAC,UAAU;CAoHvB"}
|
|
@@ -11,7 +11,7 @@ var PolicyValidator = class extends Container {
|
|
|
11
11
|
initialize() {
|
|
12
12
|
super.initialize();
|
|
13
13
|
const nameValidator = createValidator(() => {
|
|
14
|
-
return createValidationChain().exists().notEmpty().isString().isLength({
|
|
14
|
+
return createValidationChain().exists().notEmpty().isString().trim().toLowerCase().isLength({
|
|
15
15
|
min: 3,
|
|
16
16
|
max: 128
|
|
17
17
|
}).custom((value) => isPolicyNameValid(value, { throwOnFailure: true }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.mjs","names":["BuiltInPolicyType","isPolicyNameValid","isObject","Container","createValidationChain","createValidator","RequestHandlerOperation","PolicyAttributesValidator","PolicyValidator","initialize","nameValidator","chain","exists","notEmpty","isString","isLength","min","max","custom","value","throwOnFailure","mount","group","CREATE","UPDATE","optional","values","isBoolean","isUUID","ctx","Array","isArray","undefined","data","type","COMPOSITE","promises","map","child","run","flat","path","Promise","all"],"sources":["../../../../../../../src/adapters/http/controllers/entities/policy/utils/validation.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 } from '@authup/access';\nimport { isPolicyNameValid } from '@authup/core-kit';\nimport { isObject } from 'smob';\nimport type { ValidatorContext } from 'validup';\nimport { Container } from 'validup';\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport type { PolicyEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\nimport { PolicyAttributesValidator } from './attributes-validator.ts';\n\nexport class PolicyValidator extends Container<PolicyEntity & { parent_id?: string | null }> {\n protected initialize() {\n super.initialize();\n\n const nameValidator = createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .isLength({\n min: 3,\n max: 128,\n })\n .custom((value) => isPolicyNameValid(value, { throwOnFailure: true }));\n });\n\n this.mount('name', { group: RequestHandlerOperation.CREATE }, nameValidator);\n this.mount('name', {\n group: RequestHandlerOperation.UPDATE,\n optional: true, \n }, nameValidator);\n\n this.mount(\n 'display_name',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isString()\n .isLength({\n min: 3,\n max: 256, \n })\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'invert',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isBoolean();\n }),\n );\n\n this.mount(\n 'type',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isString()\n .isLength({\n min: 3,\n max: 128, \n });\n }),\n );\n\n this.mount(\n 'parent_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'realm_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount({ optional: true }, new PolicyAttributesValidator({}));\n\n this.mount(\n 'children',\n { optional: true },\n async (ctx: ValidatorContext) => {\n if (!Array.isArray(ctx.value)) {\n // todo: throw error\n return undefined;\n }\n\n if (\n isObject(ctx.data) &&\n ctx.data.type !== BuiltInPolicyType.COMPOSITE\n ) {\n return undefined;\n }\n\n const promises = ctx.value.map((child) => this.run(child, {\n group: ctx.group,\n flat: false,\n path: ctx.path,\n }));\n\n return Promise.all(promises);\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAaQ,kBAAb,cAAqCL,UAAAA;CACvBM,aAAa;AACnB,QAAMA,YAAAA;EAEN,MAAMC,gBAAgBL,sBAAgB;AAElC,UADcD,uBACPO,CACFC,QAAM,CACNC,UAAQ,CACRC,UAAQ,CACRC,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA,CACCC,QAAQC,
|
|
1
|
+
{"version":3,"file":"validation.mjs","names":["BuiltInPolicyType","isPolicyNameValid","isObject","Container","createValidationChain","createValidator","RequestHandlerOperation","PolicyAttributesValidator","PolicyValidator","initialize","nameValidator","chain","exists","notEmpty","isString","trim","toLowerCase","isLength","min","max","custom","value","throwOnFailure","mount","group","CREATE","UPDATE","optional","values","isBoolean","isUUID","ctx","Array","isArray","undefined","data","type","COMPOSITE","promises","map","child","run","flat","path","Promise","all"],"sources":["../../../../../../../src/adapters/http/controllers/entities/policy/utils/validation.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 } from '@authup/access';\nimport { isPolicyNameValid } from '@authup/core-kit';\nimport { isObject } from 'smob';\nimport type { ValidatorContext } from 'validup';\nimport { Container } from 'validup';\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport type { PolicyEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\nimport { PolicyAttributesValidator } from './attributes-validator.ts';\n\nexport class PolicyValidator extends Container<PolicyEntity & { parent_id?: string | null }> {\n protected initialize() {\n super.initialize();\n\n const nameValidator = createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .trim()\n .toLowerCase()\n .isLength({\n min: 3,\n max: 128,\n })\n .custom((value) => isPolicyNameValid(value, { throwOnFailure: true }));\n });\n\n this.mount('name', { group: RequestHandlerOperation.CREATE }, nameValidator);\n this.mount('name', {\n group: RequestHandlerOperation.UPDATE,\n optional: true, \n }, nameValidator);\n\n this.mount(\n 'display_name',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isString()\n .isLength({\n min: 3,\n max: 256, \n })\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'invert',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isBoolean();\n }),\n );\n\n this.mount(\n 'type',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isString()\n .isLength({\n min: 3,\n max: 128, \n });\n }),\n );\n\n this.mount(\n 'parent_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'realm_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount({ optional: true }, new PolicyAttributesValidator({}));\n\n this.mount(\n 'children',\n { optional: true },\n async (ctx: ValidatorContext) => {\n if (!Array.isArray(ctx.value)) {\n // todo: throw error\n return undefined;\n }\n\n if (\n isObject(ctx.data) &&\n ctx.data.type !== BuiltInPolicyType.COMPOSITE\n ) {\n return undefined;\n }\n\n const promises = ctx.value.map((child) => this.run(child, {\n group: ctx.group,\n flat: false,\n path: ctx.path,\n }));\n\n return Promise.all(promises);\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAaQ,kBAAb,cAAqCL,UAAAA;CACvBM,aAAa;AACnB,QAAMA,YAAAA;EAEN,MAAMC,gBAAgBL,sBAAgB;AAElC,UADcD,uBACPO,CACFC,QAAM,CACNC,UAAQ,CACRC,UAAQ,CACRC,MAAI,CACJC,aAAW,CACXC,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA,CACCC,QAAQC,UAAUpB,kBAAkBoB,OAAO,EAAEC,gBAAgB,MAAK,CAAA,CAAA;IAC3E;AAEA,OAAKC,MAAM,QAAQ,EAAEC,OAAOlB,wBAAwBmB,QAAO,EAAGf,cAAAA;AAC9D,OAAKa,MAAM,QAAQ;GACfC,OAAOlB,wBAAwBoB;GAC/BC,UAAU;GACd,EAAGjB,cAAAA;AAEH,OAAKa,MACD,gBACA,EAAEI,UAAU,MAAK,EACjBtB,sBAAgB;AAEZ,UADcD,uBACPO,CACFG,UAAQ,CACRG,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA,CACCQ,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MACD,UACA,EAAEI,UAAU,MAAK,EACjBtB,sBAAgB;AAEZ,UADcD,uBACPO,CACFkB,WAAS;IAClB,CAAA;AAGJ,OAAKN,MACD,QACA,EAAEC,OAAOlB,wBAAwBmB,QAAO,EACxCpB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNE,UAAQ,CACRG,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA;IACR,CAAA;AAGJ,OAAKI,MACD,aACA,EAAEI,UAAU,MAAK,EACjBtB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNkB,QAAM,CACNH,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MACD,YACA,EAAEC,OAAOlB,wBAAwBmB,QAAO,EACxCpB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNkB,QAAM,CACNH,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MAAM,EAAEI,UAAU,MAAK,EAAG,IAAIpB,0BAA0B,EAAC,CAAA,CAAA;AAE9D,OAAKgB,MACD,YACA,EAAEI,UAAU,MAAK,EACjB,OAAOI,QAAAA;AACH,OAAI,CAACC,MAAMC,QAAQF,IAAIV,MAAK,CAExB;AAGJ,OACInB,SAAS6B,IAAII,KAAI,IACjBJ,IAAII,KAAKC,SAASpC,kBAAkBqC,UAEpC;GAGJ,MAAMC,WAAWP,IAAIV,MAAMkB,KAAKC,UAAU,KAAKC,IAAID,OAAO;IACtDhB,OAAOO,IAAIP;IACXkB,MAAM;IACNC,MAAMZ,IAAIY;IACd,CAAA,CAAA;AAEA,UAAOC,QAAQC,IAAIP,SAAAA;IACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/entities/robot/module.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAWtG,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,eAAe,EAAE,gBAAgB,CAAC;IAClC,UAAU,EAAE,UAAU,CAAC;CAC1B,CAAC;AAEF,qBAEa,eAAe;IACxB,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC;IAEjC,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAEvC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;gBAErB,GAAG,EAAE,sBAAsB;IAQjC,OAAO,CACG,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAcT,GAAG,CACI,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAQT,MAAM,CACK,EAAE,EAAE,MAAM,EACX,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/entities/robot/module.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAWtG,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,eAAe,EAAE,gBAAgB,CAAC;IAClC,UAAU,EAAE,UAAU,CAAC;CAC1B,CAAC;AAEF,qBAEa,eAAe;IACxB,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC;IAEjC,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAEvC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;gBAErB,GAAG,EAAE,sBAAsB;IAQjC,OAAO,CACG,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAcT,GAAG,CACI,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAQT,MAAM,CACK,EAAE,EAAE,MAAM,EACX,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IA+ET,IAAI,CACO,EAAE,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAaT,GAAG,CACQ,EAAE,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAmBT,IAAI,CACO,EAAE,EAAE,MAAM,EACX,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;CAMlB"}
|
|
@@ -79,7 +79,7 @@ var RobotController = class {
|
|
|
79
79
|
}
|
|
80
80
|
} else {
|
|
81
81
|
const actor = buildActorContext(req);
|
|
82
|
-
entity = await this.service.getOne(id, actor, useRequestParam(req, "realmId"));
|
|
82
|
+
entity = await this.service.getOne(id, actor, useRequestQuery(req), useRequestParam(req, "realmId"));
|
|
83
83
|
return send(res, entity);
|
|
84
84
|
}
|
|
85
85
|
if (!entity) throw new NotFoundError();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["OAuth2SubKind","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","isUUID","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","OAuth2ScopeAttributesResolver","RobotEntity","ForceLoggedInMiddleware","isSelfToken","buildActorContext","useRequestIdentity","useRequestScopes","RobotController","service","repository","realmRepository","dataSource","ctx","getMany","req","res","actor","data","meta","add","entity","save","undefined","getOne","id","identity","isMe","type","realm","resolve","realmId","name","attributesResolver","attributes","resolveFor","ROBOT","resolvedId","findOneByIdOrName","robotRepository","getRepository","validAttributes","metadata","columns","map","column","databaseName","attribute","isValid","includes","withSecret","findOneWithSecret","secret","edit","updateOnly","put","created","drop","delete"],"sources":["../../../../../../src/adapters/http/controllers/entities/robot/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 { OAuth2SubKind } from '@authup/specs';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport type { Robot } from '@authup/core-kit';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { DataSource } from 'typeorm';\nimport type { IRealmRepository, IRobotRepository, IRobotService } from '../../../../../core/index.ts';\nimport { OAuth2ScopeAttributesResolver } from '../../../../../core/index.ts';\nimport { RobotEntity } from '../../../../database/domains/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n useRequestScopes,\n} from '../../../request/index.ts';\n\nexport type RobotControllerContext = {\n service: IRobotService,\n repository: IRobotRepository,\n realmRepository: IRealmRepository,\n dataSource: DataSource,\n};\n\n@DTags('robot')\n@DController('/robots')\nexport class RobotController {\n protected service: IRobotService;\n\n protected repository: IRobotRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected dataSource: DataSource;\n\n constructor(ctx: RobotControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.dataSource = ctx.dataSource;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(undefined, data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const identity = useRequestIdentity(req);\n let isMe = false;\n\n if (\n isSelfToken(id) &&\n identity &&\n identity.type === 'robot'\n ) {\n isMe = true;\n } else if (isUUID(id)) {\n if (\n identity &&\n identity.type === 'robot' &&\n id === identity.id\n ) {\n isMe = true;\n }\n } else if (\n identity &&\n identity.type === 'robot'\n ) {\n const realm = await this.realmRepository.resolve(useRequestParam(req, 'realmId'), true);\n if (\n identity.realmId === realm.id &&\n identity.data &&\n identity.data.name === id\n ) {\n isMe = true;\n }\n }\n\n let entity: Robot | null;\n\n if (isMe) {\n const attributesResolver = new OAuth2ScopeAttributesResolver();\n const attributes = attributesResolver.resolveFor(OAuth2SubKind.ROBOT, useRequestScopes(req));\n\n const resolvedId = isSelfToken(id) ? identity!.id : id;\n entity = await this.repository.findOneByIdOrName(\n resolvedId,\n useRequestParam(req, 'realmId'),\n );\n\n if (entity) {\n const robotRepository = this.dataSource.getRepository(RobotEntity);\n const validAttributes = robotRepository.metadata.columns.map(\n (column) => column.databaseName,\n );\n for (const attribute of attributes) {\n const isValid = validAttributes.includes(attribute);\n if (isValid && attribute === 'secret') {\n const withSecret = await this.repository.findOneWithSecret({ id: entity.id });\n if (withSecret) {\n entity.secret = withSecret.secret;\n }\n }\n }\n }\n } else {\n const actor = buildActorContext(req);\n entity = await this.service.getOne(\n id,\n actor,\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(\n id,\n data,\n actor,\n { updateOnly: true },\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["OAuth2SubKind","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","isUUID","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","OAuth2ScopeAttributesResolver","RobotEntity","ForceLoggedInMiddleware","isSelfToken","buildActorContext","useRequestIdentity","useRequestScopes","RobotController","service","repository","realmRepository","dataSource","ctx","getMany","req","res","actor","data","meta","add","entity","save","undefined","getOne","id","identity","isMe","type","realm","resolve","realmId","name","attributesResolver","attributes","resolveFor","ROBOT","resolvedId","findOneByIdOrName","robotRepository","getRepository","validAttributes","metadata","columns","map","column","databaseName","attribute","isValid","includes","withSecret","findOneWithSecret","secret","edit","updateOnly","put","created","drop","delete"],"sources":["../../../../../../src/adapters/http/controllers/entities/robot/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 { OAuth2SubKind } from '@authup/specs';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport type { Robot } from '@authup/core-kit';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { DataSource } from 'typeorm';\nimport type { IRealmRepository, IRobotRepository, IRobotService } from '../../../../../core/index.ts';\nimport { OAuth2ScopeAttributesResolver } from '../../../../../core/index.ts';\nimport { RobotEntity } from '../../../../database/domains/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n useRequestScopes,\n} from '../../../request/index.ts';\n\nexport type RobotControllerContext = {\n service: IRobotService,\n repository: IRobotRepository,\n realmRepository: IRealmRepository,\n dataSource: DataSource,\n};\n\n@DTags('robot')\n@DController('/robots')\nexport class RobotController {\n protected service: IRobotService;\n\n protected repository: IRobotRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected dataSource: DataSource;\n\n constructor(ctx: RobotControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.dataSource = ctx.dataSource;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(undefined, data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const identity = useRequestIdentity(req);\n let isMe = false;\n\n if (\n isSelfToken(id) &&\n identity &&\n identity.type === 'robot'\n ) {\n isMe = true;\n } else if (isUUID(id)) {\n if (\n identity &&\n identity.type === 'robot' &&\n id === identity.id\n ) {\n isMe = true;\n }\n } else if (\n identity &&\n identity.type === 'robot'\n ) {\n const realm = await this.realmRepository.resolve(useRequestParam(req, 'realmId'), true);\n if (\n identity.realmId === realm.id &&\n identity.data &&\n identity.data.name === id\n ) {\n isMe = true;\n }\n }\n\n let entity: Robot | null;\n\n if (isMe) {\n const attributesResolver = new OAuth2ScopeAttributesResolver();\n const attributes = attributesResolver.resolveFor(OAuth2SubKind.ROBOT, useRequestScopes(req));\n\n const resolvedId = isSelfToken(id) ? identity!.id : id;\n entity = await this.repository.findOneByIdOrName(\n resolvedId,\n useRequestParam(req, 'realmId'),\n );\n\n if (entity) {\n const robotRepository = this.dataSource.getRepository(RobotEntity);\n const validAttributes = robotRepository.metadata.columns.map(\n (column) => column.databaseName,\n );\n for (const attribute of attributes) {\n const isValid = validAttributes.includes(attribute);\n if (isValid && attribute === 'secret') {\n const withSecret = await this.repository.findOneWithSecret({ id: entity.id });\n if (withSecret) {\n entity.secret = withSecret.secret;\n }\n }\n }\n }\n } else {\n const actor = buildActorContext(req);\n entity = await this.service.getOne(\n id,\n actor,\n useRequestQuery(req),\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(\n id,\n data,\n actor,\n { updateOnly: true },\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/authorize/module.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAU,8BAA8B,EAAS,MAAM,kBAAkB,CAAC;AAItF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,8BAA8B,CAAC;AAG5F,OAAO,KAAK,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAEzF,qBACa,mBAAmB;IAI5B,SAAS,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAE9C,SAAS,CAAC,mBAAmB,EAAG,uCAAuC,CAAC;IAExE,SAAS,CAAC,oBAAoB,EAAG,sBAAsB,CAAC,8BAA8B,CAAC,CAAC;IAExF,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC;gBAI/B,GAAG,EAAE,0BAA0B;IAoBrC,OAAO,CACG,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,IAAI,CAAC;IAwBV,KAAK,CACK,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/authorize/module.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAU,8BAA8B,EAAS,MAAM,kBAAkB,CAAC;AAItF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,8BAA8B,CAAC;AAG5F,OAAO,KAAK,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAEzF,qBACa,mBAAmB;IAI5B,SAAS,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAE9C,SAAS,CAAC,mBAAmB,EAAG,uCAAuC,CAAC;IAExE,SAAS,CAAC,oBAAoB,EAAG,sBAAsB,CAAC,8BAA8B,CAAC,CAAC;IAExF,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC;gBAI/B,GAAG,EAAE,0BAA0B;IAoBrC,OAAO,CACG,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,IAAI,CAAC;IAwBV,KAAK,CACK,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,IAAI,CAAC;CAgFnB"}
|
|
@@ -3,7 +3,7 @@ import "../../../../../core/index.mjs";
|
|
|
3
3
|
import { HTTPOAuth2Authorizer } from "../../../adapters/oauth2/authorization/module.mjs";
|
|
4
4
|
import "../../../adapters/index.mjs";
|
|
5
5
|
import { ForceUserLoggedInMiddleware } from "../../../middleware/built-in/loggedin/user.mjs";
|
|
6
|
-
import {
|
|
6
|
+
import { UI_DIST_PATH, UI_SOURCE_PATH } from "../../../../../path.mjs";
|
|
7
7
|
import { sanitizeError } from "../../../../../utils/error.mjs";
|
|
8
8
|
import "../../../../../utils/index.mjs";
|
|
9
9
|
import "../../../middleware/index.mjs";
|
|
@@ -88,19 +88,18 @@ var AuthorizeController = class {
|
|
|
88
88
|
let html;
|
|
89
89
|
let manifest;
|
|
90
90
|
let render;
|
|
91
|
-
const clientWebSlimPackagePath = CLIENT_WEB_SLIM_PACKAGE_PATH;
|
|
92
91
|
if (isJIT) {
|
|
93
92
|
/**
|
|
94
93
|
* @type {import('vite').ViteDevServer}
|
|
95
94
|
*/ const vite = useRequestParam(req, "viteServer");
|
|
96
|
-
html = await fs.promises.readFile(path.join(
|
|
95
|
+
html = await fs.promises.readFile(path.join(UI_SOURCE_PATH, "index.html"), "utf-8");
|
|
97
96
|
html = await vite.transformIndexHtml("/", html);
|
|
98
97
|
manifest = {};
|
|
99
98
|
render = (await vite.ssrLoadModule("/src/server.ts")).render;
|
|
100
99
|
} else {
|
|
101
|
-
html = await fs.promises.readFile(path.join(
|
|
102
|
-
manifest = JSON.parse(await fs.promises.readFile(path.join(
|
|
103
|
-
render = (await load(path.join(
|
|
100
|
+
html = await fs.promises.readFile(path.join(UI_DIST_PATH, "client", "index.html"), "utf-8");
|
|
101
|
+
manifest = JSON.parse(await fs.promises.readFile(path.join(UI_DIST_PATH, "client", ".vite", "ssr-manifest.json"), "utf-8"));
|
|
102
|
+
render = (await load(path.join(UI_DIST_PATH, "server", "server.js"))).render;
|
|
104
103
|
}
|
|
105
104
|
const [appHtml, preloadLinks] = await render({
|
|
106
105
|
url: "/authorize",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["DController","DGet","DPost","DRequest","DResponse","load","fs","path","URL","send","useRequestParam","RoutupContainerAdapter","CodeTransformation","isCodeTransformation","
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["DController","DGet","DPost","DRequest","DResponse","load","fs","path","URL","send","useRequestParam","RoutupContainerAdapter","CodeTransformation","isCodeTransformation","UI_DIST_PATH","UI_SOURCE_PATH","ForceUserLoggedInMiddleware","HTTPOAuth2Authorizer","OAuth2AuthorizationCodeRequestValidator","sanitizeError","AuthorizeController","options","codeRequestVerifier","codeRequestValidator","authorizer","ctx","validator","accessTokenIssuer","openIdTokenIssuer","codeIssuer","identityResolver","confirm","req","res","result","authorizeWithRequest","url","redirectUri","state","searchParams","set","authorizationCode","accessToken","idToken","href","serve","codeRequest","client","scopes","error","data","run","locations","verify","e","normalized","message","isJIT","JUST_IN_TIME","payload","config","baseURL","html","manifest","render","vite","promises","readFile","join","transformIndexHtml","ssrLoadModule","JSON","parse","appHtml","preloadLinks","replace"],"sources":["../../../../../../src/adapters/http/controllers/workflows/authorize/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\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 {\n DController, \n DGet, \n DPost, \n DRequest, \n DResponse,\n} from '@routup/decorators';\nimport { load } from 'locter';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport { send, useRequestParam } from 'routup';\nimport { RoutupContainerAdapter } from '@validup/adapter-routup';\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport { CodeTransformation, isCodeTransformation } from 'typeorm-extension';\nimport { UI_DIST_PATH, UI_SOURCE_PATH } from '../../../../../path.ts';\nimport { ForceUserLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { HTTPOAuth2Authorizer } from '../../../adapters/index.ts';\nimport type { IOAuth2AuthorizationCodeRequestVerifier } from '../../../../../core/index.ts';\nimport { OAuth2AuthorizationCodeRequestValidator } from '../../../../../core/index.ts';\nimport { sanitizeError } from '../../../../../utils/index.ts';\nimport type { AuthorizeControllerContext, AuthorizeControllerOptions } from './types.ts';\n\n@DController('/authorize')\nexport class AuthorizeController {\n // todo: maybe /realms/<realm>/protocol/openid-connect/authorize\n // todo: maybe /realms/<realm>/[...]/authorize\n\n protected options: AuthorizeControllerOptions;\n\n protected codeRequestVerifier : IOAuth2AuthorizationCodeRequestVerifier;\n\n protected codeRequestValidator : RoutupContainerAdapter<OAuth2AuthorizationCodeRequest>;\n\n protected authorizer: HTTPOAuth2Authorizer;\n\n // ---------------------------------------------------------\n\n constructor(ctx: AuthorizeControllerContext) {\n this.options = ctx.options;\n\n this.codeRequestVerifier = ctx.codeRequestVerifier;\n\n const validator = new OAuth2AuthorizationCodeRequestValidator();\n this.codeRequestValidator = new RoutupContainerAdapter(validator);\n\n this.authorizer = new HTTPOAuth2Authorizer({\n codeRequestVerifier: this.codeRequestVerifier,\n accessTokenIssuer: ctx.accessTokenIssuer,\n openIdTokenIssuer: ctx.openIdTokenIssuer,\n codeIssuer: ctx.codeIssuer,\n identityResolver: ctx.identityResolver,\n });\n }\n\n // ---------------------------------------------------------\n\n @DPost('', [ForceUserLoggedInMiddleware])\n async confirm(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<void> {\n const result = await this.authorizer.authorizeWithRequest(req);\n\n const url = new URL(result.redirectUri);\n if (result.state) {\n url.searchParams.set('state', result.state);\n }\n\n if (result.authorizationCode) {\n url.searchParams.set('code', result.authorizationCode);\n }\n\n if (result.accessToken) {\n url.searchParams.set('access_token', result.accessToken);\n }\n\n if (result.idToken) {\n url.searchParams.set('id_token', result.idToken);\n }\n\n return send(res, { url: url.href });\n }\n\n @DGet('', [])\n async serve(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<void> {\n let codeRequest : OAuth2AuthorizationCodeRequest | undefined;\n\n let client : Client | undefined;\n let scopes : Scope[] | undefined;\n\n let error : Error | undefined;\n\n try {\n const data = await this.codeRequestValidator.run(req, { locations: ['body', 'query'] });\n\n const result = await this.codeRequestVerifier.verify(data);\n client = result.client;\n scopes = result.scopes;\n\n codeRequest = result.data;\n } catch (e) {\n const normalized = sanitizeError(e);\n error = {\n ...normalized,\n message: normalized.message,\n };\n }\n\n const isJIT = isCodeTransformation(CodeTransformation.JUST_IN_TIME);\n\n const payload = {\n config: { baseURL: this.options.baseURL },\n data: {\n codeRequest,\n error,\n client,\n scopes,\n },\n };\n\n let html : string;\n let manifest : Record<string, any>;\n let render : CallableFunction;\n\n if (isJIT) {\n /**\n * @type {import('vite').ViteDevServer}\n */\n const vite = useRequestParam(req, 'viteServer');\n\n html = await fs.promises.readFile(\n path.join(UI_SOURCE_PATH, 'index.html'),\n 'utf-8',\n );\n html = await vite.transformIndexHtml('/', html);\n manifest = {};\n render = (await vite.ssrLoadModule('/src/server.ts')).render;\n } else {\n html = await fs.promises.readFile(\n path.join(UI_DIST_PATH, 'client', 'index.html'),\n 'utf-8',\n );\n\n manifest = JSON.parse(await fs.promises.readFile(\n path.join(UI_DIST_PATH, 'client', '.vite', 'ssr-manifest.json'),\n 'utf-8',\n ));\n\n render = (await load(path.join(UI_DIST_PATH, 'server', 'server.js'))).render;\n }\n\n const [appHtml, preloadLinks] = await render({\n url: '/authorize',\n manifest,\n payload,\n });\n\n return send(\n res,\n html\n .replace('<!--preload-links-->', preloadLinks)\n .replace('<!--app-html-->', appHtml),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAaoB,sBAAb,MAAaA;CAICC;CAEAC;CAEAC;CAEAC;CAIV,YAAYC,KAAiC;AACzC,OAAKJ,UAAUI,IAAIJ;AAEnB,OAAKC,sBAAsBG,IAAIH;EAE/B,MAAMI,YAAY,IAAIR,yCAAAA;AACtB,OAAKK,uBAAuB,IAAIZ,uBAAuBe,UAAAA;AAEvD,OAAKF,aAAa,IAAIP,qBAAqB;GACvCK,qBAAqB,KAAKA;GAC1BK,mBAAmBF,IAAIE;GACvBC,mBAAmBH,IAAIG;GACvBC,YAAYJ,IAAII;GAChBC,kBAAkBL,IAAIK;GAC1B,CAAA;;CAKJ,MACMC,QACF,KACA,KACa;EACb,MAAMG,SAAS,MAAM,KAAKV,WAAWW,qBAAqBH,IAAAA;EAE1D,MAAMI,MAAM,IAAI5B,IAAI0B,OAAOG,YAAW;AACtC,MAAIH,OAAOI,MACPF,KAAIG,aAAaC,IAAI,SAASN,OAAOI,MAAK;AAG9C,MAAIJ,OAAOO,kBACPL,KAAIG,aAAaC,IAAI,QAAQN,OAAOO,kBAAiB;AAGzD,MAAIP,OAAOQ,YACPN,KAAIG,aAAaC,IAAI,gBAAgBN,OAAOQ,YAAW;AAG3D,MAAIR,OAAOS,QACPP,KAAIG,aAAaC,IAAI,YAAYN,OAAOS,QAAO;AAGnD,SAAOlC,KAAKwB,KAAK,EAAEG,KAAKA,IAAIQ,MAAK,CAAA;;CAGrC,MACMC,MACF,KACA,KACa;EACb,IAAIC;EAEJ,IAAIC;EACJ,IAAIC;EAEJ,IAAIC;AAEJ,MAAI;GACA,MAAMC,OAAO,MAAM,KAAK3B,qBAAqB4B,IAAInB,KAAK,EAAEoB,WAAW,CAAC,QAAQ,QAAQ,EAAC,CAAA;GAErF,MAAMlB,SAAS,MAAM,KAAKZ,oBAAoB+B,OAAOH,KAAAA;AACrDH,YAASb,OAAOa;AAChBC,YAASd,OAAOc;AAEhBF,iBAAcZ,OAAOgB;WAChBI,GAAG;GACR,MAAMC,aAAapC,cAAcmC,EAAAA;AACjCL,WAAQ;IACJ,GAAGM;IACHC,SAASD,WAAWC;IACxB;;EAGJ,MAAMC,QAAQ5C,qBAAqBD,mBAAmB8C,aAAY;EAElE,MAAMC,UAAU;GACZC,QAAQ,EAAEC,SAAS,KAAKxC,QAAQwC,SAAQ;GACxCX,MAAM;IACFJ;IACAG;IACAF;IACAC;IACJ;GACJ;EAEA,IAAIc;EACJ,IAAIC;EACJ,IAAIC;AAEJ,MAAIP,OAAO;;;MAIP,MAAMQ,OAAOvD,gBAAgBsB,KAAK,aAAA;AAElC8B,UAAO,MAAMxD,GAAG4D,SAASC,SACrB5D,KAAK6D,KAAKrD,gBAAgB,aAAA,EAC1B,QAAA;AAEJ+C,UAAO,MAAMG,KAAKI,mBAAmB,KAAKP,KAAAA;AAC1CC,cAAW,EAAC;AACZC,aAAU,MAAMC,KAAKK,cAAc,iBAAgB,EAAGN;SACnD;AACHF,UAAO,MAAMxD,GAAG4D,SAASC,SACrB5D,KAAK6D,KAAKtD,cAAc,UAAU,aAAA,EAClC,QAAA;AAGJiD,cAAWQ,KAAKC,MAAM,MAAMlE,GAAG4D,SAASC,SACpC5D,KAAK6D,KAAKtD,cAAc,UAAU,SAAS,oBAAA,EAC3C,QAAA,CAAA;AAGJkD,aAAU,MAAM3D,KAAKE,KAAK6D,KAAKtD,cAAc,UAAU,YAAA,CAAY,EAAGkD;;EAG1E,MAAM,CAACS,SAASC,gBAAgB,MAAMV,OAAO;GACzC5B,KAAK;GACL2B;GACAJ;GACJ,CAAA;AAEA,SAAOlD,KACHwB,KACA6B,KACKa,QAAQ,wBAAwBD,aAAAA,CAChCC,QAAQ,mBAAmBF,QAAAA,CAAAA;;;;YA5G5BzD,4BAAAA,CAAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/token/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,wBAAwB,EAAE,gCAAgC,EAAyB,MAAM,eAAe,CAAC;AACvH,OAAO,EAAe,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAS9D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EACR,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAWnE,qBAEa,eAAe;IACxB,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAEjD,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IAEhD,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAE9C,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE5C,SAAS,CAAC,gBAAgB,EAAG,iBAAiB,CAAC;IAE/C,SAAS,CAAC,0BAA0B,EAAG,2BAA2B,CAAC;IAEnE,SAAS,CAAC,WAAW,EAAG,MAAM,CAAC,GAAG,gBAAgB,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAI5D,GAAG,EAAE,sBAAsB;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/token/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,wBAAwB,EAAE,gCAAgC,EAAyB,MAAM,eAAe,CAAC;AACvH,OAAO,EAAe,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAS9D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EACR,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAWnE,qBAEa,eAAe;IACxB,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAEjD,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IAEhD,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAE9C,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE5C,SAAS,CAAC,gBAAgB,EAAG,iBAAiB,CAAC;IAE/C,SAAS,CAAC,0BAA0B,EAAG,2BAA2B,CAAC;IAEnE,SAAS,CAAC,WAAW,EAAG,MAAM,CAAC,GAAG,gBAAgB,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAI5D,GAAG,EAAE,sBAAsB;IA+CjC,aAAa,CACH,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,gCAAgC,CAAC;IAKtC,cAAc,CACJ,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,gCAAgC,CAAC;IA4DtC,WAAW,CACD,GAAG,EAAE,OAAO,EACX,GAAG,EAAE,QAAQ;IAkBxB,WAAW,CACD,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,wBAAwB,CAAC;CAavC"}
|
|
@@ -48,6 +48,7 @@ var TokenController = class {
|
|
|
48
48
|
this.tokenGrants = {
|
|
49
49
|
[OAuth2TokenGrant.AUTHORIZATION_CODE]: new HTTPOAuth2AuthorizeGrant({
|
|
50
50
|
codeVerifier: ctx.codeVerifier,
|
|
51
|
+
clientAuthenticator: ctx.oauth2ClientAuthenticator,
|
|
51
52
|
accessTokenIssuer: ctx.accessTokenIssuer,
|
|
52
53
|
refreshTokenIssuer: ctx.refreshTokenIssuer,
|
|
53
54
|
sessionManager: ctx.sessionManager
|
|
@@ -66,6 +67,7 @@ var TokenController = class {
|
|
|
66
67
|
accessTokenIssuer: ctx.accessTokenIssuer,
|
|
67
68
|
refreshTokenIssuer: ctx.refreshTokenIssuer,
|
|
68
69
|
authenticator: ctx.userAuthenticator,
|
|
70
|
+
clientAuthenticator: ctx.oauth2ClientAuthenticator,
|
|
69
71
|
sessionManager: ctx.sessionManager
|
|
70
72
|
}),
|
|
71
73
|
[OAuth2TokenGrant.REFRESH_TOKEN]: new HTTPOAuth2RefreshTokenGrant({
|
|
@@ -73,7 +75,8 @@ var TokenController = class {
|
|
|
73
75
|
refreshTokenIssuer: ctx.refreshTokenIssuer,
|
|
74
76
|
tokenVerifier: ctx.tokenVerifier,
|
|
75
77
|
tokenRevoker: ctx.tokenRevoker,
|
|
76
|
-
sessionManager: ctx.sessionManager
|
|
78
|
+
sessionManager: ctx.sessionManager,
|
|
79
|
+
clientAuthenticator: ctx.oauth2ClientAuthenticator
|
|
77
80
|
})
|
|
78
81
|
};
|
|
79
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["OAuth2Error","OAuth2TokenGrant","DController","DGet","DPost","DRequest","DResponse","DTags","sendAccepted","buildPermissionKey","toOAuth2Error","OAuth2OpenIDClaimsBuilder","HTTPClientCredentialsGrant","HTTPOAuth2AuthorizeGrant","HTTPOAuth2RefreshTokenGrant","HTTPPasswordGrant","HTTPRobotCredentialsGrant","guessOauth2GrantTypeByRequest","extractTokenFromRequest","TokenController","refreshTokenIssuer","accessTokenIssuer","tokenVerifier","tokenRevoker","identityResolver","identityPermissionProvider","tokenGrants","ctx","AUTHORIZATION_CODE","codeVerifier","sessionManager","CLIENT_CREDENTIALS","authenticator","clientAuthenticator","ROBOT_CREDENTIALS","robotAuthenticator","PASSWORD","userAuthenticator","REFRESH_TOKEN","getIntrospect","req","postIntrospect","token","payload","verify","skipActiveCheck","sub","sub_kind","identityInvalid","permissions","getFor","id","type","clientId","client_id","realmId","realm_id","identity","resolve","claimsBuilder","claims","fromIdentity","active","jti","isInactive","Object","values","reduce","acc","binding","key","permission","name","e","revokeToken","res","revoke","createToken","grantType","grantInvalid","grant","runWithRequest"],"sources":["../../../../../../src/adapters/http/controllers/workflows/token/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 type { OAuth2TokenGrantResponse, OAuth2TokenIntrospectionResponse, OAuth2TokenPermission } from '@authup/specs';\nimport { OAuth2Error, OAuth2TokenGrant } from '@authup/specs';\nimport {\n DController,\n DGet,\n DPost,\n DRequest,\n DResponse,\n DTags,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport { buildPermissionKey } from '@authup/access';\nimport { toOAuth2Error } from '../../../../../core/oauth2/helpers/index.ts';\nimport type { TokenControllerContext } from './types.ts';\nimport type {\n IIdentityPermissionProvider,\n IIdentityResolver,\n IOAuth2TokenIssuer,\n IOAuth2TokenRevoker,\n IOAuth2TokenVerifier,\n} from '../../../../../core/index.ts';\nimport { OAuth2OpenIDClaimsBuilder } from '../../../../../core/index.ts';\nimport type { IHTTPOAuth2Grant } from '../../../adapters/index.ts';\nimport {\n HTTPClientCredentialsGrant,\n HTTPOAuth2AuthorizeGrant,\n HTTPOAuth2RefreshTokenGrant,\n HTTPPasswordGrant,\n HTTPRobotCredentialsGrant,\n guessOauth2GrantTypeByRequest,\n} from '../../../adapters/index.ts';\nimport { extractTokenFromRequest } from './utils/index.ts';\n\n@DTags('auth')\n@DController('/token')\nexport class TokenController {\n protected refreshTokenIssuer: IOAuth2TokenIssuer;\n\n protected accessTokenIssuer: IOAuth2TokenIssuer;\n\n protected tokenVerifier: IOAuth2TokenVerifier;\n\n protected tokenRevoker: IOAuth2TokenRevoker;\n\n protected identityResolver : IIdentityResolver;\n\n protected identityPermissionProvider : IIdentityPermissionProvider;\n\n protected tokenGrants : Record<`${OAuth2TokenGrant}`, IHTTPOAuth2Grant>;\n\n // -------------------------------------------\n\n constructor(ctx: TokenControllerContext) {\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.tokenVerifier = ctx.tokenVerifier;\n this.tokenRevoker = ctx.tokenRevoker;\n this.identityResolver = ctx.identityResolver;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n\n this.tokenGrants = {\n [OAuth2TokenGrant.AUTHORIZATION_CODE]: new HTTPOAuth2AuthorizeGrant({\n codeVerifier: ctx.codeVerifier,\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.CLIENT_CREDENTIALS]: new HTTPClientCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.clientAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.ROBOT_CREDENTIALS]: new HTTPRobotCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.robotAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.PASSWORD]: new HTTPPasswordGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n authenticator: ctx.userAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.REFRESH_TOKEN]: new HTTPOAuth2RefreshTokenGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n tokenVerifier: ctx.tokenVerifier,\n tokenRevoker: ctx.tokenRevoker,\n sessionManager: ctx.sessionManager,\n }),\n };\n }\n\n // -------------------------------------------\n\n @DGet('/introspect', [])\n async getIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n return this.postIntrospect(req);\n }\n\n @DPost('/introspect', [])\n async postIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n try {\n const token = await extractTokenFromRequest(req);\n const payload = await this.tokenVerifier.verify(token, { skipActiveCheck: true });\n if (!payload.sub || !payload.sub_kind) {\n throw OAuth2Error.identityInvalid();\n }\n\n // todo: only receive client specific permissions\n const permissions = await this.identityPermissionProvider.getFor({\n id: payload.sub,\n type: payload.sub_kind,\n clientId: payload.client_id,\n realmId: payload.realm_id,\n });\n\n const identity = await this.identityResolver.resolve(payload.sub_kind, payload.sub);\n if (!identity) {\n // todo: differentiate between client, robot & user\n throw OAuth2Error.identityInvalid();\n }\n\n const claimsBuilder = new OAuth2OpenIDClaimsBuilder();\n const claims = claimsBuilder.fromIdentity(identity);\n\n let active : boolean;\n if (payload.jti) {\n const isInactive = await this.tokenVerifier.isInactive(payload.jti);\n active = !isInactive;\n } else {\n active = false;\n }\n\n return {\n active,\n // todo: permissions property should be removed.\n permissions: Object.values(\n permissions.reduce((acc, binding) => {\n const key = buildPermissionKey(binding.permission);\n if (!acc[key]) {\n acc[key] = {\n name: binding.permission.name,\n client_id: binding.permission.client_id,\n realm_id: binding.permission.realm_id,\n } as OAuth2TokenPermission;\n }\n return acc;\n }, {} as Record<string, OAuth2TokenPermission>),\n ),\n ...payload,\n ...claims,\n };\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('/revoke', [])\n async revokeToken(\n @DRequest() req: Request,\n @DResponse() res: Response,\n ) {\n try {\n const token = await extractTokenFromRequest(req);\n\n const payload = await this.tokenVerifier.verify(token);\n\n await this.tokenRevoker.revoke(payload);\n\n return await sendAccepted(res);\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('', [])\n async createToken(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenGrantResponse> {\n const grantType = guessOauth2GrantTypeByRequest(req);\n if (!grantType) {\n throw OAuth2Error.grantInvalid();\n }\n\n const grant = this.tokenGrants[grantType];\n if (!grant) {\n throw OAuth2Error.grantInvalid();\n }\n\n return grant.runWithRequest(req);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["OAuth2Error","OAuth2TokenGrant","DController","DGet","DPost","DRequest","DResponse","DTags","sendAccepted","buildPermissionKey","toOAuth2Error","OAuth2OpenIDClaimsBuilder","HTTPClientCredentialsGrant","HTTPOAuth2AuthorizeGrant","HTTPOAuth2RefreshTokenGrant","HTTPPasswordGrant","HTTPRobotCredentialsGrant","guessOauth2GrantTypeByRequest","extractTokenFromRequest","TokenController","refreshTokenIssuer","accessTokenIssuer","tokenVerifier","tokenRevoker","identityResolver","identityPermissionProvider","tokenGrants","ctx","AUTHORIZATION_CODE","codeVerifier","clientAuthenticator","oauth2ClientAuthenticator","sessionManager","CLIENT_CREDENTIALS","authenticator","ROBOT_CREDENTIALS","robotAuthenticator","PASSWORD","userAuthenticator","REFRESH_TOKEN","getIntrospect","req","postIntrospect","token","payload","verify","skipActiveCheck","sub","sub_kind","identityInvalid","permissions","getFor","id","type","clientId","client_id","realmId","realm_id","identity","resolve","claimsBuilder","claims","fromIdentity","active","jti","isInactive","Object","values","reduce","acc","binding","key","permission","name","e","revokeToken","res","revoke","createToken","grantType","grantInvalid","grant","runWithRequest"],"sources":["../../../../../../src/adapters/http/controllers/workflows/token/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 type { OAuth2TokenGrantResponse, OAuth2TokenIntrospectionResponse, OAuth2TokenPermission } from '@authup/specs';\nimport { OAuth2Error, OAuth2TokenGrant } from '@authup/specs';\nimport {\n DController,\n DGet,\n DPost,\n DRequest,\n DResponse,\n DTags,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport { buildPermissionKey } from '@authup/access';\nimport { toOAuth2Error } from '../../../../../core/oauth2/helpers/index.ts';\nimport type { TokenControllerContext } from './types.ts';\nimport type {\n IIdentityPermissionProvider,\n IIdentityResolver,\n IOAuth2TokenIssuer,\n IOAuth2TokenRevoker,\n IOAuth2TokenVerifier,\n} from '../../../../../core/index.ts';\nimport { OAuth2OpenIDClaimsBuilder } from '../../../../../core/index.ts';\nimport type { IHTTPOAuth2Grant } from '../../../adapters/index.ts';\nimport {\n HTTPClientCredentialsGrant,\n HTTPOAuth2AuthorizeGrant,\n HTTPOAuth2RefreshTokenGrant,\n HTTPPasswordGrant,\n HTTPRobotCredentialsGrant,\n guessOauth2GrantTypeByRequest,\n} from '../../../adapters/index.ts';\nimport { extractTokenFromRequest } from './utils/index.ts';\n\n@DTags('auth')\n@DController('/token')\nexport class TokenController {\n protected refreshTokenIssuer: IOAuth2TokenIssuer;\n\n protected accessTokenIssuer: IOAuth2TokenIssuer;\n\n protected tokenVerifier: IOAuth2TokenVerifier;\n\n protected tokenRevoker: IOAuth2TokenRevoker;\n\n protected identityResolver : IIdentityResolver;\n\n protected identityPermissionProvider : IIdentityPermissionProvider;\n\n protected tokenGrants : Record<`${OAuth2TokenGrant}`, IHTTPOAuth2Grant>;\n\n // -------------------------------------------\n\n constructor(ctx: TokenControllerContext) {\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.tokenVerifier = ctx.tokenVerifier;\n this.tokenRevoker = ctx.tokenRevoker;\n this.identityResolver = ctx.identityResolver;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n\n this.tokenGrants = {\n [OAuth2TokenGrant.AUTHORIZATION_CODE]: new HTTPOAuth2AuthorizeGrant({\n codeVerifier: ctx.codeVerifier,\n clientAuthenticator: ctx.oauth2ClientAuthenticator,\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.CLIENT_CREDENTIALS]: new HTTPClientCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.clientAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.ROBOT_CREDENTIALS]: new HTTPRobotCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.robotAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.PASSWORD]: new HTTPPasswordGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n authenticator: ctx.userAuthenticator,\n clientAuthenticator: ctx.oauth2ClientAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.REFRESH_TOKEN]: new HTTPOAuth2RefreshTokenGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n tokenVerifier: ctx.tokenVerifier,\n tokenRevoker: ctx.tokenRevoker,\n sessionManager: ctx.sessionManager,\n clientAuthenticator: ctx.oauth2ClientAuthenticator,\n }),\n };\n }\n\n // -------------------------------------------\n\n @DGet('/introspect', [])\n async getIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n return this.postIntrospect(req);\n }\n\n @DPost('/introspect', [])\n async postIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n try {\n const token = await extractTokenFromRequest(req);\n const payload = await this.tokenVerifier.verify(token, { skipActiveCheck: true });\n if (!payload.sub || !payload.sub_kind) {\n throw OAuth2Error.identityInvalid();\n }\n\n // todo: only receive client specific permissions\n const permissions = await this.identityPermissionProvider.getFor({\n id: payload.sub,\n type: payload.sub_kind,\n clientId: payload.client_id,\n realmId: payload.realm_id,\n });\n\n const identity = await this.identityResolver.resolve(payload.sub_kind, payload.sub);\n if (!identity) {\n // todo: differentiate between client, robot & user\n throw OAuth2Error.identityInvalid();\n }\n\n const claimsBuilder = new OAuth2OpenIDClaimsBuilder();\n const claims = claimsBuilder.fromIdentity(identity);\n\n let active : boolean;\n if (payload.jti) {\n const isInactive = await this.tokenVerifier.isInactive(payload.jti);\n active = !isInactive;\n } else {\n active = false;\n }\n\n return {\n active,\n // todo: permissions property should be removed.\n permissions: Object.values(\n permissions.reduce((acc, binding) => {\n const key = buildPermissionKey(binding.permission);\n if (!acc[key]) {\n acc[key] = {\n name: binding.permission.name,\n client_id: binding.permission.client_id,\n realm_id: binding.permission.realm_id,\n } as OAuth2TokenPermission;\n }\n return acc;\n }, {} as Record<string, OAuth2TokenPermission>),\n ),\n ...payload,\n ...claims,\n };\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('/revoke', [])\n async revokeToken(\n @DRequest() req: Request,\n @DResponse() res: Response,\n ) {\n try {\n const token = await extractTokenFromRequest(req);\n\n const payload = await this.tokenVerifier.verify(token);\n\n await this.tokenRevoker.revoke(payload);\n\n return await sendAccepted(res);\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('', [])\n async createToken(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenGrantResponse> {\n const grantType = guessOauth2GrantTypeByRequest(req);\n if (!grantType) {\n throw OAuth2Error.grantInvalid();\n }\n\n const grant = this.tokenGrants[grantType];\n if (!grant) {\n throw OAuth2Error.grantInvalid();\n }\n\n return grant.runWithRequest(req);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Client, Robot, User } from '@authup/core-kit';
|
|
2
|
-
import type { ICredentialsAuthenticator, IIdentityPermissionProvider, IIdentityResolver, IOAuth2AuthorizationCodeVerifier, IOAuth2TokenIssuer, IOAuth2TokenRevoker, IOAuth2TokenVerifier, ISessionManager } from '../../../../../core/index.ts';
|
|
2
|
+
import type { ICredentialsAuthenticator, IIdentityPermissionProvider, IIdentityResolver, IOAuth2AuthorizationCodeVerifier, IOAuth2TokenIssuer, IOAuth2TokenRevoker, IOAuth2TokenVerifier, ISessionManager, OAuth2ClientAuthenticator } from '../../../../../core/index.ts';
|
|
3
3
|
export type TokenControllerContext = {
|
|
4
4
|
codeVerifier: IOAuth2AuthorizationCodeVerifier;
|
|
5
5
|
accessTokenIssuer: IOAuth2TokenIssuer;
|
|
@@ -12,5 +12,6 @@ export type TokenControllerContext = {
|
|
|
12
12
|
clientAuthenticator: ICredentialsAuthenticator<Client>;
|
|
13
13
|
robotAuthenticator: ICredentialsAuthenticator<Robot>;
|
|
14
14
|
userAuthenticator: ICredentialsAuthenticator<User>;
|
|
15
|
+
oauth2ClientAuthenticator: OAuth2ClientAuthenticator;
|
|
15
16
|
};
|
|
16
17
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/token/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EACR,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,gCAAgC,EAChC,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/token/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EACR,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,gCAAgC,EAChC,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,yBAAyB,EAC5B,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,sBAAsB,GAAG;IACjC,YAAY,EAAE,gCAAgC,CAAC;IAE/C,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,aAAa,EAAE,oBAAoB,CAAC;IACpC,YAAY,EAAE,mBAAmB,CAAC;IAElC,cAAc,EAAE,eAAe,CAAC;IAEhC,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,0BAA0B,EAAE,2BAA2B,CAAC;IAExD,mBAAmB,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IACtD,kBAAkB,EAAE,yBAAyB,CAAC,KAAK,CAAC,CAAA;IACpD,iBAAiB,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAA;IAElD,yBAAyB,EAAE,yBAAyB,CAAA;CACvD,CAAC"}
|
|
@@ -9,6 +9,7 @@ import { setRequestToken, useRequestToken } from "./request/helpers/token.mjs";
|
|
|
9
9
|
import { RequestPermissionEvaluator } from "./request/permission/module.mjs";
|
|
10
10
|
import "./request/index.mjs";
|
|
11
11
|
import { HTTPOAuth2Authorizer } from "./adapters/oauth2/authorization/module.mjs";
|
|
12
|
+
import { extractClientCredentialsFromRequest } from "./adapters/oauth2/grant-types/utils/credentials.mjs";
|
|
12
13
|
import { guessOauth2GrantTypeByRequest } from "./adapters/oauth2/grant-types/utils/guess.mjs";
|
|
13
14
|
import { HTTPOAuth2AuthorizeGrant } from "./adapters/oauth2/grant-types/authorize.mjs";
|
|
14
15
|
import { HTTPClientCredentialsGrant } from "./adapters/oauth2/grant-types/client-credentials.mjs";
|
|
@@ -78,4 +79,4 @@ import { createHttpServer } from "./server/module.mjs";
|
|
|
78
79
|
import "./server/index.mjs";
|
|
79
80
|
import { Swagger } from "./swagger/module.mjs";
|
|
80
81
|
import "./swagger/index.mjs";
|
|
81
|
-
export { ActivateController, AuthorizationMiddleware, AuthorizeController, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, HTTPClientCredentialsGrant, HTTPOAuth2AuthorizeGrant, HTTPOAuth2Authorizer, HTTPOAuth2IdentityGrantType, HTTPOAuth2RefreshTokenGrant, HTTPPasswordGrant, HTTPRobotCredentialsGrant, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RegisterController, RequestHandlerOperation, RequestIdentity, RequestPermissionEvaluator, RobotController, RobotPermissionController, RobotPermissionRequestValidator, RobotRoleController, RobotRoleRequestValidator, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, StatusController, Swagger, TokenController, UserAttributeController, UserAttributeRequestValidator, UserController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, buildActorContext, createAuthorizationMiddleware, createHttpServer, createLoggerMiddleware, createSwaggerMiddleware, getJwkRouteHandler, getJwksRouteHandler, getRequestBodyRealmID, getRequestParamID, getRequestStringParam, getRequestStringParamOrFail, guessOauth2GrantTypeByRequest, isRequestIdentityMasterRealmMember, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, setRequestIdentity, setRequestPermissionEvaluator, setRequestScopes, setRequestToken, useRequestIdentity, useRequestIdentityOrFail, useRequestParamID, useRequestPermissionEvaluator, useRequestScopes, useRequestToken };
|
|
82
|
+
export { ActivateController, AuthorizationMiddleware, AuthorizeController, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, HTTPClientCredentialsGrant, HTTPOAuth2AuthorizeGrant, HTTPOAuth2Authorizer, HTTPOAuth2IdentityGrantType, HTTPOAuth2RefreshTokenGrant, HTTPPasswordGrant, HTTPRobotCredentialsGrant, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RegisterController, RequestHandlerOperation, RequestIdentity, RequestPermissionEvaluator, RobotController, RobotPermissionController, RobotPermissionRequestValidator, RobotRoleController, RobotRoleRequestValidator, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, StatusController, Swagger, TokenController, UserAttributeController, UserAttributeRequestValidator, UserController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, buildActorContext, createAuthorizationMiddleware, createHttpServer, createLoggerMiddleware, createSwaggerMiddleware, extractClientCredentialsFromRequest, getJwkRouteHandler, getJwksRouteHandler, getRequestBodyRealmID, getRequestParamID, getRequestStringParam, getRequestStringParamOrFail, guessOauth2GrantTypeByRequest, isRequestIdentityMasterRealmMember, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, setRequestIdentity, setRequestPermissionEvaluator, setRequestScopes, setRequestToken, useRequestIdentity, useRequestIdentityOrFail, useRequestParamID, useRequestPermissionEvaluator, useRequestScopes, useRequestToken };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PACKAGE_PATH, UI_DIST_PATH, UI_SOURCE_PATH } from "../../../../path.mjs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { CodeTransformation, isCodeTransformation } from "typeorm-extension";
|
|
4
4
|
import { coreHandler, setRequestParam } from "routup";
|
|
@@ -11,7 +11,7 @@ async function registerAssetsMiddleware(router) {
|
|
|
11
11
|
fallthrough: true,
|
|
12
12
|
scan: false
|
|
13
13
|
}));
|
|
14
|
-
router.use("public", createHandler(path.posix.join(
|
|
14
|
+
router.use("public", createHandler(path.posix.join(UI_DIST_PATH, "client"), {
|
|
15
15
|
fallthrough: false,
|
|
16
16
|
scan: false
|
|
17
17
|
}));
|
|
@@ -20,7 +20,7 @@ async function registerAssetsMiddleware(router) {
|
|
|
20
20
|
/**
|
|
21
21
|
* @type {import('vite').ViteDevServer}
|
|
22
22
|
*/ const server = await (await load("vite")).createServer({
|
|
23
|
-
root:
|
|
23
|
+
root: UI_SOURCE_PATH,
|
|
24
24
|
base: "/public/",
|
|
25
25
|
logLevel: "error",
|
|
26
26
|
server: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.mjs","names":["load","CodeTransformation","isCodeTransformation","createHandler","path","coreHandler","setRequestParam","
|
|
1
|
+
{"version":3,"file":"assets.mjs","names":["load","CodeTransformation","isCodeTransformation","createHandler","path","coreHandler","setRequestParam","PACKAGE_PATH","UI_DIST_PATH","UI_SOURCE_PATH","registerAssetsMiddleware","router","JUST_IN_TIME","use","posix","join","fallthrough","scan","vite","server","createServer","root","base","logLevel","middlewareMode","watch","usePolling","interval","appType","req","res","next","middlewares"],"sources":["../../../../../src/adapters/http/middleware/built-in/assets.ts"],"sourcesContent":["/*\n * Copyright (c) 2023.\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 { load } from 'locter';\nimport { CodeTransformation, isCodeTransformation } from 'typeorm-extension';\nimport { createHandler } from '@routup/assets';\nimport path from 'node:path';\nimport type { Router } from 'routup';\nimport { coreHandler, setRequestParam } from 'routup';\nimport { PACKAGE_PATH, UI_DIST_PATH, UI_SOURCE_PATH } from '../../../../path.ts';\n\nexport async function registerAssetsMiddleware(router: Router) {\n if (!isCodeTransformation(CodeTransformation.JUST_IN_TIME)) {\n router.use('public', createHandler(\n path.posix.join(PACKAGE_PATH, 'public'),\n {\n fallthrough: true,\n scan: false,\n },\n ));\n\n router.use('public', createHandler(\n path.posix.join(UI_DIST_PATH, 'client'),\n {\n fallthrough: false,\n scan: false,\n },\n ));\n return;\n }\n\n /**\n * @type import('vite')\n */\n const vite = await load('vite');\n\n /**\n * @type {import('vite').ViteDevServer}\n */\n const server = await vite.createServer({\n root: UI_SOURCE_PATH,\n base: '/public/',\n logLevel: 'error',\n server: {\n middlewareMode: true,\n watch: {\n usePolling: true,\n interval: 100,\n },\n },\n appType: 'custom',\n });\n\n router.use('public', coreHandler((req, res, next) => server.middlewares(req, res, next)));\n router.use(coreHandler((req, res, next) => {\n setRequestParam(req, 'viteServer', server);\n\n next();\n }));\n}\n"],"mappings":";;;;;;;AAeA,eAAsBU,yBAAyBC,QAAc;AACzD,KAAI,CAACT,qBAAqBD,mBAAmBW,aAAY,EAAG;AACxDD,SAAOE,IAAI,UAAUV,cACjBC,KAAKU,MAAMC,KAAKR,cAAc,SAAA,EAC9B;GACIS,aAAa;GACbC,MAAM;GACV,CAAA,CAAA;AAGJN,SAAOE,IAAI,UAAUV,cACjBC,KAAKU,MAAMC,KAAKP,cAAc,SAAA,EAC9B;GACIQ,aAAa;GACbC,MAAM;GACV,CAAA,CAAA;AAEJ;;;;IAWJ,MAAME,SAAS,OAAMD,MALFlB,KAAK,OAAA,EAKEoB,aAAa;EACnCC,MAAMZ;EACNa,MAAM;EACNC,UAAU;EACVJ,QAAQ;GACJK,gBAAgB;GAChBC,OAAO;IACHC,YAAY;IACZC,UAAU;IACd;GACJ;EACAC,SAAS;EACb,CAAA;AAEAjB,QAAOE,IAAI,UAAUR,aAAawB,KAAKC,KAAKC,SAASZ,OAAOa,YAAYH,KAAKC,KAAKC,KAAAA,CAAAA,CAAAA;AAClFpB,QAAOE,IAAIR,aAAawB,KAAKC,KAAKC,SAAAA;AAC9BzB,kBAAgBuB,KAAK,cAAcV,OAAAA;AAEnCY,QAAAA;GACJ,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EntityManager, EntityTarget, FindOptionsWhere, ObjectLiteral } from 'typeorm';
|
|
2
|
+
import type { PermissionPolicyBinding } from '@authup/access';
|
|
3
|
+
import type { Permission } from '@authup/core-kit';
|
|
4
|
+
export type LoadBoundPermissionsOptions<E extends ObjectLiteral> = {
|
|
5
|
+
manager: EntityManager;
|
|
6
|
+
junctionTarget: EntityTarget<E>;
|
|
7
|
+
where: FindOptionsWhere<E>;
|
|
8
|
+
cachePrefix: string;
|
|
9
|
+
cacheKey: string;
|
|
10
|
+
};
|
|
11
|
+
type PermissionJunction = {
|
|
12
|
+
permission: Permission;
|
|
13
|
+
policy_id?: string | null;
|
|
14
|
+
};
|
|
15
|
+
export declare function loadBoundPermissions<E extends PermissionJunction & ObjectLiteral>(options: LoadBoundPermissionsOptions<E>): Promise<PermissionPolicyBinding[]>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/database/repositories/bindings.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,aAAa,EACb,YAAY,EAEZ,gBAAgB,EAChB,aAAa,EAChB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAc,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,aAAa,IAAI;IAC/D,OAAO,EAAE,aAAa,CAAC;IACvB,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,kBAAkB,GAAG,aAAa,EACnF,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAiCpC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PolicyRepository } from "../../../../adapters/database/domains/policy/repository.mjs";
|
|
2
|
+
import "../../../../adapters/database/domains/policy/index.mjs";
|
|
3
|
+
import { buildRedisKeyPath } from "@authup/server-kit";
|
|
4
|
+
//#region src/app/modules/database/repositories/bindings.ts
|
|
5
|
+
async function loadBoundPermissions(options) {
|
|
6
|
+
const entries = await options.manager.getRepository(options.junctionTarget).find({
|
|
7
|
+
where: options.where,
|
|
8
|
+
relations: { permission: true },
|
|
9
|
+
cache: {
|
|
10
|
+
id: buildRedisKeyPath({
|
|
11
|
+
prefix: options.cachePrefix,
|
|
12
|
+
key: options.cacheKey
|
|
13
|
+
}),
|
|
14
|
+
milliseconds: 6e4
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const policyIds = /* @__PURE__ */ new Set();
|
|
18
|
+
for (const entry of entries) if (entry.policy_id) policyIds.add(entry.policy_id);
|
|
19
|
+
const policyTrees = await loadPolicyTrees(options.manager, [...policyIds]);
|
|
20
|
+
return entries.map((entry) => {
|
|
21
|
+
const policies = [];
|
|
22
|
+
if (entry.policy_id && policyTrees[entry.policy_id]) policies.push(policyTrees[entry.policy_id]);
|
|
23
|
+
return {
|
|
24
|
+
permission: entry.permission,
|
|
25
|
+
policies: policies.length > 0 ? policies : void 0
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async function loadPolicyTrees(manager, policyIds) {
|
|
30
|
+
if (policyIds.length === 0) return {};
|
|
31
|
+
const policyRepository = new PolicyRepository(manager);
|
|
32
|
+
const trees = await Promise.all(policyIds.map((id) => policyRepository.findDescendantsTreeById(id).then((tree) => [id, tree])));
|
|
33
|
+
const result = {};
|
|
34
|
+
for (const [id, tree] of trees) if (tree) result[id] = tree;
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { loadBoundPermissions };
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=bindings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.mjs","names":["buildRedisKeyPath","PolicyRepository","loadBoundPermissions","options","repository","manager","getRepository","junctionTarget","relations","permission","entries","find","where","cache","id","prefix","cachePrefix","key","cacheKey","milliseconds","policyIds","Set","entry","policy_id","add","policyTrees","loadPolicyTrees","map","policies","push","length","undefined","policyRepository","trees","Promise","all","findDescendantsTreeById","then","tree","result"],"sources":["../../../../../src/app/modules/database/repositories/bindings.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\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 type {\n EntityManager,\n EntityTarget,\n FindOptionsRelations,\n FindOptionsWhere,\n ObjectLiteral,\n} from 'typeorm';\nimport type { BasePolicy, PermissionPolicyBinding } from '@authup/access';\nimport type { Permission } from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { PolicyRepository } from '../../../../adapters/database/domains/policy/index.ts';\n\nexport type LoadBoundPermissionsOptions<E extends ObjectLiteral> = {\n manager: EntityManager;\n junctionTarget: EntityTarget<E>;\n where: FindOptionsWhere<E>;\n cachePrefix: string;\n cacheKey: string;\n};\n\ntype PermissionJunction = {\n permission: Permission;\n policy_id?: string | null;\n};\n\nexport async function loadBoundPermissions<E extends PermissionJunction & ObjectLiteral>(\n options: LoadBoundPermissionsOptions<E>,\n): Promise<PermissionPolicyBinding[]> {\n const repository = options.manager.getRepository(options.junctionTarget);\n const relations = { permission: true } as FindOptionsRelations<E>;\n\n const entries = await repository.find({\n where: options.where,\n relations,\n cache: {\n id: buildRedisKeyPath({ prefix: options.cachePrefix, key: options.cacheKey }),\n milliseconds: 60_000,\n },\n });\n\n const policyIds = new Set<string>();\n for (const entry of entries) {\n if (entry.policy_id) {\n policyIds.add(entry.policy_id);\n }\n }\n\n const policyTrees = await loadPolicyTrees(options.manager, [...policyIds]);\n\n return entries.map((entry) => {\n const policies: BasePolicy[] = [];\n if (entry.policy_id && policyTrees[entry.policy_id]) {\n policies.push(policyTrees[entry.policy_id]);\n }\n\n return {\n permission: entry.permission,\n policies: policies.length > 0 ? policies : undefined,\n };\n });\n}\n\nasync function loadPolicyTrees(\n manager: EntityManager,\n policyIds: string[],\n): Promise<Record<string, BasePolicy>> {\n if (policyIds.length === 0) {\n return {};\n }\n\n const policyRepository = new PolicyRepository(manager);\n const trees = await Promise.all(\n policyIds.map((id) => policyRepository.findDescendantsTreeById(id)\n .then((tree) => [id, tree] as const)),\n );\n\n const result: Record<string, BasePolicy> = {};\n for (const [id, tree] of trees) {\n if (tree) {\n result[id] = tree;\n }\n }\n return result;\n}\n"],"mappings":";;;;AAgCA,eAAsBE,qBAClBC,SAAuC;CAKvC,MAAMO,UAAU,MAHGP,QAAQE,QAAQC,cAAcH,QAAQI,eAGnCH,CAAWO,KAAK;EAClCC,OAAOT,QAAQS;EACfJ,WAAAA,EAJgBC,YAAY,MAI5BD;EACAK,OAAO;GACHC,IAAId,kBAAkB;IAAEe,QAAQZ,QAAQa;IAAaC,KAAKd,QAAQe;IAAS,CAAA;GAC3EC,cAAc;GAClB;EACJ,CAAA;CAEA,MAAMC,4BAAY,IAAIC,KAAAA;AACtB,MAAK,MAAMC,SAASZ,QAChB,KAAIY,MAAMC,UACNH,WAAUI,IAAIF,MAAMC,UAAS;CAIrC,MAAME,cAAc,MAAMC,gBAAgBvB,QAAQE,SAAS,CAAA,GAAIe,UAAU,CAAA;AAEzE,QAAOV,QAAQiB,KAAKL,UAAAA;EAChB,MAAMM,WAAyB,EAAE;AACjC,MAAIN,MAAMC,aAAaE,YAAYH,MAAMC,WACrCK,UAASC,KAAKJ,YAAYH,MAAMC,WAAU;AAG9C,SAAO;GACHd,YAAYa,MAAMb;GAClBmB,UAAUA,SAASE,SAAS,IAAIF,WAAWG,KAAAA;GAC/C;GACJ;;AAGJ,eAAeL,gBACXrB,SACAe,WAAmB;AAEnB,KAAIA,UAAUU,WAAW,EACrB,QAAO,EAAC;CAGZ,MAAME,mBAAmB,IAAI/B,iBAAiBI,QAAAA;CAC9C,MAAM4B,QAAQ,MAAMC,QAAQC,IACxBf,UAAUO,KAAKb,OAAOkB,iBAAiBI,wBAAwBtB,GAAAA,CAC1DuB,MAAMC,SAAS,CAACxB,IAAIwB,KAAK,CAAA,CAAA,CAAA;CAGlC,MAAMC,SAAqC,EAAC;AAC5C,MAAK,MAAM,CAACzB,IAAIwB,SAASL,MACrB,KAAIK,KACAC,QAAOzB,MAAMwB;AAGrB,QAAOC"}
|