@toa.io/extensions.exposition 0.24.0-alpha.9 → 1.0.0-alpha.10
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/context.toa.yaml +12 -0
- package/components/identity.bans/manifest.toa.yaml +2 -1
- package/components/identity.basic/manifest.toa.yaml +5 -1
- package/components/identity.basic/operations/authenticate.js +1 -2
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/source/authenticate.ts +0 -1
- package/components/identity.federation/events/principal.js +22 -0
- package/components/identity.federation/manifest.toa.yaml +94 -0
- package/components/identity.federation/operations/authenticate.d.ts +3 -0
- package/components/identity.federation/operations/authenticate.js +20 -0
- package/components/identity.federation/operations/authenticate.js.map +1 -0
- package/components/identity.federation/operations/create.d.ts +10 -0
- package/components/identity.federation/operations/create.js +15 -0
- package/components/identity.federation/operations/create.js.map +1 -0
- package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
- package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
- package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
- package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
- package/components/identity.federation/operations/lib/jwt.js +136 -0
- package/components/identity.federation/operations/lib/jwt.js.map +1 -0
- package/components/identity.federation/operations/schemas.d.ts +59 -0
- package/components/identity.federation/operations/schemas.js +9 -0
- package/components/identity.federation/operations/schemas.js.map +1 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.federation/operations/types.d.ts +51 -0
- package/components/identity.federation/operations/types.js +3 -0
- package/components/identity.federation/operations/types.js.map +1 -0
- package/components/identity.federation/source/authenticate.ts +28 -0
- package/components/identity.federation/source/create.ts +26 -0
- package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
- package/components/identity.federation/source/lib/jwt.test.ts +56 -0
- package/components/identity.federation/source/lib/jwt.ts +171 -0
- package/components/identity.federation/source/schemas.ts +61 -0
- package/components/identity.federation/source/types.ts +56 -0
- package/components/identity.federation/tsconfig.json +9 -0
- package/components/identity.roles/manifest.toa.yaml +17 -5
- package/components/identity.roles/operations/grant.d.ts +10 -0
- package/components/identity.roles/operations/grant.js +20 -0
- package/components/identity.roles/operations/grant.js.map +1 -0
- package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
- package/components/identity.roles/operations/lib/Entity.js +3 -0
- package/components/identity.roles/operations/lib/Entity.js.map +1 -0
- package/components/identity.roles/operations/list.d.ts +1 -4
- package/components/identity.roles/operations/list.js.map +1 -1
- package/components/identity.roles/operations/principal.d.ts +4 -6
- package/components/identity.roles/operations/principal.js +6 -1
- package/components/identity.roles/operations/principal.js.map +1 -1
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.roles/source/grant.ts +31 -0
- package/components/identity.roles/source/lib/Entity.ts +5 -0
- package/components/identity.roles/source/list.ts +2 -4
- package/components/identity.roles/source/principal.ts +10 -8
- package/components/identity.tokens/manifest.toa.yaml +1 -1
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/decrypt.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/octets.storage/manifest.toa.yaml +1 -0
- package/components/octets.storage/operations/store.js +3 -3
- package/cucumber.js +0 -1
- package/documentation/access.md +11 -11
- package/documentation/components.md +48 -12
- package/documentation/identity.md +14 -7
- package/documentation/io.md +56 -0
- package/documentation/octets.md +102 -37
- package/documentation/protocol.md +21 -1
- package/documentation/query.md +51 -6
- package/documentation/tree.md +22 -4
- package/documentation/vary.md +69 -0
- package/features/access.feature +13 -2
- package/features/annotation.feature +1 -0
- package/features/body.feature +3 -1
- package/features/cache.feature +3 -0
- package/features/cors.feature +72 -0
- package/features/directives.feature +2 -0
- package/features/dynamic.feature +14 -7
- package/features/errors.feature +4 -3
- package/features/etag.feature +97 -0
- package/features/identity.basic.feature +68 -0
- package/features/identity.feature +19 -3
- package/features/identity.federation.feature +153 -0
- package/features/identity.roles.feature +151 -0
- package/features/identity.tokens.feature +3 -0
- package/features/io.feature +167 -0
- package/features/octets.entries.feature +123 -0
- package/features/octets.feature +4 -28
- package/features/octets.meta.feature +66 -0
- package/features/octets.workflows.feature +177 -4
- package/features/queries.feature +9 -1
- package/features/response.feature +68 -0
- package/features/routes.feature +54 -10
- package/features/steps/Captures.ts +6 -0
- package/features/steps/Components.ts +18 -6
- package/features/steps/Database.ts +1 -1
- package/features/steps/Gateway.ts +4 -2
- package/features/steps/HTTP.ts +34 -6
- package/features/steps/IdP.ts +149 -0
- package/features/steps/Parameters.ts +8 -2
- package/features/steps/Workspace.ts +5 -7
- package/features/steps/components/echo/manifest.toa.yaml +1 -0
- package/features/steps/components/echo/operations/error.js +11 -0
- package/features/steps/components/greeter/manifest.toa.yaml +1 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
- package/features/steps/components/octets.tester/operations/concat.js +7 -0
- package/features/steps/components/octets.tester/operations/echo.js +7 -0
- package/features/steps/components/pots/manifest.toa.yaml +12 -3
- package/features/steps/components/sequences/manifest.toa.yaml +1 -0
- package/features/steps/components/users/manifest.toa.yaml +4 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
- package/features/steps/tsconfig.json +1 -1
- package/features/timing.feature +66 -0
- package/features/vary.feature +180 -0
- package/package.json +16 -20
- package/readme.md +7 -6
- package/schemas/annotation.cos.yaml +1 -0
- package/schemas/io/input.cos.yaml +3 -0
- package/schemas/io/message.cos.yaml +5 -0
- package/schemas/io/output.cos.yaml +5 -0
- package/schemas/octets/delete.cos.yaml +2 -1
- package/schemas/octets/list.cos.yaml +2 -1
- package/schemas/octets/workflow.cos.yaml +12 -0
- package/schemas/querystring.cos.yaml +1 -0
- package/source/Annotation.ts +1 -0
- package/source/Context.ts +6 -4
- package/source/Directive.test.ts +14 -8
- package/source/Directive.ts +26 -49
- package/source/Endpoint.ts +53 -6
- package/source/Factory.ts +23 -12
- package/source/Gateway.ts +45 -42
- package/source/HTTP/Context.ts +67 -0
- package/source/HTTP/Server.test.ts +61 -134
- package/source/HTTP/Server.ts +83 -87
- package/source/HTTP/Timing.ts +40 -0
- package/source/HTTP/formats/msgpack.ts +9 -6
- package/source/HTTP/formats/text.ts +1 -1
- package/source/HTTP/formats/yaml.ts +1 -1
- package/source/HTTP/index.ts +1 -0
- package/source/HTTP/messages.test.ts +27 -8
- package/source/HTTP/messages.ts +38 -42
- package/source/Interception.ts +24 -0
- package/source/Mapping.ts +7 -8
- package/source/RTD/Context.ts +7 -10
- package/source/RTD/Directives.ts +28 -4
- package/source/RTD/Endpoint.ts +6 -4
- package/source/RTD/Match.ts +2 -7
- package/source/RTD/Method.ts +7 -13
- package/source/RTD/Node.ts +13 -14
- package/source/RTD/Tree.ts +19 -15
- package/source/RTD/factory.ts +2 -5
- package/source/RTD/syntax/parse.ts +6 -6
- package/source/RTD/syntax/types.ts +1 -1
- package/source/deployment.ts +7 -2
- package/source/directives/auth/Anonymous.ts +3 -2
- package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
- package/source/directives/auth/Delegate.ts +32 -0
- package/source/directives/auth/Incept.ts +11 -6
- package/source/directives/auth/Role.ts +5 -3
- package/source/directives/auth/Rule.ts +2 -2
- package/source/directives/auth/Scheme.ts +2 -2
- package/source/directives/auth/index.ts +2 -2
- package/source/directives/auth/schemes.ts +2 -1
- package/source/directives/auth/types.ts +9 -6
- package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
- package/source/directives/cache/Control.ts +5 -5
- package/source/directives/cache/index.ts +2 -2
- package/source/directives/cache/types.ts +2 -2
- package/source/directives/cors/CORS.ts +62 -0
- package/source/directives/cors/index.ts +3 -0
- package/source/directives/dev/{Family.ts → Development.ts} +4 -5
- package/source/directives/dev/Stub.ts +4 -4
- package/source/directives/dev/Throw.ts +4 -4
- package/source/directives/dev/index.ts +2 -2
- package/source/directives/dev/types.ts +1 -1
- package/source/directives/index.ts +11 -6
- package/source/directives/io/Directive.ts +11 -0
- package/source/directives/io/IO.ts +43 -0
- package/source/directives/io/Input.ts +50 -0
- package/source/directives/io/Message.ts +1 -0
- package/source/directives/io/Output.ts +69 -0
- package/source/directives/io/index.ts +3 -0
- package/source/directives/io/schemas.ts +12 -0
- package/source/directives/octets/Context.ts +6 -5
- package/source/directives/octets/Delete.ts +64 -11
- package/source/directives/octets/Directive.ts +10 -0
- package/source/directives/octets/Fetch.ts +44 -29
- package/source/directives/octets/List.ts +50 -10
- package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
- package/source/directives/octets/Permute.ts +18 -11
- package/source/directives/octets/Store.ts +70 -102
- package/source/directives/octets/Workflow.ts +48 -0
- package/source/directives/octets/index.ts +2 -2
- package/source/directives/octets/schemas.test.ts +21 -0
- package/source/directives/octets/schemas.ts +13 -6
- package/source/directives/octets/types.ts +2 -8
- package/source/directives/octets/workflows/Execution.ts +76 -0
- package/source/directives/octets/workflows/Workflow.ts +37 -0
- package/source/directives/octets/workflows/index.ts +1 -0
- package/source/directives/vary/Directive.ts +6 -0
- package/source/directives/vary/Embed.ts +62 -0
- package/source/directives/vary/Properties.ts +17 -0
- package/source/directives/vary/Vary.ts +48 -0
- package/source/directives/vary/embeddings/Embedding.ts +6 -0
- package/source/directives/vary/embeddings/Header.ts +32 -0
- package/source/directives/vary/embeddings/Language.ts +31 -0
- package/source/directives/vary/embeddings/index.ts +11 -0
- package/source/directives/vary/index.ts +3 -0
- package/source/exceptions.ts +13 -9
- package/source/io.ts +4 -0
- package/source/manifest.test.ts +6 -14
- package/source/manifest.ts +9 -6
- package/source/root.ts +5 -0
- package/source/schemas.ts +7 -3
- package/transpiled/Annotation.d.ts +1 -0
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Context.d.ts +6 -4
- package/transpiled/Directive.d.ts +11 -25
- package/transpiled/Directive.js +17 -18
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Endpoint.d.ts +7 -5
- package/transpiled/Endpoint.js +58 -2
- package/transpiled/Endpoint.js.map +1 -1
- package/transpiled/Factory.d.ts +0 -1
- package/transpiled/Factory.js +14 -7
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +7 -8
- package/transpiled/Gateway.js +25 -25
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Context.d.ts +24 -0
- package/transpiled/HTTP/Context.js +47 -0
- package/transpiled/HTTP/Context.js.map +1 -0
- package/transpiled/HTTP/Server.d.ts +10 -7
- package/transpiled/HTTP/Server.js +80 -70
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/Timing.d.ts +10 -0
- package/transpiled/HTTP/Timing.js +29 -0
- package/transpiled/HTTP/Timing.js.map +1 -0
- package/transpiled/HTTP/formats/msgpack.d.ts +2 -2
- package/transpiled/HTTP/formats/msgpack.js +8 -29
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.d.ts +3 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +1 -1
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/index.d.ts +1 -0
- package/transpiled/HTTP/index.js +1 -0
- package/transpiled/HTTP/index.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +7 -16
- package/transpiled/HTTP/messages.js +28 -25
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.d.ts +9 -0
- package/transpiled/Interception.js +19 -0
- package/transpiled/Interception.js.map +1 -0
- package/transpiled/Mapping.js +7 -7
- package/transpiled/Mapping.js.map +1 -1
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Context.d.ts +7 -6
- package/transpiled/RTD/Directives.d.ts +19 -4
- package/transpiled/RTD/Endpoint.d.ts +6 -4
- package/transpiled/RTD/Match.d.ts +2 -4
- package/transpiled/RTD/Method.d.ts +7 -7
- package/transpiled/RTD/Method.js.map +1 -1
- package/transpiled/RTD/Node.d.ts +4 -6
- package/transpiled/RTD/Node.js +2 -1
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.d.ts +6 -6
- package/transpiled/RTD/Tree.js +5 -0
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/factory.d.ts +2 -4
- package/transpiled/RTD/factory.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.js +1 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/deployment.js +6 -2
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/Anonymous.js +3 -4
- package/transpiled/directives/auth/Anonymous.js.map +1 -1
- package/transpiled/directives/auth/{Family.d.ts → Authorization.d.ts} +4 -5
- package/transpiled/directives/auth/{Family.js → Authorization.js} +22 -13
- package/transpiled/directives/auth/Authorization.js.map +1 -0
- package/transpiled/directives/auth/Delegate.d.ts +8 -0
- package/transpiled/directives/auth/Delegate.js +27 -0
- package/transpiled/directives/auth/Delegate.js.map +1 -0
- package/transpiled/directives/auth/Incept.d.ts +1 -1
- package/transpiled/directives/auth/Incept.js +11 -6
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.js +5 -3
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.d.ts +2 -2
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/Scheme.js +2 -2
- package/transpiled/directives/auth/Scheme.js.map +1 -1
- package/transpiled/directives/auth/index.d.ts +2 -2
- package/transpiled/directives/auth/index.js +4 -5
- package/transpiled/directives/auth/index.js.map +1 -1
- package/transpiled/directives/auth/schemes.js +2 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +4 -4
- package/transpiled/directives/cache/Cache.d.ts +11 -0
- package/transpiled/directives/cache/{Family.js → Cache.js} +6 -4
- package/transpiled/directives/cache/Cache.js.map +1 -0
- package/transpiled/directives/cache/Control.d.ts +3 -3
- package/transpiled/directives/cache/Control.js +3 -3
- package/transpiled/directives/cache/Control.js.map +1 -1
- package/transpiled/directives/cache/index.d.ts +2 -2
- package/transpiled/directives/cache/index.js +4 -5
- package/transpiled/directives/cache/index.js.map +1 -1
- package/transpiled/directives/cache/types.d.ts +2 -2
- package/transpiled/directives/cors/CORS.d.ts +10 -0
- package/transpiled/directives/cors/CORS.js +51 -0
- package/transpiled/directives/cors/CORS.js.map +1 -0
- package/transpiled/directives/cors/index.d.ts +2 -0
- package/transpiled/directives/cors/index.js +6 -0
- package/transpiled/directives/cors/index.js.map +1 -0
- package/transpiled/directives/dev/Development.d.ts +9 -0
- package/transpiled/directives/dev/{Family.js → Development.js} +4 -2
- package/transpiled/directives/dev/Development.js.map +1 -0
- package/transpiled/directives/dev/Stub.d.ts +3 -3
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.d.ts +3 -3
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/dev/index.d.ts +2 -2
- package/transpiled/directives/dev/index.js +4 -5
- package/transpiled/directives/dev/index.js.map +1 -1
- package/transpiled/directives/dev/types.d.ts +1 -1
- package/transpiled/directives/index.d.ts +4 -2
- package/transpiled/directives/index.js +10 -9
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/io/Directive.d.ts +8 -0
- package/transpiled/directives/io/Directive.js +3 -0
- package/transpiled/directives/io/Directive.js.map +1 -0
- package/transpiled/directives/io/IO.d.ts +9 -0
- package/transpiled/directives/io/IO.js +33 -0
- package/transpiled/directives/io/IO.js.map +1 -0
- package/transpiled/directives/io/Input.d.ts +11 -0
- package/transpiled/directives/io/Input.js +63 -0
- package/transpiled/directives/io/Input.js.map +1 -0
- package/transpiled/directives/io/Message.d.ts +1 -0
- package/transpiled/directives/io/Message.js +3 -0
- package/transpiled/directives/io/Message.js.map +1 -0
- package/transpiled/directives/io/Output.d.ts +13 -0
- package/transpiled/directives/io/Output.js +76 -0
- package/transpiled/directives/io/Output.js.map +1 -0
- package/transpiled/directives/io/index.d.ts +2 -0
- package/transpiled/directives/io/index.js +6 -0
- package/transpiled/directives/io/index.js.map +1 -0
- package/transpiled/directives/io/schemas.d.ts +7 -0
- package/transpiled/directives/io/schemas.js +14 -0
- package/transpiled/directives/io/schemas.js.map +1 -0
- package/transpiled/directives/octets/Context.d.ts +5 -5
- package/transpiled/directives/octets/Context.js +4 -2
- package/transpiled/directives/octets/Context.js.map +1 -1
- package/transpiled/directives/octets/Delete.d.ts +15 -5
- package/transpiled/directives/octets/Delete.js +45 -8
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Directive.d.ts +8 -0
- package/transpiled/directives/octets/Directive.js +8 -0
- package/transpiled/directives/octets/Directive.js.map +1 -0
- package/transpiled/directives/octets/Fetch.d.ts +9 -9
- package/transpiled/directives/octets/Fetch.js +36 -21
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +11 -5
- package/transpiled/directives/octets/List.js +34 -7
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +12 -0
- package/transpiled/directives/octets/{Family.js → Octets.js} +12 -6
- package/transpiled/directives/octets/Octets.js.map +1 -0
- package/transpiled/directives/octets/Permute.d.ts +5 -4
- package/transpiled/directives/octets/Permute.js +15 -8
- package/transpiled/directives/octets/Permute.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +14 -23
- package/transpiled/directives/octets/Store.js +41 -70
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/Workflow.d.ts +15 -0
- package/transpiled/directives/octets/Workflow.js +59 -0
- package/transpiled/directives/octets/Workflow.js.map +1 -0
- package/transpiled/directives/octets/index.d.ts +2 -2
- package/transpiled/directives/octets/index.js +4 -5
- package/transpiled/directives/octets/index.js.map +1 -1
- package/transpiled/directives/octets/schemas.d.ts +13 -6
- package/transpiled/directives/octets/schemas.js +2 -1
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +2 -6
- package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
- package/transpiled/directives/octets/workflows/Execution.js +54 -0
- package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
- package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
- package/transpiled/directives/octets/workflows/Workflow.js +25 -0
- package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
- package/transpiled/directives/octets/workflows/index.d.ts +1 -0
- package/transpiled/directives/octets/workflows/index.js +6 -0
- package/transpiled/directives/octets/workflows/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +5 -0
- package/transpiled/directives/vary/Directive.js +3 -0
- package/transpiled/directives/vary/Directive.js.map +1 -0
- package/transpiled/directives/vary/Embed.d.ts +10 -0
- package/transpiled/directives/vary/Embed.js +49 -0
- package/transpiled/directives/vary/Embed.js.map +1 -0
- package/transpiled/directives/vary/Properties.d.ts +9 -0
- package/transpiled/directives/vary/Properties.js +16 -0
- package/transpiled/directives/vary/Properties.js.map +1 -0
- package/transpiled/directives/vary/Vary.d.ts +10 -0
- package/transpiled/directives/vary/Vary.js +36 -0
- package/transpiled/directives/vary/Vary.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
- package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Header.js +28 -0
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Language.js +28 -0
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/index.js +10 -0
- package/transpiled/directives/vary/embeddings/index.js.map +1 -0
- package/transpiled/directives/vary/index.d.ts +2 -0
- package/transpiled/directives/vary/index.js +6 -0
- package/transpiled/directives/vary/index.js.map +1 -0
- package/transpiled/exceptions.js +7 -7
- package/transpiled/exceptions.js.map +1 -1
- package/transpiled/io.d.ts +3 -0
- package/transpiled/io.js +3 -0
- package/transpiled/io.js.map +1 -0
- package/transpiled/manifest.js +10 -5
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/root.js +5 -0
- package/transpiled/root.js.map +1 -1
- package/transpiled/schemas.d.ts +7 -3
- package/transpiled/schemas.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/source/HTTP/Server.fixtures.ts +0 -41
- package/transpiled/HTTP/Server.fixtures.d.ts +0 -11
- package/transpiled/HTTP/Server.fixtures.js +0 -32
- package/transpiled/HTTP/Server.fixtures.js.map +0 -1
- package/transpiled/directives/auth/Family.js.map +0 -1
- package/transpiled/directives/cache/Family.d.ts +0 -12
- package/transpiled/directives/cache/Family.js.map +0 -1
- package/transpiled/directives/dev/Family.d.ts +0 -10
- package/transpiled/directives/dev/Family.js.map +0 -1
- package/transpiled/directives/octets/Family.d.ts +0 -12
- package/transpiled/directives/octets/Family.js.map +0 -1
package/features/dynamic.feature
CHANGED
|
@@ -11,6 +11,7 @@ Feature: Dynamic tree updates
|
|
|
11
11
|
"""yaml
|
|
12
12
|
exposition:
|
|
13
13
|
/:
|
|
14
|
+
io:output: true
|
|
14
15
|
isolated: true
|
|
15
16
|
GET: enumerate
|
|
16
17
|
"""
|
|
@@ -27,6 +28,7 @@ Feature: Dynamic tree updates
|
|
|
27
28
|
"""yaml
|
|
28
29
|
exposition:
|
|
29
30
|
/:
|
|
31
|
+
io:output: true
|
|
30
32
|
GET: enumerate
|
|
31
33
|
"""
|
|
32
34
|
When the following request is received:
|
|
@@ -44,19 +46,22 @@ Feature: Dynamic tree updates
|
|
|
44
46
|
"""yaml
|
|
45
47
|
exposition:
|
|
46
48
|
/:id:
|
|
49
|
+
io:output: true
|
|
47
50
|
GET: observe
|
|
48
51
|
"""
|
|
49
52
|
Then the `pots` is stopped
|
|
50
53
|
Then the `pots` is running with the following manifest:
|
|
51
54
|
"""yaml
|
|
52
55
|
exposition:
|
|
53
|
-
/:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
/:
|
|
57
|
+
io:output: true
|
|
58
|
+
/:id:
|
|
59
|
+
GET: observe
|
|
60
|
+
/big:
|
|
61
|
+
GET:
|
|
62
|
+
endpoint: enumerate
|
|
63
|
+
query:
|
|
64
|
+
criteria: volume>200
|
|
60
65
|
"""
|
|
61
66
|
When the following request is received:
|
|
62
67
|
"""
|
|
@@ -73,6 +78,7 @@ Feature: Dynamic tree updates
|
|
|
73
78
|
"""yaml
|
|
74
79
|
exposition:
|
|
75
80
|
/big:
|
|
81
|
+
io:output: true
|
|
76
82
|
GET:
|
|
77
83
|
endpoint: enumerate
|
|
78
84
|
query:
|
|
@@ -83,6 +89,7 @@ Feature: Dynamic tree updates
|
|
|
83
89
|
"""yaml
|
|
84
90
|
exposition:
|
|
85
91
|
/big:
|
|
92
|
+
io:output: true
|
|
86
93
|
GET:
|
|
87
94
|
endpoint: enumerate
|
|
88
95
|
query:
|
package/features/errors.feature
CHANGED
|
@@ -46,7 +46,7 @@ Feature: Errors
|
|
|
46
46
|
accept: application/yaml
|
|
47
47
|
"""
|
|
48
48
|
Then the following reply is sent:
|
|
49
|
-
"""
|
|
49
|
+
"""
|
|
50
50
|
405 Method Not Allowed
|
|
51
51
|
"""
|
|
52
52
|
|
|
@@ -57,7 +57,7 @@ Feature: Errors
|
|
|
57
57
|
accept: application/yaml
|
|
58
58
|
"""
|
|
59
59
|
Then the following reply is sent:
|
|
60
|
-
"""
|
|
60
|
+
"""
|
|
61
61
|
501 Not Implemented
|
|
62
62
|
"""
|
|
63
63
|
|
|
@@ -66,7 +66,7 @@ Feature: Errors
|
|
|
66
66
|
"""yaml
|
|
67
67
|
exposition:
|
|
68
68
|
/:
|
|
69
|
-
POST:
|
|
69
|
+
POST: create
|
|
70
70
|
"""
|
|
71
71
|
When the following request is received:
|
|
72
72
|
"""
|
|
@@ -197,6 +197,7 @@ Feature: Errors
|
|
|
197
197
|
"""yaml
|
|
198
198
|
/:
|
|
199
199
|
GET:
|
|
200
|
+
io:output: true
|
|
200
201
|
anonymous: true
|
|
201
202
|
dev:stub: hello
|
|
202
203
|
"""
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
Feature: Optimistic concurrency control
|
|
2
|
+
|
|
3
|
+
Scenario: Using `etag`
|
|
4
|
+
Given the `pots` is running with the following manifest:
|
|
5
|
+
"""yaml
|
|
6
|
+
exposition:
|
|
7
|
+
/:
|
|
8
|
+
io:output: true
|
|
9
|
+
POST: create
|
|
10
|
+
/:id:
|
|
11
|
+
GET: observe
|
|
12
|
+
PUT: transit
|
|
13
|
+
"""
|
|
14
|
+
When the following request is received:
|
|
15
|
+
"""
|
|
16
|
+
POST /pots/ HTTP/1.1
|
|
17
|
+
accept: application/yaml
|
|
18
|
+
content-type: application/yaml
|
|
19
|
+
|
|
20
|
+
title: Hello
|
|
21
|
+
volume: 1.5
|
|
22
|
+
"""
|
|
23
|
+
Then the following reply is sent:
|
|
24
|
+
"""
|
|
25
|
+
201 Created
|
|
26
|
+
etag: "1"
|
|
27
|
+
|
|
28
|
+
id: ${{ id }}
|
|
29
|
+
"""
|
|
30
|
+
When the following request is received:
|
|
31
|
+
"""
|
|
32
|
+
GET /pots/${{ id }}/ HTTP/1.1
|
|
33
|
+
"""
|
|
34
|
+
Then the following reply is sent:
|
|
35
|
+
"""
|
|
36
|
+
200 OK
|
|
37
|
+
etag: "1"
|
|
38
|
+
"""
|
|
39
|
+
When the following request is received:
|
|
40
|
+
"""
|
|
41
|
+
GET /pots/${{ id }}/ HTTP/1.1
|
|
42
|
+
if-none-match: "1"
|
|
43
|
+
"""
|
|
44
|
+
Then the following reply is sent:
|
|
45
|
+
"""
|
|
46
|
+
304 Not Modified
|
|
47
|
+
etag: "1"
|
|
48
|
+
"""
|
|
49
|
+
When the following request is received:
|
|
50
|
+
"""
|
|
51
|
+
PUT /pots/${{ id }}/ HTTP/1.1
|
|
52
|
+
content-type: application/yaml
|
|
53
|
+
if-match: "38"
|
|
54
|
+
|
|
55
|
+
volume: 2.5
|
|
56
|
+
"""
|
|
57
|
+
Then the following reply is sent:
|
|
58
|
+
"""
|
|
59
|
+
412 Precondition Failed
|
|
60
|
+
"""
|
|
61
|
+
When the following request is received:
|
|
62
|
+
"""
|
|
63
|
+
PUT /pots/${{ id }}/ HTTP/1.1
|
|
64
|
+
content-type: application/yaml
|
|
65
|
+
if-match: "1"
|
|
66
|
+
|
|
67
|
+
volume: 2.5
|
|
68
|
+
"""
|
|
69
|
+
Then the following reply is sent:
|
|
70
|
+
"""
|
|
71
|
+
200 OK
|
|
72
|
+
etag: "2"
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
Scenario: Unexpected `if-match` format
|
|
76
|
+
Given the `pots` is running with the following manifest:
|
|
77
|
+
"""yaml
|
|
78
|
+
exposition:
|
|
79
|
+
/:
|
|
80
|
+
/:id:
|
|
81
|
+
PUT: transit
|
|
82
|
+
"""
|
|
83
|
+
When the following request is received:
|
|
84
|
+
"""
|
|
85
|
+
PUT /pots/fa177da8393544139915795816ad6b97/ HTTP/1.1
|
|
86
|
+
accept: text/plain
|
|
87
|
+
content-type: application/yaml
|
|
88
|
+
if-match: "oopsie"
|
|
89
|
+
|
|
90
|
+
volume: 2.5
|
|
91
|
+
"""
|
|
92
|
+
Then the following reply is sent:
|
|
93
|
+
"""
|
|
94
|
+
400 Bad Request
|
|
95
|
+
|
|
96
|
+
Invalid ETag.
|
|
97
|
+
"""
|
|
@@ -16,12 +16,28 @@ Feature: Basic authentication
|
|
|
16
16
|
"""
|
|
17
17
|
201 Created
|
|
18
18
|
"""
|
|
19
|
+
When the following request is received:
|
|
20
|
+
"""
|
|
21
|
+
POST /identity/basic/ HTTP/1.1
|
|
22
|
+
content-type: application/yaml
|
|
23
|
+
accept: application/yaml
|
|
24
|
+
|
|
25
|
+
username: developer
|
|
26
|
+
password: secret#1234
|
|
27
|
+
"""
|
|
28
|
+
Then the following reply is sent:
|
|
29
|
+
"""
|
|
30
|
+
409 Conflict
|
|
31
|
+
|
|
32
|
+
- username
|
|
33
|
+
"""
|
|
19
34
|
|
|
20
35
|
Scenario: Creating new Identity using inception
|
|
21
36
|
Given the `users` is running with the following manifest:
|
|
22
37
|
"""yaml
|
|
23
38
|
exposition:
|
|
24
39
|
/:
|
|
40
|
+
io:output: true
|
|
25
41
|
anonymous: true # checking compatibility with anonymous access
|
|
26
42
|
POST:
|
|
27
43
|
incept: id
|
|
@@ -67,11 +83,42 @@ Feature: Basic authentication
|
|
|
67
83
|
"""
|
|
68
84
|
200 OK
|
|
69
85
|
"""
|
|
86
|
+
# username is taken
|
|
87
|
+
When the following request is received:
|
|
88
|
+
"""
|
|
89
|
+
POST /users/ HTTP/1.1
|
|
90
|
+
authorization: Basic dXNlcjphbm90aGVycGFzczEyMzQ=
|
|
91
|
+
accept: application/yaml
|
|
92
|
+
content-type: application/yaml
|
|
93
|
+
|
|
94
|
+
name: Bill Smith
|
|
95
|
+
"""
|
|
96
|
+
Then the following reply is sent:
|
|
97
|
+
"""
|
|
98
|
+
409 Conflict
|
|
99
|
+
|
|
100
|
+
- username
|
|
101
|
+
"""
|
|
102
|
+
# credentials already exists
|
|
103
|
+
When the following request is received:
|
|
104
|
+
"""
|
|
105
|
+
POST /users/ HTTP/1.1
|
|
106
|
+
authorization: Basic dXNlcjpwYXNzMTIzNA==
|
|
107
|
+
accept: application/yaml
|
|
108
|
+
content-type: application/yaml
|
|
109
|
+
|
|
110
|
+
name: Bill Smith
|
|
111
|
+
"""
|
|
112
|
+
Then the following reply is sent:
|
|
113
|
+
"""
|
|
114
|
+
403 Forbidden
|
|
115
|
+
"""
|
|
70
116
|
|
|
71
117
|
Scenario: Changing the password
|
|
72
118
|
Given the annotation:
|
|
73
119
|
"""yaml
|
|
74
120
|
/:
|
|
121
|
+
io:output: true
|
|
75
122
|
/:id:
|
|
76
123
|
id: id
|
|
77
124
|
GET:
|
|
@@ -115,6 +162,25 @@ Feature: Basic authentication
|
|
|
115
162
|
200 OK
|
|
116
163
|
"""
|
|
117
164
|
|
|
165
|
+
Scenario: Changing other identity the password
|
|
166
|
+
Given the `identity.basic` database contains:
|
|
167
|
+
| _id | username | password | _version |
|
|
168
|
+
| efe3a65ebbee47ed95a73edd911ea328 | developer | $2b$10$ZRSKkgZoGnrcTNA5w5eCcu3pxDzdTduhteVYXcp56AaNcilNkwJ.O | 1 |
|
|
169
|
+
| 6c0be50cbfb043acafe69cc7d3895f84 | attacker | $2b$10$ZRSKkgZoGnrcTNA5w5eCcu3pxDzdTduhteVYXcp56AaNcilNkwJ.O | 1 |
|
|
170
|
+
When the following request is received:
|
|
171
|
+
"""
|
|
172
|
+
PATCH /identity/basic/efe3a65ebbee47ed95a73edd911ea328/ HTTP/1.1
|
|
173
|
+
authorization: Basic YXR0YWNrZXI6c2VjcmV0
|
|
174
|
+
accept: application/yaml
|
|
175
|
+
content-type: application/yaml
|
|
176
|
+
|
|
177
|
+
password: new-secret
|
|
178
|
+
"""
|
|
179
|
+
Then the following reply is sent:
|
|
180
|
+
"""
|
|
181
|
+
403 Forbidden
|
|
182
|
+
"""
|
|
183
|
+
|
|
118
184
|
Scenario Outline: <problem> not meeting the requirements
|
|
119
185
|
When the following request is received:
|
|
120
186
|
"""
|
|
@@ -173,6 +239,7 @@ Feature: Basic authentication
|
|
|
173
239
|
And the annotation:
|
|
174
240
|
"""yaml
|
|
175
241
|
/:
|
|
242
|
+
io:output: true
|
|
176
243
|
GET:
|
|
177
244
|
auth:role: system:stub
|
|
178
245
|
dev:stub:
|
|
@@ -244,6 +311,7 @@ Feature: Basic authentication
|
|
|
244
311
|
"""yaml
|
|
245
312
|
exposition:
|
|
246
313
|
/:
|
|
314
|
+
io:output: true
|
|
247
315
|
anonymous: true
|
|
248
316
|
POST:
|
|
249
317
|
incept: id
|
|
@@ -17,7 +17,7 @@ Feature: Identity resource
|
|
|
17
17
|
Then the following reply is sent:
|
|
18
18
|
"""
|
|
19
19
|
200 OK
|
|
20
|
-
authorization: Token ${{ token }}
|
|
20
|
+
authorization: Token ${{ User.token }}
|
|
21
21
|
|
|
22
22
|
id: efe3a65ebbee47ed95a73edd911ea328
|
|
23
23
|
roles:
|
|
@@ -27,14 +27,30 @@ Feature: Identity resource
|
|
|
27
27
|
When the following request is received:
|
|
28
28
|
"""
|
|
29
29
|
GET /identity/ HTTP/1.1
|
|
30
|
-
authorization: Token ${{ token }}
|
|
30
|
+
authorization: Token ${{ User.token }}
|
|
31
31
|
accept: application/yaml
|
|
32
32
|
"""
|
|
33
33
|
Then the following reply is sent:
|
|
34
34
|
"""
|
|
35
35
|
200 OK
|
|
36
36
|
|
|
37
|
-
id:
|
|
37
|
+
id: ${{ User.id }}
|
|
38
|
+
roles:
|
|
39
|
+
- developer
|
|
40
|
+
- system:identity
|
|
41
|
+
"""
|
|
42
|
+
# checking that it returns the same id for given token
|
|
43
|
+
When the following request is received:
|
|
44
|
+
"""
|
|
45
|
+
GET /identity/ HTTP/1.1
|
|
46
|
+
authorization: Token ${{ User.token }}
|
|
47
|
+
accept: application/yaml
|
|
48
|
+
"""
|
|
49
|
+
Then the following reply is sent:
|
|
50
|
+
"""
|
|
51
|
+
200 OK
|
|
52
|
+
|
|
53
|
+
id: ${{ User.id }}
|
|
38
54
|
roles:
|
|
39
55
|
- developer
|
|
40
56
|
- system:identity
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
Feature: Identity Federation
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given the `identity.federation` database is empty
|
|
5
|
+
Given local IDP is running
|
|
6
|
+
|
|
7
|
+
Scenario: Getting identity for a new user
|
|
8
|
+
Given the `identity.federation` configuration:
|
|
9
|
+
"""yaml
|
|
10
|
+
explicit_identity_creation: false
|
|
11
|
+
trust:
|
|
12
|
+
- issuer: http://localhost:44444
|
|
13
|
+
"""
|
|
14
|
+
And the IDP token for User is issued
|
|
15
|
+
When the following request is received:
|
|
16
|
+
"""
|
|
17
|
+
GET /identity/ HTTP/1.1
|
|
18
|
+
authorization: Bearer ${{ User.id_token }}
|
|
19
|
+
accept: application/yaml
|
|
20
|
+
content-type: application/yaml
|
|
21
|
+
"""
|
|
22
|
+
Then the following reply is sent:
|
|
23
|
+
"""
|
|
24
|
+
200 OK
|
|
25
|
+
authorization: Token ${{ User.token }}
|
|
26
|
+
|
|
27
|
+
id: ${{ User.id }}
|
|
28
|
+
roles: []
|
|
29
|
+
"""
|
|
30
|
+
# validate TOKEN
|
|
31
|
+
When the following request is received:
|
|
32
|
+
"""
|
|
33
|
+
GET /identity/ HTTP/1.1
|
|
34
|
+
accept: application/yaml
|
|
35
|
+
authorization: Token ${{ User.token }}
|
|
36
|
+
"""
|
|
37
|
+
Then the following reply is sent:
|
|
38
|
+
"""
|
|
39
|
+
200 OK
|
|
40
|
+
id: ${{ User.id }}
|
|
41
|
+
"""
|
|
42
|
+
# ensuring identity idempotency
|
|
43
|
+
When the following request is received:
|
|
44
|
+
"""
|
|
45
|
+
GET /identity/ HTTP/1.1
|
|
46
|
+
authorization: Bearer ${{ User.id_token }}
|
|
47
|
+
accept: application/yaml
|
|
48
|
+
"""
|
|
49
|
+
Then the following reply is sent:
|
|
50
|
+
"""
|
|
51
|
+
200 OK
|
|
52
|
+
id: ${{ User.id }}
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
Scenario: Getting identity for a user with symmetric tokens
|
|
56
|
+
Given the `identity.federation` configuration:
|
|
57
|
+
"""yaml
|
|
58
|
+
explicit_identity_creation: false
|
|
59
|
+
trust:
|
|
60
|
+
- issuer: http://localhost:44444
|
|
61
|
+
secrets:
|
|
62
|
+
HS384:
|
|
63
|
+
k1: the-secret
|
|
64
|
+
"""
|
|
65
|
+
And the IDP HS384 token for GoodUser is issued with following secret:
|
|
66
|
+
"""
|
|
67
|
+
the-secret
|
|
68
|
+
"""
|
|
69
|
+
When the following request is received:
|
|
70
|
+
"""
|
|
71
|
+
GET /identity/ HTTP/1.1
|
|
72
|
+
authorization: Bearer ${{ GoodUser.id_token }}
|
|
73
|
+
accept: application/yaml
|
|
74
|
+
content-type: application/yaml
|
|
75
|
+
"""
|
|
76
|
+
Then the following reply is sent:
|
|
77
|
+
"""
|
|
78
|
+
200 OK
|
|
79
|
+
authorization: Token ${{ GoodUser.token }}
|
|
80
|
+
|
|
81
|
+
id: ${{ GoodUser.id }}
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
Scenario: Creating an Identity using inception with existing credentials
|
|
85
|
+
Given the `identity.federation` configuration:
|
|
86
|
+
"""yaml
|
|
87
|
+
trust:
|
|
88
|
+
- issuer: http://localhost:44444
|
|
89
|
+
"""
|
|
90
|
+
Given the `users` is running with the following manifest:
|
|
91
|
+
"""yaml
|
|
92
|
+
exposition:
|
|
93
|
+
/:
|
|
94
|
+
anonymous: true
|
|
95
|
+
POST:
|
|
96
|
+
io:output: true
|
|
97
|
+
incept: id
|
|
98
|
+
endpoint: create
|
|
99
|
+
"""
|
|
100
|
+
And the IDP token for Bill is issued
|
|
101
|
+
When the following request is received:
|
|
102
|
+
# identity inception
|
|
103
|
+
"""
|
|
104
|
+
POST /users/ HTTP/1.1
|
|
105
|
+
authorization: Bearer ${{ Bill.id_token }}
|
|
106
|
+
accept: application/yaml
|
|
107
|
+
content-type: application/yaml
|
|
108
|
+
|
|
109
|
+
name: Bill Smith
|
|
110
|
+
"""
|
|
111
|
+
Then the following reply is sent:
|
|
112
|
+
"""
|
|
113
|
+
201 Created
|
|
114
|
+
authorization: Token ${{ Bill.token }}
|
|
115
|
+
|
|
116
|
+
id: ${{ Bill.id }}
|
|
117
|
+
"""
|
|
118
|
+
# check that both tokens corresponds to the same id
|
|
119
|
+
When the following request is received:
|
|
120
|
+
"""
|
|
121
|
+
GET /identity/ HTTP/1.1
|
|
122
|
+
authorization: Token ${{ Bill.token }}
|
|
123
|
+
accept: application/yaml
|
|
124
|
+
"""
|
|
125
|
+
Then the following reply is sent:
|
|
126
|
+
"""
|
|
127
|
+
200 OK
|
|
128
|
+
id: ${{ Bill.id }}
|
|
129
|
+
"""
|
|
130
|
+
When the following request is received:
|
|
131
|
+
"""
|
|
132
|
+
GET /identity/ HTTP/1.1
|
|
133
|
+
authorization: Bearer ${{ Bill.id_token }}
|
|
134
|
+
accept: application/yaml
|
|
135
|
+
"""
|
|
136
|
+
Then the following reply is sent:
|
|
137
|
+
"""
|
|
138
|
+
200 OK
|
|
139
|
+
id: ${{ Bill.id }}
|
|
140
|
+
"""
|
|
141
|
+
And the following request is received:
|
|
142
|
+
# same credentials
|
|
143
|
+
"""
|
|
144
|
+
POST /users/ HTTP/1.1
|
|
145
|
+
authorization: Bearer ${{ Bill.id_token }}
|
|
146
|
+
content-type: text/plain
|
|
147
|
+
|
|
148
|
+
name: Mary Louis
|
|
149
|
+
"""
|
|
150
|
+
Then the following reply is sent:
|
|
151
|
+
"""
|
|
152
|
+
403 Forbidden
|
|
153
|
+
"""
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
Feature: Roles management
|
|
2
2
|
|
|
3
3
|
Scenario: Adding a role to an Identity
|
|
4
|
+
# root:secret
|
|
5
|
+
# user:pass
|
|
4
6
|
Given the `identity.basic` database contains:
|
|
5
7
|
| _id | username | password |
|
|
6
8
|
| 72cf9b0ab0ac4ab2b8036e4e940ddcae | root | $2b$10$Qq/qnyyU5wjrbDXyWok14OnqAZv/z.pLhz.UddatjI6eHU/rFof4i |
|
|
@@ -11,6 +13,7 @@ Feature: Roles management
|
|
|
11
13
|
And the annotation:
|
|
12
14
|
"""yaml
|
|
13
15
|
/:
|
|
16
|
+
io:output: true
|
|
14
17
|
auth:role: test
|
|
15
18
|
GET:
|
|
16
19
|
dev:stub:
|
|
@@ -49,3 +52,151 @@ Feature: Roles management
|
|
|
49
52
|
"""
|
|
50
53
|
200 OK
|
|
51
54
|
"""
|
|
55
|
+
|
|
56
|
+
Scenario Outline: Delegating roles
|
|
57
|
+
# moderator:secret
|
|
58
|
+
# assistant:pass
|
|
59
|
+
Given the `identity.basic` database contains:
|
|
60
|
+
| _id | username | password |
|
|
61
|
+
| 72cf9b0ab0ac4ab2b8036e4e940ddcae | moderator | $2b$10$Qq/qnyyU5wjrbDXyWok14OnqAZv/z.pLhz.UddatjI6eHU/rFof4i |
|
|
62
|
+
| 4344518184ad44228baffce7a44fd0b1 | assistant | $2b$10$JoiAQUS7tzobDAFIDBWhWeEIJv933dQetyjRzSmfQGaJE5ZlJbmYy |
|
|
63
|
+
And the `identity.roles` database contains:
|
|
64
|
+
| _id | identity | role |
|
|
65
|
+
| 9c4702490ff84f2a9e1b1da2ab64bdd4 | 72cf9b0ab0ac4ab2b8036e4e940ddcae | system:identity:roles:delegation |
|
|
66
|
+
| 30c969e05ff6437097ed5f07fc52358e | 72cf9b0ab0ac4ab2b8036e4e940ddcae | app:moderation |
|
|
67
|
+
And the annotation:
|
|
68
|
+
"""yaml
|
|
69
|
+
/:
|
|
70
|
+
io:output: true
|
|
71
|
+
auth:role: app:moderation:photos
|
|
72
|
+
GET:
|
|
73
|
+
dev:stub:
|
|
74
|
+
access: granted!
|
|
75
|
+
"""
|
|
76
|
+
When the following request is received:
|
|
77
|
+
# assistant doesn't have the required role
|
|
78
|
+
"""
|
|
79
|
+
GET / HTTP/1.1
|
|
80
|
+
authorization: Basic YXNzaXN0YW50OnBhc3M=
|
|
81
|
+
"""
|
|
82
|
+
Then the following reply is sent:
|
|
83
|
+
"""
|
|
84
|
+
403 Forbidden
|
|
85
|
+
"""
|
|
86
|
+
When the following request is received:
|
|
87
|
+
# moderator delegates a role to an assistant
|
|
88
|
+
"""
|
|
89
|
+
POST /identity/roles/4344518184ad44228baffce7a44fd0b1/ HTTP/1.1
|
|
90
|
+
authorization: Basic bW9kZXJhdG9yOnNlY3JldA==
|
|
91
|
+
content-type: application/yaml
|
|
92
|
+
|
|
93
|
+
role: <role>
|
|
94
|
+
"""
|
|
95
|
+
Then the following reply is sent:
|
|
96
|
+
"""
|
|
97
|
+
201 Created
|
|
98
|
+
"""
|
|
99
|
+
When the following request is received:
|
|
100
|
+
# assistant has access
|
|
101
|
+
"""
|
|
102
|
+
GET / HTTP/1.1
|
|
103
|
+
authorization: Basic YXNzaXN0YW50OnBhc3M=
|
|
104
|
+
"""
|
|
105
|
+
Then the following reply is sent:
|
|
106
|
+
"""
|
|
107
|
+
200 OK
|
|
108
|
+
"""
|
|
109
|
+
Examples:
|
|
110
|
+
| role |
|
|
111
|
+
| app:moderation |
|
|
112
|
+
| app:moderation:photos |
|
|
113
|
+
|
|
114
|
+
Scenario: Delegating role out of own scope
|
|
115
|
+
Given the `identity.basic` database contains:
|
|
116
|
+
| _id | username | password |
|
|
117
|
+
| 72cf9b0ab0ac4ab2b8036e4e940ddcae | moderator | $2b$10$Qq/qnyyU5wjrbDXyWok14OnqAZv/z.pLhz.UddatjI6eHU/rFof4i |
|
|
118
|
+
| 4344518184ad44228baffce7a44fd0b1 | assistant | $2b$10$JoiAQUS7tzobDAFIDBWhWeEIJv933dQetyjRzSmfQGaJE5ZlJbmYy |
|
|
119
|
+
And the `identity.roles` database contains:
|
|
120
|
+
| _id | identity | role |
|
|
121
|
+
| 9c4702490ff84f2a9e1b1da2ab64bdd4 | 72cf9b0ab0ac4ab2b8036e4e940ddcae | system:identity:roles:delegation |
|
|
122
|
+
| 30c969e05ff6437097ed5f07fc52358e | 72cf9b0ab0ac4ab2b8036e4e940ddcae | app:moderation |
|
|
123
|
+
And the annotation:
|
|
124
|
+
"""yaml
|
|
125
|
+
/:
|
|
126
|
+
io:output: true
|
|
127
|
+
auth:role: app:moderation:photos
|
|
128
|
+
GET:
|
|
129
|
+
dev:stub:
|
|
130
|
+
access: granted!
|
|
131
|
+
"""
|
|
132
|
+
When the following request is received:
|
|
133
|
+
"""
|
|
134
|
+
POST /identity/roles/4344518184ad44228baffce7a44fd0b1/ HTTP/1.1
|
|
135
|
+
accept: application/yaml
|
|
136
|
+
content-type: application/yaml
|
|
137
|
+
authorization: Basic bW9kZXJhdG9yOnNlY3JldA==
|
|
138
|
+
|
|
139
|
+
role: app:finance
|
|
140
|
+
"""
|
|
141
|
+
Then the following reply is sent:
|
|
142
|
+
"""
|
|
143
|
+
409 Conflict
|
|
144
|
+
|
|
145
|
+
code: OUT_OF_SCOPE
|
|
146
|
+
"""
|
|
147
|
+
|
|
148
|
+
Scenario: Delegating role without `system:identity:roles:delegation` role
|
|
149
|
+
Given the `identity.basic` database contains:
|
|
150
|
+
| _id | username | password |
|
|
151
|
+
| 72cf9b0ab0ac4ab2b8036e4e940ddcae | moderator | $2b$10$Qq/qnyyU5wjrbDXyWok14OnqAZv/z.pLhz.UddatjI6eHU/rFof4i |
|
|
152
|
+
| 4344518184ad44228baffce7a44fd0b1 | assistant | $2b$10$JoiAQUS7tzobDAFIDBWhWeEIJv933dQetyjRzSmfQGaJE5ZlJbmYy |
|
|
153
|
+
And the `identity.roles` database contains:
|
|
154
|
+
| _id | identity | role |
|
|
155
|
+
| 30c969e05ff6437097ed5f07fc52358e | 72cf9b0ab0ac4ab2b8036e4e940ddcae | app:moderation |
|
|
156
|
+
And the annotation:
|
|
157
|
+
"""yaml
|
|
158
|
+
/:
|
|
159
|
+
io:output: true
|
|
160
|
+
auth:role: app:moderation:photos
|
|
161
|
+
GET:
|
|
162
|
+
dev:stub:
|
|
163
|
+
access: granted!
|
|
164
|
+
"""
|
|
165
|
+
When the following request is received:
|
|
166
|
+
"""
|
|
167
|
+
POST /identity/roles/4344518184ad44228baffce7a44fd0b1/ HTTP/1.1
|
|
168
|
+
content-type: application/yaml
|
|
169
|
+
authorization: Basic bW9kZXJhdG9yOnNlY3JldA==
|
|
170
|
+
|
|
171
|
+
role: app:moderation
|
|
172
|
+
"""
|
|
173
|
+
Then the following reply is sent:
|
|
174
|
+
"""
|
|
175
|
+
403 Forbidden
|
|
176
|
+
"""
|
|
177
|
+
|
|
178
|
+
Scenario Outline: Invalid role name
|
|
179
|
+
Given the `identity.basic` database contains:
|
|
180
|
+
| _id | username | password |
|
|
181
|
+
| 72cf9b0ab0ac4ab2b8036e4e940ddcae | root | $2b$10$Qq/qnyyU5wjrbDXyWok14OnqAZv/z.pLhz.UddatjI6eHU/rFof4i |
|
|
182
|
+
And the `identity.roles` database contains:
|
|
183
|
+
| _id | identity | role |
|
|
184
|
+
| 9c4702490ff84f2a9e1b1da2ab64bdd4 | 72cf9b0ab0ac4ab2b8036e4e940ddcae | system:identity:roles |
|
|
185
|
+
When the following request is received:
|
|
186
|
+
# root adds a role to a user
|
|
187
|
+
"""
|
|
188
|
+
POST /identity/roles/4344518184ad44228baffce7a44fd0b1/ HTTP/1.1
|
|
189
|
+
authorization: Basic cm9vdDpzZWNyZXQ=
|
|
190
|
+
content-type: application/yaml
|
|
191
|
+
|
|
192
|
+
role: <role>
|
|
193
|
+
"""
|
|
194
|
+
Then the following reply is sent:
|
|
195
|
+
"""
|
|
196
|
+
400 Bad Request
|
|
197
|
+
"""
|
|
198
|
+
Examples:
|
|
199
|
+
| role |
|
|
200
|
+
| app! |
|
|
201
|
+
| app: |
|
|
202
|
+
| app:no spaces |
|
|
@@ -7,6 +7,7 @@ Feature: Tokens lifecycle
|
|
|
7
7
|
Given the annotation:
|
|
8
8
|
"""yaml
|
|
9
9
|
/:
|
|
10
|
+
io:output: true
|
|
10
11
|
/hello/:id:
|
|
11
12
|
auth:id: id
|
|
12
13
|
GET:
|
|
@@ -35,6 +36,7 @@ Feature: Tokens lifecycle
|
|
|
35
36
|
And the annotation:
|
|
36
37
|
"""yaml
|
|
37
38
|
/:
|
|
39
|
+
io:output: true
|
|
38
40
|
/hello/:id:
|
|
39
41
|
auth:id: id
|
|
40
42
|
GET:
|
|
@@ -72,6 +74,7 @@ Feature: Tokens lifecycle
|
|
|
72
74
|
Given the annotation:
|
|
73
75
|
"""yaml
|
|
74
76
|
/:
|
|
77
|
+
io:output: true
|
|
75
78
|
/:id:
|
|
76
79
|
id: id
|
|
77
80
|
GET:
|