ahmad-module 1.0.0
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.
Potentially problematic release.
This version of ahmad-module might be problematic. Click here for more details.
- package/.bin/sshpk-conv +12 -0
- package/.bin/sshpk-conv.cmd +17 -0
- package/.bin/sshpk-conv.ps1 +28 -0
- package/.bin/sshpk-sign +12 -0
- package/.bin/sshpk-sign.cmd +17 -0
- package/.bin/sshpk-sign.ps1 +28 -0
- package/.bin/sshpk-verify +12 -0
- package/.bin/sshpk-verify.cmd +17 -0
- package/.bin/sshpk-verify.ps1 +28 -0
- package/.bin/uuid +12 -0
- package/.bin/uuid.cmd +17 -0
- package/.bin/uuid.ps1 +28 -0
- package/ajv/.tonic_example.js +20 -0
- package/ajv/LICENSE +22 -0
- package/ajv/README.md +1497 -0
- package/ajv/dist/ajv.bundle.js +7189 -0
- package/ajv/dist/ajv.min.js +3 -0
- package/ajv/dist/ajv.min.js.map +1 -0
- package/ajv/lib/ajv.d.ts +397 -0
- package/ajv/lib/ajv.js +506 -0
- package/ajv/lib/cache.js +26 -0
- package/ajv/lib/compile/async.js +90 -0
- package/ajv/lib/compile/equal.js +5 -0
- package/ajv/lib/compile/error_classes.js +34 -0
- package/ajv/lib/compile/formats.js +142 -0
- package/ajv/lib/compile/index.js +387 -0
- package/ajv/lib/compile/resolve.js +270 -0
- package/ajv/lib/compile/rules.js +66 -0
- package/ajv/lib/compile/schema_obj.js +9 -0
- package/ajv/lib/compile/ucs2length.js +20 -0
- package/ajv/lib/compile/util.js +239 -0
- package/ajv/lib/data.js +49 -0
- package/ajv/lib/definition_schema.js +37 -0
- package/ajv/lib/dot/_limit.jst +113 -0
- package/ajv/lib/dot/_limitItems.jst +12 -0
- package/ajv/lib/dot/_limitLength.jst +12 -0
- package/ajv/lib/dot/_limitProperties.jst +12 -0
- package/ajv/lib/dot/allOf.jst +32 -0
- package/ajv/lib/dot/anyOf.jst +46 -0
- package/ajv/lib/dot/coerce.def +51 -0
- package/ajv/lib/dot/comment.jst +9 -0
- package/ajv/lib/dot/const.jst +11 -0
- package/ajv/lib/dot/contains.jst +55 -0
- package/ajv/lib/dot/custom.jst +191 -0
- package/ajv/lib/dot/defaults.def +47 -0
- package/ajv/lib/dot/definitions.def +203 -0
- package/ajv/lib/dot/dependencies.jst +79 -0
- package/ajv/lib/dot/enum.jst +30 -0
- package/ajv/lib/dot/errors.def +194 -0
- package/ajv/lib/dot/format.jst +106 -0
- package/ajv/lib/dot/if.jst +73 -0
- package/ajv/lib/dot/items.jst +98 -0
- package/ajv/lib/dot/missing.def +39 -0
- package/ajv/lib/dot/multipleOf.jst +22 -0
- package/ajv/lib/dot/not.jst +43 -0
- package/ajv/lib/dot/oneOf.jst +54 -0
- package/ajv/lib/dot/pattern.jst +14 -0
- package/ajv/lib/dot/properties.jst +245 -0
- package/ajv/lib/dot/propertyNames.jst +52 -0
- package/ajv/lib/dot/ref.jst +85 -0
- package/ajv/lib/dot/required.jst +108 -0
- package/ajv/lib/dot/uniqueItems.jst +62 -0
- package/ajv/lib/dot/validate.jst +276 -0
- package/ajv/lib/dotjs/README.md +3 -0
- package/ajv/lib/dotjs/_limit.js +163 -0
- package/ajv/lib/dotjs/_limitItems.js +80 -0
- package/ajv/lib/dotjs/_limitLength.js +85 -0
- package/ajv/lib/dotjs/_limitProperties.js +80 -0
- package/ajv/lib/dotjs/allOf.js +42 -0
- package/ajv/lib/dotjs/anyOf.js +73 -0
- package/ajv/lib/dotjs/comment.js +14 -0
- package/ajv/lib/dotjs/const.js +56 -0
- package/ajv/lib/dotjs/contains.js +81 -0
- package/ajv/lib/dotjs/custom.js +228 -0
- package/ajv/lib/dotjs/dependencies.js +168 -0
- package/ajv/lib/dotjs/enum.js +66 -0
- package/ajv/lib/dotjs/format.js +150 -0
- package/ajv/lib/dotjs/if.js +103 -0
- package/ajv/lib/dotjs/index.js +33 -0
- package/ajv/lib/dotjs/items.js +140 -0
- package/ajv/lib/dotjs/multipleOf.js +80 -0
- package/ajv/lib/dotjs/not.js +84 -0
- package/ajv/lib/dotjs/oneOf.js +73 -0
- package/ajv/lib/dotjs/pattern.js +75 -0
- package/ajv/lib/dotjs/properties.js +335 -0
- package/ajv/lib/dotjs/propertyNames.js +81 -0
- package/ajv/lib/dotjs/ref.js +124 -0
- package/ajv/lib/dotjs/required.js +270 -0
- package/ajv/lib/dotjs/uniqueItems.js +86 -0
- package/ajv/lib/dotjs/validate.js +482 -0
- package/ajv/lib/keyword.js +146 -0
- package/ajv/lib/refs/data.json +17 -0
- package/ajv/lib/refs/json-schema-draft-04.json +149 -0
- package/ajv/lib/refs/json-schema-draft-06.json +154 -0
- package/ajv/lib/refs/json-schema-draft-07.json +168 -0
- package/ajv/lib/refs/json-schema-secure.json +94 -0
- package/ajv/package.json +106 -0
- package/ajv/scripts/.eslintrc.yml +3 -0
- package/ajv/scripts/bundle.js +61 -0
- package/ajv/scripts/compile-dots.js +73 -0
- package/ajv/scripts/info +10 -0
- package/ajv/scripts/prepare-tests +12 -0
- package/ajv/scripts/publish-built-version +32 -0
- package/ajv/scripts/travis-gh-pages +23 -0
- package/asn1/Jenkinsfile +65 -0
- package/asn1/LICENSE +19 -0
- package/asn1/README.md +50 -0
- package/asn1/lib/ber/errors.js +13 -0
- package/asn1/lib/ber/index.js +27 -0
- package/asn1/lib/ber/reader.js +262 -0
- package/asn1/lib/ber/types.js +36 -0
- package/asn1/lib/ber/writer.js +317 -0
- package/asn1/lib/index.js +20 -0
- package/asn1/package.json +31 -0
- package/assert-plus/AUTHORS +6 -0
- package/assert-plus/CHANGES.md +14 -0
- package/assert-plus/README.md +162 -0
- package/assert-plus/assert.js +211 -0
- package/assert-plus/package.json +23 -0
- package/asynckit/LICENSE +21 -0
- package/asynckit/README.md +233 -0
- package/asynckit/bench.js +76 -0
- package/asynckit/index.js +6 -0
- package/asynckit/lib/abort.js +29 -0
- package/asynckit/lib/async.js +34 -0
- package/asynckit/lib/defer.js +26 -0
- package/asynckit/lib/iterate.js +75 -0
- package/asynckit/lib/readable_asynckit.js +91 -0
- package/asynckit/lib/readable_parallel.js +25 -0
- package/asynckit/lib/readable_serial.js +25 -0
- package/asynckit/lib/readable_serial_ordered.js +29 -0
- package/asynckit/lib/state.js +37 -0
- package/asynckit/lib/streamify.js +141 -0
- package/asynckit/lib/terminator.js +29 -0
- package/asynckit/package.json +63 -0
- package/asynckit/parallel.js +43 -0
- package/asynckit/serial.js +17 -0
- package/asynckit/serialOrdered.js +75 -0
- package/asynckit/stream.js +21 -0
- package/aws-sign2/LICENSE +55 -0
- package/aws-sign2/README.md +4 -0
- package/aws-sign2/index.js +212 -0
- package/aws-sign2/package.json +17 -0
- package/aws4/.github/FUNDING.yml +3 -0
- package/aws4/.travis.yml +9 -0
- package/aws4/LICENSE +19 -0
- package/aws4/README.md +183 -0
- package/aws4/aws4.js +373 -0
- package/aws4/lru.js +96 -0
- package/aws4/package.json +17 -0
- package/axios/CHANGELOG.md +775 -0
- package/axios/LICENSE +19 -0
- package/axios/README.md +868 -0
- package/axios/SECURITY.md +5 -0
- package/axios/UPGRADE_GUIDE.md +162 -0
- package/axios/dist/axios.js +2193 -0
- package/axios/dist/axios.map +1 -0
- package/axios/dist/axios.min.js +3 -0
- package/axios/dist/axios.min.map +1 -0
- package/axios/index.d.ts +168 -0
- package/axios/index.js +1 -0
- package/axios/lib/adapters/README.md +37 -0
- package/axios/lib/adapters/http.js +331 -0
- package/axios/lib/adapters/xhr.js +189 -0
- package/axios/lib/axios.js +56 -0
- package/axios/lib/cancel/Cancel.js +19 -0
- package/axios/lib/cancel/CancelToken.js +57 -0
- package/axios/lib/cancel/isCancel.js +5 -0
- package/axios/lib/core/Axios.js +148 -0
- package/axios/lib/core/InterceptorManager.js +54 -0
- package/axios/lib/core/README.md +8 -0
- package/axios/lib/core/buildFullPath.js +20 -0
- package/axios/lib/core/createError.js +18 -0
- package/axios/lib/core/dispatchRequest.js +82 -0
- package/axios/lib/core/enhanceError.js +42 -0
- package/axios/lib/core/mergeConfig.js +87 -0
- package/axios/lib/core/settle.js +25 -0
- package/axios/lib/core/transformData.js +22 -0
- package/axios/lib/defaults.js +134 -0
- package/axios/lib/helpers/README.md +7 -0
- package/axios/lib/helpers/bind.js +11 -0
- package/axios/lib/helpers/buildURL.js +70 -0
- package/axios/lib/helpers/combineURLs.js +14 -0
- package/axios/lib/helpers/cookies.js +53 -0
- package/axios/lib/helpers/deprecatedMethod.js +24 -0
- package/axios/lib/helpers/isAbsoluteURL.js +14 -0
- package/axios/lib/helpers/isAxiosError.js +11 -0
- package/axios/lib/helpers/isURLSameOrigin.js +68 -0
- package/axios/lib/helpers/normalizeHeaderName.js +12 -0
- package/axios/lib/helpers/parseHeaders.js +53 -0
- package/axios/lib/helpers/spread.js +27 -0
- package/axios/lib/helpers/validator.js +105 -0
- package/axios/lib/utils.js +349 -0
- package/axios/package.json +84 -0
- package/bcrypt-pbkdf/CONTRIBUTING.md +13 -0
- package/bcrypt-pbkdf/LICENSE +66 -0
- package/bcrypt-pbkdf/README.md +45 -0
- package/bcrypt-pbkdf/index.js +556 -0
- package/bcrypt-pbkdf/package.json +15 -0
- package/caseless/LICENSE +28 -0
- package/caseless/README.md +45 -0
- package/caseless/index.js +67 -0
- package/caseless/package.json +27 -0
- package/caseless/test.js +67 -0
- package/combined-stream/License +19 -0
- package/combined-stream/Readme.md +138 -0
- package/combined-stream/lib/combined_stream.js +208 -0
- package/combined-stream/package.json +25 -0
- package/combined-stream/yarn.lock +17 -0
- package/core-util-is/LICENSE +19 -0
- package/core-util-is/README.md +3 -0
- package/core-util-is/float.patch +604 -0
- package/core-util-is/lib/util.js +107 -0
- package/core-util-is/package.json +32 -0
- package/core-util-is/test.js +68 -0
- package/dashdash/CHANGES.md +364 -0
- package/dashdash/LICENSE.txt +24 -0
- package/dashdash/README.md +574 -0
- package/dashdash/etc/dashdash.bash_completion.in +389 -0
- package/dashdash/lib/dashdash.js +1055 -0
- package/dashdash/package.json +26 -0
- package/delayed-stream/License +19 -0
- package/delayed-stream/Makefile +7 -0
- package/delayed-stream/Readme.md +141 -0
- package/delayed-stream/lib/delayed_stream.js +107 -0
- package/delayed-stream/package.json +27 -0
- package/ecc-jsbn/LICENSE +21 -0
- package/ecc-jsbn/README.md +8 -0
- package/ecc-jsbn/index.js +58 -0
- package/ecc-jsbn/lib/LICENSE-jsbn +40 -0
- package/ecc-jsbn/lib/ec.js +561 -0
- package/ecc-jsbn/lib/sec.js +170 -0
- package/ecc-jsbn/package.json +40 -0
- package/ecc-jsbn/test.js +14 -0
- package/extend/.editorconfig +20 -0
- package/extend/.eslintrc +17 -0
- package/extend/.jscs.json +175 -0
- package/extend/.travis.yml +230 -0
- package/extend/CHANGELOG.md +83 -0
- package/extend/LICENSE +23 -0
- package/extend/README.md +81 -0
- package/extend/component.json +32 -0
- package/extend/index.js +117 -0
- package/extend/package.json +42 -0
- package/extsprintf/.gitmodules +0 -0
- package/extsprintf/LICENSE +19 -0
- package/extsprintf/Makefile +24 -0
- package/extsprintf/Makefile.targ +285 -0
- package/extsprintf/README.md +46 -0
- package/extsprintf/jsl.node.conf +137 -0
- package/extsprintf/lib/extsprintf.js +183 -0
- package/extsprintf/package.json +14 -0
- package/fast-deep-equal/LICENSE +21 -0
- package/fast-deep-equal/README.md +96 -0
- package/fast-deep-equal/es6/index.d.ts +2 -0
- package/fast-deep-equal/es6/index.js +72 -0
- package/fast-deep-equal/es6/react.d.ts +2 -0
- package/fast-deep-equal/es6/react.js +79 -0
- package/fast-deep-equal/index.d.ts +4 -0
- package/fast-deep-equal/index.js +46 -0
- package/fast-deep-equal/package.json +61 -0
- package/fast-deep-equal/react.d.ts +2 -0
- package/fast-deep-equal/react.js +53 -0
- package/fast-json-stable-stringify/.eslintrc.yml +26 -0
- package/fast-json-stable-stringify/.github/FUNDING.yml +1 -0
- package/fast-json-stable-stringify/.travis.yml +8 -0
- package/fast-json-stable-stringify/LICENSE +21 -0
- package/fast-json-stable-stringify/README.md +131 -0
- package/fast-json-stable-stringify/benchmark/index.js +31 -0
- package/fast-json-stable-stringify/benchmark/test.json +137 -0
- package/fast-json-stable-stringify/example/key_cmp.js +7 -0
- package/fast-json-stable-stringify/example/nested.js +3 -0
- package/fast-json-stable-stringify/example/str.js +3 -0
- package/fast-json-stable-stringify/example/value_cmp.js +7 -0
- package/fast-json-stable-stringify/index.d.ts +4 -0
- package/fast-json-stable-stringify/index.js +59 -0
- package/fast-json-stable-stringify/package.json +52 -0
- package/fast-json-stable-stringify/test/cmp.js +13 -0
- package/fast-json-stable-stringify/test/nested.js +44 -0
- package/fast-json-stable-stringify/test/str.js +46 -0
- package/fast-json-stable-stringify/test/to-json.js +22 -0
- package/follow-redirects/LICENSE +18 -0
- package/follow-redirects/README.md +155 -0
- package/follow-redirects/debug.js +15 -0
- package/follow-redirects/http.js +1 -0
- package/follow-redirects/https.js +1 -0
- package/follow-redirects/index.js +598 -0
- package/follow-redirects/package.json +59 -0
- package/forever-agent/LICENSE +55 -0
- package/forever-agent/README.md +4 -0
- package/forever-agent/index.js +138 -0
- package/forever-agent/package.json +17 -0
- package/form-data/License +19 -0
- package/form-data/README.md +234 -0
- package/form-data/README.md.bak +234 -0
- package/form-data/lib/browser.js +2 -0
- package/form-data/lib/form_data.js +457 -0
- package/form-data/lib/populate.js +10 -0
- package/form-data/package.json +65 -0
- package/form-data/yarn.lock +2662 -0
- package/getpass/.travis.yml +9 -0
- package/getpass/LICENSE +18 -0
- package/getpass/README.md +32 -0
- package/getpass/lib/index.js +123 -0
- package/getpass/package.json +18 -0
- package/har-schema/LICENSE +13 -0
- package/har-schema/README.md +49 -0
- package/har-schema/lib/afterRequest.json +30 -0
- package/har-schema/lib/beforeRequest.json +30 -0
- package/har-schema/lib/browser.json +20 -0
- package/har-schema/lib/cache.json +21 -0
- package/har-schema/lib/content.json +29 -0
- package/har-schema/lib/cookie.json +36 -0
- package/har-schema/lib/creator.json +20 -0
- package/har-schema/lib/entry.json +53 -0
- package/har-schema/lib/har.json +13 -0
- package/har-schema/lib/header.json +20 -0
- package/har-schema/lib/index.js +22 -0
- package/har-schema/lib/log.json +36 -0
- package/har-schema/lib/page.json +32 -0
- package/har-schema/lib/pageTimings.json +18 -0
- package/har-schema/lib/postData.json +43 -0
- package/har-schema/lib/query.json +20 -0
- package/har-schema/lib/request.json +57 -0
- package/har-schema/lib/response.json +54 -0
- package/har-schema/lib/timings.json +42 -0
- package/har-schema/package.json +54 -0
- package/har-validator/LICENSE +9 -0
- package/har-validator/README.md +43 -0
- package/har-validator/lib/async.js +105 -0
- package/har-validator/lib/error.js +17 -0
- package/har-validator/lib/promise.js +102 -0
- package/har-validator/package.json +43 -0
- package/http-signature/.dir-locals.el +6 -0
- package/http-signature/CHANGES.md +46 -0
- package/http-signature/LICENSE +18 -0
- package/http-signature/README.md +79 -0
- package/http-signature/http_signing.md +363 -0
- package/http-signature/lib/index.js +29 -0
- package/http-signature/lib/parser.js +315 -0
- package/http-signature/lib/signer.js +401 -0
- package/http-signature/lib/utils.js +112 -0
- package/http-signature/lib/verify.js +88 -0
- package/http-signature/package.json +39 -0
- package/is-typedarray/LICENSE.md +18 -0
- package/is-typedarray/README.md +16 -0
- package/is-typedarray/index.js +41 -0
- package/is-typedarray/package.json +30 -0
- package/is-typedarray/test.js +34 -0
- package/isstream/.jshintrc +59 -0
- package/isstream/.travis.yml +12 -0
- package/isstream/LICENSE.md +11 -0
- package/isstream/README.md +66 -0
- package/isstream/isstream.js +27 -0
- package/isstream/package.json +33 -0
- package/isstream/test.js +168 -0
- package/jsbn/LICENSE +40 -0
- package/jsbn/README.md +175 -0
- package/jsbn/example.html +12 -0
- package/jsbn/example.js +3 -0
- package/jsbn/index.js +1357 -0
- package/jsbn/package.json +21 -0
- package/json-schema/LICENSE +195 -0
- package/json-schema/README.md +3 -0
- package/json-schema/lib/links.js +65 -0
- package/json-schema/lib/validate.js +271 -0
- package/json-schema/package.json +24 -0
- package/json-schema-traverse/.eslintrc.yml +27 -0
- package/json-schema-traverse/.travis.yml +8 -0
- package/json-schema-traverse/LICENSE +21 -0
- package/json-schema-traverse/README.md +83 -0
- package/json-schema-traverse/index.js +89 -0
- package/json-schema-traverse/package.json +43 -0
- package/json-schema-traverse/spec/.eslintrc.yml +6 -0
- package/json-schema-traverse/spec/fixtures/schema.js +125 -0
- package/json-schema-traverse/spec/index.spec.js +171 -0
- package/json-stringify-safe/CHANGELOG.md +14 -0
- package/json-stringify-safe/LICENSE +15 -0
- package/json-stringify-safe/Makefile +35 -0
- package/json-stringify-safe/README.md +52 -0
- package/json-stringify-safe/package.json +31 -0
- package/json-stringify-safe/stringify.js +27 -0
- package/json-stringify-safe/test/mocha.opts +2 -0
- package/json-stringify-safe/test/stringify_test.js +246 -0
- package/jsprim/CHANGES.md +53 -0
- package/jsprim/CONTRIBUTING.md +19 -0
- package/jsprim/LICENSE +19 -0
- package/jsprim/README.md +287 -0
- package/jsprim/lib/jsprim.js +735 -0
- package/jsprim/package.json +20 -0
- package/m3u8stream/LICENSE +21 -0
- package/m3u8stream/README.md +81 -0
- package/m3u8stream/dist/dash-mpd-parser.d.ts +11 -0
- package/m3u8stream/dist/dash-mpd-parser.js +183 -0
- package/m3u8stream/dist/dash-mpd-parser.js.map +1 -0
- package/m3u8stream/dist/index.d.ts +31 -0
- package/m3u8stream/dist/index.js +180 -0
- package/m3u8stream/dist/index.js.map +1 -0
- package/m3u8stream/dist/m3u8-parser.d.ts +18 -0
- package/m3u8stream/dist/m3u8-parser.js +111 -0
- package/m3u8stream/dist/m3u8-parser.js.map +1 -0
- package/m3u8stream/dist/parse-time.d.ts +16 -0
- package/m3u8stream/dist/parse-time.js +59 -0
- package/m3u8stream/dist/parse-time.js.map +1 -0
- package/m3u8stream/dist/parser.d.ts +19 -0
- package/m3u8stream/dist/parser.js +3 -0
- package/m3u8stream/dist/parser.js.map +1 -0
- package/m3u8stream/dist/queue.d.ts +39 -0
- package/m3u8stream/dist/queue.js +58 -0
- package/m3u8stream/dist/queue.js.map +1 -0
- package/m3u8stream/node_modules/sax/LICENSE +41 -0
- package/m3u8stream/node_modules/sax/README.md +225 -0
- package/m3u8stream/node_modules/sax/lib/sax.js +1565 -0
- package/m3u8stream/node_modules/sax/package.json +25 -0
- package/m3u8stream/package.json +54 -0
- package/mime-db/HISTORY.md +507 -0
- package/mime-db/LICENSE +23 -0
- package/mime-db/README.md +100 -0
- package/mime-db/db.json +8519 -0
- package/mime-db/index.js +12 -0
- package/mime-db/package.json +60 -0
- package/mime-types/HISTORY.md +397 -0
- package/mime-types/LICENSE +23 -0
- package/mime-types/README.md +113 -0
- package/mime-types/index.js +188 -0
- package/mime-types/package.json +44 -0
- package/miniget/LICENSE +21 -0
- package/miniget/README.md +111 -0
- package/miniget/dist/index.d.ts +65 -0
- package/miniget/dist/index.js +281 -0
- package/miniget/dist/index.js.map +1 -0
- package/miniget/package.json +49 -0
- package/oauth-sign/LICENSE +55 -0
- package/oauth-sign/README.md +11 -0
- package/oauth-sign/index.js +146 -0
- package/oauth-sign/package.json +23 -0
- package/package.json +11 -0
- package/performance-now/.tm_properties +7 -0
- package/performance-now/.travis.yml +6 -0
- package/performance-now/README.md +30 -0
- package/performance-now/lib/performance-now.js +36 -0
- package/performance-now/lib/performance-now.js.map +10 -0
- package/performance-now/license.txt +7 -0
- package/performance-now/package.json +35 -0
- package/performance-now/src/index.d.ts +8 -0
- package/performance-now/src/performance-now.coffee +17 -0
- package/performance-now/test/mocha.opts +3 -0
- package/performance-now/test/performance-now.coffee +43 -0
- package/performance-now/test/scripts/delayed-call.coffee +11 -0
- package/performance-now/test/scripts/delayed-require.coffee +12 -0
- package/performance-now/test/scripts/difference.coffee +6 -0
- package/performance-now/test/scripts/initial-value.coffee +10 -0
- package/performance-now/test/scripts.coffee +27 -0
- package/psl/.env +0 -0
- package/psl/LICENSE +9 -0
- package/psl/README.md +211 -0
- package/psl/browserstack-logo.svg +90 -0
- package/psl/data/rules.json +9376 -0
- package/psl/dist/psl.js +10187 -0
- package/psl/dist/psl.min.js +1 -0
- package/psl/index.js +269 -0
- package/psl/package.json +43 -0
- package/punycode/LICENSE-MIT.txt +20 -0
- package/punycode/README.md +122 -0
- package/punycode/package.json +58 -0
- package/punycode/punycode.es6.js +441 -0
- package/punycode/punycode.js +440 -0
- package/qs/.editorconfig +43 -0
- package/qs/.eslintrc +37 -0
- package/qs/.github/FUNDING.yml +12 -0
- package/qs/.nycrc +13 -0
- package/qs/CHANGELOG.md +250 -0
- package/qs/LICENSE.md +29 -0
- package/qs/README.md +510 -0
- package/qs/bower.json +21 -0
- package/qs/component.json +15 -0
- package/qs/dist/qs.js +648 -0
- package/qs/lib/formats.js +18 -0
- package/qs/lib/index.js +11 -0
- package/qs/lib/parse.js +175 -0
- package/qs/lib/stringify.js +217 -0
- package/qs/lib/utils.js +215 -0
- package/qs/package.json +54 -0
- package/qs/test/index.js +7 -0
- package/qs/test/parse.js +649 -0
- package/qs/test/stringify.js +642 -0
- package/qs/test/utils.js +65 -0
- package/request/CHANGELOG.md +717 -0
- package/request/LICENSE +55 -0
- package/request/README.md +1133 -0
- package/request/index.js +155 -0
- package/request/lib/auth.js +167 -0
- package/request/lib/cookies.js +38 -0
- package/request/lib/getProxyFromURI.js +79 -0
- package/request/lib/har.js +205 -0
- package/request/lib/hawk.js +89 -0
- package/request/lib/helpers.js +66 -0
- package/request/lib/multipart.js +112 -0
- package/request/lib/oauth.js +148 -0
- package/request/lib/querystring.js +50 -0
- package/request/lib/redirect.js +154 -0
- package/request/lib/tunnel.js +175 -0
- package/request/package.json +86 -0
- package/request/request.js +1553 -0
- package/safe-buffer/LICENSE +21 -0
- package/safe-buffer/README.md +584 -0
- package/safe-buffer/index.d.ts +187 -0
- package/safe-buffer/index.js +65 -0
- package/safe-buffer/package.json +51 -0
- package/safer-buffer/LICENSE +21 -0
- package/safer-buffer/Porting-Buffer.md +268 -0
- package/safer-buffer/Readme.md +156 -0
- package/safer-buffer/dangerous.js +58 -0
- package/safer-buffer/package.json +34 -0
- package/safer-buffer/safer.js +77 -0
- package/safer-buffer/tests.js +406 -0
- package/sax/AUTHORS +10 -0
- package/sax/LICENSE +32 -0
- package/sax/LICENSE-W3C.html +188 -0
- package/sax/README.md +216 -0
- package/sax/component.json +12 -0
- package/sax/examples/big-not-pretty.xml +8002 -0
- package/sax/examples/example.js +29 -0
- package/sax/examples/get-products.js +58 -0
- package/sax/examples/hello-world.js +4 -0
- package/sax/examples/not-pretty.xml +8 -0
- package/sax/examples/pretty-print.js +74 -0
- package/sax/examples/shopping.xml +2 -0
- package/sax/examples/strict.dtd +870 -0
- package/sax/examples/test.html +15 -0
- package/sax/examples/test.xml +1254 -0
- package/sax/lib/sax.js +1355 -0
- package/sax/package.json +12 -0
- package/sax/test/attribute-name.js +33 -0
- package/sax/test/attribute-no-space.js +75 -0
- package/sax/test/buffer-overrun.js +26 -0
- package/sax/test/case.js +50 -0
- package/sax/test/cdata-chunked.js +11 -0
- package/sax/test/cdata-end-split.js +15 -0
- package/sax/test/cdata-fake-end.js +28 -0
- package/sax/test/cdata-multiple.js +15 -0
- package/sax/test/cdata.js +10 -0
- package/sax/test/cyrillic.js +8 -0
- package/sax/test/duplicate-attribute.js +13 -0
- package/sax/test/end_empty_stream.js +5 -0
- package/sax/test/entities.js +10 -0
- package/sax/test/entity-mega.js +16 -0
- package/sax/test/flush.js +13 -0
- package/sax/test/index.js +86 -0
- package/sax/test/issue-23.js +43 -0
- package/sax/test/issue-30.js +24 -0
- package/sax/test/issue-35.js +15 -0
- package/sax/test/issue-47.js +12 -0
- package/sax/test/issue-49.js +31 -0
- package/sax/test/issue-84.js +13 -0
- package/sax/test/parser-position.js +28 -0
- package/sax/test/script-close-better.js +12 -0
- package/sax/test/script.js +12 -0
- package/sax/test/self-closing-child-strict.js +44 -0
- package/sax/test/self-closing-child.js +44 -0
- package/sax/test/self-closing-tag.js +25 -0
- package/sax/test/stray-ending.js +17 -0
- package/sax/test/trailing-attribute-no-value.js +10 -0
- package/sax/test/trailing-non-whitespace.js +18 -0
- package/sax/test/unclosed-root.js +11 -0
- package/sax/test/unquoted.js +18 -0
- package/sax/test/utf8-split.js +32 -0
- package/sax/test/xmlns-as-tag-name.js +15 -0
- package/sax/test/xmlns-issue-41.js +68 -0
- package/sax/test/xmlns-rebinding.js +63 -0
- package/sax/test/xmlns-strict.js +74 -0
- package/sax/test/xmlns-unbound-element.js +33 -0
- package/sax/test/xmlns-unbound.js +15 -0
- package/sax/test/xmlns-xml-default-ns.js +31 -0
- package/sax/test/xmlns-xml-default-prefix-attribute.js +36 -0
- package/sax/test/xmlns-xml-default-prefix.js +21 -0
- package/sax/test/xmlns-xml-default-redefine.js +41 -0
- package/simple-csv-reader/.editorconfig +8 -0
- package/simple-csv-reader/LICENSE +21 -0
- package/simple-csv-reader/README.md +32 -0
- package/simple-csv-reader/dist/simple-csv-reader.min.js +2 -0
- package/simple-csv-reader/dist/simple-csv-reader.min.js.map +1 -0
- package/simple-csv-reader/gulpfile.js +26 -0
- package/simple-csv-reader/index.js +131 -0
- package/simple-csv-reader/package.json +38 -0
- package/sshpk/.travis.yml +11 -0
- package/sshpk/Jenkinsfile +86 -0
- package/sshpk/LICENSE +18 -0
- package/sshpk/README.md +804 -0
- package/sshpk/bin/sshpk-conv +243 -0
- package/sshpk/bin/sshpk-sign +191 -0
- package/sshpk/bin/sshpk-verify +167 -0
- package/sshpk/lib/algs.js +168 -0
- package/sshpk/lib/certificate.js +410 -0
- package/sshpk/lib/dhe.js +397 -0
- package/sshpk/lib/ed-compat.js +92 -0
- package/sshpk/lib/errors.js +84 -0
- package/sshpk/lib/fingerprint.js +220 -0
- package/sshpk/lib/formats/auto.js +124 -0
- package/sshpk/lib/formats/dnssec.js +287 -0
- package/sshpk/lib/formats/openssh-cert.js +352 -0
- package/sshpk/lib/formats/pem.js +290 -0
- package/sshpk/lib/formats/pkcs1.js +373 -0
- package/sshpk/lib/formats/pkcs8.js +631 -0
- package/sshpk/lib/formats/putty.js +194 -0
- package/sshpk/lib/formats/rfc4253.js +166 -0
- package/sshpk/lib/formats/ssh-private.js +262 -0
- package/sshpk/lib/formats/ssh.js +115 -0
- package/sshpk/lib/formats/x509-pem.js +88 -0
- package/sshpk/lib/formats/x509.js +752 -0
- package/sshpk/lib/identity.js +373 -0
- package/sshpk/lib/index.js +40 -0
- package/sshpk/lib/key.js +294 -0
- package/sshpk/lib/private-key.js +247 -0
- package/sshpk/lib/signature.js +314 -0
- package/sshpk/lib/ssh-buffer.js +149 -0
- package/sshpk/lib/utils.js +404 -0
- package/sshpk/man/man1/sshpk-conv.1 +135 -0
- package/sshpk/man/man1/sshpk-sign.1 +81 -0
- package/sshpk/man/man1/sshpk-verify.1 +68 -0
- package/sshpk/package.json +60 -0
- package/tough-cookie/LICENSE +12 -0
- package/tough-cookie/README.md +527 -0
- package/tough-cookie/lib/cookie.js +1482 -0
- package/tough-cookie/lib/memstore.js +181 -0
- package/tough-cookie/lib/pathMatch.js +61 -0
- package/tough-cookie/lib/permuteDomain.js +56 -0
- package/tough-cookie/lib/pubsuffix-psl.js +38 -0
- package/tough-cookie/lib/store.js +75 -0
- package/tough-cookie/lib/version.js +2 -0
- package/tough-cookie/package.json +78 -0
- package/tunnel-agent/LICENSE +55 -0
- package/tunnel-agent/README.md +4 -0
- package/tunnel-agent/index.js +244 -0
- package/tunnel-agent/package.json +22 -0
- package/tweetnacl/AUTHORS.md +28 -0
- package/tweetnacl/CHANGELOG.md +221 -0
- package/tweetnacl/LICENSE +24 -0
- package/tweetnacl/PULL_REQUEST_TEMPLATE.md +20 -0
- package/tweetnacl/README.md +459 -0
- package/tweetnacl/nacl-fast.js +2388 -0
- package/tweetnacl/nacl-fast.min.js +2 -0
- package/tweetnacl/nacl.d.ts +98 -0
- package/tweetnacl/nacl.js +1175 -0
- package/tweetnacl/nacl.min.js +1 -0
- package/tweetnacl/package.json +58 -0
- package/uri-js/LICENSE +11 -0
- package/uri-js/README.md +203 -0
- package/uri-js/dist/es5/uri.all.d.ts +59 -0
- package/uri-js/dist/es5/uri.all.js +1443 -0
- package/uri-js/dist/es5/uri.all.js.map +1 -0
- package/uri-js/dist/es5/uri.all.min.d.ts +59 -0
- package/uri-js/dist/es5/uri.all.min.js +3 -0
- package/uri-js/dist/es5/uri.all.min.js.map +1 -0
- package/uri-js/dist/esnext/index.d.ts +1 -0
- package/uri-js/dist/esnext/index.js +17 -0
- package/uri-js/dist/esnext/index.js.map +1 -0
- package/uri-js/dist/esnext/regexps-iri.d.ts +3 -0
- package/uri-js/dist/esnext/regexps-iri.js +3 -0
- package/uri-js/dist/esnext/regexps-iri.js.map +1 -0
- package/uri-js/dist/esnext/regexps-uri.d.ts +4 -0
- package/uri-js/dist/esnext/regexps-uri.js +42 -0
- package/uri-js/dist/esnext/regexps-uri.js.map +1 -0
- package/uri-js/dist/esnext/schemes/http.d.ts +3 -0
- package/uri-js/dist/esnext/schemes/http.js +28 -0
- package/uri-js/dist/esnext/schemes/http.js.map +1 -0
- package/uri-js/dist/esnext/schemes/https.d.ts +3 -0
- package/uri-js/dist/esnext/schemes/https.js +9 -0
- package/uri-js/dist/esnext/schemes/https.js.map +1 -0
- package/uri-js/dist/esnext/schemes/mailto.d.ts +12 -0
- package/uri-js/dist/esnext/schemes/mailto.js +148 -0
- package/uri-js/dist/esnext/schemes/mailto.js.map +1 -0
- package/uri-js/dist/esnext/schemes/urn-uuid.d.ts +7 -0
- package/uri-js/dist/esnext/schemes/urn-uuid.js +23 -0
- package/uri-js/dist/esnext/schemes/urn-uuid.js.map +1 -0
- package/uri-js/dist/esnext/schemes/urn.d.ts +10 -0
- package/uri-js/dist/esnext/schemes/urn.js +49 -0
- package/uri-js/dist/esnext/schemes/urn.js.map +1 -0
- package/uri-js/dist/esnext/schemes/ws.d.ts +7 -0
- package/uri-js/dist/esnext/schemes/ws.js +41 -0
- package/uri-js/dist/esnext/schemes/ws.js.map +1 -0
- package/uri-js/dist/esnext/schemes/wss.d.ts +3 -0
- package/uri-js/dist/esnext/schemes/wss.js +9 -0
- package/uri-js/dist/esnext/schemes/wss.js.map +1 -0
- package/uri-js/dist/esnext/uri.d.ts +59 -0
- package/uri-js/dist/esnext/uri.js +480 -0
- package/uri-js/dist/esnext/uri.js.map +1 -0
- package/uri-js/dist/esnext/util.d.ts +6 -0
- package/uri-js/dist/esnext/util.js +36 -0
- package/uri-js/dist/esnext/util.js.map +1 -0
- package/uri-js/package.json +77 -0
- package/uri-js/yarn.lock +2558 -0
- package/uuid/AUTHORS +5 -0
- package/uuid/CHANGELOG.md +119 -0
- package/uuid/LICENSE.md +21 -0
- package/uuid/README.md +276 -0
- package/uuid/bin/uuid +65 -0
- package/uuid/index.js +8 -0
- package/uuid/lib/bytesToUuid.js +26 -0
- package/uuid/lib/md5-browser.js +216 -0
- package/uuid/lib/md5.js +25 -0
- package/uuid/lib/rng-browser.js +34 -0
- package/uuid/lib/rng.js +8 -0
- package/uuid/lib/sha1-browser.js +89 -0
- package/uuid/lib/sha1.js +25 -0
- package/uuid/lib/v35.js +57 -0
- package/uuid/package.json +49 -0
- package/uuid/v1.js +109 -0
- package/uuid/v3.js +4 -0
- package/uuid/v4.js +29 -0
- package/uuid/v5.js +3 -0
- package/verror/CHANGES.md +28 -0
- package/verror/CONTRIBUTING.md +19 -0
- package/verror/LICENSE +19 -0
- package/verror/README.md +528 -0
- package/verror/lib/verror.js +451 -0
- package/verror/package.json +22 -0
- package/xml2js/.travis.yml +5 -0
- package/xml2js/83.coffee +6 -0
- package/xml2js/LICENSE +19 -0
- package/xml2js/README.md +248 -0
- package/xml2js/canon.xml +482 -0
- package/xml2js/lib/xml2js.js +299 -0
- package/xml2js/package.json +47 -0
- package/xml2js/text.coffee +11 -0
- package/xml2js/text.xml +485 -0
- package/youtube-search/.travis.yml +5 -0
- package/youtube-search/README.md +61 -0
- package/youtube-search/index.d.ts +77 -0
- package/youtube-search/index.js +111 -0
- package/youtube-search/package.json +29 -0
- package/youtube-search/tests/test-search.js +32 -0
- package/ytdl-core/LICENSE +21 -0
- package/ytdl-core/README.md +238 -0
- package/ytdl-core/lib/cache.js +54 -0
- package/ytdl-core/lib/format-utils.js +250 -0
- package/ytdl-core/lib/formats.js +524 -0
- package/ytdl-core/lib/index.js +214 -0
- package/ytdl-core/lib/info-extras.js +365 -0
- package/ytdl-core/lib/info.js +495 -0
- package/ytdl-core/lib/sig.js +122 -0
- package/ytdl-core/lib/url-utils.js +91 -0
- package/ytdl-core/lib/utils.js +286 -0
- package/ytdl-core/node_modules/sax/LICENSE +41 -0
- package/ytdl-core/node_modules/sax/README.md +225 -0
- package/ytdl-core/node_modules/sax/lib/sax.js +1565 -0
- package/ytdl-core/node_modules/sax/package.json +25 -0
- package/ytdl-core/package.json +61 -0
- package/ytdl-core/typings/index.d.ts +426 -0
- package/ytdl-getinfo/.travis.yml +3 -0
- package/ytdl-getinfo/README.md +77 -0
- package/ytdl-getinfo/index.js +105 -0
- package/ytdl-getinfo/package.json +33 -0
- package/ytdl-getinfo/playlist.js +50 -0
- package/ytdl-getinfo/test/test.js +68 -0
- package/ytdl-getinfo/updater.js +42 -0
- package/ytdl-getinfo/yarn.lock +533 -0
- package/ytdl-getinfo/ytdl/.gitkeep +0 -0
- package/ytdl-getinfo/ytdl/youtube-dl.exe +0 -0
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
// Copyright 2012 Joyent, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
var assert = require('assert-plus');
|
|
4
|
+
var util = require('util');
|
|
5
|
+
var utils = require('./utils');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
///--- Globals
|
|
10
|
+
|
|
11
|
+
var HASH_ALGOS = utils.HASH_ALGOS;
|
|
12
|
+
var PK_ALGOS = utils.PK_ALGOS;
|
|
13
|
+
var HttpSignatureError = utils.HttpSignatureError;
|
|
14
|
+
var InvalidAlgorithmError = utils.InvalidAlgorithmError;
|
|
15
|
+
var validateAlgorithm = utils.validateAlgorithm;
|
|
16
|
+
|
|
17
|
+
var State = {
|
|
18
|
+
New: 0,
|
|
19
|
+
Params: 1
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
var ParamsState = {
|
|
23
|
+
Name: 0,
|
|
24
|
+
Quote: 1,
|
|
25
|
+
Value: 2,
|
|
26
|
+
Comma: 3
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
///--- Specific Errors
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
function ExpiredRequestError(message) {
|
|
34
|
+
HttpSignatureError.call(this, message, ExpiredRequestError);
|
|
35
|
+
}
|
|
36
|
+
util.inherits(ExpiredRequestError, HttpSignatureError);
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
function InvalidHeaderError(message) {
|
|
40
|
+
HttpSignatureError.call(this, message, InvalidHeaderError);
|
|
41
|
+
}
|
|
42
|
+
util.inherits(InvalidHeaderError, HttpSignatureError);
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
function InvalidParamsError(message) {
|
|
46
|
+
HttpSignatureError.call(this, message, InvalidParamsError);
|
|
47
|
+
}
|
|
48
|
+
util.inherits(InvalidParamsError, HttpSignatureError);
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
function MissingHeaderError(message) {
|
|
52
|
+
HttpSignatureError.call(this, message, MissingHeaderError);
|
|
53
|
+
}
|
|
54
|
+
util.inherits(MissingHeaderError, HttpSignatureError);
|
|
55
|
+
|
|
56
|
+
function StrictParsingError(message) {
|
|
57
|
+
HttpSignatureError.call(this, message, StrictParsingError);
|
|
58
|
+
}
|
|
59
|
+
util.inherits(StrictParsingError, HttpSignatureError);
|
|
60
|
+
|
|
61
|
+
///--- Exported API
|
|
62
|
+
|
|
63
|
+
module.exports = {
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Parses the 'Authorization' header out of an http.ServerRequest object.
|
|
67
|
+
*
|
|
68
|
+
* Note that this API will fully validate the Authorization header, and throw
|
|
69
|
+
* on any error. It will not however check the signature, or the keyId format
|
|
70
|
+
* as those are specific to your environment. You can use the options object
|
|
71
|
+
* to pass in extra constraints.
|
|
72
|
+
*
|
|
73
|
+
* As a response object you can expect this:
|
|
74
|
+
*
|
|
75
|
+
* {
|
|
76
|
+
* "scheme": "Signature",
|
|
77
|
+
* "params": {
|
|
78
|
+
* "keyId": "foo",
|
|
79
|
+
* "algorithm": "rsa-sha256",
|
|
80
|
+
* "headers": [
|
|
81
|
+
* "date" or "x-date",
|
|
82
|
+
* "digest"
|
|
83
|
+
* ],
|
|
84
|
+
* "signature": "base64"
|
|
85
|
+
* },
|
|
86
|
+
* "signingString": "ready to be passed to crypto.verify()"
|
|
87
|
+
* }
|
|
88
|
+
*
|
|
89
|
+
* @param {Object} request an http.ServerRequest.
|
|
90
|
+
* @param {Object} options an optional options object with:
|
|
91
|
+
* - clockSkew: allowed clock skew in seconds (default 300).
|
|
92
|
+
* - headers: required header names (def: date or x-date)
|
|
93
|
+
* - algorithms: algorithms to support (default: all).
|
|
94
|
+
* - strict: should enforce latest spec parsing
|
|
95
|
+
* (default: false).
|
|
96
|
+
* @return {Object} parsed out object (see above).
|
|
97
|
+
* @throws {TypeError} on invalid input.
|
|
98
|
+
* @throws {InvalidHeaderError} on an invalid Authorization header error.
|
|
99
|
+
* @throws {InvalidParamsError} if the params in the scheme are invalid.
|
|
100
|
+
* @throws {MissingHeaderError} if the params indicate a header not present,
|
|
101
|
+
* either in the request headers from the params,
|
|
102
|
+
* or not in the params from a required header
|
|
103
|
+
* in options.
|
|
104
|
+
* @throws {StrictParsingError} if old attributes are used in strict parsing
|
|
105
|
+
* mode.
|
|
106
|
+
* @throws {ExpiredRequestError} if the value of date or x-date exceeds skew.
|
|
107
|
+
*/
|
|
108
|
+
parseRequest: function parseRequest(request, options) {
|
|
109
|
+
assert.object(request, 'request');
|
|
110
|
+
assert.object(request.headers, 'request.headers');
|
|
111
|
+
if (options === undefined) {
|
|
112
|
+
options = {};
|
|
113
|
+
}
|
|
114
|
+
if (options.headers === undefined) {
|
|
115
|
+
options.headers = [request.headers['x-date'] ? 'x-date' : 'date'];
|
|
116
|
+
}
|
|
117
|
+
assert.object(options, 'options');
|
|
118
|
+
assert.arrayOfString(options.headers, 'options.headers');
|
|
119
|
+
assert.optionalFinite(options.clockSkew, 'options.clockSkew');
|
|
120
|
+
|
|
121
|
+
var authzHeaderName = options.authorizationHeaderName || 'authorization';
|
|
122
|
+
|
|
123
|
+
if (!request.headers[authzHeaderName]) {
|
|
124
|
+
throw new MissingHeaderError('no ' + authzHeaderName + ' header ' +
|
|
125
|
+
'present in the request');
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
options.clockSkew = options.clockSkew || 300;
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
var i = 0;
|
|
132
|
+
var state = State.New;
|
|
133
|
+
var substate = ParamsState.Name;
|
|
134
|
+
var tmpName = '';
|
|
135
|
+
var tmpValue = '';
|
|
136
|
+
|
|
137
|
+
var parsed = {
|
|
138
|
+
scheme: '',
|
|
139
|
+
params: {},
|
|
140
|
+
signingString: ''
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
var authz = request.headers[authzHeaderName];
|
|
144
|
+
for (i = 0; i < authz.length; i++) {
|
|
145
|
+
var c = authz.charAt(i);
|
|
146
|
+
|
|
147
|
+
switch (Number(state)) {
|
|
148
|
+
|
|
149
|
+
case State.New:
|
|
150
|
+
if (c !== ' ') parsed.scheme += c;
|
|
151
|
+
else state = State.Params;
|
|
152
|
+
break;
|
|
153
|
+
|
|
154
|
+
case State.Params:
|
|
155
|
+
switch (Number(substate)) {
|
|
156
|
+
|
|
157
|
+
case ParamsState.Name:
|
|
158
|
+
var code = c.charCodeAt(0);
|
|
159
|
+
// restricted name of A-Z / a-z
|
|
160
|
+
if ((code >= 0x41 && code <= 0x5a) || // A-Z
|
|
161
|
+
(code >= 0x61 && code <= 0x7a)) { // a-z
|
|
162
|
+
tmpName += c;
|
|
163
|
+
} else if (c === '=') {
|
|
164
|
+
if (tmpName.length === 0)
|
|
165
|
+
throw new InvalidHeaderError('bad param format');
|
|
166
|
+
substate = ParamsState.Quote;
|
|
167
|
+
} else {
|
|
168
|
+
throw new InvalidHeaderError('bad param format');
|
|
169
|
+
}
|
|
170
|
+
break;
|
|
171
|
+
|
|
172
|
+
case ParamsState.Quote:
|
|
173
|
+
if (c === '"') {
|
|
174
|
+
tmpValue = '';
|
|
175
|
+
substate = ParamsState.Value;
|
|
176
|
+
} else {
|
|
177
|
+
throw new InvalidHeaderError('bad param format');
|
|
178
|
+
}
|
|
179
|
+
break;
|
|
180
|
+
|
|
181
|
+
case ParamsState.Value:
|
|
182
|
+
if (c === '"') {
|
|
183
|
+
parsed.params[tmpName] = tmpValue;
|
|
184
|
+
substate = ParamsState.Comma;
|
|
185
|
+
} else {
|
|
186
|
+
tmpValue += c;
|
|
187
|
+
}
|
|
188
|
+
break;
|
|
189
|
+
|
|
190
|
+
case ParamsState.Comma:
|
|
191
|
+
if (c === ',') {
|
|
192
|
+
tmpName = '';
|
|
193
|
+
substate = ParamsState.Name;
|
|
194
|
+
} else {
|
|
195
|
+
throw new InvalidHeaderError('bad param format');
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
|
|
199
|
+
default:
|
|
200
|
+
throw new Error('Invalid substate');
|
|
201
|
+
}
|
|
202
|
+
break;
|
|
203
|
+
|
|
204
|
+
default:
|
|
205
|
+
throw new Error('Invalid substate');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
if (!parsed.params.headers || parsed.params.headers === '') {
|
|
211
|
+
if (request.headers['x-date']) {
|
|
212
|
+
parsed.params.headers = ['x-date'];
|
|
213
|
+
} else {
|
|
214
|
+
parsed.params.headers = ['date'];
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
parsed.params.headers = parsed.params.headers.split(' ');
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Minimally validate the parsed object
|
|
221
|
+
if (!parsed.scheme || parsed.scheme !== 'Signature')
|
|
222
|
+
throw new InvalidHeaderError('scheme was not "Signature"');
|
|
223
|
+
|
|
224
|
+
if (!parsed.params.keyId)
|
|
225
|
+
throw new InvalidHeaderError('keyId was not specified');
|
|
226
|
+
|
|
227
|
+
if (!parsed.params.algorithm)
|
|
228
|
+
throw new InvalidHeaderError('algorithm was not specified');
|
|
229
|
+
|
|
230
|
+
if (!parsed.params.signature)
|
|
231
|
+
throw new InvalidHeaderError('signature was not specified');
|
|
232
|
+
|
|
233
|
+
// Check the algorithm against the official list
|
|
234
|
+
parsed.params.algorithm = parsed.params.algorithm.toLowerCase();
|
|
235
|
+
try {
|
|
236
|
+
validateAlgorithm(parsed.params.algorithm);
|
|
237
|
+
} catch (e) {
|
|
238
|
+
if (e instanceof InvalidAlgorithmError)
|
|
239
|
+
throw (new InvalidParamsError(parsed.params.algorithm + ' is not ' +
|
|
240
|
+
'supported'));
|
|
241
|
+
else
|
|
242
|
+
throw (e);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Build the signingString
|
|
246
|
+
for (i = 0; i < parsed.params.headers.length; i++) {
|
|
247
|
+
var h = parsed.params.headers[i].toLowerCase();
|
|
248
|
+
parsed.params.headers[i] = h;
|
|
249
|
+
|
|
250
|
+
if (h === 'request-line') {
|
|
251
|
+
if (!options.strict) {
|
|
252
|
+
/*
|
|
253
|
+
* We allow headers from the older spec drafts if strict parsing isn't
|
|
254
|
+
* specified in options.
|
|
255
|
+
*/
|
|
256
|
+
parsed.signingString +=
|
|
257
|
+
request.method + ' ' + request.url + ' HTTP/' + request.httpVersion;
|
|
258
|
+
} else {
|
|
259
|
+
/* Strict parsing doesn't allow older draft headers. */
|
|
260
|
+
throw (new StrictParsingError('request-line is not a valid header ' +
|
|
261
|
+
'with strict parsing enabled.'));
|
|
262
|
+
}
|
|
263
|
+
} else if (h === '(request-target)') {
|
|
264
|
+
parsed.signingString +=
|
|
265
|
+
'(request-target): ' + request.method.toLowerCase() + ' ' +
|
|
266
|
+
request.url;
|
|
267
|
+
} else {
|
|
268
|
+
var value = request.headers[h];
|
|
269
|
+
if (value === undefined)
|
|
270
|
+
throw new MissingHeaderError(h + ' was not in the request');
|
|
271
|
+
parsed.signingString += h + ': ' + value;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if ((i + 1) < parsed.params.headers.length)
|
|
275
|
+
parsed.signingString += '\n';
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Check against the constraints
|
|
279
|
+
var date;
|
|
280
|
+
if (request.headers.date || request.headers['x-date']) {
|
|
281
|
+
if (request.headers['x-date']) {
|
|
282
|
+
date = new Date(request.headers['x-date']);
|
|
283
|
+
} else {
|
|
284
|
+
date = new Date(request.headers.date);
|
|
285
|
+
}
|
|
286
|
+
var now = new Date();
|
|
287
|
+
var skew = Math.abs(now.getTime() - date.getTime());
|
|
288
|
+
|
|
289
|
+
if (skew > options.clockSkew * 1000) {
|
|
290
|
+
throw new ExpiredRequestError('clock skew of ' +
|
|
291
|
+
(skew / 1000) +
|
|
292
|
+
's was greater than ' +
|
|
293
|
+
options.clockSkew + 's');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
options.headers.forEach(function (hdr) {
|
|
298
|
+
// Remember that we already checked any headers in the params
|
|
299
|
+
// were in the request, so if this passes we're good.
|
|
300
|
+
if (parsed.params.headers.indexOf(hdr.toLowerCase()) < 0)
|
|
301
|
+
throw new MissingHeaderError(hdr + ' was not a signed header');
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
if (options.algorithms) {
|
|
305
|
+
if (options.algorithms.indexOf(parsed.params.algorithm) === -1)
|
|
306
|
+
throw new InvalidParamsError(parsed.params.algorithm +
|
|
307
|
+
' is not a supported algorithm');
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
parsed.algorithm = parsed.params.algorithm.toUpperCase();
|
|
311
|
+
parsed.keyId = parsed.params.keyId;
|
|
312
|
+
return parsed;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
};
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
// Copyright 2012 Joyent, Inc. All rights reserved.
|
|
2
|
+
|
|
3
|
+
var assert = require('assert-plus');
|
|
4
|
+
var crypto = require('crypto');
|
|
5
|
+
var http = require('http');
|
|
6
|
+
var util = require('util');
|
|
7
|
+
var sshpk = require('sshpk');
|
|
8
|
+
var jsprim = require('jsprim');
|
|
9
|
+
var utils = require('./utils');
|
|
10
|
+
|
|
11
|
+
var sprintf = require('util').format;
|
|
12
|
+
|
|
13
|
+
var HASH_ALGOS = utils.HASH_ALGOS;
|
|
14
|
+
var PK_ALGOS = utils.PK_ALGOS;
|
|
15
|
+
var InvalidAlgorithmError = utils.InvalidAlgorithmError;
|
|
16
|
+
var HttpSignatureError = utils.HttpSignatureError;
|
|
17
|
+
var validateAlgorithm = utils.validateAlgorithm;
|
|
18
|
+
|
|
19
|
+
///--- Globals
|
|
20
|
+
|
|
21
|
+
var AUTHZ_FMT =
|
|
22
|
+
'Signature keyId="%s",algorithm="%s",headers="%s",signature="%s"';
|
|
23
|
+
|
|
24
|
+
///--- Specific Errors
|
|
25
|
+
|
|
26
|
+
function MissingHeaderError(message) {
|
|
27
|
+
HttpSignatureError.call(this, message, MissingHeaderError);
|
|
28
|
+
}
|
|
29
|
+
util.inherits(MissingHeaderError, HttpSignatureError);
|
|
30
|
+
|
|
31
|
+
function StrictParsingError(message) {
|
|
32
|
+
HttpSignatureError.call(this, message, StrictParsingError);
|
|
33
|
+
}
|
|
34
|
+
util.inherits(StrictParsingError, HttpSignatureError);
|
|
35
|
+
|
|
36
|
+
/* See createSigner() */
|
|
37
|
+
function RequestSigner(options) {
|
|
38
|
+
assert.object(options, 'options');
|
|
39
|
+
|
|
40
|
+
var alg = [];
|
|
41
|
+
if (options.algorithm !== undefined) {
|
|
42
|
+
assert.string(options.algorithm, 'options.algorithm');
|
|
43
|
+
alg = validateAlgorithm(options.algorithm);
|
|
44
|
+
}
|
|
45
|
+
this.rs_alg = alg;
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* RequestSigners come in two varieties: ones with an rs_signFunc, and ones
|
|
49
|
+
* with an rs_signer.
|
|
50
|
+
*
|
|
51
|
+
* rs_signFunc-based RequestSigners have to build up their entire signing
|
|
52
|
+
* string within the rs_lines array and give it to rs_signFunc as a single
|
|
53
|
+
* concat'd blob. rs_signer-based RequestSigners can add a line at a time to
|
|
54
|
+
* their signing state by using rs_signer.update(), thus only needing to
|
|
55
|
+
* buffer the hash function state and one line at a time.
|
|
56
|
+
*/
|
|
57
|
+
if (options.sign !== undefined) {
|
|
58
|
+
assert.func(options.sign, 'options.sign');
|
|
59
|
+
this.rs_signFunc = options.sign;
|
|
60
|
+
|
|
61
|
+
} else if (alg[0] === 'hmac' && options.key !== undefined) {
|
|
62
|
+
assert.string(options.keyId, 'options.keyId');
|
|
63
|
+
this.rs_keyId = options.keyId;
|
|
64
|
+
|
|
65
|
+
if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key))
|
|
66
|
+
throw (new TypeError('options.key for HMAC must be a string or Buffer'));
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* Make an rs_signer for HMACs, not a rs_signFunc -- HMACs digest their
|
|
70
|
+
* data in chunks rather than requiring it all to be given in one go
|
|
71
|
+
* at the end, so they are more similar to signers than signFuncs.
|
|
72
|
+
*/
|
|
73
|
+
this.rs_signer = crypto.createHmac(alg[1].toUpperCase(), options.key);
|
|
74
|
+
this.rs_signer.sign = function () {
|
|
75
|
+
var digest = this.digest('base64');
|
|
76
|
+
return ({
|
|
77
|
+
hashAlgorithm: alg[1],
|
|
78
|
+
toString: function () { return (digest); }
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
} else if (options.key !== undefined) {
|
|
83
|
+
var key = options.key;
|
|
84
|
+
if (typeof (key) === 'string' || Buffer.isBuffer(key))
|
|
85
|
+
key = sshpk.parsePrivateKey(key);
|
|
86
|
+
|
|
87
|
+
assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]),
|
|
88
|
+
'options.key must be a sshpk.PrivateKey');
|
|
89
|
+
this.rs_key = key;
|
|
90
|
+
|
|
91
|
+
assert.string(options.keyId, 'options.keyId');
|
|
92
|
+
this.rs_keyId = options.keyId;
|
|
93
|
+
|
|
94
|
+
if (!PK_ALGOS[key.type]) {
|
|
95
|
+
throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' +
|
|
96
|
+
'keys are not supported'));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (alg[0] !== undefined && key.type !== alg[0]) {
|
|
100
|
+
throw (new InvalidAlgorithmError('options.key must be a ' +
|
|
101
|
+
alg[0].toUpperCase() + ' key, was given a ' +
|
|
102
|
+
key.type.toUpperCase() + ' key instead'));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
this.rs_signer = key.createSign(alg[1]);
|
|
106
|
+
|
|
107
|
+
} else {
|
|
108
|
+
throw (new TypeError('options.sign (func) or options.key is required'));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
this.rs_headers = [];
|
|
112
|
+
this.rs_lines = [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Adds a header to be signed, with its value, into this signer.
|
|
117
|
+
*
|
|
118
|
+
* @param {String} header
|
|
119
|
+
* @param {String} value
|
|
120
|
+
* @return {String} value written
|
|
121
|
+
*/
|
|
122
|
+
RequestSigner.prototype.writeHeader = function (header, value) {
|
|
123
|
+
assert.string(header, 'header');
|
|
124
|
+
header = header.toLowerCase();
|
|
125
|
+
assert.string(value, 'value');
|
|
126
|
+
|
|
127
|
+
this.rs_headers.push(header);
|
|
128
|
+
|
|
129
|
+
if (this.rs_signFunc) {
|
|
130
|
+
this.rs_lines.push(header + ': ' + value);
|
|
131
|
+
|
|
132
|
+
} else {
|
|
133
|
+
var line = header + ': ' + value;
|
|
134
|
+
if (this.rs_headers.length > 0)
|
|
135
|
+
line = '\n' + line;
|
|
136
|
+
this.rs_signer.update(line);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return (value);
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Adds a default Date header, returning its value.
|
|
144
|
+
*
|
|
145
|
+
* @return {String}
|
|
146
|
+
*/
|
|
147
|
+
RequestSigner.prototype.writeDateHeader = function () {
|
|
148
|
+
return (this.writeHeader('date', jsprim.rfc1123(new Date())));
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Adds the request target line to be signed.
|
|
153
|
+
*
|
|
154
|
+
* @param {String} method, HTTP method (e.g. 'get', 'post', 'put')
|
|
155
|
+
* @param {String} path
|
|
156
|
+
*/
|
|
157
|
+
RequestSigner.prototype.writeTarget = function (method, path) {
|
|
158
|
+
assert.string(method, 'method');
|
|
159
|
+
assert.string(path, 'path');
|
|
160
|
+
method = method.toLowerCase();
|
|
161
|
+
this.writeHeader('(request-target)', method + ' ' + path);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Calculate the value for the Authorization header on this request
|
|
166
|
+
* asynchronously.
|
|
167
|
+
*
|
|
168
|
+
* @param {Func} callback (err, authz)
|
|
169
|
+
*/
|
|
170
|
+
RequestSigner.prototype.sign = function (cb) {
|
|
171
|
+
assert.func(cb, 'callback');
|
|
172
|
+
|
|
173
|
+
if (this.rs_headers.length < 1)
|
|
174
|
+
throw (new Error('At least one header must be signed'));
|
|
175
|
+
|
|
176
|
+
var alg, authz;
|
|
177
|
+
if (this.rs_signFunc) {
|
|
178
|
+
var data = this.rs_lines.join('\n');
|
|
179
|
+
var self = this;
|
|
180
|
+
this.rs_signFunc(data, function (err, sig) {
|
|
181
|
+
if (err) {
|
|
182
|
+
cb(err);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
assert.object(sig, 'signature');
|
|
187
|
+
assert.string(sig.keyId, 'signature.keyId');
|
|
188
|
+
assert.string(sig.algorithm, 'signature.algorithm');
|
|
189
|
+
assert.string(sig.signature, 'signature.signature');
|
|
190
|
+
alg = validateAlgorithm(sig.algorithm);
|
|
191
|
+
|
|
192
|
+
authz = sprintf(AUTHZ_FMT,
|
|
193
|
+
sig.keyId,
|
|
194
|
+
sig.algorithm,
|
|
195
|
+
self.rs_headers.join(' '),
|
|
196
|
+
sig.signature);
|
|
197
|
+
} catch (e) {
|
|
198
|
+
cb(e);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
cb(null, authz);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
} else {
|
|
205
|
+
try {
|
|
206
|
+
var sigObj = this.rs_signer.sign();
|
|
207
|
+
} catch (e) {
|
|
208
|
+
cb(e);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
alg = (this.rs_alg[0] || this.rs_key.type) + '-' + sigObj.hashAlgorithm;
|
|
212
|
+
var signature = sigObj.toString();
|
|
213
|
+
authz = sprintf(AUTHZ_FMT,
|
|
214
|
+
this.rs_keyId,
|
|
215
|
+
alg,
|
|
216
|
+
this.rs_headers.join(' '),
|
|
217
|
+
signature);
|
|
218
|
+
cb(null, authz);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
///--- Exported API
|
|
223
|
+
|
|
224
|
+
module.exports = {
|
|
225
|
+
/**
|
|
226
|
+
* Identifies whether a given object is a request signer or not.
|
|
227
|
+
*
|
|
228
|
+
* @param {Object} object, the object to identify
|
|
229
|
+
* @returns {Boolean}
|
|
230
|
+
*/
|
|
231
|
+
isSigner: function (obj) {
|
|
232
|
+
if (typeof (obj) === 'object' && obj instanceof RequestSigner)
|
|
233
|
+
return (true);
|
|
234
|
+
return (false);
|
|
235
|
+
},
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Creates a request signer, used to asynchronously build a signature
|
|
239
|
+
* for a request (does not have to be an http.ClientRequest).
|
|
240
|
+
*
|
|
241
|
+
* @param {Object} options, either:
|
|
242
|
+
* - {String} keyId
|
|
243
|
+
* - {String|Buffer} key
|
|
244
|
+
* - {String} algorithm (optional, required for HMAC)
|
|
245
|
+
* or:
|
|
246
|
+
* - {Func} sign (data, cb)
|
|
247
|
+
* @return {RequestSigner}
|
|
248
|
+
*/
|
|
249
|
+
createSigner: function createSigner(options) {
|
|
250
|
+
return (new RequestSigner(options));
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Adds an 'Authorization' header to an http.ClientRequest object.
|
|
255
|
+
*
|
|
256
|
+
* Note that this API will add a Date header if it's not already set. Any
|
|
257
|
+
* other headers in the options.headers array MUST be present, or this
|
|
258
|
+
* will throw.
|
|
259
|
+
*
|
|
260
|
+
* You shouldn't need to check the return type; it's just there if you want
|
|
261
|
+
* to be pedantic.
|
|
262
|
+
*
|
|
263
|
+
* The optional flag indicates whether parsing should use strict enforcement
|
|
264
|
+
* of the version draft-cavage-http-signatures-04 of the spec or beyond.
|
|
265
|
+
* The default is to be loose and support
|
|
266
|
+
* older versions for compatibility.
|
|
267
|
+
*
|
|
268
|
+
* @param {Object} request an instance of http.ClientRequest.
|
|
269
|
+
* @param {Object} options signing parameters object:
|
|
270
|
+
* - {String} keyId required.
|
|
271
|
+
* - {String} key required (either a PEM or HMAC key).
|
|
272
|
+
* - {Array} headers optional; defaults to ['date'].
|
|
273
|
+
* - {String} algorithm optional (unless key is HMAC);
|
|
274
|
+
* default is the same as the sshpk default
|
|
275
|
+
* signing algorithm for the type of key given
|
|
276
|
+
* - {String} httpVersion optional; defaults to '1.1'.
|
|
277
|
+
* - {Boolean} strict optional; defaults to 'false'.
|
|
278
|
+
* @return {Boolean} true if Authorization (and optionally Date) were added.
|
|
279
|
+
* @throws {TypeError} on bad parameter types (input).
|
|
280
|
+
* @throws {InvalidAlgorithmError} if algorithm was bad or incompatible with
|
|
281
|
+
* the given key.
|
|
282
|
+
* @throws {sshpk.KeyParseError} if key was bad.
|
|
283
|
+
* @throws {MissingHeaderError} if a header to be signed was specified but
|
|
284
|
+
* was not present.
|
|
285
|
+
*/
|
|
286
|
+
signRequest: function signRequest(request, options) {
|
|
287
|
+
assert.object(request, 'request');
|
|
288
|
+
assert.object(options, 'options');
|
|
289
|
+
assert.optionalString(options.algorithm, 'options.algorithm');
|
|
290
|
+
assert.string(options.keyId, 'options.keyId');
|
|
291
|
+
assert.optionalArrayOfString(options.headers, 'options.headers');
|
|
292
|
+
assert.optionalString(options.httpVersion, 'options.httpVersion');
|
|
293
|
+
|
|
294
|
+
if (!request.getHeader('Date'))
|
|
295
|
+
request.setHeader('Date', jsprim.rfc1123(new Date()));
|
|
296
|
+
if (!options.headers)
|
|
297
|
+
options.headers = ['date'];
|
|
298
|
+
if (!options.httpVersion)
|
|
299
|
+
options.httpVersion = '1.1';
|
|
300
|
+
|
|
301
|
+
var alg = [];
|
|
302
|
+
if (options.algorithm) {
|
|
303
|
+
options.algorithm = options.algorithm.toLowerCase();
|
|
304
|
+
alg = validateAlgorithm(options.algorithm);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
var i;
|
|
308
|
+
var stringToSign = '';
|
|
309
|
+
for (i = 0; i < options.headers.length; i++) {
|
|
310
|
+
if (typeof (options.headers[i]) !== 'string')
|
|
311
|
+
throw new TypeError('options.headers must be an array of Strings');
|
|
312
|
+
|
|
313
|
+
var h = options.headers[i].toLowerCase();
|
|
314
|
+
|
|
315
|
+
if (h === 'request-line') {
|
|
316
|
+
if (!options.strict) {
|
|
317
|
+
/**
|
|
318
|
+
* We allow headers from the older spec drafts if strict parsing isn't
|
|
319
|
+
* specified in options.
|
|
320
|
+
*/
|
|
321
|
+
stringToSign +=
|
|
322
|
+
request.method + ' ' + request.path + ' HTTP/' +
|
|
323
|
+
options.httpVersion;
|
|
324
|
+
} else {
|
|
325
|
+
/* Strict parsing doesn't allow older draft headers. */
|
|
326
|
+
throw (new StrictParsingError('request-line is not a valid header ' +
|
|
327
|
+
'with strict parsing enabled.'));
|
|
328
|
+
}
|
|
329
|
+
} else if (h === '(request-target)') {
|
|
330
|
+
stringToSign +=
|
|
331
|
+
'(request-target): ' + request.method.toLowerCase() + ' ' +
|
|
332
|
+
request.path;
|
|
333
|
+
} else {
|
|
334
|
+
var value = request.getHeader(h);
|
|
335
|
+
if (value === undefined || value === '') {
|
|
336
|
+
throw new MissingHeaderError(h + ' was not in the request');
|
|
337
|
+
}
|
|
338
|
+
stringToSign += h + ': ' + value;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if ((i + 1) < options.headers.length)
|
|
342
|
+
stringToSign += '\n';
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/* This is just for unit tests. */
|
|
346
|
+
if (request.hasOwnProperty('_stringToSign')) {
|
|
347
|
+
request._stringToSign = stringToSign;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
var signature;
|
|
351
|
+
if (alg[0] === 'hmac') {
|
|
352
|
+
if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key))
|
|
353
|
+
throw (new TypeError('options.key must be a string or Buffer'));
|
|
354
|
+
|
|
355
|
+
var hmac = crypto.createHmac(alg[1].toUpperCase(), options.key);
|
|
356
|
+
hmac.update(stringToSign);
|
|
357
|
+
signature = hmac.digest('base64');
|
|
358
|
+
|
|
359
|
+
} else {
|
|
360
|
+
var key = options.key;
|
|
361
|
+
if (typeof (key) === 'string' || Buffer.isBuffer(key))
|
|
362
|
+
key = sshpk.parsePrivateKey(options.key);
|
|
363
|
+
|
|
364
|
+
assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]),
|
|
365
|
+
'options.key must be a sshpk.PrivateKey');
|
|
366
|
+
|
|
367
|
+
if (!PK_ALGOS[key.type]) {
|
|
368
|
+
throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' +
|
|
369
|
+
'keys are not supported'));
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (alg[0] !== undefined && key.type !== alg[0]) {
|
|
373
|
+
throw (new InvalidAlgorithmError('options.key must be a ' +
|
|
374
|
+
alg[0].toUpperCase() + ' key, was given a ' +
|
|
375
|
+
key.type.toUpperCase() + ' key instead'));
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
var signer = key.createSign(alg[1]);
|
|
379
|
+
signer.update(stringToSign);
|
|
380
|
+
var sigObj = signer.sign();
|
|
381
|
+
if (!HASH_ALGOS[sigObj.hashAlgorithm]) {
|
|
382
|
+
throw (new InvalidAlgorithmError(sigObj.hashAlgorithm.toUpperCase() +
|
|
383
|
+
' is not a supported hash algorithm'));
|
|
384
|
+
}
|
|
385
|
+
options.algorithm = key.type + '-' + sigObj.hashAlgorithm;
|
|
386
|
+
signature = sigObj.toString();
|
|
387
|
+
assert.notStrictEqual(signature, '', 'empty signature produced');
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
var authzHeaderName = options.authorizationHeaderName || 'Authorization';
|
|
391
|
+
|
|
392
|
+
request.setHeader(authzHeaderName, sprintf(AUTHZ_FMT,
|
|
393
|
+
options.keyId,
|
|
394
|
+
options.algorithm,
|
|
395
|
+
options.headers.join(' '),
|
|
396
|
+
signature));
|
|
397
|
+
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
};
|