@toa.io/extensions.exposition 1.0.0-alpha.291 → 1.0.0-alpha.293
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/components/identity.basic/package.json +8 -0
- package/components/identity.federation/package.json +8 -0
- package/components/identity.passkeys/package.json +8 -0
- package/components/identity.tokens/package.json +10 -0
- package/package.json +25 -13
- package/transpiled/Discovery/Explorer.js +1 -1
- package/transpiled/Discovery/Explorer.js.map +1 -1
- package/transpiled/Discovery/Site.js +1 -1
- package/transpiled/Discovery/Site.js.map +1 -1
- package/transpiled/Discovery/trunk.js +1 -1
- package/transpiled/Discovery/trunk.js.map +1 -1
- package/transpiled/Endpoint.js +3 -0
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.js +1 -1
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.js +1 -1
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +1 -1
- package/transpiled/HTTP/Server.js +1 -1
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/Introspection.d.ts +6 -0
- package/transpiled/Introspection.js +1 -0
- package/transpiled/Introspection.js.map +1 -1
- package/transpiled/MCP/Server.d.ts +1 -1
- package/transpiled/MCP/Server.js +1 -1
- package/transpiled/MCP/Server.js.map +1 -1
- package/transpiled/MCP/discover.d.ts +1 -1
- package/transpiled/MCP/schema.js +2 -2
- package/transpiled/Query.d.ts +2 -12
- package/transpiled/Query.js +3 -13
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RPC/Dispatcher.d.ts +1 -1
- package/transpiled/RPC/Dispatcher.js +2 -2
- package/transpiled/RPC/Dispatcher.js.map +1 -1
- package/transpiled/RTD/Endpoint.d.ts +2 -3
- package/transpiled/RTD/Tree.js +1 -1
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.js +1 -1
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/index.d.ts +1 -2
- package/transpiled/RTD/syntax/index.js +1 -2
- package/transpiled/RTD/syntax/index.js.map +1 -1
- package/transpiled/Tenant.js +1 -1
- package/transpiled/Tenant.js.map +1 -1
- package/transpiled/directives/auth/Authorization.js +1 -1
- package/transpiled/directives/auth/Authorization.js.map +1 -1
- package/transpiled/directives/io/IO.js +1 -1
- package/transpiled/directives/io/IO.js.map +1 -1
- package/transpiled/directives/oauth/documents.d.ts +1 -1
- package/transpiled/index.d.ts +0 -2
- package/transpiled/index.js +0 -2
- package/transpiled/index.js.map +1 -1
- package/transpiled/service.js +1 -1
- package/transpiled/service.js.map +1 -1
- package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
- package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
- package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
- package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
- package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
- package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
- package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
- package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
- package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
- package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
- package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
- package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
- package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
- package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
- package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
- package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
- package/ui/dist/_app/version.json +1 -1
- package/ui/dist/index.html +12 -12
- package/CHANGELOG.md +0 -35
- package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
- package/components/identity.basic/source/lib/credentials.test.ts +0 -18
- package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
- package/components/identity.clients/source/lib/canonical.test.ts +0 -43
- package/components/identity.clients/source/lib/cimd.test.ts +0 -122
- package/components/identity.clients/source/lib/redirect.test.ts +0 -47
- package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
- package/components/identity.credentials/source/list.test.ts +0 -70
- package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
- package/components/identity.federation/source/lib/discovery.test.ts +0 -60
- package/components/identity.federation/source/list.test.ts +0 -41
- package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
- package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
- package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
- package/components/identity.passkeys/source/errors.test.ts +0 -34
- package/components/identity.passkeys/source/webauthn.test.ts +0 -26
- package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
- package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
- package/components/identity.tokens/source/authenticate.test.ts +0 -112
- package/components/identity.tokens/source/decrypt.test.ts +0 -216
- package/components/identity.tokens/source/encrypt.test.ts +0 -150
- package/components/identity.tokens/source/issue.test.ts +0 -73
- package/components/identity.tokens/source/lib/form.test.ts +0 -25
- package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
- package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
- package/context.toa.yaml +0 -31
- package/cucumber.mjs +0 -7
- package/documentation/.assets/ia3-dark.jpg +0 -0
- package/documentation/.assets/ia3-light.jpg +0 -0
- package/documentation/.assets/overview-dark.jpg +0 -0
- package/documentation/.assets/overview-light.jpg +0 -0
- package/documentation/.assets/role-scopes-dark.jpg +0 -0
- package/documentation/.assets/role-scopes-light.jpg +0 -0
- package/documentation/.assets/rtd-dark.jpg +0 -0
- package/documentation/.assets/rtd-light.jpg +0 -0
- package/documentation/access.md +0 -350
- package/documentation/authorities.md +0 -51
- package/documentation/cache.md +0 -72
- package/documentation/components.md +0 -472
- package/documentation/consent.md +0 -101
- package/documentation/credentials.md +0 -88
- package/documentation/dev.md +0 -30
- package/documentation/discovery.md +0 -81
- package/documentation/flow.md +0 -44
- package/documentation/help.md +0 -122
- package/documentation/identity.md +0 -304
- package/documentation/introspection.md +0 -123
- package/documentation/io.md +0 -167
- package/documentation/ip.md +0 -24
- package/documentation/map.md +0 -123
- package/documentation/mcp.md +0 -183
- package/documentation/notes/desync.jpg +0 -0
- package/documentation/notes/peers.md +0 -59
- package/documentation/notes/sse.md +0 -71
- package/documentation/notes/throttling.md +0 -122
- package/documentation/oauth.md +0 -180
- package/documentation/octets.md +0 -334
- package/documentation/passkeys.md +0 -11
- package/documentation/protocol.md +0 -120
- package/documentation/query.md +0 -324
- package/documentation/require.md +0 -15
- package/documentation/rpc.md +0 -154
- package/documentation/tracing.md +0 -70
- package/documentation/tree.md +0 -199
- package/features/access.feature +0 -596
- package/features/annotation.feature +0 -32
- package/features/auth.assert.feature +0 -55
- package/features/auth.bearer.feature +0 -120
- package/features/auth.claims.feature +0 -171
- package/features/auth.incept.feature +0 -166
- package/features/auth.input.feature +0 -59
- package/features/authorities.basic.feature +0 -141
- package/features/authorities.feature +0 -71
- package/features/authorities.federation.feature +0 -100
- package/features/authorities.tokens.feature +0 -117
- package/features/body.feature +0 -76
- package/features/cache.feature +0 -368
- package/features/configuration.feature +0 -206
- package/features/cors.feature +0 -127
- package/features/credentials.feature +0 -106
- package/features/debug.feature +0 -34
- package/features/dev.feature +0 -90
- package/features/directives.feature +0 -61
- package/features/discovery.feature +0 -213
- package/features/discovery.ui.feature +0 -213
- package/features/dynamic.feature +0 -192
- package/features/errors.feature +0 -258
- package/features/etag.feature +0 -239
- package/features/flow.feature +0 -148
- package/features/help.feature +0 -512
- package/features/identity.bans.feature +0 -200
- package/features/identity.basic.feature +0 -666
- package/features/identity.feature +0 -240
- package/features/identity.federation.feature +0 -396
- package/features/identity.otp.feature +0 -142
- package/features/identity.roles.feature +0 -568
- package/features/identity.tokens.custom.feature +0 -430
- package/features/identity.tokens.feature +0 -131
- package/features/interruptions.feature +0 -20
- package/features/introspection.feature +0 -565
- package/features/introspection.map.feature +0 -108
- package/features/io.feature +0 -204
- package/features/io.throttle.feature +0 -166
- package/features/map.feature +0 -360
- package/features/mcp.feature +0 -753
- package/features/methods.feature +0 -48
- package/features/oauth.clients.feature +0 -195
- package/features/oauth.discovery.feature +0 -164
- package/features/oauth.grants.feature +0 -301
- package/features/octets.cloudinary.feature +0 -233
- package/features/octets.download.feature +0 -194
- package/features/octets.entries.feature +0 -83
- package/features/octets.feature +0 -306
- package/features/octets.head.feature +0 -40
- package/features/octets.location.feature +0 -83
- package/features/octets.meta.feature +0 -117
- package/features/octets.workflows.feature +0 -565
- package/features/passkeys.feature +0 -66
- package/features/probes.feature +0 -18
- package/features/query.feature +0 -389
- package/features/realtime.feature +0 -34
- package/features/require.feature +0 -66
- package/features/response.feature +0 -103
- package/features/routes.feature +0 -224
- package/features/rpc.feature +0 -429
- package/features/server.feature +0 -21
- package/features/site/_app/immutable/asset.js +0 -1
- package/features/site/favicon.ico +0 -0
- package/features/site/index.html +0 -10
- package/features/steps/.env.example +0 -5
- package/features/steps/Captures.ts +0 -20
- package/features/steps/Cloudinary.ts +0 -12
- package/features/steps/Common.ts +0 -38
- package/features/steps/Components.ts +0 -115
- package/features/steps/Database.ts +0 -106
- package/features/steps/Gateway.ts +0 -240
- package/features/steps/HTTP.ts +0 -96
- package/features/steps/IDP.ts +0 -361
- package/features/steps/Identity.ts +0 -54
- package/features/steps/OTP.ts +0 -42
- package/features/steps/Parameters.ts +0 -162
- package/features/steps/Probe.ts +0 -38
- package/features/steps/Realtime.ts +0 -175
- package/features/steps/Workspace.ts +0 -48
- package/features/steps/components/audit/manifest.toa.yaml +0 -20
- package/features/steps/components/audit/operations/record.js +0 -5
- package/features/steps/components/echo/manifest.toa.yaml +0 -59
- package/features/steps/components/echo/operations/affect.js +0 -3
- package/features/steps/components/echo/operations/compute.js +0 -3
- package/features/steps/components/echo/operations/echo.js +0 -3
- package/features/steps/components/echo/operations/error.js +0 -7
- package/features/steps/components/echo/operations/identity.js +0 -3
- package/features/steps/components/echo/operations/parameters.js +0 -3
- package/features/steps/components/echo/operations/ping.js +0 -3
- package/features/steps/components/echo/operations/unwrap.js +0 -3
- package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
- package/features/steps/components/echo.beacon/operations/hello.js +0 -3
- package/features/steps/components/greeter/manifest.toa.yaml +0 -5
- package/features/steps/components/greeter/operations/greet.js +0 -3
- package/features/steps/components/notify/manifest.toa.yaml +0 -20
- package/features/steps/components/notify/operations/send.js +0 -5
- package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
- package/features/steps/components/octets.tester/operations/authority.js +0 -3
- package/features/steps/components/octets.tester/operations/bar.js +0 -9
- package/features/steps/components/octets.tester/operations/baz.js +0 -9
- package/features/steps/components/octets.tester/operations/concat.js +0 -5
- package/features/steps/components/octets.tester/operations/echo.js +0 -5
- package/features/steps/components/octets.tester/operations/err.js +0 -14
- package/features/steps/components/octets.tester/operations/foo.js +0 -5
- package/features/steps/components/octets.tester/operations/id.js +0 -5
- package/features/steps/components/octets.tester/operations/identity.js +0 -5
- package/features/steps/components/octets.tester/operations/lenna.png +0 -0
- package/features/steps/components/octets.tester/operations/redirect.js +0 -17
- package/features/steps/components/octets.tester/operations/yex.js +0 -14
- package/features/steps/components/octets.tester/operations/yield.js +0 -11
- package/features/steps/components/orders/manifest.toa.yaml +0 -30
- package/features/steps/components/orders/operations/create.js +0 -7
- package/features/steps/components/pots/manifest.toa.yaml +0 -91
- package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
- package/features/steps/components/pricing/manifest.toa.yaml +0 -13
- package/features/steps/components/pricing/operations/quote.js +0 -3
- package/features/steps/components/sequences/manifest.toa.yaml +0 -11
- package/features/steps/components/sequences/operations/numbers.js +0 -5
- package/features/steps/components/sequences/operations/tokens.js +0 -14
- package/features/steps/components/users/manifest.toa.yaml +0 -30
- package/features/steps/components/users/operations/create.js +0 -11
- package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
- package/features/steps/map.ts +0 -30
- package/features/steps/tsconfig.json +0 -9
- package/features/streams.feature +0 -35
- package/features/timestamps.feature +0 -41
- package/features/timing.feature +0 -49
- package/features/tracing.feature +0 -123
- package/schemas/annotation.cos.yaml +0 -125
- package/schemas/call.cos.yaml +0 -18
- package/schemas/directive.cos.yaml +0 -7
- package/schemas/method.cos.yaml +0 -23
- package/schemas/node.cos.yaml +0 -22
- package/schemas/query.cos.yaml +0 -31
- package/schemas/querystring.cos.yaml +0 -19
- package/schemas/range.cos.yaml +0 -10
- package/schemas/route.cos.yaml +0 -6
- package/source/Annotation.ts +0 -89
- package/source/Branch.test.ts +0 -40
- package/source/Branch.ts +0 -44
- package/source/Composition.ts +0 -51
- package/source/Context.ts +0 -11
- package/source/Directive.test.ts +0 -199
- package/source/Directive.ts +0 -248
- package/source/Discovery/Explorer.ts +0 -34
- package/source/Discovery/Site.test.ts +0 -147
- package/source/Discovery/Site.ts +0 -202
- package/source/Discovery/index.ts +0 -3
- package/source/Discovery/tree.test.ts +0 -175
- package/source/Discovery/tree.ts +0 -77
- package/source/Discovery/trunk.ts +0 -33
- package/source/Endpoint.test.ts +0 -67
- package/source/Endpoint.ts +0 -157
- package/source/Factory.ts +0 -42
- package/source/Gateway.ts +0 -390
- package/source/HTTP/Context.ts +0 -143
- package/source/HTTP/Probe.ts +0 -99
- package/source/HTTP/Server.ts +0 -430
- package/source/HTTP/Timing.ts +0 -14
- package/source/HTTP/address.test.ts +0 -28
- package/source/HTTP/address.ts +0 -16
- package/source/HTTP/exceptions.ts +0 -99
- package/source/HTTP/formats/form.ts +0 -21
- package/source/HTTP/formats/index.ts +0 -36
- package/source/HTTP/formats/json.ts +0 -14
- package/source/HTTP/formats/msgpack.ts +0 -14
- package/source/HTTP/formats/text.ts +0 -10
- package/source/HTTP/formats/yaml.test.ts +0 -22
- package/source/HTTP/formats/yaml.ts +0 -40
- package/source/HTTP/index.ts +0 -6
- package/source/HTTP/messages.test.ts +0 -196
- package/source/HTTP/messages.ts +0 -186
- package/source/HTTP/types.ts +0 -39
- package/source/Interception.ts +0 -37
- package/source/Introspection.ts +0 -179
- package/source/MCP/Server.ts +0 -335
- package/source/MCP/discover.ts +0 -51
- package/source/MCP/errors.ts +0 -80
- package/source/MCP/index.ts +0 -1
- package/source/MCP/schema.test.ts +0 -91
- package/source/MCP/schema.ts +0 -94
- package/source/MCP/tools.ts +0 -144
- package/source/MCP/types.ts +0 -84
- package/source/Mapping.ts +0 -101
- package/source/Query.test.ts +0 -54
- package/source/Query.ts +0 -277
- package/source/RPC/Context.ts +0 -75
- package/source/RPC/Dispatcher.ts +0 -150
- package/source/RPC/errors.test.ts +0 -77
- package/source/RPC/errors.ts +0 -82
- package/source/RPC/index.ts +0 -1
- package/source/RPC/names.test.ts +0 -141
- package/source/RPC/names.ts +0 -176
- package/source/RPC/types.ts +0 -34
- package/source/RTD/Context.ts +0 -16
- package/source/RTD/Directives.ts +0 -126
- package/source/RTD/Endpoint.ts +0 -27
- package/source/RTD/Match.ts +0 -11
- package/source/RTD/Method.ts +0 -39
- package/source/RTD/Node.ts +0 -169
- package/source/RTD/Route.ts +0 -93
- package/source/RTD/Tree.ts +0 -137
- package/source/RTD/expiration.test.ts +0 -81
- package/source/RTD/factory.ts +0 -105
- package/source/RTD/index.ts +0 -8
- package/source/RTD/segment.test.ts +0 -35
- package/source/RTD/segment.ts +0 -51
- package/source/RTD/syntax/index.ts +0 -2
- package/source/RTD/syntax/parse.test.ts +0 -196
- package/source/RTD/syntax/parse.ts +0 -171
- package/source/RTD/syntax/types.ts +0 -69
- package/source/RTD/walk.test.ts +0 -147
- package/source/Remotes.test.ts +0 -79
- package/source/Remotes.ts +0 -39
- package/source/Tenant.ts +0 -73
- package/source/const.ts +0 -45
- package/source/deployment.ts +0 -96
- package/source/directives/auth/Anonymous.test.ts +0 -70
- package/source/directives/auth/Anonymous.ts +0 -36
- package/source/directives/auth/Anyone.ts +0 -23
- package/source/directives/auth/Assert.ts +0 -43
- package/source/directives/auth/Authorization.test.ts +0 -24
- package/source/directives/auth/Authorization.ts +0 -388
- package/source/directives/auth/Delegate.test.ts +0 -36
- package/source/directives/auth/Delegate.ts +0 -54
- package/source/directives/auth/Echo.ts +0 -24
- package/source/directives/auth/Federation.ts +0 -104
- package/source/directives/auth/Id.ts +0 -37
- package/source/directives/auth/Incept.ts +0 -117
- package/source/directives/auth/Input.ts +0 -92
- package/source/directives/auth/Role.test.ts +0 -147
- package/source/directives/auth/Role.ts +0 -99
- package/source/directives/auth/Rule.ts +0 -59
- package/source/directives/auth/Scheme.ts +0 -31
- package/source/directives/auth/create.ts +0 -11
- package/source/directives/auth/index.ts +0 -3
- package/source/directives/auth/schemes.test.ts +0 -18
- package/source/directives/auth/schemes.ts +0 -39
- package/source/directives/auth/split.ts +0 -14
- package/source/directives/auth/types.ts +0 -75
- package/source/directives/cache/Cache.ts +0 -92
- package/source/directives/cache/Control.ts +0 -81
- package/source/directives/cache/Exact.ts +0 -7
- package/source/directives/cache/etag.ts +0 -38
- package/source/directives/cache/index.ts +0 -3
- package/source/directives/cache/types.ts +0 -9
- package/source/directives/cors/CORS.test.ts +0 -75
- package/source/directives/cors/CORS.ts +0 -88
- package/source/directives/cors/index.ts +0 -3
- package/source/directives/dev/Development.ts +0 -41
- package/source/directives/dev/Faulty.ts +0 -31
- package/source/directives/dev/Sleep.ts +0 -53
- package/source/directives/dev/Stub.ts +0 -14
- package/source/directives/dev/Throw.ts +0 -14
- package/source/directives/dev/index.ts +0 -3
- package/source/directives/dev/types.ts +0 -5
- package/source/directives/flow/Compose.ts +0 -98
- package/source/directives/flow/Fetch.ts +0 -86
- package/source/directives/flow/Flow.ts +0 -43
- package/source/directives/flow/index.ts +0 -3
- package/source/directives/flow/types.ts +0 -7
- package/source/directives/help/Family.ts +0 -122
- package/source/directives/help/Help.test.ts +0 -227
- package/source/directives/help/Help.ts +0 -47
- package/source/directives/help/Parameters.ts +0 -47
- package/source/directives/help/described.ts +0 -57
- package/source/directives/help/index.ts +0 -45
- package/source/directives/index.ts +0 -33
- package/source/directives/io/Directive.ts +0 -17
- package/source/directives/io/IO.ts +0 -118
- package/source/directives/io/Input.ts +0 -55
- package/source/directives/io/Message.ts +0 -1
- package/source/directives/io/Output.ts +0 -81
- package/source/directives/io/Status.test.ts +0 -88
- package/source/directives/io/Status.ts +0 -47
- package/source/directives/io/Throttle.ts +0 -30
- package/source/directives/io/index.ts +0 -3
- package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
- package/source/directives/io/lib/throttle/Configuration.ts +0 -68
- package/source/directives/io/lib/throttle/Keys.ts +0 -53
- package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
- package/source/directives/io/lib/throttle/Quotas.ts +0 -190
- package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
- package/source/directives/io/lib/throttle/Sync.ts +0 -93
- package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
- package/source/directives/io/lib/throttle/Warning.ts +0 -29
- package/source/directives/io/lib/throttle/components/Component.ts +0 -7
- package/source/directives/io/lib/throttle/components/IP.ts +0 -30
- package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
- package/source/directives/io/lib/throttle/components/Path.ts +0 -8
- package/source/directives/io/lib/throttle/components/Route.ts +0 -19
- package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
- package/source/directives/io/lib/throttle/components/index.ts +0 -19
- package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
- package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
- package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
- package/source/directives/io/lib/throttle/index.ts +0 -4
- package/source/directives/io/schemas.test.ts +0 -40
- package/source/directives/io/schemas.ts +0 -16
- package/source/directives/map/Authority.ts +0 -15
- package/source/directives/map/Buffer.ts +0 -15
- package/source/directives/map/Claims.ts +0 -63
- package/source/directives/map/Directive.ts +0 -4
- package/source/directives/map/Headers.ts +0 -60
- package/source/directives/map/Language.ts +0 -45
- package/source/directives/map/Languages.ts +0 -17
- package/source/directives/map/Map.ts +0 -85
- package/source/directives/map/Mapping.ts +0 -45
- package/source/directives/map/Properties.ts +0 -15
- package/source/directives/map/Segments.ts +0 -52
- package/source/directives/map/index.ts +0 -3
- package/source/directives/mcp/MCP.ts +0 -33
- package/source/directives/mcp/Tool.test.ts +0 -56
- package/source/directives/mcp/Tool.ts +0 -32
- package/source/directives/mcp/index.ts +0 -6
- package/source/directives/oauth/Discovery.ts +0 -66
- package/source/directives/oauth/documents.ts +0 -110
- package/source/directives/oauth/index.ts +0 -3
- package/source/directives/octets/Context.ts +0 -23
- package/source/directives/octets/Delete.ts +0 -96
- package/source/directives/octets/Directive.ts +0 -21
- package/source/directives/octets/Get.ts +0 -88
- package/source/directives/octets/Octets.ts +0 -82
- package/source/directives/octets/Put.ts +0 -186
- package/source/directives/octets/Workflow.ts +0 -60
- package/source/directives/octets/bytes.test.ts +0 -33
- package/source/directives/octets/bytes.ts +0 -18
- package/source/directives/octets/index.ts +0 -3
- package/source/directives/octets/schemas.test.ts +0 -20
- package/source/directives/octets/schemas.ts +0 -15
- package/source/directives/octets/types.ts +0 -9
- package/source/directives/octets/workflows/Execution.ts +0 -130
- package/source/directives/octets/workflows/Workflow.ts +0 -51
- package/source/directives/octets/workflows/index.ts +0 -1
- package/source/directives/require/Directive.ts +0 -5
- package/source/directives/require/Headers.ts +0 -19
- package/source/directives/require/Require.ts +0 -27
- package/source/directives/require/index.ts +0 -3
- package/source/discovery.ts +0 -1
- package/source/exceptions.ts +0 -47
- package/source/index.ts +0 -12
- package/source/io.ts +0 -4
- package/source/manifest.test.ts +0 -56
- package/source/manifest.ts +0 -56
- package/source/octets.d.ts +0 -17
- package/source/root.ts +0 -59
- package/source/schemas.test.ts +0 -31
- package/source/schemas.ts +0 -15
- package/source/service.ts +0 -94
- package/source/shortcuts.ts +0 -14
- package/source/userland.ts +0 -47
- package/transpiled/Annotation.d.ts +0 -70
- package/transpiled/Annotation.js +0 -2
- package/transpiled/Annotation.js.map +0 -1
- package/transpiled/RTD/syntax/parse.d.ts +0 -4
- package/transpiled/RTD/syntax/parse.js +0 -112
- package/transpiled/RTD/syntax/parse.js.map +0 -1
- package/transpiled/RTD/syntax/types.d.ts +0 -52
- package/transpiled/RTD/syntax/types.js +0 -11
- package/transpiled/RTD/syntax/types.js.map +0 -1
- package/transpiled/const.d.ts +0 -36
- package/transpiled/const.js +0 -37
- package/transpiled/const.js.map +0 -1
- package/transpiled/deployment.d.ts +0 -6
- package/transpiled/deployment.js +0 -76
- package/transpiled/deployment.js.map +0 -1
- package/transpiled/manifest.d.ts +0 -3
- package/transpiled/manifest.js +0 -39
- package/transpiled/manifest.js.map +0 -1
- package/transpiled/schemas.d.ts +0 -9
- package/transpiled/schemas.js +0 -9
- package/transpiled/schemas.js.map +0 -1
- package/transpiled/shortcuts.d.ts +0 -3
- package/transpiled/shortcuts.js +0 -13
- package/transpiled/shortcuts.js.map +0 -1
- package/tsconfig.json +0 -13
- package/tsconfig.tsbuildinfo +0 -1
- package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
- package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
- package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
- package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
- package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
- package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
- package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
- package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
- package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
- package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
import { it, beforeEach, mock } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { generate } from 'randomstring'
|
|
5
|
-
import { EncryptFactory, ImportKeyFactory } from 'paseto/v3/local'
|
|
6
|
-
import { Effect as Encrypt } from './encrypt.js'
|
|
7
|
-
import { Computation as Decrypt } from './decrypt.js'
|
|
8
|
-
import { type Configuration, type Context, type Identity } from './lib/index.js'
|
|
9
|
-
import type { Secret } from '@toa.io/extensions.configuration'
|
|
10
|
-
|
|
11
|
-
let configuration: Configuration
|
|
12
|
-
let context: Context
|
|
13
|
-
let encrypt: Encrypt
|
|
14
|
-
let decrypt: Decrypt
|
|
15
|
-
|
|
16
|
-
const remote = { identity: { keys: { observe: mock.fn(async () => null) } } }
|
|
17
|
-
const authority = generate()
|
|
18
|
-
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
configuration = {
|
|
21
|
-
keys: [
|
|
22
|
-
{ id: 'key0', key: secret('sTxL6qVOadKkUJwh3FveU53XgTEo3Sdfg7k2FfiIKfs') },
|
|
23
|
-
// keys are secrets, and a secret is an object
|
|
24
|
-
{ id: 'key1', key: secret('5I0iSKw3yfBkQ4AXfA8eR-tWR0Q1dpn4x3bPrPzHkP0') },
|
|
25
|
-
{
|
|
26
|
-
id: 'legacy0',
|
|
27
|
-
key: secret('k3.local.m28p8SrbS467t-2IUjQuSOqmjvi24TbXhyjAW_dOrog'),
|
|
28
|
-
format: 'paseto'
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
id: 'legacy1',
|
|
32
|
-
key: secret('k3.local.-498jfWenrZH-Dqw3-zQJih_hKzDgBgUMfe37OCqSOA'),
|
|
33
|
-
format: 'paseto'
|
|
34
|
-
}
|
|
35
|
-
],
|
|
36
|
-
lifetime: 1000,
|
|
37
|
-
refresh: 500,
|
|
38
|
-
cache: {
|
|
39
|
-
max: 1024,
|
|
40
|
-
ttl: 600
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
context = {
|
|
45
|
-
configuration,
|
|
46
|
-
remote,
|
|
47
|
-
logs: { debug: () => undefined }
|
|
48
|
-
} as unknown as Context
|
|
49
|
-
|
|
50
|
-
encrypt = new Encrypt()
|
|
51
|
-
encrypt.mount(context)
|
|
52
|
-
|
|
53
|
-
decrypt = new Decrypt()
|
|
54
|
-
decrypt.mount(context)
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it('should decrypt', async () => {
|
|
58
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
59
|
-
const lifetime = 100
|
|
60
|
-
|
|
61
|
-
const reply = await encrypt.execute({ authority, identity, lifetime })
|
|
62
|
-
|
|
63
|
-
if (reply instanceof Error) throw reply
|
|
64
|
-
|
|
65
|
-
const decrypted = await decrypt.execute(reply)
|
|
66
|
-
|
|
67
|
-
assert.partialDeepStrictEqual(decrypted, {
|
|
68
|
-
iss: authority,
|
|
69
|
-
identity,
|
|
70
|
-
refresh: false,
|
|
71
|
-
custom: false
|
|
72
|
-
})
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
it('should mark a token encrypted with a custom key', async () => {
|
|
76
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
77
|
-
const key = {
|
|
78
|
-
id: generate(),
|
|
79
|
-
key: '5I0iSKw3yfBkQ4AXfA8eR-tWR0Q1dpn4x3bPrPzHkP0',
|
|
80
|
-
label: 'custom'
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
remote.identity.keys.observe = mock.fn(async ({ query }: { query: { id: string } }) =>
|
|
84
|
-
query.id === key.id ? { ...key, identity: identity.id } : null
|
|
85
|
-
) as any
|
|
86
|
-
|
|
87
|
-
const encrypted = await encrypt.execute({ authority, identity, lifetime: 100, key })
|
|
88
|
-
|
|
89
|
-
if (encrypted instanceof Error) throw encrypted
|
|
90
|
-
|
|
91
|
-
const decrypted = await decrypt.execute(encrypted)
|
|
92
|
-
|
|
93
|
-
assert.partialDeepStrictEqual(decrypted, { identity, refresh: false, custom: true })
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('should decrypt with key1', async () => {
|
|
97
|
-
const k1context = {
|
|
98
|
-
configuration: {
|
|
99
|
-
keys: [configuration.keys[1]]
|
|
100
|
-
}
|
|
101
|
-
} as unknown as Context
|
|
102
|
-
|
|
103
|
-
encrypt = new Encrypt()
|
|
104
|
-
encrypt.mount(k1context)
|
|
105
|
-
|
|
106
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
107
|
-
const lifetime = 100
|
|
108
|
-
|
|
109
|
-
const encrypted = await encrypt.execute({ authority, identity, lifetime })
|
|
110
|
-
|
|
111
|
-
if (encrypted instanceof Error) throw encrypted
|
|
112
|
-
|
|
113
|
-
const decrypted = await decrypt.execute(encrypted)
|
|
114
|
-
|
|
115
|
-
assert.partialDeepStrictEqual(decrypted, { identity, refresh: true })
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
it('should decrypt legacy PASETO and require refresh', async () => {
|
|
119
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
120
|
-
|
|
121
|
-
const token = await paseto(
|
|
122
|
-
configuration.keys[2].key.unwrap(),
|
|
123
|
-
{ iss: authority, identity },
|
|
124
|
-
'legacy0'
|
|
125
|
-
)
|
|
126
|
-
|
|
127
|
-
await assert.partialDeepStrictEqual(await decrypt.execute(token), {
|
|
128
|
-
iss: authority,
|
|
129
|
-
identity,
|
|
130
|
-
refresh: true
|
|
131
|
-
})
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
it('should separate JWE and PASETO keys with the same id by format', async () => {
|
|
135
|
-
configuration.keys[2].id = 'key0'
|
|
136
|
-
|
|
137
|
-
decrypt = new Decrypt()
|
|
138
|
-
decrypt.mount(context)
|
|
139
|
-
|
|
140
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
141
|
-
|
|
142
|
-
const token = await paseto(
|
|
143
|
-
configuration.keys[2].key.unwrap(),
|
|
144
|
-
{ iss: authority, identity },
|
|
145
|
-
'key0'
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
await assert.partialDeepStrictEqual(await decrypt.execute(token), {
|
|
149
|
-
identity,
|
|
150
|
-
refresh: true
|
|
151
|
-
})
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
it('should reject a token under a revoked key', async () => {
|
|
155
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
156
|
-
const key = {
|
|
157
|
-
id: generate(),
|
|
158
|
-
key: '5I0iSKw3yfBkQ4AXfA8eR-tWR0Q1dpn4x3bPrPzHkP0',
|
|
159
|
-
label: 'revoked'
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
remote.identity.keys.observe = mock.fn(async ({ query }: { query: { id: string } }) =>
|
|
163
|
-
query.id === key.id ? { ...key, identity: identity.id, revokedAt: Date.now() } : null
|
|
164
|
-
) as any
|
|
165
|
-
|
|
166
|
-
const encrypted = await encrypt.execute({ authority, identity, lifetime: 0, key })
|
|
167
|
-
|
|
168
|
-
if (encrypted instanceof Error) throw encrypted
|
|
169
|
-
|
|
170
|
-
const thrown: any = await decrypt.execute(encrypted)
|
|
171
|
-
|
|
172
|
-
assert.deepStrictEqual(thrown.code, 'REVOKED_KEY')
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
it('should reject a tampered JWE', async () => {
|
|
176
|
-
const token = await encrypt.execute({
|
|
177
|
-
authority,
|
|
178
|
-
identity: { id: generate(), roles: [] }
|
|
179
|
-
})
|
|
180
|
-
|
|
181
|
-
if (token instanceof Error) throw token
|
|
182
|
-
|
|
183
|
-
const parts = token.split('.')
|
|
184
|
-
|
|
185
|
-
parts[3] = (parts[3].startsWith('A') ? 'B' : 'A') + parts[3].slice(1)
|
|
186
|
-
|
|
187
|
-
const tampered = parts.join('.')
|
|
188
|
-
|
|
189
|
-
const thrown: any = await decrypt.execute(tampered)
|
|
190
|
-
assert.deepStrictEqual(thrown.code, 'INVALID_TOKEN')
|
|
191
|
-
})
|
|
192
|
-
|
|
193
|
-
it('should reject JWE with an unknown key', async () => {
|
|
194
|
-
const token = await encrypt.execute({
|
|
195
|
-
authority,
|
|
196
|
-
identity: { id: generate(), roles: [] },
|
|
197
|
-
key: { id: 'missing', key: configuration.keys[0].key.unwrap(), label: 'missing' }
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
if (token instanceof Error) throw token
|
|
201
|
-
|
|
202
|
-
const thrown: any = await decrypt.execute(token)
|
|
203
|
-
assert.deepStrictEqual(thrown.code, 'INVALID_KEY')
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
function secret(value: string): Secret {
|
|
207
|
-
return { unwrap: () => value }
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
async function paseto(key: string, claims: object, kid: string): Promise<string> {
|
|
211
|
-
const imported = await ImportKeyFactory().run(key as `k3.local.${string}`)
|
|
212
|
-
|
|
213
|
-
return await EncryptFactory().run(imported, claims, {
|
|
214
|
-
footer: new TextEncoder().encode(JSON.stringify({ kid }))
|
|
215
|
-
})
|
|
216
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { it, beforeEach } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { generate } from 'randomstring'
|
|
5
|
-
import { timeout } from '@toa.io/generic'
|
|
6
|
-
import { Effect as Encrypt } from './encrypt.js'
|
|
7
|
-
import { Computation as Decrypt } from './decrypt.js'
|
|
8
|
-
import { type Context, type Identity } from './lib/index.js'
|
|
9
|
-
import type { Secret } from '@toa.io/extensions.configuration'
|
|
10
|
-
|
|
11
|
-
let encrypt: Encrypt
|
|
12
|
-
let decrypt: Decrypt
|
|
13
|
-
|
|
14
|
-
const context: Context = {
|
|
15
|
-
remote: { identity: { keys: null } },
|
|
16
|
-
logs: { debug: () => undefined }
|
|
17
|
-
} as unknown as Context
|
|
18
|
-
|
|
19
|
-
const authority = generate()
|
|
20
|
-
|
|
21
|
-
beforeEach(() => {
|
|
22
|
-
context.configuration = {
|
|
23
|
-
keys: [
|
|
24
|
-
{ id: 'key0', key: secret('sTxL6qVOadKkUJwh3FveU53XgTEo3Sdfg7k2FfiIKfs') },
|
|
25
|
-
{
|
|
26
|
-
id: 'legacy0',
|
|
27
|
-
key: secret('k3.local.m28p8SrbS467t-2IUjQuSOqmjvi24TbXhyjAW_dOrog'),
|
|
28
|
-
format: 'paseto'
|
|
29
|
-
}
|
|
30
|
-
],
|
|
31
|
-
lifetime: 1,
|
|
32
|
-
refresh: 2,
|
|
33
|
-
cache: {
|
|
34
|
-
max: 1024,
|
|
35
|
-
ttl: 3
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
encrypt = new Encrypt()
|
|
40
|
-
encrypt.mount(context)
|
|
41
|
-
|
|
42
|
-
decrypt = new Decrypt()
|
|
43
|
-
decrypt.mount(context)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
it('should use the first encryption key as active and expose its id as kid', async () => {
|
|
47
|
-
context.configuration.keys.unshift({
|
|
48
|
-
id: 'legacy-first',
|
|
49
|
-
key: secret('k3.local.m28p8SrbS467t-2IUjQuSOqmjvi24TbXhyjAW_dOrog'),
|
|
50
|
-
format: 'paseto'
|
|
51
|
-
})
|
|
52
|
-
context.configuration.keys.push({
|
|
53
|
-
id: 'key1',
|
|
54
|
-
key: secret('5I0iSKw3yfBkQ4AXfA8eR-tWR0Q1dpn4x3bPrPzHkP0')
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
encrypt.mount(context)
|
|
58
|
-
|
|
59
|
-
const encrypted = await encrypt.execute({
|
|
60
|
-
authority,
|
|
61
|
-
identity: { id: generate(), roles: [] }
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
if (encrypted instanceof Error) throw encrypted
|
|
65
|
-
|
|
66
|
-
const header = JSON.parse(Buffer.from(encrypted.split('.')[0], 'base64url').toString())
|
|
67
|
-
|
|
68
|
-
assert.partialDeepStrictEqual(header, { kid: 'key0', alg: 'dir', enc: 'A256GCM' })
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
it('should encrypt with configured lifetime by default', async () => {
|
|
72
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
73
|
-
|
|
74
|
-
const encrypted = await encrypt.execute({
|
|
75
|
-
authority,
|
|
76
|
-
identity
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
if (encrypted instanceof Error) throw encrypted
|
|
80
|
-
|
|
81
|
-
await assert.partialDeepStrictEqual(await decrypt.execute(encrypted), {
|
|
82
|
-
iss: authority,
|
|
83
|
-
identity
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
await timeout(context.configuration.lifetime * 1000)
|
|
87
|
-
|
|
88
|
-
const thrown: any = await decrypt.execute(encrypted)
|
|
89
|
-
assert.deepStrictEqual(thrown.code, 'INVALID_TOKEN')
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it('should encrypt with given lifetime', async () => {
|
|
93
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
94
|
-
const lifetime = 0.1
|
|
95
|
-
|
|
96
|
-
const encrypted = await encrypt.execute({
|
|
97
|
-
authority,
|
|
98
|
-
identity,
|
|
99
|
-
lifetime
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
if (encrypted instanceof Error) throw encrypted
|
|
103
|
-
|
|
104
|
-
await assert.partialDeepStrictEqual(await decrypt.execute(encrypted), {
|
|
105
|
-
iss: authority,
|
|
106
|
-
identity
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
await timeout(lifetime * 1000)
|
|
110
|
-
|
|
111
|
-
const thrown: any = await decrypt.execute(encrypted)
|
|
112
|
-
assert.deepStrictEqual(thrown.code, 'INVALID_TOKEN')
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
it('should encrypt without lifetime INSECURE', async () => {
|
|
116
|
-
const identity: Identity = { id: generate(), roles: [] }
|
|
117
|
-
const lifetime = 0
|
|
118
|
-
|
|
119
|
-
const encrypted = await encrypt.execute({
|
|
120
|
-
authority,
|
|
121
|
-
identity,
|
|
122
|
-
lifetime
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
if (encrypted instanceof Error) throw encrypted
|
|
126
|
-
|
|
127
|
-
const decrypted = await decrypt.execute(encrypted)
|
|
128
|
-
|
|
129
|
-
assert.ok(!(decrypted instanceof Error))
|
|
130
|
-
|
|
131
|
-
assert.partialDeepStrictEqual(decrypted.identity, identity)
|
|
132
|
-
})
|
|
133
|
-
|
|
134
|
-
it('should keep the identity permissions when none are given', async () => {
|
|
135
|
-
const permissions = { '/notes/': ['GET'] }
|
|
136
|
-
const identity: Identity = { id: generate(), roles: [], permissions }
|
|
137
|
-
|
|
138
|
-
const encrypted = await encrypt.execute({ authority, identity, lifetime: 100 })
|
|
139
|
-
|
|
140
|
-
if (encrypted instanceof Error) throw encrypted
|
|
141
|
-
|
|
142
|
-
const decrypted = await decrypt.execute(encrypted)
|
|
143
|
-
|
|
144
|
-
assert.ok(!(decrypted instanceof Error))
|
|
145
|
-
assert.deepStrictEqual(decrypted.identity.permissions, permissions)
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
function secret(value: string): Secret {
|
|
149
|
-
return { unwrap: () => value }
|
|
150
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { it, beforeEach, mock } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { generate } from 'randomstring'
|
|
5
|
-
import { Effect as Issue } from './issue.js'
|
|
6
|
-
import type { Context, EncryptInput } from './lib/index.js'
|
|
7
|
-
|
|
8
|
-
const LIFETIME = 2592000 // seconds, the configured default
|
|
9
|
-
const identity = generate()
|
|
10
|
-
const authority = generate()
|
|
11
|
-
const label = generate()
|
|
12
|
-
|
|
13
|
-
let issue: Issue
|
|
14
|
-
let encrypted: EncryptInput
|
|
15
|
-
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
const context = {
|
|
18
|
-
configuration: { lifetime: LIFETIME },
|
|
19
|
-
remote: {
|
|
20
|
-
identity: {
|
|
21
|
-
keys: { create: mock.fn(async () => ({ id: 'kid0', key: 'secret' })) },
|
|
22
|
-
roles: { list: mock.fn(async () => []) }
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
local: {
|
|
26
|
-
encrypt: mock.fn(async ({ input }: { input: EncryptInput }) => {
|
|
27
|
-
encrypted = input
|
|
28
|
-
|
|
29
|
-
return 'token'
|
|
30
|
-
})
|
|
31
|
-
}
|
|
32
|
-
} as unknown as Context
|
|
33
|
-
|
|
34
|
-
issue = new Issue()
|
|
35
|
-
issue.mount(context)
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* The configured lifetime is seconds, as the schema says and as `encrypt` reads it. Storing
|
|
40
|
-
* it as milliseconds and then multiplying again put the expiration some eighty thousand years
|
|
41
|
-
* out, and only on this path — every scenario passes a lifetime of its own.
|
|
42
|
-
*/
|
|
43
|
-
it('should expire a token issued without a lifetime as the configuration says', async () => {
|
|
44
|
-
const now = Date.now()
|
|
45
|
-
const reply: any = await issue.execute({ authority, identity, label })
|
|
46
|
-
|
|
47
|
-
const seconds = (reply.exp - now) / 1000
|
|
48
|
-
|
|
49
|
-
assert.ok(
|
|
50
|
-
Math.abs(seconds - LIFETIME) < 10,
|
|
51
|
-
`expected to expire in about ${LIFETIME} seconds, got ${seconds}`
|
|
52
|
-
)
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
it('should hand the lifetime to `encrypt` in the seconds it reads', async () => {
|
|
56
|
-
await issue.execute({ authority, identity, label })
|
|
57
|
-
|
|
58
|
-
assert.equal(encrypted.lifetime, LIFETIME)
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
it('should expire a token as its own lifetime says', async () => {
|
|
62
|
-
const now = Date.now()
|
|
63
|
-
const reply: any = await issue.execute({ authority, identity, label, lifetime: 600 })
|
|
64
|
-
|
|
65
|
-
assert.ok(Math.abs((reply.exp - now) / 1000 - 600) < 10)
|
|
66
|
-
assert.equal(encrypted.lifetime, 600)
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
it('should issue a token that does not expire INSECURE', async () => {
|
|
70
|
-
const reply: any = await issue.execute({ authority, identity, label, lifetime: 0 })
|
|
71
|
-
|
|
72
|
-
assert.equal(reply.exp, undefined)
|
|
73
|
-
})
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import { form } from './form.js'
|
|
5
|
-
|
|
6
|
-
it('should recognize a compact JWE by its five segments', () => {
|
|
7
|
-
assert.equal(form('header.key.iv.ciphertext.tag'), 'jwe')
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
it('should recognize a legacy PASETO by its prefix', () => {
|
|
11
|
-
assert.equal(form('v3.local.payload'), 'paseto')
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
it('should not recognize a JWS, which is what an id_token is', () => {
|
|
15
|
-
assert.equal(form('header.payload.signature'), null)
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
it('should not recognize what is not a token at all', () => {
|
|
19
|
-
for (const value of ['', 'token', 'header.key.iv.ciphertext.tag.extra'])
|
|
20
|
-
assert.equal(form(value), null)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
it('should read the shape and nothing else, leaving the rest to the verifier', () => {
|
|
24
|
-
assert.equal(form('....'), 'jwe')
|
|
25
|
-
})
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { it } from 'node:test'
|
|
2
|
-
import assert from 'node:assert/strict'
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
DecryptFactory,
|
|
6
|
-
EncryptFactory,
|
|
7
|
-
ExportKeyFactory,
|
|
8
|
-
GenerateKeyFactory,
|
|
9
|
-
ImportKeyFactory
|
|
10
|
-
} from 'paseto/v3/local'
|
|
11
|
-
|
|
12
|
-
const generateKey = GenerateKeyFactory().run
|
|
13
|
-
const exportKey = ExportKeyFactory().run
|
|
14
|
-
const importKey = ImportKeyFactory().run
|
|
15
|
-
const encrypt = EncryptFactory().run
|
|
16
|
-
const decrypt = DecryptFactory().run
|
|
17
|
-
|
|
18
|
-
it('should export a generated key as PASERK', async () => {
|
|
19
|
-
const paserk = await exportKey(await generateKey({ extractable: true }))
|
|
20
|
-
|
|
21
|
-
assert.match(paserk, /^k3\.local\./)
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
it('should round trip a token', async () => {
|
|
25
|
-
const key = await importKey(await exportKey(await generateKey({ extractable: true })))
|
|
26
|
-
const token = await encrypt(key, { iss: 'test', sub: 'me' })
|
|
27
|
-
|
|
28
|
-
assert.match(token, /^v3\.local\./)
|
|
29
|
-
|
|
30
|
-
const { claims } = await decrypt(key, token, { allowNonExpiring: true })
|
|
31
|
-
|
|
32
|
-
assert.partialDeepStrictEqual(claims, { iss: 'test', sub: 'me' })
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
it('should carry the key id in the footer, which is read without the key', async () => {
|
|
36
|
-
const key = await importKey(await exportKey(await generateKey({ extractable: true })))
|
|
37
|
-
const token = await encrypt(
|
|
38
|
-
key,
|
|
39
|
-
{ iss: 'test' },
|
|
40
|
-
{ footer: new TextEncoder().encode(JSON.stringify({ kid: 'key0' })) }
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
// decrypt reads it, and so does anyone holding only the token
|
|
44
|
-
const [, , , footer] = token.split('.')
|
|
45
|
-
|
|
46
|
-
assert.deepStrictEqual(JSON.parse(Buffer.from(footer, 'base64url').toString()), {
|
|
47
|
-
kid: 'key0'
|
|
48
|
-
})
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it('should decrypt a token issued under paseto 3', async () => {
|
|
52
|
-
// both written by paseto 3.1.4: the legacy path exists to read tokens already in the wild
|
|
53
|
-
const key = await importKey('k3.local.m28p8SrbS467t-2IUjQuSOqmjvi24TbXhyjAW_dOrog')
|
|
54
|
-
const token =
|
|
55
|
-
'v3.local.Fm7vzrYSDh7Kc9j_2eNr4vwWw5jSEOIKrh_vCbteQQP57tFo5xxk7koNIJQNcH9b' +
|
|
56
|
-
'O4yH9ItoC-fWL3ycm-YqBIsadjfbSOvwhffP130-tw3MZZ5PNJzFe6afNa4wxbKpa1bWtOwwULJpAqmZ' +
|
|
57
|
-
'.eyJraWQiOiJsZWdhY3kwIn0'
|
|
58
|
-
|
|
59
|
-
const { claims } = await decrypt(key, token, { allowNonExpiring: true })
|
|
60
|
-
|
|
61
|
-
assert.partialDeepStrictEqual(claims, { iss: 'legacy', sub: 'old' })
|
|
62
|
-
})
|