@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,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NTLM (MS-NLMP) message codec: the Type 1 (NEGOTIATE), Type 2 (CHALLENGE) and
|
|
3
|
+
* Type 3 (AUTHENTICATE) messages plus the NTLMv2/LMv2 response computation, as a
|
|
4
|
+
* pure byte-level module. The connection choreography lives in `ntlm-transport.ts`.
|
|
5
|
+
*
|
|
6
|
+
* Only NTLMv2 with extended session security is produced; no session key exchange,
|
|
7
|
+
* signing or sealing, none of which HTTP needs. No MIC is emitted (it is optional
|
|
8
|
+
* for a client that negotiates no key exchange).
|
|
9
|
+
*/
|
|
10
|
+
import { createHmac } from 'node:crypto';
|
|
11
|
+
import { WirebenchError } from '../../errors.js';
|
|
12
|
+
import { md4 } from './md4.js';
|
|
13
|
+
const SIGNATURE = 'NTLMSSP\0';
|
|
14
|
+
const SIGNATURE_BYTES = new Uint8Array(Buffer.from(SIGNATURE, 'ascii'));
|
|
15
|
+
/** NTLM negotiate flags (MS-NLMP §2.2.2.5) this codec cares about. */
|
|
16
|
+
export const NTLM_FLAGS = {
|
|
17
|
+
NEGOTIATE_UNICODE: 0x00000001,
|
|
18
|
+
NEGOTIATE_OEM: 0x00000002,
|
|
19
|
+
REQUEST_TARGET: 0x00000004,
|
|
20
|
+
NEGOTIATE_NTLM: 0x00000200,
|
|
21
|
+
NEGOTIATE_OEM_DOMAIN_SUPPLIED: 0x00001000,
|
|
22
|
+
NEGOTIATE_OEM_WORKSTATION_SUPPLIED: 0x00002000,
|
|
23
|
+
NEGOTIATE_ALWAYS_SIGN: 0x00008000,
|
|
24
|
+
NEGOTIATE_EXTENDED_SESSIONSECURITY: 0x00080000,
|
|
25
|
+
NEGOTIATE_TARGET_INFO: 0x00800000,
|
|
26
|
+
NEGOTIATE_VERSION: 0x02000000,
|
|
27
|
+
NEGOTIATE_128: 0x20000000,
|
|
28
|
+
NEGOTIATE_56: 0x80000000,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* The flag set every Wirebench Type 1/Type 3 message carries: Unicode names, NTLM with
|
|
32
|
+
* extended session security (NTLMv2), target info, a version block, and 128/56-bit key
|
|
33
|
+
* strengths. Deliberately *without* `NEGOTIATE_SIGN`/`SEAL`/`KEY_EXCH` — HTTP carries no
|
|
34
|
+
* signed or sealed payloads, so advertising them would only invite a server to expect one.
|
|
35
|
+
*/
|
|
36
|
+
export const DEFAULT_NEGOTIATE_FLAGS = (NTLM_FLAGS.NEGOTIATE_UNICODE |
|
|
37
|
+
NTLM_FLAGS.REQUEST_TARGET |
|
|
38
|
+
NTLM_FLAGS.NEGOTIATE_NTLM |
|
|
39
|
+
NTLM_FLAGS.NEGOTIATE_ALWAYS_SIGN |
|
|
40
|
+
NTLM_FLAGS.NEGOTIATE_EXTENDED_SESSIONSECURITY |
|
|
41
|
+
NTLM_FLAGS.NEGOTIATE_TARGET_INFO |
|
|
42
|
+
NTLM_FLAGS.NEGOTIATE_VERSION |
|
|
43
|
+
NTLM_FLAGS.NEGOTIATE_128 |
|
|
44
|
+
NTLM_FLAGS.NEGOTIATE_56) >>>
|
|
45
|
+
0;
|
|
46
|
+
/** AV pair identifiers (MS-NLMP §2.2.2.1). */
|
|
47
|
+
export const AV_IDS = {
|
|
48
|
+
MsvAvEOL: 0x0000,
|
|
49
|
+
MsvAvNbComputerName: 0x0001,
|
|
50
|
+
MsvAvNbDomainName: 0x0002,
|
|
51
|
+
MsvAvDnsComputerName: 0x0003,
|
|
52
|
+
MsvAvDnsDomainName: 0x0004,
|
|
53
|
+
MsvAvTimestamp: 0x0007,
|
|
54
|
+
MsvAvFlags: 0x0006,
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* The `Version` block (MS-NLMP §2.2.2.10): Windows 6.1 build 7601, NTLMSSP revision 15.
|
|
58
|
+
* Purely cosmetic — servers log it, none of them gate on it.
|
|
59
|
+
*/
|
|
60
|
+
const VERSION_BLOCK = new Uint8Array([0x06, 0x01, 0xb1, 0x1d, 0x00, 0x00, 0x00, 0x0f]);
|
|
61
|
+
/** 100-nanosecond intervals between the Windows FILETIME epoch (1601-01-01) and the Unix epoch. */
|
|
62
|
+
const FILETIME_EPOCH_OFFSET = 11644473600000n;
|
|
63
|
+
/** Converts a Unix millisecond timestamp to a Windows FILETIME (100 ns ticks since 1601). */
|
|
64
|
+
export function toFileTime(unixMillis) {
|
|
65
|
+
return (BigInt(Math.floor(unixMillis)) + FILETIME_EPOCH_OFFSET) * 10000n;
|
|
66
|
+
}
|
|
67
|
+
function utf16le(value) {
|
|
68
|
+
return new Uint8Array(Buffer.from(value, 'utf16le'));
|
|
69
|
+
}
|
|
70
|
+
function oem(value) {
|
|
71
|
+
return new Uint8Array(Buffer.from(value, 'latin1'));
|
|
72
|
+
}
|
|
73
|
+
function concat(parts) {
|
|
74
|
+
const total = parts.reduce((sum, part) => sum + part.length, 0);
|
|
75
|
+
const out = new Uint8Array(total);
|
|
76
|
+
let offset = 0;
|
|
77
|
+
for (const part of parts) {
|
|
78
|
+
out.set(part, offset);
|
|
79
|
+
offset += part.length;
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
function hmacMd5(key, data) {
|
|
84
|
+
return new Uint8Array(createHmac('md5', key).update(data).digest());
|
|
85
|
+
}
|
|
86
|
+
/** Reads a `(Len, MaxLen, BufferOffset)` field descriptor and returns the payload slice it points at. */
|
|
87
|
+
function readField(bytes, view, at) {
|
|
88
|
+
const length = view.getUint16(at, true);
|
|
89
|
+
const offset = view.getUint32(at + 4, true);
|
|
90
|
+
if (length === 0 || offset + length > bytes.length) {
|
|
91
|
+
return new Uint8Array(0);
|
|
92
|
+
}
|
|
93
|
+
return bytes.slice(offset, offset + length);
|
|
94
|
+
}
|
|
95
|
+
/** Writes a `(Len, MaxLen, BufferOffset)` field descriptor at `at`. */
|
|
96
|
+
function writeField(view, at, length, offset) {
|
|
97
|
+
view.setUint16(at, length, true);
|
|
98
|
+
view.setUint16(at + 2, length, true);
|
|
99
|
+
view.setUint32(at + 4, offset, true);
|
|
100
|
+
}
|
|
101
|
+
function hasSignature(bytes) {
|
|
102
|
+
if (bytes.length < 12)
|
|
103
|
+
return false;
|
|
104
|
+
return SIGNATURE_BYTES.every((byte, index) => bytes[index] === byte);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Builds a Type 1 NEGOTIATE message.
|
|
108
|
+
*
|
|
109
|
+
* @param options negotiate flags plus the optional domain/workstation to advertise
|
|
110
|
+
* @returns the raw message bytes, ready for {@link encodeNtlmAuthorization}
|
|
111
|
+
*/
|
|
112
|
+
export function createType1(options) {
|
|
113
|
+
const domain = options?.domain !== undefined && options.domain !== '' ? oem(options.domain.toUpperCase()) : undefined;
|
|
114
|
+
const workstation = options?.workstation !== undefined && options.workstation !== ''
|
|
115
|
+
? oem(options.workstation.toUpperCase())
|
|
116
|
+
: undefined;
|
|
117
|
+
let flags = options?.flags ?? DEFAULT_NEGOTIATE_FLAGS;
|
|
118
|
+
if (domain !== undefined)
|
|
119
|
+
flags = (flags | NTLM_FLAGS.NEGOTIATE_OEM_DOMAIN_SUPPLIED) >>> 0;
|
|
120
|
+
if (workstation !== undefined)
|
|
121
|
+
flags = (flags | NTLM_FLAGS.NEGOTIATE_OEM_WORKSTATION_SUPPLIED) >>> 0;
|
|
122
|
+
// 8 signature + 4 type + 8 domain field + 8 workstation field + 4 flags + 8 version.
|
|
123
|
+
const headerLength = 40;
|
|
124
|
+
const payload = concat([domain ?? new Uint8Array(0), workstation ?? new Uint8Array(0)]);
|
|
125
|
+
const message = new Uint8Array(headerLength + payload.length);
|
|
126
|
+
message.set(SIGNATURE_BYTES, 0);
|
|
127
|
+
const view = new DataView(message.buffer);
|
|
128
|
+
view.setUint32(8, 1, true);
|
|
129
|
+
view.setUint32(12, flags, true);
|
|
130
|
+
writeField(view, 16, domain?.length ?? 0, headerLength);
|
|
131
|
+
writeField(view, 24, workstation?.length ?? 0, headerLength + (domain?.length ?? 0));
|
|
132
|
+
message.set(VERSION_BLOCK, 32);
|
|
133
|
+
message.set(payload, headerLength);
|
|
134
|
+
return message;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Parses a Type 2 CHALLENGE message.
|
|
138
|
+
*
|
|
139
|
+
* @param bytes the raw message (already base64-decoded)
|
|
140
|
+
* @throws WirebenchError (`ntlm-invalid-message`) when the signature or message type is not a Type 2 message
|
|
141
|
+
*/
|
|
142
|
+
export function parseType2(bytes) {
|
|
143
|
+
if (!hasSignature(bytes) || bytes.length < 32) {
|
|
144
|
+
throw new WirebenchError('ntlm-invalid-message', 'not an NTLM message');
|
|
145
|
+
}
|
|
146
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
147
|
+
if (view.getUint32(8, true) !== 2) {
|
|
148
|
+
throw new WirebenchError('ntlm-invalid-message', 'not an NTLM Type 2 message');
|
|
149
|
+
}
|
|
150
|
+
const flags = view.getUint32(20, true);
|
|
151
|
+
const targetNameBytes = readField(bytes, view, 12);
|
|
152
|
+
const targetInfo = bytes.length >= 48 ? readField(bytes, view, 40) : new Uint8Array(0);
|
|
153
|
+
const version = bytes.length >= 56 ? bytes.slice(48, 56) : undefined;
|
|
154
|
+
return {
|
|
155
|
+
flags,
|
|
156
|
+
serverChallenge: bytes.slice(24, 32),
|
|
157
|
+
targetName: Buffer.from(targetNameBytes).toString((flags & NTLM_FLAGS.NEGOTIATE_UNICODE) !== 0 ? 'utf16le' : 'latin1'),
|
|
158
|
+
targetInfo,
|
|
159
|
+
...(version !== undefined ? { version } : {}),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* `NTOWFv2` (MS-NLMP §3.3.2): `HMAC_MD5(MD4(UTF16LE(password)), UTF16LE(UPPER(user) + domain))`.
|
|
164
|
+
* The domain keeps its case; only the user name is upper-cased.
|
|
165
|
+
*
|
|
166
|
+
* @param username the account name
|
|
167
|
+
* @param domain the domain (empty string when there is none)
|
|
168
|
+
* @param password the plaintext password — never logged, never stored by this module
|
|
169
|
+
*/
|
|
170
|
+
export function ntowfv2(username, domain, password) {
|
|
171
|
+
const ntHash = md4(utf16le(password));
|
|
172
|
+
return hmacMd5(ntHash, utf16le(username.toUpperCase() + domain));
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Builds the NTLMv2 `temp` blob: version bytes, the timestamp, the client challenge and the
|
|
176
|
+
* server's AV pairs. Exported so a verifier can rebuild the exact blob it received.
|
|
177
|
+
*/
|
|
178
|
+
export function ntlmv2Blob(params) {
|
|
179
|
+
const head = new Uint8Array(28);
|
|
180
|
+
const view = new DataView(head.buffer);
|
|
181
|
+
head[0] = 1; // Responserversion
|
|
182
|
+
head[1] = 1; // HiResponserversion
|
|
183
|
+
view.setBigUint64(8, params.timestamp, true);
|
|
184
|
+
head.set(params.clientChallenge, 16);
|
|
185
|
+
return concat([head, params.targetInfo, new Uint8Array(4)]);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* `NTProofStr` (MS-NLMP §3.3.2): `HMAC_MD5(NTOWFv2, serverChallenge || temp)`.
|
|
189
|
+
*
|
|
190
|
+
* @param responseKeyNt the `NTOWFv2` for the account
|
|
191
|
+
* @param serverChallenge the 8-byte challenge from the Type 2 message
|
|
192
|
+
* @param blob the `temp` blob from {@link ntlmv2Blob}
|
|
193
|
+
*/
|
|
194
|
+
export function ntProofString(responseKeyNt, serverChallenge, blob) {
|
|
195
|
+
return hmacMd5(responseKeyNt, concat([serverChallenge, blob]));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The LMv2 response: `HMAC_MD5(NTOWFv2, serverChallenge || clientChallenge) || clientChallenge`.
|
|
199
|
+
*/
|
|
200
|
+
export function lmv2Response(responseKeyNt, serverChallenge, clientChallenge) {
|
|
201
|
+
return concat([hmacMd5(responseKeyNt, concat([serverChallenge, clientChallenge])), clientChallenge]);
|
|
202
|
+
}
|
|
203
|
+
/** Appends an `MsvAvFlags` AV pair to a target-info block whose `MsvAvEOL` terminator is replaced. */
|
|
204
|
+
function withAvPairs(targetInfo, extra) {
|
|
205
|
+
// Strip the trailing EOL pair (id 0, len 0 — all 4 bytes zero) so the extra pairs land before it.
|
|
206
|
+
let end = targetInfo.length;
|
|
207
|
+
if (end >= 4 &&
|
|
208
|
+
targetInfo[end - 4] === 0 &&
|
|
209
|
+
targetInfo[end - 3] === 0 &&
|
|
210
|
+
targetInfo[end - 2] === 0 &&
|
|
211
|
+
targetInfo[end - 1] === 0) {
|
|
212
|
+
end -= 4;
|
|
213
|
+
}
|
|
214
|
+
const parts = [targetInfo.slice(0, end)];
|
|
215
|
+
for (const pair of extra) {
|
|
216
|
+
const header = new Uint8Array(4);
|
|
217
|
+
const view = new DataView(header.buffer);
|
|
218
|
+
view.setUint16(0, pair.id, true);
|
|
219
|
+
view.setUint16(2, pair.value.length, true);
|
|
220
|
+
parts.push(header, pair.value);
|
|
221
|
+
}
|
|
222
|
+
parts.push(new Uint8Array(4)); // MsvAvEOL
|
|
223
|
+
return concat(parts);
|
|
224
|
+
}
|
|
225
|
+
/** Reads an AV-pair block into a list of `{id, value}` entries, stopping at `MsvAvEOL`. */
|
|
226
|
+
export function parseAvPairs(bytes) {
|
|
227
|
+
const pairs = [];
|
|
228
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
229
|
+
let offset = 0;
|
|
230
|
+
while (offset + 4 <= bytes.length) {
|
|
231
|
+
const id = view.getUint16(offset, true);
|
|
232
|
+
const length = view.getUint16(offset + 2, true);
|
|
233
|
+
if (id === AV_IDS.MsvAvEOL)
|
|
234
|
+
break;
|
|
235
|
+
if (offset + 4 + length > bytes.length)
|
|
236
|
+
break;
|
|
237
|
+
pairs.push({ id, value: bytes.slice(offset + 4, offset + 4 + length) });
|
|
238
|
+
offset += 4 + length;
|
|
239
|
+
}
|
|
240
|
+
return pairs;
|
|
241
|
+
}
|
|
242
|
+
/** Builds an AV-pair block from `{id, value}` entries, terminated with `MsvAvEOL`. */
|
|
243
|
+
export function buildAvPairs(pairs) {
|
|
244
|
+
return withAvPairs(new Uint8Array(4), pairs);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Builds a Type 3 AUTHENTICATE message answering `params.type2`, computing the NTLMv2 and
|
|
248
|
+
* LMv2 responses. The server's target info is carried through verbatim (with an
|
|
249
|
+
* `MsvAvTimestamp` added when the server sent none, and `MsvAvFlags` = 0 to state
|
|
250
|
+
* explicitly that no MIC follows).
|
|
251
|
+
*
|
|
252
|
+
* The password is used only to derive `NTOWFv2` and never appears in the message.
|
|
253
|
+
*
|
|
254
|
+
* When the server's Type 2 did not negotiate `NEGOTIATE_UNICODE`, the domain/user/workstation
|
|
255
|
+
* are OEM- (latin1-) encoded instead of UTF-16LE, and the Type 3's own flags clear the Unicode
|
|
256
|
+
* bit and set `NEGOTIATE_OEM`, matching what the server asked for.
|
|
257
|
+
*
|
|
258
|
+
* @param params the credentials, the parsed challenge and the injectable nonce/clock
|
|
259
|
+
*/
|
|
260
|
+
export function createType3(params) {
|
|
261
|
+
const domain = params.domain ?? '';
|
|
262
|
+
const workstation = params.workstation ?? '';
|
|
263
|
+
const responseKeyNt = ntowfv2(params.username, domain, params.password);
|
|
264
|
+
const useUnicode = (params.type2.flags & NTLM_FLAGS.NEGOTIATE_UNICODE) !== 0;
|
|
265
|
+
const encodeName = useUnicode ? utf16le : oem;
|
|
266
|
+
const serverPairs = parseAvPairs(params.type2.targetInfo);
|
|
267
|
+
const hasTimestamp = serverPairs.some((pair) => pair.id === AV_IDS.MsvAvTimestamp);
|
|
268
|
+
const timestampBytes = new Uint8Array(8);
|
|
269
|
+
new DataView(timestampBytes.buffer).setBigUint64(0, params.timestamp, true);
|
|
270
|
+
const extra = [];
|
|
271
|
+
if (!hasTimestamp)
|
|
272
|
+
extra.push({ id: AV_IDS.MsvAvTimestamp, value: timestampBytes });
|
|
273
|
+
// MsvAvFlags = 0: no MIC is present. (Bit 0x02 would claim one, which we do not send.)
|
|
274
|
+
extra.push({ id: AV_IDS.MsvAvFlags, value: new Uint8Array(4) });
|
|
275
|
+
const targetInfo = extra.length > 0 ? withAvPairs(params.type2.targetInfo, extra) : params.type2.targetInfo;
|
|
276
|
+
const blob = ntlmv2Blob({ timestamp: params.timestamp, clientChallenge: params.clientChallenge, targetInfo });
|
|
277
|
+
const ntProofStr = ntProofString(responseKeyNt, params.type2.serverChallenge, blob);
|
|
278
|
+
const ntChallengeResponse = concat([ntProofStr, blob]);
|
|
279
|
+
const lmChallengeResponse = lmv2Response(responseKeyNt, params.type2.serverChallenge, params.clientChallenge);
|
|
280
|
+
const domainBytes = encodeName(domain);
|
|
281
|
+
const userBytes = encodeName(params.username);
|
|
282
|
+
const workstationBytes = encodeName(workstation);
|
|
283
|
+
// 8 signature + 4 type + 6 * 8 field descriptors + 4 flags + 8 version. No MIC.
|
|
284
|
+
const headerLength = 72;
|
|
285
|
+
const parts = [lmChallengeResponse, ntChallengeResponse, domainBytes, userBytes, workstationBytes];
|
|
286
|
+
const message = new Uint8Array(headerLength + parts.reduce((sum, part) => sum + part.length, 0));
|
|
287
|
+
message.set(SIGNATURE_BYTES, 0);
|
|
288
|
+
const view = new DataView(message.buffer);
|
|
289
|
+
view.setUint32(8, 3, true);
|
|
290
|
+
let offset = headerLength;
|
|
291
|
+
for (const [index, part] of parts.entries()) {
|
|
292
|
+
writeField(view, 12 + index * 8, part.length, offset);
|
|
293
|
+
message.set(part, offset);
|
|
294
|
+
offset += part.length;
|
|
295
|
+
}
|
|
296
|
+
// EncryptedRandomSessionKey: empty, since no key exchange is negotiated.
|
|
297
|
+
writeField(view, 52, 0, offset);
|
|
298
|
+
let responseFlags = DEFAULT_NEGOTIATE_FLAGS;
|
|
299
|
+
if (!useUnicode) {
|
|
300
|
+
responseFlags = (responseFlags & ~NTLM_FLAGS.NEGOTIATE_UNICODE) >>> 0;
|
|
301
|
+
responseFlags = (responseFlags | NTLM_FLAGS.NEGOTIATE_OEM) >>> 0;
|
|
302
|
+
}
|
|
303
|
+
view.setUint32(60, responseFlags, true);
|
|
304
|
+
message.set(VERSION_BLOCK, 64);
|
|
305
|
+
return { message, ntProofStr, ntChallengeResponse, lmChallengeResponse, responseKeyNt };
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Parses a Type 3 AUTHENTICATE message. Used by the test NTLM server to verify a client's
|
|
309
|
+
* response independently of {@link createType3}.
|
|
310
|
+
*
|
|
311
|
+
* @param bytes the raw message (already base64-decoded)
|
|
312
|
+
* @throws WirebenchError (`ntlm-invalid-message`) when the signature or message type is not a Type 3 message
|
|
313
|
+
*/
|
|
314
|
+
export function parseType3(bytes) {
|
|
315
|
+
if (!hasSignature(bytes) || bytes.length < 64) {
|
|
316
|
+
throw new WirebenchError('ntlm-invalid-message', 'not an NTLM message');
|
|
317
|
+
}
|
|
318
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
319
|
+
if (view.getUint32(8, true) !== 3) {
|
|
320
|
+
throw new WirebenchError('ntlm-invalid-message', 'not an NTLM Type 3 message');
|
|
321
|
+
}
|
|
322
|
+
const flags = view.getUint32(60, true);
|
|
323
|
+
const decode = (field) => Buffer.from(field).toString((flags & NTLM_FLAGS.NEGOTIATE_UNICODE) !== 0 ? 'utf16le' : 'latin1');
|
|
324
|
+
return {
|
|
325
|
+
flags,
|
|
326
|
+
lmChallengeResponse: readField(bytes, view, 12),
|
|
327
|
+
ntChallengeResponse: readField(bytes, view, 20),
|
|
328
|
+
domain: decode(readField(bytes, view, 28)),
|
|
329
|
+
username: decode(readField(bytes, view, 36)),
|
|
330
|
+
workstation: decode(readField(bytes, view, 44)),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Formats a message as an `Authorization`/`WWW-Authenticate` value: `NTLM <base64>`.
|
|
335
|
+
* Wirebench always answers with the `NTLM` scheme, even when the server advertised
|
|
336
|
+
* `Negotiate` — every server that offers raw NTLMSSP under `Negotiate` accepts it.
|
|
337
|
+
*/
|
|
338
|
+
export function encodeNtlmAuthorization(message) {
|
|
339
|
+
return `NTLM ${Buffer.from(message).toString('base64')}`;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Extracts an NTLMSSP message from a `WWW-Authenticate` header value. Accepts both
|
|
343
|
+
* `NTLM <base64>` and `Negotiate <base64>` (only when the payload really is NTLMSSP,
|
|
344
|
+
* not a Kerberos/SPNEGO token), and tolerates several challenges in one header.
|
|
345
|
+
*
|
|
346
|
+
* @param header the raw header value, or `undefined` when the response had none
|
|
347
|
+
* @returns the decoded message bytes, or `undefined` when there is no usable NTLM challenge
|
|
348
|
+
*/
|
|
349
|
+
export function parseNtlmChallengeHeader(header) {
|
|
350
|
+
if (header === undefined)
|
|
351
|
+
return undefined;
|
|
352
|
+
for (const part of header.split(',')) {
|
|
353
|
+
const match = /^\s*(NTLM|Negotiate)(?:\s+([A-Za-z0-9+/=]+))?\s*$/i.exec(part);
|
|
354
|
+
const token = match?.[2];
|
|
355
|
+
if (token === undefined || token === '')
|
|
356
|
+
continue;
|
|
357
|
+
let decoded;
|
|
358
|
+
try {
|
|
359
|
+
decoded = new Uint8Array(Buffer.from(token, 'base64'));
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (hasSignature(decoded))
|
|
365
|
+
return decoded;
|
|
366
|
+
}
|
|
367
|
+
return undefined;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* True when `header` offers an NTLM (or NTLMSSP-over-Negotiate) challenge at all, including
|
|
371
|
+
* the bare `WWW-Authenticate: NTLM` that starts a handshake.
|
|
372
|
+
*/
|
|
373
|
+
export function offersNtlm(header) {
|
|
374
|
+
if (header === undefined)
|
|
375
|
+
return false;
|
|
376
|
+
return header.split(',').some((part) => /^\s*(NTLM|Negotiate)(\s|$)/i.test(part));
|
|
377
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ProxyAgent, type Dispatcher } from 'undici';
|
|
2
|
+
import type { HttpExchange, HttpRequest, ProxyOptions, TlsOptions } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Builds a dispatcher for the given TLS/proxy options. Callers that pass
|
|
5
|
+
* custom `tls`/`proxy` own the returned dispatcher (it is not cached) and
|
|
6
|
+
* should close it when done; callers with no options get the shared default
|
|
7
|
+
* keep-alive agent.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createDispatcher(opts: {
|
|
10
|
+
readonly tls?: TlsOptions;
|
|
11
|
+
readonly proxy?: ProxyOptions;
|
|
12
|
+
readonly keepAlive?: boolean;
|
|
13
|
+
/** Local interface address to bind outgoing sockets to; undici's `connect.localAddress`. */
|
|
14
|
+
readonly localAddress?: string;
|
|
15
|
+
/** Offer HTTP/2 in the ALPN handshake. Off by default; see `HttpRequest.allowH2`. */
|
|
16
|
+
readonly allowH2?: boolean;
|
|
17
|
+
}): Dispatcher;
|
|
18
|
+
/**
|
|
19
|
+
* The `ProxyAgent` options for one proxied request.
|
|
20
|
+
*
|
|
21
|
+
* The split between `requestTls` and `proxyTls` is the whole point: undici applies the
|
|
22
|
+
* agent-level `connect` to the socket it opens *to the proxy*, never to the TLS session inside
|
|
23
|
+
* the CONNECT tunnel — so passing our TLS settings there would silently drop the user's trust
|
|
24
|
+
* anchors, client certificate and `minVersion` for every proxied HTTPS request. `requestTls`
|
|
25
|
+
* is the tunnelled origin handshake (where those belong) and `proxyTls` carries only what
|
|
26
|
+
* describes the hop to the proxy itself, i.e. the bind address.
|
|
27
|
+
*
|
|
28
|
+
* `allowH2` is stated on `requestTls` rather than left to the agent, because undici builds the
|
|
29
|
+
* tunnelled connector from `requestTls` alone and its `allowH2` *defaults to true* — so an
|
|
30
|
+
* unstated flag offered `h2` in the ALPN of every proxied HTTPS handshake, including the ones
|
|
31
|
+
* whose client only speaks HTTP/1.1. Exported for the unit test that pins exactly that; not
|
|
32
|
+
* part of the package's public API (`index.ts` does not re-export it).
|
|
33
|
+
*
|
|
34
|
+
* @param proxy the resolved proxy to dial
|
|
35
|
+
* @param opts the send's TLS options and bind address
|
|
36
|
+
* @param allowH2 whether HTTP/2 may be negotiated, on the tunnelled handshake and the agent
|
|
37
|
+
* @param extra agent-level options merged on top (connection pooling, keep-alive)
|
|
38
|
+
*/
|
|
39
|
+
export declare function proxyAgentOptionsFor(proxy: ProxyOptions, opts: {
|
|
40
|
+
readonly tls?: TlsOptions;
|
|
41
|
+
readonly localAddress?: string;
|
|
42
|
+
}, allowH2: boolean, extra?: Record<string, unknown>): ProxyAgent.Options;
|
|
43
|
+
/**
|
|
44
|
+
* Builds a dispatcher pinned to a single, non-pipelined connection per origin, using the
|
|
45
|
+
* same TLS/proxy/bind-address mapping as {@link createDispatcher}. NTLM authenticates the
|
|
46
|
+
* *connection*, not the request, so all three legs of its handshake have to travel over one
|
|
47
|
+
* socket; `connections: 1` plus keep-alive gives sequential requests exactly that. The caller
|
|
48
|
+
* owns the returned dispatcher and must close it.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createSingleConnectionDispatcher(opts: {
|
|
51
|
+
readonly tls?: TlsOptions;
|
|
52
|
+
readonly proxy?: ProxyOptions;
|
|
53
|
+
readonly localAddress?: string;
|
|
54
|
+
}): Dispatcher;
|
|
55
|
+
/**
|
|
56
|
+
* Sends one HTTP request and returns the full {@link HttpExchange}, including
|
|
57
|
+
* reconstructed raw wire bytes and best-effort timings. Redirects (301/302/
|
|
58
|
+
* 303/307/308) are followed manually when `req.followRedirects` is set, so we
|
|
59
|
+
* can record the `redirects[]` trail and apply fetch's POST→GET downgrade on
|
|
60
|
+
* 301/302/303.
|
|
61
|
+
*
|
|
62
|
+
* Non-2xx responses are returned as a normal exchange, never thrown — only
|
|
63
|
+
* transport-level failures (timeout, abort, DNS, TLS, refused connection,
|
|
64
|
+
* too many redirects, invalid URL) throw {@link HttpError}.
|
|
65
|
+
*
|
|
66
|
+
* A response exceeding `req.maxSizeBytes` is *not* an error: the exchange is
|
|
67
|
+
* returned with `truncated: true` and `body` cut at the cap, per the product
|
|
68
|
+
* decision that "Max Size" (Task 30) should notify, not fail, the exchange.
|
|
69
|
+
*/
|
|
70
|
+
export declare function sendHttp(req: HttpRequest, options?: {
|
|
71
|
+
readonly dispatcher?: Dispatcher;
|
|
72
|
+
readonly now?: () => number;
|
|
73
|
+
}): Promise<HttpExchange>;
|