From f636e6cc618ddaf2523513ce7f650d182a2b39bf Mon Sep 17 00:00:00 2001 From: azu Date: Fri, 20 Oct 2023 09:50:25 +0900 Subject: [PATCH 01/14] =?UTF-8?q?=F0=9F=93=9D2=E5=BA=A6=E7=9B=AE=E3=81=AED?= =?UTF-8?q?NS=20loopup=E3=81=A7destroy=E3=81=99=E3=82=8B=E3=81=A8=E3=82=A8?= =?UTF-8?q?=E3=83=A9=E3=83=BC=E3=81=8C=E8=B5=B7=E3=81=8D=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 + package.json | 8 +- src/request-filtering-agent.ts | 138 ++++++++++++++- test/request-filtering-agent.test.ts | 9 +- tsconfig.json | 4 +- yarn.lock | 242 +++++++++++++-------------- 6 files changed, 271 insertions(+), 134 deletions(-) diff --git a/README.md b/README.md index f9a835e..6871d42 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ This library block the request to these IP addresses by default. So, This library block the request to non-`unicast` IP addresses. +:warning: Node.js's built-in `fetch` does not support `http.Agent`. + +- [Passing a custom agent to `fetch()` · Issue #1489 · nodejs/undici](https://github.com/nodejs/undici/issues/1489) + ## Support `http.Agent` libraries This library provides Node.js's [http.Agent](https://nodejs.org/api/http.html#http_class_http_agent) implementation. diff --git a/package.json b/package.json index 61eac86..c47c721 100644 --- a/package.json +++ b/package.json @@ -58,13 +58,13 @@ }, "devDependencies": { "@types/ip": "^1.1.0", - "@types/mocha": "^8.2.2", - "@types/node": "^15.12.0", + "@types/mocha": "^10.0.3", + "@types/node": "^20.8.7", "@types/node-fetch": "^2.5.10", "cross-env": "^7.0.3", "lint-staged": "^11.0.0", - "mocha": "^8.4.0", - "node-fetch": "^2.6.1", + "mocha": "^10.2.0", + "node-fetch": "^2.7.0", "prettier": "^2.3.0", "rimraf": "^3.0.0", "ts-node": "^10.0.0", diff --git a/src/request-filtering-agent.ts b/src/request-filtering-agent.ts index a7472b9..0fd09ea 100644 --- a/src/request-filtering-agent.ts +++ b/src/request-filtering-agent.ts @@ -3,6 +3,7 @@ import { TcpNetConnectOpts } from "net"; import * as http from "http"; import * as https from "https"; import ipaddr from "ipaddr.js"; +import { Socket } from "node:net"; export interface RequestFilteringAgentOptions { // Allow to connect private IP address @@ -19,7 +20,7 @@ export interface RequestFilteringAgentOptions { // Default: false allowMetaIPAddress?: boolean; // Allow address list - // This values are preferred than denyAddressList + // These values are preferred than denyAddressList // Default: [] allowIPAddressList?: string[]; // Deny address list @@ -74,7 +75,7 @@ const validateIPAddress = ( ); } } catch (error) { - return error as Error; // if can not parsed IP address, throw error + return error as Error; // if can not parse IP address, throw error } return; }; @@ -167,9 +168,98 @@ export function applyRequestFilter( * A subclass of http.Agent with request filtering */ export class RequestFilteringHttpAgent extends http.Agent { + private requestFilterOptions: Required; + constructor(options?: http.AgentOptions & RequestFilteringAgentOptions) { super(options); - applyRequestFilter(this, options); + this.requestFilterOptions = { + allowPrivateIPAddress: + options && options.allowPrivateIPAddress !== undefined ? options.allowPrivateIPAddress : false, + allowMetaIPAddress: + options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, + allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], + denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], + stopPortScanningByUrlRedirection: + options && options.stopPortScanningByUrlRedirection !== undefined + ? options.stopPortScanningByUrlRedirection + : false + }; + } + + createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { + console.log("createConnectio !!!!n"); + // console.log("createConnection", options); + const { host } = options; + let validationError: Error | null | undefined = null; + if (host) { + // Direct ip address request without dns-lookup + // Example: http://127.0.0.1 + // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener + validationError = validateIPAddress({ address: host }, this.requestFilterOptions); + } + // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener + let isSocketEnding = false; + // @ts-expect-error - @types/node does not defined createConnection + const socket: Socket = super.createConnection(options, connectionListener); + const onReady = () => { + if (validationError) { + if (isSocketEnding) { + return; + } + if (socket.destroyed) { + return; + } + isSocketEnding = true; + socket.removeListener("ready", onReady); + socket.end(() => { + console.log("end 1"); + if (validationError) { + if (socket.destroyed) { + return; + } + socket.destroy(validationError); + } + }); + } + }; + socket.addListener("ready", onReady); + // Request with domain name + // Example: http://127.0.0.1.nip.io/ + let isEndong: boolean = false; + const onLookup = (err: Error, address: string, family: string | number, host: string): void => { + if (err) { + return; + } + const error = validateIPAddress({ address, family, host }, this.requestFilterOptions); + console.log("validation 2 ", error); + if (error) { + console.log("error 2", { + isEndong, + isSocketDestroyed: socket.destroyed, + connecting: socket.connecting, + pending: socket.pending + }); + if (isEndong) { + return; + } + isEndong = true; + socket.removeListener("lookup", onLookup); + if (socket.destroyed) { + return; + } + socket.end(() => { + console.log("end 2"); + if (socket.destroyed) { + return; + } + console.log("end 3 ", socket.destroyed); + console.log("end errr", validationError?.message); + socket.destroy(error); + }); + } + }; + socket.addListener("lookup", onLookup); + return socket; } } @@ -177,9 +267,45 @@ export class RequestFilteringHttpAgent extends http.Agent { * A subclass of https.Agent with request filtering */ export class RequestFilteringHttpsAgent extends https.Agent { + private requestFilterOptions: Required; + constructor(options?: https.AgentOptions & RequestFilteringAgentOptions) { super(options); - applyRequestFilter(this, options); + this.requestFilterOptions = { + allowPrivateIPAddress: + options && options.allowPrivateIPAddress !== undefined ? options.allowPrivateIPAddress : false, + allowMetaIPAddress: + options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, + allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], + denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], + stopPortScanningByUrlRedirection: + options && options.stopPortScanningByUrlRedirection !== undefined + ? options.stopPortScanningByUrlRedirection + : false + }; + } + + createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { + if (this.requestFilterOptions.stopPortScanningByUrlRedirection) { + // Prevents malicious user from identifying which ports are open + const { host, family } = options; + if (host && net.isIP(host)) { + const addr = ipaddr.parse(host); + const range = addr.range(); + if (range !== "unicast") { + throw new Error( + `DNS lookup ${host}(family:${family}, host:${host}) is not allowed. Because, It is private IP address.` + ); + } + } + } + + // @ts-expect-error - @types/node does not defined createConnection + const socket = super.createConnection(options, connectionListener); + // Request with domain name + // Example: http://127.0.0.1.nip.io/ + addDropFilterSocket(this.requestFilterOptions, socket); + return socket; } } @@ -191,8 +317,8 @@ export const globalHttpsAgent = new RequestFilteringHttpsAgent(); * @param url */ export const useAgent = (url: string, options?: https.AgentOptions & RequestFilteringAgentOptions) => { - if(!options) { - return url.startsWith("https") ? globalHttpsAgent : globalHttpAgent; + if (!options) { + return url.startsWith("https") ? globalHttpsAgent : globalHttpAgent; } return url.startsWith("https") ? new RequestFilteringHttpsAgent(options) : new RequestFilteringHttpAgent(options); }; diff --git a/test/request-filtering-agent.test.ts b/test/request-filtering-agent.test.ts index 81baf09..0eba97f 100644 --- a/test/request-filtering-agent.test.ts +++ b/test/request-filtering-agent.test.ts @@ -86,11 +86,15 @@ describe("request-filtering-agent", function () { agent, timeout: 2000 }); + console.log("???ss"); throw new ReferenceError("SHOULD NOT BE CALLED:" + ipAddress); } catch (error) { + console.log("??" + error); if (error instanceof ReferenceError) { assert.fail(error); } + } finally { + console.log("??"); } } }); @@ -204,7 +208,10 @@ describe("request-filtering-agent", function () { if (error instanceof ReferenceError) { assert.fail(error); } - assert.ok(/It is private IP address/i.test(error.message), `Failed at ${ipAddress}, error: ${error}`); + assert.ok( + /Because, It is private IP address./i.test(error.message), + `Failed at ${ipAddress}, error: ${error}` + ); } } }); diff --git a/tsconfig.json b/tsconfig.json index e1d6a02..42dba3e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "esModuleInterop": true, "newLine": "LF", "outDir": "./lib/", - "target": "es5", + "target": "ES2020", "sourceMap": true, "declaration": true, "jsx": "preserve", @@ -33,4 +33,4 @@ ".git", "node_modules" ] -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 7b1622f..537465a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,10 +50,10 @@ dependencies: "@types/node" "*" -"@types/mocha@^8.2.2": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" - integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== +"@types/mocha@^10.0.3": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.3.tgz#4804fe9cd39da26eb62fa65c15ea77615a187812" + integrity sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ== "@types/node-fetch@^2.5.10": version "2.5.10" @@ -63,11 +63,18 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^15.12.0": +"@types/node@*": version "15.12.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.0.tgz#6a459d261450a300e6865faeddb5af01c3389bb3" integrity sha512-+aHJvoCsVhO2ZCuT4o5JtcPrCPyDE3+1nvbDprYes+pPkEsbjH7AGUCNtjMOXS0fqH14t+B7yLzaqSz92FPWyw== +"@types/node@^20.8.7": + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -78,11 +85,6 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -103,11 +105,6 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -127,10 +124,10 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -173,6 +170,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -209,7 +213,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.1.0, chalk@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -217,20 +221,20 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.5.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" clean-stack@^2.0.0: version "2.2.0" @@ -339,7 +343,14 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@4.3.1, debug@^4.3.1: +debug@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -454,10 +465,10 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" @@ -479,17 +490,17 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob-parent@~5.1.0: +glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -510,11 +521,6 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -602,11 +608,6 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -659,10 +660,10 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" @@ -717,14 +718,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - -log-symbols@^4.1.0: +log-symbols@4.1.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -777,40 +771,43 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@3.0.4, minimatch@^3.0.4: +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -mocha@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" - integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== +mocha@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" + chokidar "3.5.3" + debug "4.3.4" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.1.6" - growl "1.10.5" + glob "7.2.0" he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" + nanoid "3.3.3" + serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" + workerpool "6.2.1" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" @@ -825,15 +822,17 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.1.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" normalize-package-data@^2.5.0: version "2.5.0" @@ -968,10 +967,10 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" @@ -1030,10 +1029,10 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" @@ -1116,14 +1115,6 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^4.1.0, string-width@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" @@ -1142,13 +1133,6 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -1199,6 +1183,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-node-test-register@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ts-node-test-register/-/ts-node-test-register-10.0.0.tgz#eb8cbe40954331f2f70c8e5fb83c677965ac14f9" @@ -1242,6 +1231,11 @@ typescript@^4.3.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -1250,24 +1244,30 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -which@2.0.2, which@^2.0.1: +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^6.2.0: version "6.2.0" From 6fad4f08e7468347a5a0a6e88d5d52f67557bef7 Mon Sep 17 00:00:00 2001 From: azu Date: Fri, 20 Oct 2023 09:50:25 +0900 Subject: [PATCH 02/14] =?UTF-8?q?=E2=86=A9=EF=B8=8F=20f636e6cc618ddaf25235?= =?UTF-8?q?13ce7f650d182a2b39bf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 - package.json | 8 +- src/request-filtering-agent.ts | 134 +-------------- test/request-filtering-agent.test.ts | 9 +- tsconfig.json | 4 +- yarn.lock | 242 +++++++++++++-------------- 6 files changed, 132 insertions(+), 269 deletions(-) diff --git a/README.md b/README.md index 6871d42..f9a835e 100644 --- a/README.md +++ b/README.md @@ -16,10 +16,6 @@ This library block the request to these IP addresses by default. So, This library block the request to non-`unicast` IP addresses. -:warning: Node.js's built-in `fetch` does not support `http.Agent`. - -- [Passing a custom agent to `fetch()` · Issue #1489 · nodejs/undici](https://github.com/nodejs/undici/issues/1489) - ## Support `http.Agent` libraries This library provides Node.js's [http.Agent](https://nodejs.org/api/http.html#http_class_http_agent) implementation. diff --git a/package.json b/package.json index c47c721..61eac86 100644 --- a/package.json +++ b/package.json @@ -58,13 +58,13 @@ }, "devDependencies": { "@types/ip": "^1.1.0", - "@types/mocha": "^10.0.3", - "@types/node": "^20.8.7", + "@types/mocha": "^8.2.2", + "@types/node": "^15.12.0", "@types/node-fetch": "^2.5.10", "cross-env": "^7.0.3", "lint-staged": "^11.0.0", - "mocha": "^10.2.0", - "node-fetch": "^2.7.0", + "mocha": "^8.4.0", + "node-fetch": "^2.6.1", "prettier": "^2.3.0", "rimraf": "^3.0.0", "ts-node": "^10.0.0", diff --git a/src/request-filtering-agent.ts b/src/request-filtering-agent.ts index 0fd09ea..0e1a3fa 100644 --- a/src/request-filtering-agent.ts +++ b/src/request-filtering-agent.ts @@ -3,7 +3,6 @@ import { TcpNetConnectOpts } from "net"; import * as http from "http"; import * as https from "https"; import ipaddr from "ipaddr.js"; -import { Socket } from "node:net"; export interface RequestFilteringAgentOptions { // Allow to connect private IP address @@ -20,7 +19,7 @@ export interface RequestFilteringAgentOptions { // Default: false allowMetaIPAddress?: boolean; // Allow address list - // These values are preferred than denyAddressList + // This values are preferred than denyAddressList // Default: [] allowIPAddressList?: string[]; // Deny address list @@ -75,7 +74,7 @@ const validateIPAddress = ( ); } } catch (error) { - return error as Error; // if can not parse IP address, throw error + return error as Error; // if can not parsed IP address, throw error } return; }; @@ -168,98 +167,9 @@ export function applyRequestFilter( * A subclass of http.Agent with request filtering */ export class RequestFilteringHttpAgent extends http.Agent { - private requestFilterOptions: Required; - constructor(options?: http.AgentOptions & RequestFilteringAgentOptions) { super(options); - this.requestFilterOptions = { - allowPrivateIPAddress: - options && options.allowPrivateIPAddress !== undefined ? options.allowPrivateIPAddress : false, - allowMetaIPAddress: - options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, - allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], - denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], - stopPortScanningByUrlRedirection: - options && options.stopPortScanningByUrlRedirection !== undefined - ? options.stopPortScanningByUrlRedirection - : false - }; - } - - createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { - console.log("createConnectio !!!!n"); - // console.log("createConnection", options); - const { host } = options; - let validationError: Error | null | undefined = null; - if (host) { - // Direct ip address request without dns-lookup - // Example: http://127.0.0.1 - // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener - validationError = validateIPAddress({ address: host }, this.requestFilterOptions); - } - // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener - let isSocketEnding = false; - // @ts-expect-error - @types/node does not defined createConnection - const socket: Socket = super.createConnection(options, connectionListener); - const onReady = () => { - if (validationError) { - if (isSocketEnding) { - return; - } - if (socket.destroyed) { - return; - } - isSocketEnding = true; - socket.removeListener("ready", onReady); - socket.end(() => { - console.log("end 1"); - if (validationError) { - if (socket.destroyed) { - return; - } - socket.destroy(validationError); - } - }); - } - }; - socket.addListener("ready", onReady); - // Request with domain name - // Example: http://127.0.0.1.nip.io/ - let isEndong: boolean = false; - const onLookup = (err: Error, address: string, family: string | number, host: string): void => { - if (err) { - return; - } - const error = validateIPAddress({ address, family, host }, this.requestFilterOptions); - console.log("validation 2 ", error); - if (error) { - console.log("error 2", { - isEndong, - isSocketDestroyed: socket.destroyed, - connecting: socket.connecting, - pending: socket.pending - }); - if (isEndong) { - return; - } - isEndong = true; - socket.removeListener("lookup", onLookup); - if (socket.destroyed) { - return; - } - socket.end(() => { - console.log("end 2"); - if (socket.destroyed) { - return; - } - console.log("end 3 ", socket.destroyed); - console.log("end errr", validationError?.message); - socket.destroy(error); - }); - } - }; - socket.addListener("lookup", onLookup); - return socket; + applyRequestFilter(this, options); } } @@ -267,45 +177,9 @@ export class RequestFilteringHttpAgent extends http.Agent { * A subclass of https.Agent with request filtering */ export class RequestFilteringHttpsAgent extends https.Agent { - private requestFilterOptions: Required; - constructor(options?: https.AgentOptions & RequestFilteringAgentOptions) { super(options); - this.requestFilterOptions = { - allowPrivateIPAddress: - options && options.allowPrivateIPAddress !== undefined ? options.allowPrivateIPAddress : false, - allowMetaIPAddress: - options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, - allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], - denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], - stopPortScanningByUrlRedirection: - options && options.stopPortScanningByUrlRedirection !== undefined - ? options.stopPortScanningByUrlRedirection - : false - }; - } - - createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { - if (this.requestFilterOptions.stopPortScanningByUrlRedirection) { - // Prevents malicious user from identifying which ports are open - const { host, family } = options; - if (host && net.isIP(host)) { - const addr = ipaddr.parse(host); - const range = addr.range(); - if (range !== "unicast") { - throw new Error( - `DNS lookup ${host}(family:${family}, host:${host}) is not allowed. Because, It is private IP address.` - ); - } - } - } - - // @ts-expect-error - @types/node does not defined createConnection - const socket = super.createConnection(options, connectionListener); - // Request with domain name - // Example: http://127.0.0.1.nip.io/ - addDropFilterSocket(this.requestFilterOptions, socket); - return socket; + applyRequestFilter(this, options); } } diff --git a/test/request-filtering-agent.test.ts b/test/request-filtering-agent.test.ts index 0eba97f..81baf09 100644 --- a/test/request-filtering-agent.test.ts +++ b/test/request-filtering-agent.test.ts @@ -86,15 +86,11 @@ describe("request-filtering-agent", function () { agent, timeout: 2000 }); - console.log("???ss"); throw new ReferenceError("SHOULD NOT BE CALLED:" + ipAddress); } catch (error) { - console.log("??" + error); if (error instanceof ReferenceError) { assert.fail(error); } - } finally { - console.log("??"); } } }); @@ -208,10 +204,7 @@ describe("request-filtering-agent", function () { if (error instanceof ReferenceError) { assert.fail(error); } - assert.ok( - /Because, It is private IP address./i.test(error.message), - `Failed at ${ipAddress}, error: ${error}` - ); + assert.ok(/It is private IP address/i.test(error.message), `Failed at ${ipAddress}, error: ${error}`); } } }); diff --git a/tsconfig.json b/tsconfig.json index 42dba3e..e1d6a02 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "esModuleInterop": true, "newLine": "LF", "outDir": "./lib/", - "target": "ES2020", + "target": "es5", "sourceMap": true, "declaration": true, "jsx": "preserve", @@ -33,4 +33,4 @@ ".git", "node_modules" ] -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 537465a..7b1622f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,10 +50,10 @@ dependencies: "@types/node" "*" -"@types/mocha@^10.0.3": - version "10.0.3" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.3.tgz#4804fe9cd39da26eb62fa65c15ea77615a187812" - integrity sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ== +"@types/mocha@^8.2.2": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" + integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== "@types/node-fetch@^2.5.10": version "2.5.10" @@ -63,18 +63,11 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*": +"@types/node@*", "@types/node@^15.12.0": version "15.12.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.0.tgz#6a459d261450a300e6865faeddb5af01c3389bb3" integrity sha512-+aHJvoCsVhO2ZCuT4o5JtcPrCPyDE3+1nvbDprYes+pPkEsbjH7AGUCNtjMOXS0fqH14t+B7yLzaqSz92FPWyw== -"@types/node@^20.8.7": - version "20.8.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" - integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== - dependencies: - undici-types "~5.25.1" - "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -85,6 +78,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -105,6 +103,11 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -124,10 +127,10 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== +anymatch@~3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -170,13 +173,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -213,7 +209,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -221,20 +217,20 @@ chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: - anymatch "~3.1.2" + anymatch "~3.1.1" braces "~3.0.2" - glob-parent "~5.1.2" + glob-parent "~5.1.0" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.6.0" + readdirp "~3.5.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.3.1" clean-stack@^2.0.0: version "2.2.0" @@ -343,14 +339,7 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.1: +debug@4.3.1, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -465,10 +454,10 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +fsevents@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -490,17 +479,17 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob-parent@~5.1.2: +glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -521,6 +510,11 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -608,6 +602,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -660,10 +659,10 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== dependencies: argparse "^2.0.1" @@ -718,7 +717,14 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -log-symbols@4.1.0, log-symbols@^4.1.0: +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -771,43 +777,40 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -mocha@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== +mocha@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== dependencies: + "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" + chokidar "3.5.1" + debug "4.3.1" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.2.0" + glob "7.1.6" + growl "1.10.5" he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" + nanoid "3.1.20" + serialize-javascript "5.0.1" strip-json-comments "3.1.1" supports-color "8.1.1" - workerpool "6.2.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" @@ -822,17 +825,15 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== -node-fetch@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== normalize-package-data@^2.5.0: version "2.5.0" @@ -967,10 +968,10 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" @@ -1029,10 +1030,10 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" @@ -1115,6 +1116,14 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" @@ -1133,6 +1142,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -1183,11 +1199,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - ts-node-test-register@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ts-node-test-register/-/ts-node-test-register-10.0.0.tgz#eb8cbe40954331f2f70c8e5fb83c677965ac14f9" @@ -1231,11 +1242,6 @@ typescript@^4.3.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -1244,30 +1250,24 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^2.0.1: +which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== wrap-ansi@^6.2.0: version "6.2.0" From efa6f8e674a4cc51ed223c89235f72a8948ba8c7 Mon Sep 17 00:00:00 2001 From: azu Date: Fri, 20 Oct 2023 10:03:55 +0900 Subject: [PATCH 03/14] fix: Node.js 20 support --- .github/workflows/ci.yml | 11 +- README.md | 4 + package.json | 8 +- src/request-filtering-agent.ts | 221 +++++++++++++++++++++++- test/request-filtering-agent.test.ts | 11 +- tsconfig.json | 4 +- yarn.lock | 242 +++++++++++++-------------- 7 files changed, 362 insertions(+), 139 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f9c268f..159a1d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,21 +1,20 @@ name: ci -on: [push] - +on: [push, pull_request] permissions: contents: read jobs: build: name: Test on node ${{ matrix.node_version }} - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest strategy: matrix: - node_version: [ 12, 14, 16 ] + node_version: [ 18, 20 ] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node_version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node_version }} diff --git a/README.md b/README.md index f9a835e..6871d42 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,10 @@ This library block the request to these IP addresses by default. So, This library block the request to non-`unicast` IP addresses. +:warning: Node.js's built-in `fetch` does not support `http.Agent`. + +- [Passing a custom agent to `fetch()` · Issue #1489 · nodejs/undici](https://github.com/nodejs/undici/issues/1489) + ## Support `http.Agent` libraries This library provides Node.js's [http.Agent](https://nodejs.org/api/http.html#http_class_http_agent) implementation. diff --git a/package.json b/package.json index 61eac86..c47c721 100644 --- a/package.json +++ b/package.json @@ -58,13 +58,13 @@ }, "devDependencies": { "@types/ip": "^1.1.0", - "@types/mocha": "^8.2.2", - "@types/node": "^15.12.0", + "@types/mocha": "^10.0.3", + "@types/node": "^20.8.7", "@types/node-fetch": "^2.5.10", "cross-env": "^7.0.3", "lint-staged": "^11.0.0", - "mocha": "^8.4.0", - "node-fetch": "^2.6.1", + "mocha": "^10.2.0", + "node-fetch": "^2.7.0", "prettier": "^2.3.0", "rimraf": "^3.0.0", "ts-node": "^10.0.0", diff --git a/src/request-filtering-agent.ts b/src/request-filtering-agent.ts index 0e1a3fa..a8c5300 100644 --- a/src/request-filtering-agent.ts +++ b/src/request-filtering-agent.ts @@ -3,6 +3,7 @@ import { TcpNetConnectOpts } from "net"; import * as http from "http"; import * as https from "https"; import ipaddr from "ipaddr.js"; +import { Socket } from "node:net"; export interface RequestFilteringAgentOptions { // Allow to connect private IP address @@ -19,7 +20,7 @@ export interface RequestFilteringAgentOptions { // Default: false allowMetaIPAddress?: boolean; // Allow address list - // This values are preferred than denyAddressList + // These values are preferred than denyAddressList // Default: [] allowIPAddressList?: string[]; // Deny address list @@ -74,7 +75,7 @@ const validateIPAddress = ( ); } } catch (error) { - return error as Error; // if can not parsed IP address, throw error + return error as Error; // if can not parse IP address, throw error } return; }; @@ -167,9 +168,114 @@ export function applyRequestFilter( * A subclass of http.Agent with request filtering */ export class RequestFilteringHttpAgent extends http.Agent { + private requestFilterOptions: Required; + constructor(options?: http.AgentOptions & RequestFilteringAgentOptions) { super(options); - applyRequestFilter(this, options); + this.requestFilterOptions = { + allowPrivateIPAddress: + options && options.allowPrivateIPAddress !== undefined ? options.allowPrivateIPAddress : false, + allowMetaIPAddress: + options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, + allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], + denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], + stopPortScanningByUrlRedirection: + options && options.stopPortScanningByUrlRedirection !== undefined + ? options.stopPortScanningByUrlRedirection + : false + }; + } + + createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { + console.log("createConnectio !!!!n"); + let validationError: Error | null | undefined = null; + if (this.requestFilterOptions.stopPortScanningByUrlRedirection) { + // Prevents malicious user from identifying which ports are open + const { host, family } = options; + if (host && net.isIP(host)) { + const addr = ipaddr.parse(host); + const range = addr.range(); + if (range !== "unicast") { + throw new Error( + `DNS lookup ${host}(family:${family}, host:${host}) is not allowed. Because, It is private IP address.` + ); + } + } + } + // console.log("createConnection", options); + const { host } = options; + if (host) { + // Direct ip address request without dns-lookup + // Example: http://127.0.0.1 + // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener + validationError = validateIPAddress({ address: host }, this.requestFilterOptions); + } + // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener + let isSocketEnding = false; + // @ts-expect-error - @types/node does not defined createConnection + const socket: Socket = super.createConnection(options, connectionListener); + const onReady = () => { + if (validationError) { + if (isSocketEnding) { + return; + } + if (socket.destroyed) { + return; + } + isSocketEnding = true; + socket.removeListener("ready", onReady); + socket.end(() => { + console.log("end 1"); + if (validationError) { + if (socket.destroyed) { + return; + } + socket.destroy(validationError); + } + }); + } + }; + socket.addListener("ready", onReady); + // Request with domain name + // Example: http://127.0.0.1.nip.io/ + const weakSet = new WeakSet(); + const onLookup = (err: Error, address: string, family: string | number, host: string): void => { + if (err) { + return; + } + console.log({ + family, + host + }); + const error = validateIPAddress({ address, family, host }, this.requestFilterOptions); + console.log("validation 2 ", error); + if (error) { + console.log("error 2", { + isSocketDestroyed: socket.destroyed, + connecting: socket.connecting, + pending: socket.pending + }); + if (weakSet.has(socket)) { + return; + } + weakSet.add(socket); + socket.removeListener("lookup", onLookup); + if (socket.destroyed) { + return; + } + socket.end(() => { + console.log("end 2"); + if (socket.destroyed) { + return; + } + console.log("end 3 ", socket.destroyed); + console.log("end errr", validationError?.message); + socket.destroy(error); + }); + } + }; + socket.addListener("lookup", onLookup); + return socket; } } @@ -177,9 +283,116 @@ export class RequestFilteringHttpAgent extends http.Agent { * A subclass of https.Agent with request filtering */ export class RequestFilteringHttpsAgent extends https.Agent { + private requestFilterOptions: Required; + constructor(options?: https.AgentOptions & RequestFilteringAgentOptions) { super(options); - applyRequestFilter(this, options); + this.requestFilterOptions = { + allowPrivateIPAddress: + options && options.allowPrivateIPAddress !== undefined ? options.allowPrivateIPAddress : false, + allowMetaIPAddress: + options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, + allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], + denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], + stopPortScanningByUrlRedirection: + options && options.stopPortScanningByUrlRedirection !== undefined + ? options.stopPortScanningByUrlRedirection + : false + }; + } + + createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { + console.log("createConnectio !!!!n"); + let validationError: Error | null | undefined = null; + if (this.requestFilterOptions.stopPortScanningByUrlRedirection) { + // Prevents malicious user from identifying which ports are open + const { host, family } = options; + if (host && net.isIP(host)) { + const addr = ipaddr.parse(host); + const range = addr.range(); + if (range !== "unicast") { + throw new Error( + `DNS lookup ${host}(family:${family}, host:${host}) is not allowed. Because, It is private IP address.` + ); + } + } + } + // console.log("createConnection", options); + const { host } = options; + if (host) { + // Direct ip address request without dns-lookup + // Example: http://127.0.0.1 + // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener + validationError = validateIPAddress({ address: host }, this.requestFilterOptions); + } + // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener + let isSocketEnding = false; + // @ts-expect-error - @types/node does not defined createConnection + const socket: Socket = super.createConnection(options, connectionListener); + const onReady = () => { + if (validationError) { + if (isSocketEnding) { + return; + } + if (socket.destroyed) { + return; + } + isSocketEnding = true; + socket.removeListener("ready", onReady); + socket.end(() => { + console.log("end 1"); + if (validationError) { + if (socket.destroyed) { + return; + } + socket.destroy(validationError); + } + }); + } + }; + socket.addListener("ready", onReady); + // Request with domain name + // Example: http://127.0.0.1.nip.io/ + let isEndong: boolean = false; + const weakSet = new WeakSet(); + const onLookup = (err: Error, address: string, family: string | number, host: string): void => { + if (err) { + return; + } + const error = validateIPAddress({ address, family, host }, this.requestFilterOptions); + console.log("validation 2 ", error); + if (error) { + console.log("error 2", { + isEndong, + isSocketDestroyed: socket.destroyed, + connecting: socket.connecting, + pending: socket.pending + }); + if (weakSet.has(socket)) { + return; + } + if (isEndong) { + return; + } + weakSet.add(socket); + isEndong = true; + socket.removeListener("lookup", onLookup); + if (socket.destroyed) { + return; + } + socket.end(() => { + console.log("end 2"); + if (socket.destroyed) { + return; + } + console.log("end 3 ", socket.destroyed); + console.log("end errr", validationError?.message); + socket.destroy(error); + }); + } + }; + socket.addListener("lookup", onLookup); + return socket; } } diff --git a/test/request-filtering-agent.test.ts b/test/request-filtering-agent.test.ts index 81baf09..75d9886 100644 --- a/test/request-filtering-agent.test.ts +++ b/test/request-filtering-agent.test.ts @@ -86,18 +86,22 @@ describe("request-filtering-agent", function () { agent, timeout: 2000 }); + console.log("???ss"); throw new ReferenceError("SHOULD NOT BE CALLED:" + ipAddress); } catch (error) { + console.log("??" + error); if (error instanceof ReferenceError) { assert.fail(error); } + } finally { + console.log("??"); } } }); it("should allow http://127.0.0.1, but other private ip is disallowed", async () => { const agent = new RequestFilteringHttpAgent({ - allowIPAddressList: ["127.0.0.1"], + allowIPAddressList: ["127.0.0.1", "::1"], allowPrivateIPAddress: false }); const privateIPs = [`http://127.0.0.1:${TEST_PORT}`, `http://localhost:${TEST_PORT}`]; @@ -204,7 +208,10 @@ describe("request-filtering-agent", function () { if (error instanceof ReferenceError) { assert.fail(error); } - assert.ok(/It is private IP address/i.test(error.message), `Failed at ${ipAddress}, error: ${error}`); + assert.ok( + /Because, It is private IP address./i.test(error.message), + `Failed at ${ipAddress}, error: ${error}` + ); } } }); diff --git a/tsconfig.json b/tsconfig.json index e1d6a02..42dba3e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "esModuleInterop": true, "newLine": "LF", "outDir": "./lib/", - "target": "es5", + "target": "ES2020", "sourceMap": true, "declaration": true, "jsx": "preserve", @@ -33,4 +33,4 @@ ".git", "node_modules" ] -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 7b1622f..537465a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,10 +50,10 @@ dependencies: "@types/node" "*" -"@types/mocha@^8.2.2": - version "8.2.2" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" - integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== +"@types/mocha@^10.0.3": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.3.tgz#4804fe9cd39da26eb62fa65c15ea77615a187812" + integrity sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ== "@types/node-fetch@^2.5.10": version "2.5.10" @@ -63,11 +63,18 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^15.12.0": +"@types/node@*": version "15.12.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.0.tgz#6a459d261450a300e6865faeddb5af01c3389bb3" integrity sha512-+aHJvoCsVhO2ZCuT4o5JtcPrCPyDE3+1nvbDprYes+pPkEsbjH7AGUCNtjMOXS0fqH14t+B7yLzaqSz92FPWyw== +"@types/node@^20.8.7": + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -78,11 +85,6 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -103,11 +105,6 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -127,10 +124,10 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -173,6 +170,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -209,7 +213,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.1.0, chalk@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -217,20 +221,20 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.5.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" clean-stack@^2.0.0: version "2.2.0" @@ -339,7 +343,14 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@4.3.1, debug@^4.3.1: +debug@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -454,10 +465,10 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" @@ -479,17 +490,17 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob-parent@~5.1.0: +glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -510,11 +521,6 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -602,11 +608,6 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -659,10 +660,10 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" @@ -717,14 +718,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -log-symbols@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" - integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== - dependencies: - chalk "^4.0.0" - -log-symbols@^4.1.0: +log-symbols@4.1.0, log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -777,40 +771,43 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@3.0.4, minimatch@^3.0.4: +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -mocha@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" - integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== +mocha@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.5.1" - debug "4.3.1" + chokidar "3.5.3" + debug "4.3.4" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.1.6" - growl "1.10.5" + glob "7.2.0" he "1.2.0" - js-yaml "4.0.0" - log-symbols "4.0.0" - minimatch "3.0.4" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" ms "2.1.3" - nanoid "3.1.20" - serialize-javascript "5.0.1" + nanoid "3.3.3" + serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" - which "2.0.2" - wide-align "1.1.3" - workerpool "6.1.0" + workerpool "6.2.1" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" @@ -825,15 +822,17 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.1.20: - version "3.1.20" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" - integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -node-fetch@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" normalize-package-data@^2.5.0: version "2.5.0" @@ -968,10 +967,10 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" @@ -1030,10 +1029,10 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -serialize-javascript@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" @@ -1116,14 +1115,6 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - string-width@^4.1.0, string-width@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" @@ -1142,13 +1133,6 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -1199,6 +1183,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + ts-node-test-register@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ts-node-test-register/-/ts-node-test-register-10.0.0.tgz#eb8cbe40954331f2f70c8e5fb83c677965ac14f9" @@ -1242,6 +1231,11 @@ typescript@^4.3.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -1250,24 +1244,30 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -which@2.0.2, which@^2.0.1: +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -workerpool@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" - integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== wrap-ansi@^6.2.0: version "6.2.0" From 5b951e9a0497f91efaaa3673414c4038fdd6ede6 Mon Sep 17 00:00:00 2001 From: azu Date: Fri, 20 Oct 2023 10:08:48 +0900 Subject: [PATCH 04/14] CI: Node. 12+ --- .github/workflows/ci.yml | 2 +- package.json | 8 +- yarn.lock | 211 ++++++++++++++++++++++----------------- 3 files changed, 127 insertions(+), 94 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 159a1d0..7984fc0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node_version: [ 18, 20 ] + node_version: [ 12, 14, 16, 18, 20 ] steps: - uses: actions/checkout@v3 diff --git a/package.json b/package.json index c47c721..61eac86 100644 --- a/package.json +++ b/package.json @@ -58,13 +58,13 @@ }, "devDependencies": { "@types/ip": "^1.1.0", - "@types/mocha": "^10.0.3", - "@types/node": "^20.8.7", + "@types/mocha": "^8.2.2", + "@types/node": "^15.12.0", "@types/node-fetch": "^2.5.10", "cross-env": "^7.0.3", "lint-staged": "^11.0.0", - "mocha": "^10.2.0", - "node-fetch": "^2.7.0", + "mocha": "^8.4.0", + "node-fetch": "^2.6.1", "prettier": "^2.3.0", "rimraf": "^3.0.0", "ts-node": "^10.0.0", diff --git a/yarn.lock b/yarn.lock index 537465a..2aed490 100644 --- a/yarn.lock +++ b/yarn.lock @@ -50,10 +50,10 @@ dependencies: "@types/node" "*" -"@types/mocha@^10.0.3": - version "10.0.3" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.3.tgz#4804fe9cd39da26eb62fa65c15ea77615a187812" - integrity sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ== +"@types/mocha@^8.2.2": + version "8.2.3" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" + integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== "@types/node-fetch@^2.5.10": version "2.5.10" @@ -68,12 +68,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.0.tgz#6a459d261450a300e6865faeddb5af01c3389bb3" integrity sha512-+aHJvoCsVhO2ZCuT4o5JtcPrCPyDE3+1nvbDprYes+pPkEsbjH7AGUCNtjMOXS0fqH14t+B7yLzaqSz92FPWyw== -"@types/node@^20.8.7": - version "20.8.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" - integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== - dependencies: - undici-types "~5.25.1" +"@types/node@^15.12.0": + version "15.14.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" + integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -85,6 +83,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -105,6 +108,11 @@ ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -124,7 +132,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.2: +anymatch@~3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== @@ -170,13 +178,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -213,6 +214,14 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^4.1.0, chalk@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" @@ -221,20 +230,20 @@ chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== +chokidar@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" + integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== dependencies: - anymatch "~3.1.2" + anymatch "~3.1.1" braces "~3.0.2" - glob-parent "~5.1.2" + glob-parent "~5.1.0" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.6.0" + readdirp "~3.5.0" optionalDependencies: - fsevents "~2.3.2" + fsevents "~2.3.1" clean-stack@^2.0.0: version "2.2.0" @@ -343,14 +352,7 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.1: +debug@4.3.1, debug@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== @@ -465,7 +467,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.3.2: +fsevents@~2.3.1: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -490,17 +492,17 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob-parent@~5.1.2: +glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -521,6 +523,11 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -608,6 +615,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -660,10 +672,10 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== +js-yaml@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" + integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== dependencies: argparse "^2.0.1" @@ -718,7 +730,14 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -log-symbols@4.1.0, log-symbols@^4.1.0: +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== + dependencies: + chalk "^4.0.0" + +log-symbols@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -771,43 +790,40 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.4: +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -mocha@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" - integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== +mocha@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.4.0.tgz#677be88bf15980a3cae03a73e10a0fc3997f0cff" + integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== dependencies: + "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" + chokidar "3.5.1" + debug "4.3.1" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.2.0" + glob "7.1.6" + growl "1.10.5" he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" + js-yaml "4.0.0" + log-symbols "4.0.0" + minimatch "3.0.4" ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" + nanoid "3.1.20" + serialize-javascript "5.0.1" strip-json-comments "3.1.1" supports-color "8.1.1" - workerpool "6.2.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.0" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" @@ -822,12 +838,12 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== +nanoid@3.1.20: + version "3.1.20" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" + integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== -node-fetch@^2.7.0: +node-fetch@^2.6.1: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -967,10 +983,10 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== +readdirp@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" + integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== dependencies: picomatch "^2.2.1" @@ -1029,10 +1045,10 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== +serialize-javascript@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== dependencies: randombytes "^2.1.0" @@ -1115,6 +1131,14 @@ string-argv@0.3.1: resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^4.1.0, string-width@^4.2.0: version "4.2.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" @@ -1133,6 +1157,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + strip-ansi@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" @@ -1231,11 +1262,6 @@ typescript@^4.3.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" integrity sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw== -undici-types@~5.25.1: - version "5.25.3" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" - integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== - validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -1257,17 +1283,24 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which@^2.0.1: +which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +workerpool@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.0.tgz#a8e038b4c94569596852de7a8ea4228eefdeb37b" + integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== wrap-ansi@^6.2.0: version "6.2.0" From 67128bf9ca5a5a429c43870b66c44bec410beb81 Mon Sep 17 00:00:00 2001 From: azu Date: Fri, 20 Oct 2023 10:09:40 +0900 Subject: [PATCH 05/14] CI: Node. 14+ --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7984fc0..7005f45 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node_version: [ 12, 14, 16, 18, 20 ] + node_version: [ 14, 16, 18, 20 ] steps: - uses: actions/checkout@v3 From 0c53b422c75e79d144a1f90b0839a49d1ce8a726 Mon Sep 17 00:00:00 2001 From: azu Date: Fri, 20 Oct 2023 10:10:23 +0900 Subject: [PATCH 06/14] CI: Node. 14+ --- src/request-filtering-agent.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/request-filtering-agent.ts b/src/request-filtering-agent.ts index a8c5300..d03688c 100644 --- a/src/request-filtering-agent.ts +++ b/src/request-filtering-agent.ts @@ -3,7 +3,7 @@ import { TcpNetConnectOpts } from "net"; import * as http from "http"; import * as https from "https"; import ipaddr from "ipaddr.js"; -import { Socket } from "node:net"; +import { Socket } from "net"; export interface RequestFilteringAgentOptions { // Allow to connect private IP address From 3dfbb3d842f8539a34fb7a41be448126d20910ed Mon Sep 17 00:00:00 2001 From: azu Date: Fri, 20 Oct 2023 10:10:51 +0900 Subject: [PATCH 07/14] fix type --- src/request-filtering-agent.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/request-filtering-agent.ts b/src/request-filtering-agent.ts index d03688c..7d8a135 100644 --- a/src/request-filtering-agent.ts +++ b/src/request-filtering-agent.ts @@ -250,11 +250,6 @@ export class RequestFilteringHttpAgent extends http.Agent { const error = validateIPAddress({ address, family, host }, this.requestFilterOptions); console.log("validation 2 ", error); if (error) { - console.log("error 2", { - isSocketDestroyed: socket.destroyed, - connecting: socket.connecting, - pending: socket.pending - }); if (weakSet.has(socket)) { return; } @@ -362,12 +357,6 @@ export class RequestFilteringHttpsAgent extends https.Agent { const error = validateIPAddress({ address, family, host }, this.requestFilterOptions); console.log("validation 2 ", error); if (error) { - console.log("error 2", { - isEndong, - isSocketDestroyed: socket.destroyed, - connecting: socket.connecting, - pending: socket.pending - }); if (weakSet.has(socket)) { return; } From 6ae95db31dbd424bb1d4148f3345e9fb83a6634e Mon Sep 17 00:00:00 2001 From: azu Date: Fri, 20 Oct 2023 10:13:37 +0900 Subject: [PATCH 08/14] CI: Node.js 16+ --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7005f45..6e00b37 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node_version: [ 14, 16, 18, 20 ] + node_version: [ 16, 18, 20 ] steps: - uses: actions/checkout@v3 From a0a348ead386728aaf3e21cddbee3fb077c3d3bf Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 21 Oct 2023 14:26:36 +0900 Subject: [PATCH 09/14] refactor!: remove `applyRequestFilter()` and `stopPortScanningByUrlRedirection` option --- src/request-filtering-agent.ts | 273 ++++----------------------- test/request-filtering-agent.test.ts | 95 ++++------ 2 files changed, 73 insertions(+), 295 deletions(-) diff --git a/src/request-filtering-agent.ts b/src/request-filtering-agent.ts index 7d8a135..ce897c8 100644 --- a/src/request-filtering-agent.ts +++ b/src/request-filtering-agent.ts @@ -6,15 +6,15 @@ import ipaddr from "ipaddr.js"; import { Socket } from "net"; export interface RequestFilteringAgentOptions { - // Allow to connect private IP address + // Allow to connect private IP address if allowPrivateIPAddress is true // This includes Private IP addresses and Reserved IP addresses. // https://en.wikipedia.org/wiki/Private_network // https://en.wikipedia.org/wiki/Reserved_IP_addresses // Example, http://127.0.0.1/, http://localhost/, https://169.254.169.254/ // Default: false allowPrivateIPAddress?: boolean; - // Allow to connect meta address 0.0.0.0 - // 0.0.0.0 (IPv4) and :: (IPv6) a meta address that routing another address + // Allow to connect meta address 0.0.0.0 if allowPrivateIPAddress is true + // 0.0.0.0 (IPv4) and :: (IPv6) a meta/unspecified address that routing another address // https://en.wikipedia.org/wiki/Reserved_IP_addresses // https://tools.ietf.org/html/rfc6890 // Default: false @@ -26,12 +26,14 @@ export interface RequestFilteringAgentOptions { // Deny address list // Default: [] denyIPAddressList?: string[]; - // prevent url redirection attack - // connection not made to private IP adresses where the port is closed - // Default: false - stopPortScanningByUrlRedirection?: boolean; } +export const DefaultRequestFilteringAgentOptions: Required = { + allowPrivateIPAddress: false, + allowMetaIPAddress: false, + allowIPAddressList: [], + denyIPAddressList: [] +}; /** * validate the address that is matched the validation options * @param address ip address @@ -42,7 +44,7 @@ export interface RequestFilteringAgentOptions { const validateIPAddress = ( { address, host, family }: { address: string; host?: string; family?: string | number }, options: Required -): null | undefined | Error => { +): undefined | Error => { // if it is not IP address, skip it if (net.isIP(address) === 0) { return; @@ -80,90 +82,6 @@ const validateIPAddress = ( return; }; -// dns lookup -> check -const addDropFilterSocket = (options: Required, socket: net.Socket) => { - socket.addListener("lookup", (err, address, family, host) => { - if (err) { - return; - } - const error = validateIPAddress({ address, family, host }, options); - if (error) { - socket.destroy(error); - } - }); -}; - -// public -// prevent twice apply -const appliedAgentSet = new WeakSet(); - -/** - * Apply request filter to http(s).Agent instance - */ -export function applyRequestFilter( - agent: T, - options?: RequestFilteringAgentOptions -): T { - if (appliedAgentSet.has(agent)) { - return agent; - } - appliedAgentSet.add(agent); - const requestFilterOptions: Required = { - allowPrivateIPAddress: - options && options.allowPrivateIPAddress !== undefined ? options.allowPrivateIPAddress : false, - allowMetaIPAddress: options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, - allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], - denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], - stopPortScanningByUrlRedirection: - options && options.stopPortScanningByUrlRedirection !== undefined - ? options.stopPortScanningByUrlRedirection - : false - }; - // override http.Agent#createConnection - // https://nodejs.org/api/http.html#http_agent_createconnection_options_callback - // https://nodejs.org/api/net.html#net_net_createconnection_options_connectlistener - // @ts-expect-error - @types/node does not defined createConnection - const createConnection = agent.createConnection; - // @ts-expect-error - @types/node does not defined createConnection - agent.createConnection = (options: TcpNetConnectOpts, connectionListener?: (error?: Error) => void) => { - if (requestFilterOptions.stopPortScanningByUrlRedirection) { - // Prevents malicious user from identifying which ports are open - const { host, family } = options; - if (host && net.isIP(host)) { - const addr = ipaddr.parse(host); - const range = addr.range(); - if (range !== "unicast") { - throw new Error( - `DNS lookup ${host}(family:${family}, host:${host}) is not allowed. Because, It is private IP address.` - ); - } - } - } - - const socket = createConnection.call(agent, options, () => { - // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener - const { host } = options; - if (host) { - // Direct ip address request without dns-lookup - // Example: http://127.0.0.1 - // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener - const error = validateIPAddress({ address: host }, requestFilterOptions); - if (error) { - socket.destroy(error); - } - } - if (typeof connectionListener === "function") { - connectionListener(); - } - }); - // Request with domain name - // Example: http://127.0.0.1.nip.io/ - addDropFilterSocket(requestFilterOptions, socket); - return socket; - }; - return agent; -} - /** * A subclass of http.Agent with request filtering */ @@ -174,98 +92,49 @@ export class RequestFilteringHttpAgent extends http.Agent { super(options); this.requestFilterOptions = { allowPrivateIPAddress: - options && options.allowPrivateIPAddress !== undefined ? options.allowPrivateIPAddress : false, + options && options.allowPrivateIPAddress !== undefined + ? options.allowPrivateIPAddress + : DefaultRequestFilteringAgentOptions.allowPrivateIPAddress, allowMetaIPAddress: - options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, - allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], - denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], - stopPortScanningByUrlRedirection: - options && options.stopPortScanningByUrlRedirection !== undefined - ? options.stopPortScanningByUrlRedirection - : false + options && options.allowMetaIPAddress !== undefined + ? options.allowMetaIPAddress + : DefaultRequestFilteringAgentOptions.allowMetaIPAddress, + allowIPAddressList: + options && options.allowIPAddressList + ? options.allowIPAddressList + : DefaultRequestFilteringAgentOptions.allowIPAddressList, + denyIPAddressList: + options && options.denyIPAddressList + ? options.denyIPAddressList + : DefaultRequestFilteringAgentOptions.denyIPAddressList }; } createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { - console.log("createConnectio !!!!n"); - let validationError: Error | null | undefined = null; - if (this.requestFilterOptions.stopPortScanningByUrlRedirection) { - // Prevents malicious user from identifying which ports are open - const { host, family } = options; - if (host && net.isIP(host)) { - const addr = ipaddr.parse(host); - const range = addr.range(); - if (range !== "unicast") { - throw new Error( - `DNS lookup ${host}(family:${family}, host:${host}) is not allowed. Because, It is private IP address.` - ); - } - } - } - // console.log("createConnection", options); const { host } = options; - if (host) { + if (host !== undefined) { // Direct ip address request without dns-lookup // Example: http://127.0.0.1 // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener - validationError = validateIPAddress({ address: host }, this.requestFilterOptions); + const validationError = validateIPAddress({ address: host }, this.requestFilterOptions); + if (validationError) { + throw validationError; + } } // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener - let isSocketEnding = false; // @ts-expect-error - @types/node does not defined createConnection const socket: Socket = super.createConnection(options, connectionListener); - const onReady = () => { - if (validationError) { - if (isSocketEnding) { - return; - } - if (socket.destroyed) { - return; - } - isSocketEnding = true; - socket.removeListener("ready", onReady); - socket.end(() => { - console.log("end 1"); - if (validationError) { - if (socket.destroyed) { - return; - } - socket.destroy(validationError); - } - }); - } - }; - socket.addListener("ready", onReady); // Request with domain name // Example: http://127.0.0.1.nip.io/ - const weakSet = new WeakSet(); const onLookup = (err: Error, address: string, family: string | number, host: string): void => { if (err) { return; } - console.log({ - family, - host - }); - const error = validateIPAddress({ address, family, host }, this.requestFilterOptions); - console.log("validation 2 ", error); - if (error) { - if (weakSet.has(socket)) { - return; - } - weakSet.add(socket); + const validationError = validateIPAddress({ address, family, host }, this.requestFilterOptions); + if (validationError) { socket.removeListener("lookup", onLookup); - if (socket.destroyed) { - return; - } socket.end(() => { - console.log("end 2"); - if (socket.destroyed) { - return; - } - console.log("end 3 ", socket.destroyed); - console.log("end errr", validationError?.message); - socket.destroy(error); + socket.destroy(validationError); }); } }; @@ -288,95 +157,35 @@ export class RequestFilteringHttpsAgent extends https.Agent { allowMetaIPAddress: options && options.allowMetaIPAddress !== undefined ? options.allowMetaIPAddress : false, allowIPAddressList: options && options.allowIPAddressList ? options.allowIPAddressList : [], - denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [], - stopPortScanningByUrlRedirection: - options && options.stopPortScanningByUrlRedirection !== undefined - ? options.stopPortScanningByUrlRedirection - : false + denyIPAddressList: options && options.denyIPAddressList ? options.denyIPAddressList : [] }; } createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { - console.log("createConnectio !!!!n"); - let validationError: Error | null | undefined = null; - if (this.requestFilterOptions.stopPortScanningByUrlRedirection) { - // Prevents malicious user from identifying which ports are open - const { host, family } = options; - if (host && net.isIP(host)) { - const addr = ipaddr.parse(host); - const range = addr.range(); - if (range !== "unicast") { - throw new Error( - `DNS lookup ${host}(family:${family}, host:${host}) is not allowed. Because, It is private IP address.` - ); - } - } - } - // console.log("createConnection", options); const { host } = options; - if (host) { + if (host !== undefined) { // Direct ip address request without dns-lookup // Example: http://127.0.0.1 // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener - validationError = validateIPAddress({ address: host }, this.requestFilterOptions); + const validationError = validateIPAddress({ address: host }, this.requestFilterOptions); + if (validationError) { + throw validationError; + } } // https://nodejs.org/api/net.html#net_socket_connect_options_connectlistener - let isSocketEnding = false; // @ts-expect-error - @types/node does not defined createConnection const socket: Socket = super.createConnection(options, connectionListener); - const onReady = () => { - if (validationError) { - if (isSocketEnding) { - return; - } - if (socket.destroyed) { - return; - } - isSocketEnding = true; - socket.removeListener("ready", onReady); - socket.end(() => { - console.log("end 1"); - if (validationError) { - if (socket.destroyed) { - return; - } - socket.destroy(validationError); - } - }); - } - }; - socket.addListener("ready", onReady); // Request with domain name // Example: http://127.0.0.1.nip.io/ - let isEndong: boolean = false; - const weakSet = new WeakSet(); const onLookup = (err: Error, address: string, family: string | number, host: string): void => { if (err) { return; } - const error = validateIPAddress({ address, family, host }, this.requestFilterOptions); - console.log("validation 2 ", error); - if (error) { - if (weakSet.has(socket)) { - return; - } - if (isEndong) { - return; - } - weakSet.add(socket); - isEndong = true; + const validationError = validateIPAddress({ address, family, host }, this.requestFilterOptions); + if (validationError) { socket.removeListener("lookup", onLookup); - if (socket.destroyed) { - return; - } socket.end(() => { - console.log("end 2"); - if (socket.destroyed) { - return; - } - console.log("end 3 ", socket.destroyed); - console.log("end errr", validationError?.message); - socket.destroy(error); + socket.destroy(validationError); }); } }; diff --git a/test/request-filtering-agent.test.ts b/test/request-filtering-agent.test.ts index 75d9886..8c6d5d0 100644 --- a/test/request-filtering-agent.test.ts +++ b/test/request-filtering-agent.test.ts @@ -1,11 +1,6 @@ import * as assert from "assert"; import fetch from "node-fetch"; -import { - globalHttpAgent, - RequestFilteringHttpAgent, - useAgent, - applyRequestFilter -} from "../src/request-filtering-agent"; +import { globalHttpAgent, RequestFilteringHttpAgent, useAgent } from "../src/request-filtering-agent"; import * as http from "http"; const TEST_PORT = 12456; @@ -18,7 +13,12 @@ describe("request-filtering-agent", function () { return new Promise((resolve) => { // response ok const server = http.createServer(); - server.on("request", (_req, res) => { + server.on("request", (req, res) => { + if (req.url === "/redirect") { + console.log("redirect"); + res.writeHead(301, { Location: `http://0.0.0.0:${TEST_PORT + 1}` }); + return; + } res.writeHead(200, { "Content-Type": "text/plain" }); res.write("ok"); res.end(); @@ -58,25 +58,6 @@ describe("request-filtering-agent", function () { } } }); - it("apply request filtering to existing http.Agent", async () => { - const agent = new http.Agent({ - keepAlive: true - }); - const agentWithFiltering = applyRequestFilter(agent, { - allowPrivateIPAddress: true - }); - const privateIPs = [`http://127.0.0.1:${TEST_PORT}`]; - for (const ipAddress of privateIPs) { - try { - await fetch(ipAddress, { - agent: agentWithFiltering, - timeout: 2000 - }); - } catch (error) { - assert.fail(new Error("should fetch, because it is allow, error" + error)); - } - } - }); it("0.0.0.0 and :: is metaAddress, it is disabled by default", async () => { const agent = new RequestFilteringHttpAgent(); const disAllowedIPs = [`http://0.0.0.0:${TEST_PORT}`, `http://[::]:${TEST_PORT}`]; @@ -86,15 +67,11 @@ describe("request-filtering-agent", function () { agent, timeout: 2000 }); - console.log("???ss"); throw new ReferenceError("SHOULD NOT BE CALLED:" + ipAddress); } catch (error) { - console.log("??" + error); if (error instanceof ReferenceError) { assert.fail(error); } - } finally { - console.log("??"); } } }); @@ -130,9 +107,8 @@ describe("request-filtering-agent", function () { } } }); - it("IPv4: should not request because Socket is closed", async () => { + it("IPv4: should not request because it is private IP", async () => { const privateIPs = [ - `http://0.0.0.0:${TEST_PORT}`, // 0.0.0.0 is special `http://127.0.0.1:${TEST_PORT}`, // `http://A.com@127.0.0.1:${TEST_PORT}` ]; @@ -147,7 +123,28 @@ describe("request-filtering-agent", function () { if (error instanceof ReferenceError) { assert.fail(error); } - assert.strictEqual(error.type, "system", `Failed at ${ipAddress}, error: ${error}`); + // shoud be validation error + assert.match(error.message, /It is private IP address/); + } + } + }); + it("IPv4: should not request because it is meta/unspecified IP", async () => { + const privateIPs = [ + `http://0.0.0.0:${TEST_PORT}` // 0.0.0.0 is special + ]; + for (const ipAddress of privateIPs) { + try { + await fetch(ipAddress, { + agent: useAgent(ipAddress), + timeout: 2000 + }); + throw new ReferenceError("SHOULD NOT BE CALLED"); + } catch (error) { + if (error instanceof ReferenceError) { + assert.fail(error); + } + // shoud be validation error + assert.match(error.message, /It is meta IP address/); } } }); @@ -173,8 +170,8 @@ describe("request-filtering-agent", function () { if (error instanceof ReferenceError) { assert.fail(error); } - // Should be system error - assert.strictEqual(error.type, "system", `Failed at ${ipAddress}, error: ${error}`); + // should be validation error + assert.match(error.message, /It is private IP address/); } } }); @@ -250,32 +247,4 @@ describe("request-filtering-agent", function () { assert.fail(new Error("should fetch public ip, but it is failed")); } }); - it("should fail to make request when stopPortScanningByUrlRedirection option is set to true", async () => { - const closedPort = TEST_PORT + 1; - const privateIPs = [ - `http://0.0.0.0:${closedPort}`, // 0.0.0.0 is special - `http://127.0.0.1:${closedPort}`, - `http://A.com@127.0.0.1:${closedPort}` - ]; - const agent = new RequestFilteringHttpAgent({ - stopPortScanningByUrlRedirection: true - }); - for (const ipAddress of privateIPs) { - try { - await fetch(ipAddress, { - agent, - timeout: 2000 - }); - throw new ReferenceError("SHOULD NOT BE CALLED"); - } catch (error) { - if (error instanceof ReferenceError) { - assert.fail(error); - } - assert.match( - error.message, - /^DNS lookup (0\.0\.0\.0|127\.0\.0\.1|undefined)\(family:undefined, host:(0\.0\.0\.0|127\.0\.0\.1|undefined)\) is not allowed. Because, It is private IP address.$/g - ); - } - } - }); }); From 55cd37d9a8545e4dcefa13f9f018b84a755ba7bb Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 21 Oct 2023 14:36:35 +0900 Subject: [PATCH 10/14] CI: remove Node.js 16 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6e00b37..159a1d0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node_version: [ 16, 18, 20 ] + node_version: [ 18, 20 ] steps: - uses: actions/checkout@v3 From 622720f20d564e951dd842c079053c81a0187994 Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 21 Oct 2023 14:38:27 +0900 Subject: [PATCH 11/14] fix comment --- src/request-filtering-agent.ts | 7 +++++++ test/request-filtering-agent.test.ts | 7 +------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/request-filtering-agent.ts b/src/request-filtering-agent.ts index ce897c8..e813a2a 100644 --- a/src/request-filtering-agent.ts +++ b/src/request-filtering-agent.ts @@ -110,6 +110,9 @@ export class RequestFilteringHttpAgent extends http.Agent { }; } + // override http.Agent#createConnection + // https://nodejs.org/api/http.html#http_agent_createconnection_options_callback + // https://nodejs.org/api/net.html#net_net_createconnection_options_connectlistener createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { const { host } = options; if (host !== undefined) { @@ -161,6 +164,9 @@ export class RequestFilteringHttpsAgent extends https.Agent { }; } + // override http.Agent#createConnection + // https://nodejs.org/api/http.html#http_agent_createconnection_options_callback + // https://nodejs.org/api/net.html#net_net_createconnection_options_connectlistener createConnection(options: TcpNetConnectOpts, connectionListener?: (error: Error | null, socket: Socket) => void) { const { host } = options; if (host !== undefined) { @@ -200,6 +206,7 @@ export const globalHttpsAgent = new RequestFilteringHttpsAgent(); * Get an agent for the url * return http or https agent * @param url + * @param options */ export const useAgent = (url: string, options?: https.AgentOptions & RequestFilteringAgentOptions) => { if (!options) { diff --git a/test/request-filtering-agent.test.ts b/test/request-filtering-agent.test.ts index 8c6d5d0..3673b17 100644 --- a/test/request-filtering-agent.test.ts +++ b/test/request-filtering-agent.test.ts @@ -13,12 +13,7 @@ describe("request-filtering-agent", function () { return new Promise((resolve) => { // response ok const server = http.createServer(); - server.on("request", (req, res) => { - if (req.url === "/redirect") { - console.log("redirect"); - res.writeHead(301, { Location: `http://0.0.0.0:${TEST_PORT + 1}` }); - return; - } + server.on("request", (_req, res) => { res.writeHead(200, { "Content-Type": "text/plain" }); res.write("ok"); res.end(); From 1088affdee8060a6bd5f73cddacf8d32202648ae Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 21 Oct 2023 14:42:00 +0900 Subject: [PATCH 12/14] revert target --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 42dba3e..046336d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "esModuleInterop": true, "newLine": "LF", "outDir": "./lib/", - "target": "ES2020", + "target": "es5", "sourceMap": true, "declaration": true, "jsx": "preserve", From 9d6e5559ce4c1ecd7d487883946c61047ad9a2e7 Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 21 Oct 2023 14:42:44 +0900 Subject: [PATCH 13/14] Update yarn.lock --- yarn.lock | 71 +++++++++++++++---------------------------------------- 1 file changed, 19 insertions(+), 52 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2aed490..7b1622f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -51,9 +51,9 @@ "@types/node" "*" "@types/mocha@^8.2.2": - version "8.2.3" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.3.tgz#bbeb55fbc73f28ea6de601fbfa4613f58d785323" - integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" + integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== "@types/node-fetch@^2.5.10": version "2.5.10" @@ -63,16 +63,11 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*": +"@types/node@*", "@types/node@^15.12.0": version "15.12.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.12.0.tgz#6a459d261450a300e6865faeddb5af01c3389bb3" integrity sha512-+aHJvoCsVhO2ZCuT4o5JtcPrCPyDE3+1nvbDprYes+pPkEsbjH7AGUCNtjMOXS0fqH14t+B7yLzaqSz92FPWyw== -"@types/node@^15.12.0": - version "15.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa" - integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A== - "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -109,9 +104,9 @@ ansi-escapes@^4.3.0: type-fest "^0.21.3" ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^5.0.0: version "5.0.0" @@ -133,9 +128,9 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: color-convert "^2.0.1" anymatch@~3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -214,15 +209,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== @@ -468,9 +455,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@~2.3.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" @@ -618,7 +605,7 @@ is-extglob@^2.1.1: is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -844,11 +831,9 @@ nanoid@3.1.20: integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== node-fetch@^2.6.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== normalize-package-data@^2.5.0: version "2.5.0" @@ -1160,7 +1145,7 @@ stringify-object@^3.3.0: strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" @@ -1214,11 +1199,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - ts-node-test-register@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ts-node-test-register/-/ts-node-test-register-10.0.0.tgz#eb8cbe40954331f2f70c8e5fb83c677965ac14f9" @@ -1270,19 +1250,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" From 0e0e01cceb20ca9be7196ea430e69720ceb845e6 Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 21 Oct 2023 14:48:31 +0900 Subject: [PATCH 14/14] add comment --- src/request-filtering-agent.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/request-filtering-agent.ts b/src/request-filtering-agent.ts index e813a2a..a18b356 100644 --- a/src/request-filtering-agent.ts +++ b/src/request-filtering-agent.ts @@ -136,6 +136,8 @@ export class RequestFilteringHttpAgent extends http.Agent { const validationError = validateIPAddress({ address, family, host }, this.requestFilterOptions); if (validationError) { socket.removeListener("lookup", onLookup); + // When just call destroy without end, Node.js 20 throws INTERNAL error. + // https://github.com/azu/request-filtering-agent/pull/16#discussion_r1367669822 socket.end(() => { socket.destroy(validationError); }); @@ -190,6 +192,8 @@ export class RequestFilteringHttpsAgent extends https.Agent { const validationError = validateIPAddress({ address, family, host }, this.requestFilterOptions); if (validationError) { socket.removeListener("lookup", onLookup); + // When just call destroy without end, Node.js 20 throws INTERNAL error. + // https://github.com/azu/request-filtering-agent/pull/16#discussion_r1367669822 socket.end(() => { socket.destroy(validationError); });