@wirebench/engine 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +3 -0
- package/dist/assert/contract.d.ts +3 -0
- package/dist/assert/contract.js +17 -0
- package/dist/assert/index.d.ts +4 -0
- package/dist/assert/index.js +27 -0
- package/dist/assert/match.d.ts +3 -0
- package/dist/assert/match.js +58 -0
- package/dist/assert/model.d.ts +73 -0
- package/dist/assert/model.js +8 -0
- package/dist/assert/schema.d.ts +34 -0
- package/dist/assert/schema.js +46 -0
- package/dist/assert/sla.d.ts +3 -0
- package/dist/assert/sla.js +8 -0
- package/dist/assert/soap-fault.d.ts +3 -0
- package/dist/assert/soap-fault.js +20 -0
- package/dist/assert/status.d.ts +3 -0
- package/dist/assert/status.js +14 -0
- package/dist/errors.d.ts +77 -0
- package/dist/errors.js +121 -0
- package/dist/fs.d.ts +35 -0
- package/dist/fs.js +64 -0
- package/dist/generate.d.ts +12 -0
- package/dist/generate.js +14 -0
- package/dist/grpc/browser.d.ts +11 -0
- package/dist/grpc/browser.js +9 -0
- package/dist/grpc/cache.d.ts +113 -0
- package/dist/grpc/cache.js +244 -0
- package/dist/grpc/call.d.ts +64 -0
- package/dist/grpc/call.js +72 -0
- package/dist/grpc/codec.d.ts +29 -0
- package/dist/grpc/codec.js +416 -0
- package/dist/grpc/command.d.ts +23 -0
- package/dist/grpc/command.js +91 -0
- package/dist/grpc/expand.d.ts +25 -0
- package/dist/grpc/expand.js +52 -0
- package/dist/grpc/framing.d.ts +28 -0
- package/dist/grpc/framing.js +61 -0
- package/dist/grpc/import.d.ts +47 -0
- package/dist/grpc/import.js +88 -0
- package/dist/grpc/model.d.ts +179 -0
- package/dist/grpc/model.js +91 -0
- package/dist/grpc/proto/describe.d.ts +92 -0
- package/dist/grpc/proto/describe.js +205 -0
- package/dist/grpc/proto/load.d.ts +35 -0
- package/dist/grpc/proto/load.js +112 -0
- package/dist/grpc/proto/sample.d.ts +21 -0
- package/dist/grpc/proto/sample.js +79 -0
- package/dist/grpc/proto/well-known.d.ts +42 -0
- package/dist/grpc/proto/well-known.js +143 -0
- package/dist/grpc/reconcile.d.ts +42 -0
- package/dist/grpc/reconcile.js +153 -0
- package/dist/grpc/reflection/client.d.ts +70 -0
- package/dist/grpc/reflection/client.js +197 -0
- package/dist/grpc/reflection/descriptors.d.ts +69 -0
- package/dist/grpc/reflection/descriptors.js +140 -0
- package/dist/grpc/reflection/proto.d.ts +33 -0
- package/dist/grpc/reflection/proto.js +144 -0
- package/dist/grpc/send.d.ts +132 -0
- package/dist/grpc/send.js +435 -0
- package/dist/grpc/shape.d.ts +29 -0
- package/dist/grpc/shape.js +36 -0
- package/dist/grpc/status.d.ts +21 -0
- package/dist/grpc/status.js +62 -0
- package/dist/grpc/target.d.ts +21 -0
- package/dist/grpc/target.js +66 -0
- package/dist/http/auth/apply.d.ts +37 -0
- package/dist/http/auth/apply.js +74 -0
- package/dist/http/auth/basic.d.ts +36 -0
- package/dist/http/auth/basic.js +69 -0
- package/dist/http/auth/md4.d.ts +13 -0
- package/dist/http/auth/md4.js +81 -0
- package/dist/http/auth/ntlm-transport.d.ts +61 -0
- package/dist/http/auth/ntlm-transport.js +97 -0
- package/dist/http/auth/ntlm.d.ts +190 -0
- package/dist/http/auth/ntlm.js +377 -0
- package/dist/http/client.d.ts +73 -0
- package/dist/http/client.js +403 -0
- package/dist/http/curl-flags.d.ts +15 -0
- package/dist/http/curl-flags.js +95 -0
- package/dist/http/curl.d.ts +94 -0
- package/dist/http/curl.js +245 -0
- package/dist/http/decompress.d.ts +7 -0
- package/dist/http/decompress.js +22 -0
- package/dist/http/errors.d.ts +22 -0
- package/dist/http/errors.js +144 -0
- package/dist/http/failed-request.d.ts +27 -0
- package/dist/http/failed-request.js +48 -0
- package/dist/http/headers.d.ts +15 -0
- package/dist/http/headers.js +50 -0
- package/dist/http/heredoc.d.ts +25 -0
- package/dist/http/heredoc.js +74 -0
- package/dist/http/proxy.d.ts +103 -0
- package/dist/http/proxy.js +168 -0
- package/dist/http/raw-capture.d.ts +23 -0
- package/dist/http/raw-capture.js +57 -0
- package/dist/http/timings.d.ts +79 -0
- package/dist/http/timings.js +212 -0
- package/dist/http/tls.d.ts +111 -0
- package/dist/http/tls.js +167 -0
- package/dist/http/types.d.ts +125 -0
- package/dist/http/types.js +6 -0
- package/dist/import-detect.d.ts +26 -0
- package/dist/import-detect.js +169 -0
- package/dist/import.d.ts +20 -0
- package/dist/import.js +163 -0
- package/dist/index.d.ts +272 -0
- package/dist/index.js +157 -0
- package/dist/json/cursor.d.ts +43 -0
- package/dist/json/cursor.js +168 -0
- package/dist/operations.d.ts +12 -0
- package/dist/operations.js +52 -0
- package/dist/project/attachments-cache.d.ts +80 -0
- package/dist/project/attachments-cache.js +186 -0
- package/dist/project/endpoints.d.ts +23 -0
- package/dist/project/endpoints.js +47 -0
- package/dist/project/environments.d.ts +68 -0
- package/dist/project/environments.js +124 -0
- package/dist/project/fs.d.ts +45 -0
- package/dist/project/fs.js +78 -0
- package/dist/project/history.d.ts +171 -0
- package/dist/project/history.js +179 -0
- package/dist/project/keystores.d.ts +24 -0
- package/dist/project/keystores.js +66 -0
- package/dist/project/load.d.ts +44 -0
- package/dist/project/load.js +634 -0
- package/dist/project/migrate.d.ts +27 -0
- package/dist/project/migrate.js +46 -0
- package/dist/project/model.d.ts +401 -0
- package/dist/project/model.js +126 -0
- package/dist/project/paths.d.ts +134 -0
- package/dist/project/paths.js +259 -0
- package/dist/project/preferences.d.ts +318 -0
- package/dist/project/preferences.js +239 -0
- package/dist/project/properties.d.ts +97 -0
- package/dist/project/properties.js +356 -0
- package/dist/project/save.d.ts +65 -0
- package/dist/project/save.js +295 -0
- package/dist/project/schema.d.ts +1329 -0
- package/dist/project/schema.js +737 -0
- package/dist/project/serialize.d.ts +42 -0
- package/dist/project/serialize.js +385 -0
- package/dist/project/wss-configs.d.ts +40 -0
- package/dist/project/wss-configs.js +142 -0
- package/dist/project/yaml.d.ts +17 -0
- package/dist/project/yaml.js +39 -0
- package/dist/redact/index.d.ts +77 -0
- package/dist/redact/index.js +328 -0
- package/dist/redact/literal.d.ts +12 -0
- package/dist/redact/literal.js +68 -0
- package/dist/rest/auth.d.ts +53 -0
- package/dist/rest/auth.js +80 -0
- package/dist/rest/body.d.ts +61 -0
- package/dist/rest/body.js +184 -0
- package/dist/rest/browser.d.ts +12 -0
- package/dist/rest/browser.js +11 -0
- package/dist/rest/cookies.d.ts +41 -0
- package/dist/rest/cookies.js +102 -0
- package/dist/rest/curl.d.ts +75 -0
- package/dist/rest/curl.js +417 -0
- package/dist/rest/expand.d.ts +35 -0
- package/dist/rest/expand.js +104 -0
- package/dist/rest/model.d.ts +247 -0
- package/dist/rest/model.js +118 -0
- package/dist/rest/oauth2.d.ts +118 -0
- package/dist/rest/oauth2.js +212 -0
- package/dist/rest/openapi/cache.d.ts +54 -0
- package/dist/rest/openapi/cache.js +128 -0
- package/dist/rest/openapi/import.d.ts +67 -0
- package/dist/rest/openapi/import.js +91 -0
- package/dist/rest/openapi/map.d.ts +102 -0
- package/dist/rest/openapi/map.js +477 -0
- package/dist/rest/openapi/model.d.ts +203 -0
- package/dist/rest/openapi/model.js +37 -0
- package/dist/rest/openapi/parse.d.ts +44 -0
- package/dist/rest/openapi/parse.js +1530 -0
- package/dist/rest/openapi/refs.d.ts +63 -0
- package/dist/rest/openapi/refs.js +258 -0
- package/dist/rest/openapi/sample.d.ts +68 -0
- package/dist/rest/openapi/sample.js +336 -0
- package/dist/rest/postman/import.d.ts +21 -0
- package/dist/rest/postman/import.js +47 -0
- package/dist/rest/postman/index.d.ts +7 -0
- package/dist/rest/postman/index.js +7 -0
- package/dist/rest/postman/map.d.ts +28 -0
- package/dist/rest/postman/map.js +427 -0
- package/dist/rest/postman/model.d.ts +118 -0
- package/dist/rest/postman/model.js +7 -0
- package/dist/rest/postman/parse.d.ts +29 -0
- package/dist/rest/postman/parse.js +518 -0
- package/dist/rest/response.d.ts +72 -0
- package/dist/rest/response.js +221 -0
- package/dist/rest/send.d.ts +102 -0
- package/dist/rest/send.js +148 -0
- package/dist/rest/url.d.ts +92 -0
- package/dist/rest/url.js +213 -0
- package/dist/run/effective-auth.d.ts +10 -0
- package/dist/run/effective-auth.js +19 -0
- package/dist/run/index.d.ts +8 -0
- package/dist/run/index.js +4 -0
- package/dist/run/prepare.d.ts +43 -0
- package/dist/run/prepare.js +280 -0
- package/dist/run/run.d.ts +53 -0
- package/dist/run/run.js +223 -0
- package/dist/run/secret-needs.d.ts +13 -0
- package/dist/run/secret-needs.js +125 -0
- package/dist/run/select.d.ts +34 -0
- package/dist/run/select.js +76 -0
- package/dist/secrets/env-names.d.ts +27 -0
- package/dist/secrets/env-names.js +40 -0
- package/dist/secrets/resolve.d.ts +58 -0
- package/dist/secrets/resolve.js +136 -0
- package/dist/send-options.d.ts +141 -0
- package/dist/send-options.js +228 -0
- package/dist/send.d.ts +53 -0
- package/dist/send.js +210 -0
- package/dist/soap/body-builder.d.ts +38 -0
- package/dist/soap/body-builder.js +250 -0
- package/dist/soap/build-problems.d.ts +12 -0
- package/dist/soap/build-problems.js +2 -0
- package/dist/soap/charset.d.ts +23 -0
- package/dist/soap/charset.js +47 -0
- package/dist/soap/envelope.d.ts +44 -0
- package/dist/soap/envelope.js +76 -0
- package/dist/soap/fault.d.ts +46 -0
- package/dist/soap/fault.js +129 -0
- package/dist/soap/form-request.d.ts +34 -0
- package/dist/soap/form-request.js +251 -0
- package/dist/soap/legacy-project/definition-fetcher.d.ts +21 -0
- package/dist/soap/legacy-project/definition-fetcher.js +43 -0
- package/dist/soap/legacy-project/format.d.ts +18 -0
- package/dist/soap/legacy-project/format.js +24 -0
- package/dist/soap/legacy-project/import.d.ts +21 -0
- package/dist/soap/legacy-project/import.js +46 -0
- package/dist/soap/legacy-project/index.d.ts +9 -0
- package/dist/soap/legacy-project/index.js +5 -0
- package/dist/soap/legacy-project/map.d.ts +91 -0
- package/dist/soap/legacy-project/map.js +290 -0
- package/dist/soap/legacy-project/model.d.ts +98 -0
- package/dist/soap/legacy-project/model.js +5 -0
- package/dist/soap/legacy-project/parse.d.ts +16 -0
- package/dist/soap/legacy-project/parse.js +325 -0
- package/dist/soap/mime/cid-scan.d.ts +36 -0
- package/dist/soap/mime/cid-scan.js +52 -0
- package/dist/soap/mime/inline-files.d.ts +39 -0
- package/dist/soap/mime/inline-files.js +71 -0
- package/dist/soap/mime/mtom.d.ts +74 -0
- package/dist/soap/mime/mtom.js +134 -0
- package/dist/soap/mime/multipart.d.ts +66 -0
- package/dist/soap/mime/multipart.js +329 -0
- package/dist/soap/mime/send-pipeline.d.ts +61 -0
- package/dist/soap/mime/send-pipeline.js +145 -0
- package/dist/soap/mime/swa.d.ts +45 -0
- package/dist/soap/mime/swa.js +62 -0
- package/dist/soap/mime/types.d.ts +69 -0
- package/dist/soap/mime/types.js +10 -0
- package/dist/soap/namespace-scope.d.ts +32 -0
- package/dist/soap/namespace-scope.js +85 -0
- package/dist/soap/prefixes.d.ts +24 -0
- package/dist/soap/prefixes.js +70 -0
- package/dist/soap/recreate.d.ts +28 -0
- package/dist/soap/recreate.js +168 -0
- package/dist/soap/request-builder.d.ts +63 -0
- package/dist/soap/request-builder.js +161 -0
- package/dist/soap/response-parser.d.ts +29 -0
- package/dist/soap/response-parser.js +71 -0
- package/dist/soap/soap-action.d.ts +31 -0
- package/dist/soap/soap-action.js +28 -0
- package/dist/soap/transforms.d.ts +52 -0
- package/dist/soap/transforms.js +164 -0
- package/dist/types.d.ts +307 -0
- package/dist/types.js +6 -0
- package/dist/validate/index.d.ts +61 -0
- package/dist/validate/index.js +72 -0
- package/dist/validate/schema-file-set.d.ts +51 -0
- package/dist/validate/schema-file-set.js +288 -0
- package/dist/validate/schema-validator.d.ts +53 -0
- package/dist/validate/schema-validator.js +251 -0
- package/dist/validate/soap-structure.d.ts +34 -0
- package/dist/validate/soap-structure.js +255 -0
- package/dist/validate/types.d.ts +47 -0
- package/dist/validate/types.js +8 -0
- package/dist/validate/wsi/assertions/helpers.d.ts +145 -0
- package/dist/validate/wsi/assertions/helpers.js +387 -0
- package/dist/validate/wsi/assertions/index.d.ts +44 -0
- package/dist/validate/wsi/assertions/index.js +77 -0
- package/dist/validate/wsi/assertions/message/helpers.d.ts +63 -0
- package/dist/validate/wsi/assertions/message/helpers.js +168 -0
- package/dist/validate/wsi/assertions/message/index.d.ts +39 -0
- package/dist/validate/wsi/assertions/message/index.js +62 -0
- package/dist/validate/wsi/assertions/message/r1001.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1001.js +38 -0
- package/dist/validate/wsi/assertions/message/r1003.d.ts +14 -0
- package/dist/validate/wsi/assertions/message/r1003.js +45 -0
- package/dist/validate/wsi/assertions/message/r1005.d.ts +12 -0
- package/dist/validate/wsi/assertions/message/r1005.js +37 -0
- package/dist/validate/wsi/assertions/message/r1006.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1006.js +49 -0
- package/dist/validate/wsi/assertions/message/r1007.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1007.js +30 -0
- package/dist/validate/wsi/assertions/message/r1011.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1011.js +33 -0
- package/dist/validate/wsi/assertions/message/r1012.d.ts +13 -0
- package/dist/validate/wsi/assertions/message/r1012.js +37 -0
- package/dist/validate/wsi/assertions/message/r1013.d.ts +9 -0
- package/dist/validate/wsi/assertions/message/r1013.js +42 -0
- package/dist/validate/wsi/assertions/message/r1014.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1014.js +30 -0
- package/dist/validate/wsi/assertions/message/r1015.d.ts +12 -0
- package/dist/validate/wsi/assertions/message/r1015.js +36 -0
- package/dist/validate/wsi/assertions/message/r1017.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1017.js +30 -0
- package/dist/validate/wsi/assertions/message/r1100.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1100.js +39 -0
- package/dist/validate/wsi/assertions/message/r1101.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1101.js +37 -0
- package/dist/validate/wsi/assertions/message/r1102.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1102.js +41 -0
- package/dist/validate/wsi/assertions/message/r1103.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1103.js +28 -0
- package/dist/validate/wsi/assertions/message/r1107.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1107.js +38 -0
- package/dist/validate/wsi/assertions/message/r1109.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1109.js +32 -0
- package/dist/validate/wsi/assertions/message/r1124.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1124.js +31 -0
- package/dist/validate/wsi/assertions/message/r1132.d.ts +9 -0
- package/dist/validate/wsi/assertions/message/r1132.js +23 -0
- package/dist/validate/wsi/assertions/message/r1140.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1140.js +42 -0
- package/dist/validate/wsi/assertions/message/r1141.d.ts +10 -0
- package/dist/validate/wsi/assertions/message/r1141.js +32 -0
- package/dist/validate/wsi/assertions/message/r2113.d.ts +11 -0
- package/dist/validate/wsi/assertions/message/r2113.js +33 -0
- package/dist/validate/wsi/assertions/message/r2211.d.ts +7 -0
- package/dist/validate/wsi/assertions/message/r2211.js +42 -0
- package/dist/validate/wsi/assertions/r2001.d.ts +15 -0
- package/dist/validate/wsi/assertions/r2001.js +47 -0
- package/dist/validate/wsi/assertions/r2002.d.ts +11 -0
- package/dist/validate/wsi/assertions/r2002.js +38 -0
- package/dist/validate/wsi/assertions/r2003.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2003.js +32 -0
- package/dist/validate/wsi/assertions/r2005.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2005.js +40 -0
- package/dist/validate/wsi/assertions/r2101.d.ts +14 -0
- package/dist/validate/wsi/assertions/r2101.js +65 -0
- package/dist/validate/wsi/assertions/r2102.d.ts +10 -0
- package/dist/validate/wsi/assertions/r2102.js +41 -0
- package/dist/validate/wsi/assertions/r2105.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2105.js +39 -0
- package/dist/validate/wsi/assertions/r2110.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2110.js +38 -0
- package/dist/validate/wsi/assertions/r2111.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2111.js +30 -0
- package/dist/validate/wsi/assertions/r2112.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2112.js +35 -0
- package/dist/validate/wsi/assertions/r2201.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2201.js +28 -0
- package/dist/validate/wsi/assertions/r2203.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2203.js +30 -0
- package/dist/validate/wsi/assertions/r2204.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2204.js +29 -0
- package/dist/validate/wsi/assertions/r2205.d.ts +8 -0
- package/dist/validate/wsi/assertions/r2205.js +46 -0
- package/dist/validate/wsi/assertions/r2206.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2206.js +36 -0
- package/dist/validate/wsi/assertions/r2209.d.ts +12 -0
- package/dist/validate/wsi/assertions/r2209.js +37 -0
- package/dist/validate/wsi/assertions/r2210.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2210.js +30 -0
- package/dist/validate/wsi/assertions/r2303.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2303.js +44 -0
- package/dist/validate/wsi/assertions/r2304.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2304.js +32 -0
- package/dist/validate/wsi/assertions/r2401.d.ts +12 -0
- package/dist/validate/wsi/assertions/r2401.js +31 -0
- package/dist/validate/wsi/assertions/r2701.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2701.js +28 -0
- package/dist/validate/wsi/assertions/r2702.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2702.js +26 -0
- package/dist/validate/wsi/assertions/r2705.d.ts +11 -0
- package/dist/validate/wsi/assertions/r2705.js +31 -0
- package/dist/validate/wsi/assertions/r2706.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2706.js +29 -0
- package/dist/validate/wsi/assertions/r2710.d.ts +13 -0
- package/dist/validate/wsi/assertions/r2710.js +37 -0
- package/dist/validate/wsi/assertions/r2716.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2716.js +29 -0
- package/dist/validate/wsi/assertions/r2717.d.ts +9 -0
- package/dist/validate/wsi/assertions/r2717.js +31 -0
- package/dist/validate/wsi/assertions/r2718.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2718.js +41 -0
- package/dist/validate/wsi/assertions/r2720.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2720.js +29 -0
- package/dist/validate/wsi/assertions/r2721.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2721.js +27 -0
- package/dist/validate/wsi/assertions/r2722.d.ts +6 -0
- package/dist/validate/wsi/assertions/r2722.js +29 -0
- package/dist/validate/wsi/assertions/r2801.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2801.js +39 -0
- package/dist/validate/wsi/assertions/r2803.d.ts +7 -0
- package/dist/validate/wsi/assertions/r2803.js +29 -0
- package/dist/validate/wsi/docs.d.ts +29 -0
- package/dist/validate/wsi/docs.js +167 -0
- package/dist/validate/wsi/index.d.ts +16 -0
- package/dist/validate/wsi/index.js +11 -0
- package/dist/validate/wsi/report-html.d.ts +36 -0
- package/dist/validate/wsi/report-html.js +135 -0
- package/dist/validate/wsi/run-message.d.ts +50 -0
- package/dist/validate/wsi/run-message.js +190 -0
- package/dist/validate/wsi/run-wsdl.d.ts +48 -0
- package/dist/validate/wsi/run-wsdl.js +99 -0
- package/dist/validate/wsi/types.d.ts +173 -0
- package/dist/validate/wsi/types.js +17 -0
- package/dist/workspace/commit-message.d.ts +47 -0
- package/dist/workspace/commit-message.js +195 -0
- package/dist/workspace/environments.d.ts +79 -0
- package/dist/workspace/environments.js +115 -0
- package/dist/workspace/index.d.ts +28 -0
- package/dist/workspace/index.js +19 -0
- package/dist/workspace/load.d.ts +45 -0
- package/dist/workspace/load.js +155 -0
- package/dist/workspace/local-state.d.ts +37 -0
- package/dist/workspace/local-state.js +59 -0
- package/dist/workspace/migrate.d.ts +38 -0
- package/dist/workspace/migrate.js +50 -0
- package/dist/workspace/model.d.ts +86 -0
- package/dist/workspace/model.js +54 -0
- package/dist/workspace/paths.d.ts +64 -0
- package/dist/workspace/paths.js +97 -0
- package/dist/workspace/reidentify.d.ts +22 -0
- package/dist/workspace/reidentify.js +122 -0
- package/dist/workspace/save.d.ts +31 -0
- package/dist/workspace/save.js +84 -0
- package/dist/workspace/schema.d.ts +93 -0
- package/dist/workspace/schema.js +115 -0
- package/dist/workspace/serialize.d.ts +24 -0
- package/dist/workspace/serialize.js +60 -0
- package/dist/workspace/share.d.ts +52 -0
- package/dist/workspace/share.js +89 -0
- package/dist/ws/browser.d.ts +13 -0
- package/dist/ws/browser.js +11 -0
- package/dist/ws/call.d.ts +53 -0
- package/dist/ws/call.js +106 -0
- package/dist/ws/command.d.ts +19 -0
- package/dist/ws/command.js +28 -0
- package/dist/ws/expand.d.ts +38 -0
- package/dist/ws/expand.js +76 -0
- package/dist/ws/model.d.ts +191 -0
- package/dist/ws/model.js +83 -0
- package/dist/ws/pretty.d.ts +12 -0
- package/dist/ws/pretty.js +25 -0
- package/dist/ws/session.d.ts +50 -0
- package/dist/ws/session.js +333 -0
- package/dist/ws/shape.d.ts +18 -0
- package/dist/ws/shape.js +28 -0
- package/dist/ws/transcript.d.ts +14 -0
- package/dist/ws/transcript.js +29 -0
- package/dist/ws/url.d.ts +3 -0
- package/dist/ws/url.js +44 -0
- package/dist/wsa/headers.d.ts +78 -0
- package/dist/wsa/headers.js +244 -0
- package/dist/wsa/model.d.ts +66 -0
- package/dist/wsa/model.js +52 -0
- package/dist/wsa/policy-detect.d.ts +81 -0
- package/dist/wsa/policy-detect.js +245 -0
- package/dist/wsdl/cache-naming.d.ts +39 -0
- package/dist/wsdl/cache-naming.js +90 -0
- package/dist/wsdl/cache.d.ts +48 -0
- package/dist/wsdl/cache.js +141 -0
- package/dist/wsdl/docs-generator.d.ts +47 -0
- package/dist/wsdl/docs-generator.js +439 -0
- package/dist/wsdl/dom-utils.d.ts +15 -0
- package/dist/wsdl/dom-utils.js +50 -0
- package/dist/wsdl/export-definition.d.ts +38 -0
- package/dist/wsdl/export-definition.js +100 -0
- package/dist/wsdl/fetch.d.ts +13 -0
- package/dist/wsdl/fetch.js +60 -0
- package/dist/wsdl/merge.d.ts +17 -0
- package/dist/wsdl/merge.js +57 -0
- package/dist/wsdl/model.d.ts +176 -0
- package/dist/wsdl/model.js +17 -0
- package/dist/wsdl/parse-binding.d.ts +6 -0
- package/dist/wsdl/parse-binding.js +150 -0
- package/dist/wsdl/parse-wsdl.d.ts +47 -0
- package/dist/wsdl/parse-wsdl.js +161 -0
- package/dist/wsdl/qname.d.ts +28 -0
- package/dist/wsdl/qname.js +41 -0
- package/dist/wsdl/ref-policy.d.ts +54 -0
- package/dist/wsdl/ref-policy.js +87 -0
- package/dist/wsdl/resolver.d.ts +81 -0
- package/dist/wsdl/resolver.js +276 -0
- package/dist/wsdl/update-definition.d.ts +106 -0
- package/dist/wsdl/update-definition.js +314 -0
- package/dist/wss/apply.d.ts +40 -0
- package/dist/wss/apply.js +212 -0
- package/dist/wss/c14n-prefixes.d.ts +27 -0
- package/dist/wss/c14n-prefixes.js +95 -0
- package/dist/wss/incoming/decrypt.d.ts +35 -0
- package/dist/wss/incoming/decrypt.js +57 -0
- package/dist/wss/incoming/index.d.ts +56 -0
- package/dist/wss/incoming/index.js +189 -0
- package/dist/wss/incoming/verify.d.ts +74 -0
- package/dist/wss/incoming/verify.js +440 -0
- package/dist/wss/key-identifiers.d.ts +76 -0
- package/dist/wss/key-identifiers.js +139 -0
- package/dist/wss/keystore/certificate.d.ts +45 -0
- package/dist/wss/keystore/certificate.js +134 -0
- package/dist/wss/keystore/index.d.ts +50 -0
- package/dist/wss/keystore/index.js +80 -0
- package/dist/wss/keystore/model.d.ts +83 -0
- package/dist/wss/keystore/model.js +27 -0
- package/dist/wss/keystore/pem.d.ts +21 -0
- package/dist/wss/keystore/pem.js +140 -0
- package/dist/wss/keystore/pkcs12.d.ts +21 -0
- package/dist/wss/keystore/pkcs12.js +125 -0
- package/dist/wss/model.d.ts +160 -0
- package/dist/wss/model.js +37 -0
- package/dist/wss/outgoing/encryption.d.ts +76 -0
- package/dist/wss/outgoing/encryption.js +618 -0
- package/dist/wss/outgoing/signature.d.ts +73 -0
- package/dist/wss/outgoing/signature.js +239 -0
- package/dist/wss/outgoing/timestamp.d.ts +29 -0
- package/dist/wss/outgoing/timestamp.js +39 -0
- package/dist/wss/outgoing/username-token.d.ts +36 -0
- package/dist/wss/outgoing/username-token.js +68 -0
- package/dist/wss/security-header.d.ts +31 -0
- package/dist/wss/security-header.js +83 -0
- package/dist/xml/index.d.ts +7 -0
- package/dist/xml/index.js +7 -0
- package/dist/xml/namespaces.d.ts +36 -0
- package/dist/xml/namespaces.js +60 -0
- package/dist/xml/parse.d.ts +79 -0
- package/dist/xml/parse.js +109 -0
- package/dist/xml/positions.d.ts +26 -0
- package/dist/xml/positions.js +71 -0
- package/dist/xml/pretty.d.ts +37 -0
- package/dist/xml/pretty.js +137 -0
- package/dist/xml/serialize.d.ts +6 -0
- package/dist/xml/serialize.js +8 -0
- package/dist/xml/tolerant-tree.d.ts +56 -0
- package/dist/xml/tolerant-tree.js +134 -0
- package/dist/xpath/evaluate-async.d.ts +31 -0
- package/dist/xpath/evaluate-async.js +81 -0
- package/dist/xpath/evaluate.d.ts +98 -0
- package/dist/xpath/evaluate.js +340 -0
- package/dist/xpath/jsonpath.d.ts +40 -0
- package/dist/xpath/jsonpath.js +109 -0
- package/dist/xpath/namespaces.d.ts +29 -0
- package/dist/xpath/namespaces.js +101 -0
- package/dist/xpath/worker.d.ts +7 -0
- package/dist/xpath/worker.js +26 -0
- package/dist/xsd/builtins.d.ts +36 -0
- package/dist/xsd/builtins.js +108 -0
- package/dist/xsd/check-references.d.ts +25 -0
- package/dist/xsd/check-references.js +145 -0
- package/dist/xsd/form-edits.d.ts +57 -0
- package/dist/xsd/form-edits.js +153 -0
- package/dist/xsd/form-model.d.ts +153 -0
- package/dist/xsd/form-model.js +691 -0
- package/dist/xsd/locate.d.ts +42 -0
- package/dist/xsd/locate.js +249 -0
- package/dist/xsd/model.d.ts +249 -0
- package/dist/xsd/model.js +1 -0
- package/dist/xsd/parse-particles.d.ts +48 -0
- package/dist/xsd/parse-particles.js +320 -0
- package/dist/xsd/parse-schema.d.ts +21 -0
- package/dist/xsd/parse-schema.js +143 -0
- package/dist/xsd/resolve-content.d.ts +18 -0
- package/dist/xsd/resolve-content.js +242 -0
- package/dist/xsd/sample-generator.d.ts +51 -0
- package/dist/xsd/sample-generator.js +291 -0
- package/dist/xsd/sample-types.d.ts +21 -0
- package/dist/xsd/sample-types.js +69 -0
- package/dist/xsd/sample-values.d.ts +54 -0
- package/dist/xsd/sample-values.js +267 -0
- package/dist/xsd/schema-set.d.ts +51 -0
- package/dist/xsd/schema-set.js +203 -0
- package/dist/xsd/xml-scan.d.ts +64 -0
- package/dist/xsd/xml-scan.js +286 -0
- package/dist/xsd/xml-writer.d.ts +56 -0
- package/dist/xsd/xml-writer.js +103 -0
- package/package.json +69 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `InclusiveNamespaces PrefixList` exclusive canonicalization needs to be told about.
|
|
3
|
+
*
|
|
4
|
+
* Exclusive c14n's "visible utilization" rule only looks at element and attribute *names*, so a
|
|
5
|
+
* prefix a subtree uses only inside an attribute value or in text — `xsi:type="tns:Foo"`, a
|
|
6
|
+
* WSDL/XSD `ref`, a `QName` element body — loses its declaration and the canonical form stops
|
|
7
|
+
* meaning what it said. Both `outgoing/signature.ts` (per-reference transforms) and
|
|
8
|
+
* `outgoing/encryption.ts` (the plaintext it canonicalizes before encrypting) need the same
|
|
9
|
+
* list, so the rule lives here once.
|
|
10
|
+
*/
|
|
11
|
+
/** The namespace `xmlns:*` declarations themselves live in. */
|
|
12
|
+
const XMLNS_NS = 'http://www.w3.org/2000/xmlns/';
|
|
13
|
+
/**
|
|
14
|
+
* Matches a `prefix:localName`-shaped token, the way a QName looks when it appears as an
|
|
15
|
+
* attribute value or as element text (`xsi:type="tns:Foo"`, a WSDL/XSD `ref` value, and so on).
|
|
16
|
+
*/
|
|
17
|
+
const QNAME_TOKEN = /\b([A-Za-z_][\w.-]*):[A-Za-z_][\w.-]*/g;
|
|
18
|
+
/** The prefixes `element` declares on itself via `xmlns:*` attributes. */
|
|
19
|
+
function ownDeclaredPrefixes(element) {
|
|
20
|
+
const declared = new Set();
|
|
21
|
+
const attributes = element.attributes;
|
|
22
|
+
for (let i = 0; i < attributes.length; i += 1) {
|
|
23
|
+
const attribute = attributes.item(i);
|
|
24
|
+
if (attribute !== null &&
|
|
25
|
+
attribute.namespaceURI === XMLNS_NS &&
|
|
26
|
+
attribute.prefix === 'xmlns' &&
|
|
27
|
+
attribute.localName !== null) {
|
|
28
|
+
declared.add(attribute.localName);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return declared;
|
|
32
|
+
}
|
|
33
|
+
/** Every `prefix:local` token found in attribute values or text content under `element`. */
|
|
34
|
+
function qnamePrefixesIn(element) {
|
|
35
|
+
const found = new Set();
|
|
36
|
+
const scan = (text) => {
|
|
37
|
+
QNAME_TOKEN.lastIndex = 0;
|
|
38
|
+
let match = QNAME_TOKEN.exec(text);
|
|
39
|
+
while (match !== null) {
|
|
40
|
+
const prefix = match[1];
|
|
41
|
+
if (prefix !== undefined) {
|
|
42
|
+
found.add(prefix);
|
|
43
|
+
}
|
|
44
|
+
match = QNAME_TOKEN.exec(text);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const walk = (node) => {
|
|
48
|
+
if (node.nodeType === 1) {
|
|
49
|
+
const el = node;
|
|
50
|
+
const attributes = el.attributes;
|
|
51
|
+
for (let i = 0; i < attributes.length; i += 1) {
|
|
52
|
+
const attribute = attributes.item(i);
|
|
53
|
+
if (attribute !== null && attribute.namespaceURI !== XMLNS_NS) {
|
|
54
|
+
scan(attribute.value);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
for (let child = el.firstChild; child !== null; child = child.nextSibling) {
|
|
58
|
+
walk(child);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else if (node.nodeType === 3) {
|
|
62
|
+
scan(node.nodeValue ?? '');
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
walk(element);
|
|
66
|
+
return found;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The `InclusiveNamespaces PrefixList` exclusive c14n of `element` needs: every prefix
|
|
70
|
+
* `element`'s subtree references only through attribute-value or text QName content — a use
|
|
71
|
+
* exclusive c14n's "visible utilization" rule does not see — plus `envelopePrefix` when one is
|
|
72
|
+
* given.
|
|
73
|
+
*
|
|
74
|
+
* A prefix `element` already declares on itself is left out: exclusive c14n renders that
|
|
75
|
+
* declaration regardless, so listing it again would be redundant, not wrong.
|
|
76
|
+
*
|
|
77
|
+
* @param element the element about to be canonicalized
|
|
78
|
+
* @param envelopePrefix the SOAP envelope's own prefix when the canonical form has to stand on
|
|
79
|
+
* its own inside the envelope (a signature reference), or `null` when it does not (an
|
|
80
|
+
* encrypted plaintext, which is self-contained by construction)
|
|
81
|
+
* @returns the prefixes to list, sorted, so the value is stable
|
|
82
|
+
*/
|
|
83
|
+
export function inclusiveNamespacePrefixList(element, envelopePrefix) {
|
|
84
|
+
const declared = ownDeclaredPrefixes(element);
|
|
85
|
+
const prefixes = new Set();
|
|
86
|
+
if (envelopePrefix !== null && envelopePrefix !== '') {
|
|
87
|
+
prefixes.add(envelopePrefix);
|
|
88
|
+
}
|
|
89
|
+
for (const prefix of qnamePrefixesIn(element)) {
|
|
90
|
+
if (!declared.has(prefix) && element.lookupNamespaceURI(prefix) !== null) {
|
|
91
|
+
prefixes.add(prefix);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return [...prefixes].sort();
|
|
95
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decryption of an *incoming* message: the thin layer between a resolved keystore alias and
|
|
3
|
+
* Task 39's {@link decryptEnvelope}.
|
|
4
|
+
*
|
|
5
|
+
* The only behaviour it adds is the no-op: a response that carries neither an
|
|
6
|
+
* `xenc:EncryptedKey` nor an `xenc:EncryptedData` is not an error — it is simply a response
|
|
7
|
+
* that was not encrypted — so the caller gets the document back unchanged rather than a
|
|
8
|
+
* `wss-decrypt-failed` it would have to special-case.
|
|
9
|
+
*/
|
|
10
|
+
import type { Keystore, KeystoreAlias } from '../keystore/model.js';
|
|
11
|
+
/** The keystore material {@link decryptIncoming} opens an `xenc:EncryptedKey` with. */
|
|
12
|
+
export interface ResolvedDecryptionKey {
|
|
13
|
+
readonly keystore: Keystore;
|
|
14
|
+
/** The alias whose private key unwraps the symmetric key. */
|
|
15
|
+
readonly alias: KeystoreAlias;
|
|
16
|
+
/** Passphrase for an encrypted private key PEM. Resolved by the host; never logged. */
|
|
17
|
+
readonly keyPassword?: string;
|
|
18
|
+
}
|
|
19
|
+
/** The outcome of {@link decryptIncoming}. */
|
|
20
|
+
export interface DecryptIncomingResult {
|
|
21
|
+
/** The message with every block this key could open restored; the input when there was none. */
|
|
22
|
+
readonly xml: string;
|
|
23
|
+
/** The plaintext of each decrypted block, in `ReferenceList` order. Empty for a no-op. */
|
|
24
|
+
readonly decrypted: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Decrypts an incoming message with `resolved`, or returns it untouched when it carries no
|
|
28
|
+
* XML-Encryption at all.
|
|
29
|
+
*
|
|
30
|
+
* @param xml the response envelope
|
|
31
|
+
* @param resolved the keystore alias (and passphrase) to decrypt with
|
|
32
|
+
* @returns the restored envelope and the plaintext of each decrypted block
|
|
33
|
+
* @throws WssError `wss-decrypt-failed`, `wss-algorithm-unsupported`, `wss-decryption-key-missing`
|
|
34
|
+
*/
|
|
35
|
+
export declare function decryptIncoming(xml: string, resolved: ResolvedDecryptionKey): DecryptIncomingResult;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decryption of an *incoming* message: the thin layer between a resolved keystore alias and
|
|
3
|
+
* Task 39's {@link decryptEnvelope}.
|
|
4
|
+
*
|
|
5
|
+
* The only behaviour it adds is the no-op: a response that carries neither an
|
|
6
|
+
* `xenc:EncryptedKey` nor an `xenc:EncryptedData` is not an error — it is simply a response
|
|
7
|
+
* that was not encrypted — so the caller gets the document back unchanged rather than a
|
|
8
|
+
* `wss-decrypt-failed` it would have to special-case.
|
|
9
|
+
*/
|
|
10
|
+
import { NS } from '../../xml/namespaces.js';
|
|
11
|
+
import { parseXml } from '../../xml/parse.js';
|
|
12
|
+
import { findElement } from '../security-header.js';
|
|
13
|
+
import { decryptEnvelope } from '../outgoing/encryption.js';
|
|
14
|
+
/**
|
|
15
|
+
* Whether `xml` really carries XML-Encryption: an `xenc:EncryptedKey` or `xenc:EncryptedData`
|
|
16
|
+
* *element*, found in the DOM.
|
|
17
|
+
*
|
|
18
|
+
* A substring test (the previous implementation) says yes to a response that merely mentions
|
|
19
|
+
* those words in its text — an error message quoting them, say — and that answer turns a plain
|
|
20
|
+
* response into a `wss-decrypt-failed`. The cheap substring test stays as a pre-filter so the
|
|
21
|
+
* many responses that are not XML at all are never parsed.
|
|
22
|
+
*/
|
|
23
|
+
function looksEncrypted(xml) {
|
|
24
|
+
if (!xml.includes(NS.XENC) || (!xml.includes('EncryptedKey') && !xml.includes('EncryptedData'))) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const root = parseXml(xml, { location: 'envelope' }).documentElement;
|
|
29
|
+
if (root === null) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return (findElement(root, NS.XENC, 'EncryptedKey') !== undefined ||
|
|
33
|
+
findElement(root, NS.XENC, 'EncryptedData') !== undefined);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Decrypts an incoming message with `resolved`, or returns it untouched when it carries no
|
|
41
|
+
* XML-Encryption at all.
|
|
42
|
+
*
|
|
43
|
+
* @param xml the response envelope
|
|
44
|
+
* @param resolved the keystore alias (and passphrase) to decrypt with
|
|
45
|
+
* @returns the restored envelope and the plaintext of each decrypted block
|
|
46
|
+
* @throws WssError `wss-decrypt-failed`, `wss-algorithm-unsupported`, `wss-decryption-key-missing`
|
|
47
|
+
*/
|
|
48
|
+
export function decryptIncoming(xml, resolved) {
|
|
49
|
+
if (!looksEncrypted(xml)) {
|
|
50
|
+
return { xml, decrypted: [] };
|
|
51
|
+
}
|
|
52
|
+
return decryptEnvelope(xml, {
|
|
53
|
+
keystore: resolved.keystore,
|
|
54
|
+
alias: resolved.alias,
|
|
55
|
+
...(resolved.keyPassword !== undefined ? { keyPassword: resolved.keyPassword } : {}),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incoming WS-Security processing: what a configured response goes through after it has been
|
|
3
|
+
* read off the wire (and after MTOM expansion, so the envelope is the one the user will see).
|
|
4
|
+
*
|
|
5
|
+
* The result is deliberately a *report*, not a verdict. Nothing here throws and nothing here
|
|
6
|
+
* refuses a response: a failed signature, an untrusted signer and an expired timestamp are all
|
|
7
|
+
* recorded as failed actions and shown, because a workbench's job is to tell you exactly what
|
|
8
|
+
* the server sent, not to hide it. The caller decides what to make of that.
|
|
9
|
+
*/
|
|
10
|
+
import type { WssContext, WssIncomingConfig } from '../model.js';
|
|
11
|
+
/** Which of the three incoming steps an action reports on. */
|
|
12
|
+
export type WssActionKind = 'decrypt' | 'signature' | 'timestamp';
|
|
13
|
+
/** One step of incoming processing, as the response inspector lists it. */
|
|
14
|
+
export interface WssAction {
|
|
15
|
+
readonly kind: WssActionKind;
|
|
16
|
+
readonly ok: boolean;
|
|
17
|
+
/** A human-readable summary. Never carries key material, a password or a secret reference. */
|
|
18
|
+
readonly detail: string;
|
|
19
|
+
/** The signer's subject DN; only on a `signature` action whose certificate resolved. */
|
|
20
|
+
readonly signerSubject?: string;
|
|
21
|
+
/** Whether the signer is in (or chains to) the truststore; only on a `signature` action. */
|
|
22
|
+
readonly trusted?: boolean;
|
|
23
|
+
/** `wsu:Created`; only on a `timestamp` action. */
|
|
24
|
+
readonly created?: string;
|
|
25
|
+
/** `wsu:Expires`; only on a `timestamp` action that had one. */
|
|
26
|
+
readonly expires?: string;
|
|
27
|
+
/** The covered parts' element names (the reference id when unresolvable); `signature` only. */
|
|
28
|
+
readonly references?: readonly string[];
|
|
29
|
+
/** Whether a valid reference covers the envelope's `Body`; `signature` only. */
|
|
30
|
+
readonly coversBody?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/** What {@link processIncomingWss} made of a response. */
|
|
33
|
+
export interface WssResult {
|
|
34
|
+
/** One entry per step actually taken, in processing order. Empty for an unsecured response. */
|
|
35
|
+
readonly actions: readonly WssAction[];
|
|
36
|
+
/** The restored envelope, present only when decryption actually changed something. */
|
|
37
|
+
readonly decryptedXml?: string;
|
|
38
|
+
/** Every failure, as a message safe to log. Empty when every action succeeded. */
|
|
39
|
+
readonly errors: readonly string[];
|
|
40
|
+
}
|
|
41
|
+
/** Options for {@link processIncomingWss}. */
|
|
42
|
+
export interface ProcessIncomingWssOptions {
|
|
43
|
+
/** The clock timestamp freshness (and certificate validity) is judged against. */
|
|
44
|
+
readonly clock?: () => Date;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Runs `config` over a response envelope: decrypt, then verify every signature on the restored
|
|
48
|
+
* document, then judge the timestamp.
|
|
49
|
+
*
|
|
50
|
+
* @param xml the response envelope as it arrived
|
|
51
|
+
* @param config the incoming configuration the request selected
|
|
52
|
+
* @param ctx the injected keystore/secret capabilities
|
|
53
|
+
* @param options an injected clock, so freshness is testable
|
|
54
|
+
* @returns the actions taken, the decrypted envelope when there was one, and any failures
|
|
55
|
+
*/
|
|
56
|
+
export declare function processIncomingWss(xml: string, config: WssIncomingConfig, ctx: WssContext, options?: ProcessIncomingWssOptions): Promise<WssResult>;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incoming WS-Security processing: what a configured response goes through after it has been
|
|
3
|
+
* read off the wire (and after MTOM expansion, so the envelope is the one the user will see).
|
|
4
|
+
*
|
|
5
|
+
* The result is deliberately a *report*, not a verdict. Nothing here throws and nothing here
|
|
6
|
+
* refuses a response: a failed signature, an untrusted signer and an expired timestamp are all
|
|
7
|
+
* recorded as failed actions and shown, because a workbench's job is to tell you exactly what
|
|
8
|
+
* the server sent, not to hide it. The caller decides what to make of that.
|
|
9
|
+
*/
|
|
10
|
+
import { isWirebenchError } from '../../errors.js';
|
|
11
|
+
import { selectAlias } from '../keystore/index.js';
|
|
12
|
+
import { decryptIncoming } from './decrypt.js';
|
|
13
|
+
import { verifyIncoming } from './verify.js';
|
|
14
|
+
/** The message of a thrown value, without the stack or any `details` a secret could hide in. */
|
|
15
|
+
function messageOf(error) {
|
|
16
|
+
if (isWirebenchError(error)) {
|
|
17
|
+
return error.message;
|
|
18
|
+
}
|
|
19
|
+
return error instanceof Error ? error.message : String(error);
|
|
20
|
+
}
|
|
21
|
+
/** The decrypt step: the (possibly restored) XML plus the action it produced, if any. */
|
|
22
|
+
async function runDecrypt(xml, config, ctx) {
|
|
23
|
+
const ref = config.decryptKeystoreRef;
|
|
24
|
+
if (ref === undefined || ref === '') {
|
|
25
|
+
return { xml };
|
|
26
|
+
}
|
|
27
|
+
let keystore;
|
|
28
|
+
try {
|
|
29
|
+
keystore = await ctx.keystores(ref);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
// A resolver that rejects (a locked registry, a revoked secret) must not fail the send: the
|
|
33
|
+
// response already arrived, and the user is entitled to see it plus why it was not opened.
|
|
34
|
+
return { xml, action: { kind: 'decrypt', ok: false, detail: messageOf(error) } };
|
|
35
|
+
}
|
|
36
|
+
if (keystore === undefined) {
|
|
37
|
+
return {
|
|
38
|
+
xml,
|
|
39
|
+
action: { kind: 'decrypt', ok: false, detail: 'The decryption keystore is not available.' },
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
const alias = selectAlias(keystore, config.decryptAlias);
|
|
44
|
+
const password = config.decryptKeyPasswordRef === undefined ? undefined : await ctx.secrets(config.decryptKeyPasswordRef);
|
|
45
|
+
const result = decryptIncoming(xml, {
|
|
46
|
+
keystore,
|
|
47
|
+
alias,
|
|
48
|
+
...(password !== undefined ? { keyPassword: password } : {}),
|
|
49
|
+
});
|
|
50
|
+
if (result.decrypted.length === 0) {
|
|
51
|
+
// Nothing was encrypted: not a step that happened, so not a step to report.
|
|
52
|
+
return { xml: result.xml };
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
xml: result.xml,
|
|
56
|
+
decryptedXml: result.xml,
|
|
57
|
+
action: {
|
|
58
|
+
kind: 'decrypt',
|
|
59
|
+
ok: true,
|
|
60
|
+
detail: result.decrypted.length === 1 ? 'Decrypted 1 block.' : `Decrypted ${String(result.decrypted.length)} blocks.`,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
return { xml, action: { kind: 'decrypt', ok: false, detail: messageOf(error) } };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Runs `config` over a response envelope: decrypt, then verify every signature on the restored
|
|
70
|
+
* document, then judge the timestamp.
|
|
71
|
+
*
|
|
72
|
+
* @param xml the response envelope as it arrived
|
|
73
|
+
* @param config the incoming configuration the request selected
|
|
74
|
+
* @param ctx the injected keystore/secret capabilities
|
|
75
|
+
* @param options an injected clock, so freshness is testable
|
|
76
|
+
* @returns the actions taken, the decrypted envelope when there was one, and any failures
|
|
77
|
+
*/
|
|
78
|
+
export async function processIncomingWss(xml, config, ctx, options) {
|
|
79
|
+
const clock = options?.clock ?? ctx.clock;
|
|
80
|
+
const actions = [];
|
|
81
|
+
const errors = [];
|
|
82
|
+
const decrypt = await runDecrypt(xml, config, ctx);
|
|
83
|
+
if (decrypt.action !== undefined) {
|
|
84
|
+
actions.push(decrypt.action);
|
|
85
|
+
if (!decrypt.action.ok) {
|
|
86
|
+
errors.push(decrypt.action.detail);
|
|
87
|
+
// Whatever the signatures cover is still ciphertext, so verifying them would report a
|
|
88
|
+
// failure whose real cause is the key, not the signature. Say so instead.
|
|
89
|
+
actions.push({
|
|
90
|
+
kind: 'signature',
|
|
91
|
+
ok: false,
|
|
92
|
+
detail: 'Signatures were not verified because the message could not be decrypted.',
|
|
93
|
+
});
|
|
94
|
+
return { actions, errors };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const wantsTruststore = config.signatureKeystoreRef !== undefined && config.signatureKeystoreRef !== '';
|
|
98
|
+
let truststore;
|
|
99
|
+
let truststoreError;
|
|
100
|
+
if (wantsTruststore) {
|
|
101
|
+
try {
|
|
102
|
+
truststore = await ctx.keystores(config.signatureKeystoreRef ?? '');
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
truststoreError = `The signature truststore could not be resolved: ${messageOf(error)}`;
|
|
106
|
+
}
|
|
107
|
+
if (truststore === undefined) {
|
|
108
|
+
// Fail closed: without the truststore nothing can be trusted, and the reason is reported
|
|
109
|
+
// on the signature actions below rather than left to be read as "signer unknown".
|
|
110
|
+
truststoreError ??= 'The signature truststore is not available.';
|
|
111
|
+
errors.push(truststoreError);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
let verified;
|
|
115
|
+
try {
|
|
116
|
+
verified = verifyIncoming(decrypt.xml, {
|
|
117
|
+
...(truststore !== undefined ? { truststore } : {}),
|
|
118
|
+
clock,
|
|
119
|
+
skewSeconds: config.timestampSkewSeconds,
|
|
120
|
+
verifyChain: config.verifyChain,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
// `verifyIncoming` is written not to throw; if it ever does, that is a failed verification
|
|
125
|
+
// report, never a failed send.
|
|
126
|
+
const detail = `Verification could not be completed: ${messageOf(error)}`;
|
|
127
|
+
actions.push({ kind: 'signature', ok: false, detail, trusted: false });
|
|
128
|
+
errors.push(detail);
|
|
129
|
+
return { actions, ...(decrypt.decryptedXml !== undefined ? { decryptedXml: decrypt.decryptedXml } : {}), errors };
|
|
130
|
+
}
|
|
131
|
+
for (const signature of verified.signatures) {
|
|
132
|
+
const ok = signature.ok && signature.trusted;
|
|
133
|
+
const covered = signature.referenceNames.length === 0 ? 'nothing' : signature.referenceNames.join(', ');
|
|
134
|
+
const untrusted = truststoreError !== undefined ? `${truststoreError}` : 'but the signer is not trusted.';
|
|
135
|
+
const detail = signature.ok
|
|
136
|
+
? signature.trusted
|
|
137
|
+
? `Signature valid over ${covered}; signer trusted.`
|
|
138
|
+
: `Signature valid over ${covered}, ${untrusted}`
|
|
139
|
+
: (signature.error ?? 'The signature did not verify.');
|
|
140
|
+
actions.push({
|
|
141
|
+
kind: 'signature',
|
|
142
|
+
ok,
|
|
143
|
+
detail,
|
|
144
|
+
...(signature.signerSubject !== undefined ? { signerSubject: signature.signerSubject } : {}),
|
|
145
|
+
trusted: signature.trusted,
|
|
146
|
+
references: [...signature.referenceNames],
|
|
147
|
+
coversBody: signature.coversBody,
|
|
148
|
+
});
|
|
149
|
+
if (!ok) {
|
|
150
|
+
errors.push(detail);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// "A signature is required" means a *valid, trusted* signature over the **Body**: a signature
|
|
154
|
+
// covering only the Timestamp leaves the payload as unprotected as no signature at all.
|
|
155
|
+
const bodySigned = verified.signatures.some((signature) => signature.ok && signature.trusted && signature.coversBody);
|
|
156
|
+
if (config.requireSignature && !bodySigned) {
|
|
157
|
+
const detail = verified.signatures.length === 0
|
|
158
|
+
? 'This response carries no signature, and one is required.'
|
|
159
|
+
: 'No valid, trusted signature covers the Body, and one is required.';
|
|
160
|
+
actions.push({ kind: 'signature', ok: false, detail });
|
|
161
|
+
errors.push(detail);
|
|
162
|
+
}
|
|
163
|
+
const timestamp = verified.timestamp;
|
|
164
|
+
if (timestamp !== undefined) {
|
|
165
|
+
const detail = timestamp.fresh
|
|
166
|
+
? `Timestamp fresh (created ${timestamp.created}).`
|
|
167
|
+
: (timestamp.error ?? 'The timestamp is not fresh.');
|
|
168
|
+
actions.push({
|
|
169
|
+
kind: 'timestamp',
|
|
170
|
+
ok: timestamp.fresh,
|
|
171
|
+
detail,
|
|
172
|
+
created: timestamp.created,
|
|
173
|
+
...(timestamp.expires !== undefined ? { expires: timestamp.expires } : {}),
|
|
174
|
+
});
|
|
175
|
+
if (!timestamp.fresh) {
|
|
176
|
+
errors.push(detail);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else if (config.requireTimestamp) {
|
|
180
|
+
const detail = 'This response carries no timestamp, and one is required.';
|
|
181
|
+
actions.push({ kind: 'timestamp', ok: false, detail });
|
|
182
|
+
errors.push(detail);
|
|
183
|
+
}
|
|
184
|
+
return {
|
|
185
|
+
actions,
|
|
186
|
+
...(decrypt.decryptedXml !== undefined ? { decryptedXml: decrypt.decryptedXml } : {}),
|
|
187
|
+
errors,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verification of an *incoming* message: every `ds:Signature` in a `wsse:Security` header, and
|
|
3
|
+
* the header's `wsu:Timestamp`.
|
|
4
|
+
*
|
|
5
|
+
* Two questions are answered separately, because they fail for different reasons and a user
|
|
6
|
+
* has to be able to tell them apart:
|
|
7
|
+
*
|
|
8
|
+
* - **validity** — does the signature actually hold over the bytes that arrived? That is
|
|
9
|
+
* Task 38's {@link verifySignature}, run against the certificate the message's own `KeyInfo`
|
|
10
|
+
* points at.
|
|
11
|
+
* - **trust** — is that certificate one we accept? A signature verifies perfectly against the
|
|
12
|
+
* key that made it, including a key an attacker owns, so the certificate is checked against
|
|
13
|
+
* the configured truststore: stored verbatim, or (with `verifyChain`) chaining to one of its
|
|
14
|
+
* certificates.
|
|
15
|
+
*
|
|
16
|
+
* `KeyInfo` is therefore a *hint* about which key to look up, never a source of trust.
|
|
17
|
+
*/
|
|
18
|
+
import type { Keystore } from '../keystore/model.js';
|
|
19
|
+
/** One `ds:Signature` as {@link verifyIncoming} judged it. */
|
|
20
|
+
export interface IncomingSignatureResult {
|
|
21
|
+
/** The signature held over the bytes that arrived. */
|
|
22
|
+
readonly ok: boolean;
|
|
23
|
+
/** The `URI`s the signature's references covered, without their leading `#`. */
|
|
24
|
+
readonly references: readonly string[];
|
|
25
|
+
/** The local names of the covered elements, in reference order; the id when one is unresolvable. */
|
|
26
|
+
readonly referenceNames: readonly string[];
|
|
27
|
+
/** A valid reference covers the envelope's `Body`. `false` whenever that cannot be shown. */
|
|
28
|
+
readonly coversBody: boolean;
|
|
29
|
+
/** The signer's subject DN, when the certificate could be resolved at all. */
|
|
30
|
+
readonly signerSubject?: string;
|
|
31
|
+
/** The signer's certificate is in (or chains to) the truststore. */
|
|
32
|
+
readonly trusted: boolean;
|
|
33
|
+
/** Why the signature did not verify, or why its certificate could not be resolved. */
|
|
34
|
+
readonly error?: string;
|
|
35
|
+
}
|
|
36
|
+
/** The `wsu:Timestamp` as {@link verifyIncoming} read it. */
|
|
37
|
+
export interface IncomingTimestampResult {
|
|
38
|
+
/** `wsu:Created`, verbatim. */
|
|
39
|
+
readonly created: string;
|
|
40
|
+
/** `wsu:Expires`, verbatim; absent when the timestamp carries none. */
|
|
41
|
+
readonly expires?: string;
|
|
42
|
+
/** `Created - skew <= now <= Expires + skew` (or, with no `Expires`, `Created` within skew). */
|
|
43
|
+
readonly fresh: boolean;
|
|
44
|
+
/** Why the timestamp was rejected; absent when fresh. */
|
|
45
|
+
readonly error?: string;
|
|
46
|
+
}
|
|
47
|
+
/** The outcome of {@link verifyIncoming}. */
|
|
48
|
+
export interface VerifyIncomingResult {
|
|
49
|
+
readonly signatures: readonly IncomingSignatureResult[];
|
|
50
|
+
/** Absent when the message carries no `wsu:Timestamp`. */
|
|
51
|
+
readonly timestamp?: IncomingTimestampResult;
|
|
52
|
+
}
|
|
53
|
+
/** What {@link verifyIncoming} needs to judge a message. */
|
|
54
|
+
export interface VerifyIncomingOptions {
|
|
55
|
+
/** Keystore whose aliases are the trusted certificates/CAs; without one nothing is trusted. */
|
|
56
|
+
readonly truststore?: Keystore;
|
|
57
|
+
readonly clock: () => Date;
|
|
58
|
+
/** Clock skew tolerated on the timestamp, in seconds. */
|
|
59
|
+
readonly skewSeconds: number;
|
|
60
|
+
/** Accept a signer that chains to a truststore certificate, not only one stored verbatim. */
|
|
61
|
+
readonly verifyChain: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Verifies every `ds:Signature` in `xml`'s `wsse:Security` headers and reads its
|
|
65
|
+
* `wsu:Timestamp`.
|
|
66
|
+
*
|
|
67
|
+
* Never throws: an unparsable, unsigned or non-SOAP message simply produces no signatures and
|
|
68
|
+
* no timestamp, which is what "this response had no WS-Security" has to look like.
|
|
69
|
+
*
|
|
70
|
+
* @param xml the (already decrypted) response envelope
|
|
71
|
+
* @param options the truststore, the clock, the tolerated skew and whether to follow chains
|
|
72
|
+
* @returns one result per signature, plus the timestamp when the message carries one
|
|
73
|
+
*/
|
|
74
|
+
export declare function verifyIncoming(xml: string, options: VerifyIncomingOptions): VerifyIncomingResult;
|