@uncefact/untp-utils 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -12
- package/artefacts/context/untp/0.6.0/dcc.json +1241 -0
- package/artefacts/context/untp/0.6.0/dfr.json +619 -0
- package/artefacts/context/untp/0.6.0/dia.json +162 -0
- package/artefacts/context/untp/0.6.0/dpp.json +1078 -0
- package/artefacts/context/untp/0.6.0/dte.json +1285 -0
- package/artefacts/context/untp/0.6.1/dcc.json +1388 -0
- package/artefacts/context/untp/0.6.1/dfr.json +690 -0
- package/artefacts/context/untp/0.6.1/dia.json +196 -0
- package/artefacts/context/untp/0.6.1/dpp.json +1164 -0
- package/artefacts/context/untp/0.6.1/dte.json +1340 -0
- package/artefacts/context/untp/0.7.0/untp.json +3493 -0
- package/artefacts/context/vcdm/2/credentials.json +301 -0
- package/artefacts/manifest.json +214 -0
- package/artefacts/schema/untp/0.6.0/dcc.json +1131 -0
- package/artefacts/schema/untp/0.6.0/dfr.json +1028 -0
- package/artefacts/schema/untp/0.6.0/dia.json +236 -0
- package/artefacts/schema/untp/0.6.0/dpp.json +1219 -0
- package/artefacts/schema/untp/0.6.0/dte.json +845 -0
- package/artefacts/schema/untp/0.6.1/dcc.json +1196 -0
- package/artefacts/schema/untp/0.6.1/dfr.json +1037 -0
- package/artefacts/schema/untp/0.6.1/dia.json +236 -0
- package/artefacts/schema/untp/0.6.1/dpp.json +1229 -0
- package/artefacts/schema/untp/0.6.1/dte.json +845 -0
- package/artefacts/schema/untp/0.7.0/cvc.json +701 -0
- package/artefacts/schema/untp/0.7.0/dcc.json +1133 -0
- package/artefacts/schema/untp/0.7.0/dfr.json +1245 -0
- package/artefacts/schema/untp/0.7.0/dia.json +443 -0
- package/artefacts/schema/untp/0.7.0/dpp.json +1300 -0
- package/artefacts/schema/untp/0.7.0/dte.json +1226 -0
- package/artefacts/schema/untp/0.7.0/linkset.json +119 -0
- package/artefacts/schema/vcdm/2/verifiable-credential.json +318 -0
- package/build/artefacts/urls.d.ts +6 -0
- package/build/artefacts/urls.js +8 -0
- package/build/artefacts/urls.js.map +1 -1
- package/build/artefacts/urls.test.js +9 -1
- package/build/artefacts/urls.test.js.map +1 -1
- package/build/bundle/artefacts/context/untp/0.6.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dcc.js +1244 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.js +622 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.js +165 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dia.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.js +1081 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.js +1288 -0
- package/build/bundle/artefacts/context/untp/0.6.0/dte.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.js +1391 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dcc.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.js +693 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dfr.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.js +199 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dia.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.js +1167 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dpp.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.js +1343 -0
- package/build/bundle/artefacts/context/untp/0.6.1/dte.js.map +1 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.d.ts +2 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.js +3496 -0
- package/build/bundle/artefacts/context/untp/0.7.0/untp.js.map +1 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.d.ts +2 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.js +304 -0
- package/build/bundle/artefacts/context/vcdm/2/credentials.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js +1134 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js +1031 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.js +239 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js +1222 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.js +848 -0
- package/build/bundle/artefacts/schema/untp/0.6.0/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js +1199 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js +1040 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.js +239 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js +1232 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.js +848 -0
- package/build/bundle/artefacts/schema/untp/0.6.1/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js +704 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js +1136 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js +1248 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.js +446 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dia.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js +1303 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.js +1229 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/dte.js.map +1 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.d.ts +2 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js +122 -0
- package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js.map +1 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.d.ts +2 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js +321 -0
- package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js.map +1 -0
- package/build/bundle/fallback.d.ts +41 -0
- package/build/bundle/fallback.js +62 -0
- package/build/bundle/fallback.js.map +1 -0
- package/build/bundle/fallback.test.d.ts +1 -0
- package/build/bundle/fallback.test.js +124 -0
- package/build/bundle/fallback.test.js.map +1 -0
- package/build/bundle/index.d.ts +4 -0
- package/build/bundle/index.js +77 -0
- package/build/bundle/index.js.map +1 -0
- package/build/bundle/lookup.d.ts +14 -0
- package/build/bundle/lookup.js +40 -0
- package/build/bundle/lookup.js.map +1 -0
- package/build/bundle/lookup.test.d.ts +1 -0
- package/build/bundle/lookup.test.js +70 -0
- package/build/bundle/lookup.test.js.map +1 -0
- package/build/bundle/public.d.ts +25 -0
- package/build/bundle/public.js +56 -0
- package/build/bundle/public.js.map +1 -0
- package/build/bundle/public.test.d.ts +1 -0
- package/build/bundle/public.test.js +35 -0
- package/build/bundle/public.test.js.map +1 -0
- package/build/bundle/refresh-classify.test.d.ts +1 -0
- package/build/bundle/refresh-classify.test.js +20 -0
- package/build/bundle/refresh-classify.test.js.map +1 -0
- package/build/bundle/refresh-main.test.d.ts +1 -0
- package/build/bundle/refresh-main.test.js +98 -0
- package/build/bundle/refresh-main.test.js.map +1 -0
- package/build/common/as-date-time.d.ts +13 -0
- package/build/common/as-date-time.js +44 -0
- package/build/common/as-date-time.js.map +1 -0
- package/build/common/as-date-time.test.d.ts +1 -0
- package/build/common/as-date-time.test.js +42 -0
- package/build/common/as-date-time.test.js.map +1 -0
- package/build/common/as-non-empty-string.d.ts +11 -4
- package/build/common/as-non-empty-string.js +15 -5
- package/build/common/as-non-empty-string.js.map +1 -1
- package/build/common/as-non-empty-string.test.js +7 -2
- package/build/common/as-non-empty-string.test.js.map +1 -1
- package/build/common/index.d.ts +4 -0
- package/build/common/index.js +5 -0
- package/build/common/index.js.map +1 -0
- package/build/common/validity-window.d.ts +45 -0
- package/build/common/validity-window.js +68 -0
- package/build/common/validity-window.js.map +1 -0
- package/build/common/validity-window.test.d.ts +1 -0
- package/build/common/validity-window.test.js +67 -0
- package/build/common/validity-window.test.js.map +1 -0
- package/build/loaders/index.d.ts +2 -0
- package/build/loaders/index.js +1 -0
- package/build/loaders/index.js.map +1 -1
- package/build/loaders/jsonld-document-loader.d.ts +7 -5
- package/build/loaders/jsonld-document-loader.js +11 -2
- package/build/loaders/jsonld-document-loader.js.map +1 -1
- package/build/loaders/jsonld-document-loader.test.js +41 -1
- package/build/loaders/jsonld-document-loader.test.js.map +1 -1
- package/build/loaders/schema-loader.d.ts +13 -3
- package/build/loaders/schema-loader.js +24 -8
- package/build/loaders/schema-loader.js.map +1 -1
- package/build/loaders/schema-loader.test.js +56 -1
- package/build/loaders/schema-loader.test.js.map +1 -1
- package/build/node/errors.d.ts +9 -3
- package/build/node/errors.js +9 -3
- package/build/node/errors.js.map +1 -1
- package/build/node/index.d.ts +1 -1
- package/build/node/index.js +1 -1
- package/build/node/index.js.map +1 -1
- package/build/node/is-private-ip.d.ts +8 -4
- package/build/node/is-private-ip.fail-closed.test.d.ts +1 -0
- package/build/node/is-private-ip.fail-closed.test.js +36 -0
- package/build/node/is-private-ip.fail-closed.test.js.map +1 -0
- package/build/node/is-private-ip.js +77 -12
- package/build/node/is-private-ip.js.map +1 -1
- package/build/node/is-private-ip.test.js +28 -0
- package/build/node/is-private-ip.test.js.map +1 -1
- package/build/node/validate-public-url.d.ts +43 -11
- package/build/node/validate-public-url.js +68 -34
- package/build/node/validate-public-url.js.map +1 -1
- package/build/node/validate-public-url.test.js +161 -14
- package/build/node/validate-public-url.test.js.map +1 -1
- package/build/resolvers/errors.d.ts +36 -6
- package/build/resolvers/errors.js +41 -7
- package/build/resolvers/errors.js.map +1 -1
- package/build/resolvers/resolve-document-if-changed.test.js +7 -0
- package/build/resolvers/resolve-document-if-changed.test.js.map +1 -1
- package/build/resolvers/resolve-document.d.ts +29 -9
- package/build/resolvers/resolve-document.integration.test.d.ts +1 -0
- package/build/resolvers/resolve-document.integration.test.js +108 -0
- package/build/resolvers/resolve-document.integration.test.js.map +1 -0
- package/build/resolvers/resolve-document.js +129 -49
- package/build/resolvers/resolve-document.js.map +1 -1
- package/build/resolvers/resolve-document.test.js +462 -12
- package/build/resolvers/resolve-document.test.js.map +1 -1
- package/build/resolvers/resolve-json-document.d.ts +11 -8
- package/build/resolvers/resolve-json-document.js +7 -6
- package/build/resolvers/resolve-json-document.js.map +1 -1
- package/build/resolvers/resolve-json-document.test.js +21 -4
- package/build/resolvers/resolve-json-document.test.js.map +1 -1
- package/build/validation/describe-jsonld-failure.d.ts +48 -8
- package/build/validation/describe-jsonld-failure.js +94 -27
- package/build/validation/describe-jsonld-failure.js.map +1 -1
- package/build/validation/describe-jsonld-failure.test.js +98 -13
- package/build/validation/describe-jsonld-failure.test.js.map +1 -1
- package/build/validation/index.d.ts +3 -2
- package/build/validation/index.js +2 -2
- package/build/validation/index.js.map +1 -1
- package/build/validation/validate-jsonld.d.ts +29 -3
- package/build/validation/validate-jsonld.js +49 -22
- package/build/validation/validate-jsonld.js.map +1 -1
- package/build/validation/validate-jsonld.test.js +62 -5
- package/build/validation/validate-jsonld.test.js.map +1 -1
- package/package.json +23 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is-private-ip.test.js","sourceRoot":"","sources":["../../src/node/is-private-ip.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"is-private-ip.test.js","sourceRoot":"","sources":["../../src/node/is-private-ip.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { LookupAddress, LookupAllOptions } from 'node:dns';
|
|
1
2
|
/**
|
|
2
3
|
* Options for {@link validatePublicUrl}.
|
|
3
4
|
*/
|
|
@@ -12,7 +13,18 @@ export interface ValidatePublicUrlOptions {
|
|
|
12
13
|
* family the resolver prefers, `4` forces IPv4-only, `6` forces IPv6-only.
|
|
13
14
|
*/
|
|
14
15
|
family?: 0 | 4 | 6;
|
|
16
|
+
/** Permit private, loopback and reserved hostnames and addresses. Defaults to strict rejection. */
|
|
17
|
+
allowPrivateAddresses?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Lookup implementation used for hostname resolution. This is a test and
|
|
20
|
+
* diagnostics seam, not a policy switch: every returned address still goes
|
|
21
|
+
* through the hostname and address guard below. Omitted uses Node's default
|
|
22
|
+
* `node:dns/promises` lookup.
|
|
23
|
+
*/
|
|
24
|
+
lookup?: PublicUrlLookup;
|
|
15
25
|
}
|
|
26
|
+
/** Node lookup result shape used when validating all addresses for a hostname. */
|
|
27
|
+
export type PublicUrlLookup = (hostname: string, options: LookupAllOptions) => Promise<LookupAddress[]>;
|
|
16
28
|
/**
|
|
17
29
|
* The resolved address that callers must use as the connect target so the
|
|
18
30
|
* connection lands on the IP that validation checked. Connecting via the
|
|
@@ -22,15 +34,35 @@ export interface ResolvedAddress {
|
|
|
22
34
|
address: string;
|
|
23
35
|
family: 4 | 6;
|
|
24
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* The validated address set for one hostname, in resolver order. Callers must
|
|
39
|
+
* connect only to these addresses, so the connection lands on IPs that
|
|
40
|
+
* validation checked.
|
|
41
|
+
*
|
|
42
|
+
* `address` and `family` repeat the first entry of `addresses`, so a caller
|
|
43
|
+
* that can use only one connect target keeps working unchanged. A caller that
|
|
44
|
+
* can offer several targets to its connector should hand it the whole of
|
|
45
|
+
* `addresses`: a name such as `localhost` resolves to both `::1` and
|
|
46
|
+
* `127.0.0.1`, and only one of them may have a listener, so pinning the first
|
|
47
|
+
* alone refuses a connection an unpinned request would have made.
|
|
48
|
+
*/
|
|
49
|
+
export interface ValidatedAddresses extends ResolvedAddress {
|
|
50
|
+
addresses: readonly ResolvedAddress[];
|
|
51
|
+
}
|
|
25
52
|
/**
|
|
26
53
|
* Validates that `url` is a parseable HTTP(S) URL whose hostname resolves
|
|
27
|
-
* to publicly routable IP addresses, and returns
|
|
28
|
-
* pinned for the caller to use as
|
|
54
|
+
* to publicly routable IP addresses, and returns the validated address set,
|
|
55
|
+
* pinned by the resolver, for the caller to use as its connect targets. When
|
|
56
|
+
* `allowPrivateAddresses` is exactly `true`, private and reserved destinations
|
|
57
|
+
* are permitted while the other validation and pinning rules remain active.
|
|
29
58
|
*
|
|
30
|
-
* DNS resolution is performed with `all: true`; the URL is
|
|
31
|
-
* resolved address is in a private / loopback / link-local /
|
|
32
|
-
* cloud-metadata range, so a mixed public/private DNS response cannot
|
|
33
|
-
*
|
|
59
|
+
* DNS resolution is performed with `all: true`; in strict mode the URL is
|
|
60
|
+
* rejected if any resolved address is in a private / loopback / link-local /
|
|
61
|
+
* cloud-metadata range, so a mixed public/private DNS response cannot sneak a
|
|
62
|
+
* private record through. `addresses` therefore holds every structurally valid
|
|
63
|
+
* record, in resolver order: in strict mode all of them are public, because a
|
|
64
|
+
* private one has already thrown, and in relaxed mode all of them. `address`
|
|
65
|
+
* and `family` repeat the first entry.
|
|
34
66
|
*
|
|
35
67
|
* Per ADR-035, this function throws subclasses of {@link UrlValidationError}
|
|
36
68
|
* on failure. The structured payload (`code`, `message`, `received`,
|
|
@@ -39,11 +71,11 @@ export interface ResolvedAddress {
|
|
|
39
71
|
*
|
|
40
72
|
* @see https://owasp.org/www-community/attacks/Server_Side_Request_Forgery
|
|
41
73
|
* @see ../../../docs/adrs/035-utils-throws-structured-errors.md
|
|
42
|
-
* @throws {InvalidUrlError} `url` is not a parseable URL.
|
|
74
|
+
* @throws {InvalidUrlError} `url` is not a parseable URL, or has no hostname.
|
|
43
75
|
* @throws {UnsupportedSchemeError} the URL's scheme is not allowed.
|
|
44
|
-
* @throws {PrivateHostnameError} the hostname names a private resource.
|
|
45
|
-
* @throws {ResolutionFailedError} DNS resolution rejected.
|
|
76
|
+
* @throws {PrivateHostnameError} the hostname names a private resource in strict mode.
|
|
77
|
+
* @throws {ResolutionFailedError} DNS resolution rejected, or the resolver returned an unparseable or family-contradictory record.
|
|
46
78
|
* @throws {ResolutionEmptyError} DNS resolution returned no records.
|
|
47
|
-
* @throws {PrivateAddressError} any resolved record is private.
|
|
79
|
+
* @throws {PrivateAddressError} any resolved record is private in strict mode.
|
|
48
80
|
*/
|
|
49
|
-
export declare function validatePublicUrl(url: string, options?: ValidatePublicUrlOptions): Promise<
|
|
81
|
+
export declare function validatePublicUrl(url: string, options?: ValidatePublicUrlOptions): Promise<ValidatedAddresses>;
|
|
@@ -5,13 +5,18 @@ import { InvalidUrlError, PrivateAddressError, PrivateHostnameError, ResolutionE
|
|
|
5
5
|
const DEFAULT_ALLOWED_SCHEMES = ['http', 'https'];
|
|
6
6
|
/**
|
|
7
7
|
* Validates that `url` is a parseable HTTP(S) URL whose hostname resolves
|
|
8
|
-
* to publicly routable IP addresses, and returns
|
|
9
|
-
* pinned for the caller to use as
|
|
8
|
+
* to publicly routable IP addresses, and returns the validated address set,
|
|
9
|
+
* pinned by the resolver, for the caller to use as its connect targets. When
|
|
10
|
+
* `allowPrivateAddresses` is exactly `true`, private and reserved destinations
|
|
11
|
+
* are permitted while the other validation and pinning rules remain active.
|
|
10
12
|
*
|
|
11
|
-
* DNS resolution is performed with `all: true`; the URL is
|
|
12
|
-
* resolved address is in a private / loopback / link-local /
|
|
13
|
-
* cloud-metadata range, so a mixed public/private DNS response cannot
|
|
14
|
-
*
|
|
13
|
+
* DNS resolution is performed with `all: true`; in strict mode the URL is
|
|
14
|
+
* rejected if any resolved address is in a private / loopback / link-local /
|
|
15
|
+
* cloud-metadata range, so a mixed public/private DNS response cannot sneak a
|
|
16
|
+
* private record through. `addresses` therefore holds every structurally valid
|
|
17
|
+
* record, in resolver order: in strict mode all of them are public, because a
|
|
18
|
+
* private one has already thrown, and in relaxed mode all of them. `address`
|
|
19
|
+
* and `family` repeat the first entry.
|
|
15
20
|
*
|
|
16
21
|
* Per ADR-035, this function throws subclasses of {@link UrlValidationError}
|
|
17
22
|
* on failure. The structured payload (`code`, `message`, `received`,
|
|
@@ -20,12 +25,12 @@ const DEFAULT_ALLOWED_SCHEMES = ['http', 'https'];
|
|
|
20
25
|
*
|
|
21
26
|
* @see https://owasp.org/www-community/attacks/Server_Side_Request_Forgery
|
|
22
27
|
* @see ../../../docs/adrs/035-utils-throws-structured-errors.md
|
|
23
|
-
* @throws {InvalidUrlError} `url` is not a parseable URL.
|
|
28
|
+
* @throws {InvalidUrlError} `url` is not a parseable URL, or has no hostname.
|
|
24
29
|
* @throws {UnsupportedSchemeError} the URL's scheme is not allowed.
|
|
25
|
-
* @throws {PrivateHostnameError} the hostname names a private resource.
|
|
26
|
-
* @throws {ResolutionFailedError} DNS resolution rejected.
|
|
30
|
+
* @throws {PrivateHostnameError} the hostname names a private resource in strict mode.
|
|
31
|
+
* @throws {ResolutionFailedError} DNS resolution rejected, or the resolver returned an unparseable or family-contradictory record.
|
|
27
32
|
* @throws {ResolutionEmptyError} DNS resolution returned no records.
|
|
28
|
-
* @throws {PrivateAddressError} any resolved record is private.
|
|
33
|
+
* @throws {PrivateAddressError} any resolved record is private in strict mode.
|
|
29
34
|
*/
|
|
30
35
|
export async function validatePublicUrl(url, options) {
|
|
31
36
|
let parsed;
|
|
@@ -36,29 +41,48 @@ export async function validatePublicUrl(url, options) {
|
|
|
36
41
|
throw new InvalidUrlError(url, cause);
|
|
37
42
|
}
|
|
38
43
|
const allowedSchemes = options?.allowedSchemes ?? DEFAULT_ALLOWED_SCHEMES;
|
|
44
|
+
const allowPrivateAddresses = options?.allowPrivateAddresses === true;
|
|
39
45
|
const scheme = parsed.protocol.toLowerCase().replace(/:$/, '');
|
|
40
46
|
if (!allowedSchemes.some((s) => s.toLowerCase() === scheme)) {
|
|
41
47
|
throw new UnsupportedSchemeError(scheme, allowedSchemes);
|
|
42
48
|
}
|
|
43
49
|
// URL.hostname wraps IPv6 literals in brackets (e.g. `[::1]`); strip them
|
|
44
50
|
// so the hostname can be passed to predicates and DNS resolution. Note
|
|
45
|
-
// that `URL` already discards any `userinfo@` prefix from the hostname,
|
|
46
|
-
//
|
|
47
|
-
// `127.0.0.1
|
|
51
|
+
// that `URL` already discards any `userinfo@` prefix from the hostname, so
|
|
52
|
+
// a smuggling attempt like `http://evil.com@127.0.0.1/` is checked and
|
|
53
|
+
// connected as `127.0.0.1`, never as `evil.com`. In strict mode
|
|
54
|
+
// `isPrivateHostname` below then refuses it; in relaxed mode the private
|
|
55
|
+
// test does not run, and the destination is permitted as any other private
|
|
56
|
+
// destination is. Refusing the userinfo itself is not this function's job in
|
|
57
|
+
// either mode: for user-submitted URLs the RI's request schema rejects one
|
|
58
|
+
// that carries userinfo, and undici does not send credentials it was not
|
|
59
|
+
// asked for. URLs this function is given from elsewhere (did:web resolution,
|
|
60
|
+
// for instance) pass through no such schema, so that first clause covers the
|
|
61
|
+
// caller-supplied case only.
|
|
48
62
|
const hostname = parsed.hostname.replace(/^\[|\]$/g, '');
|
|
49
|
-
|
|
63
|
+
// A URL with no authority is malformed input, not a private destination, so
|
|
64
|
+
// it is reported as an invalid URL in both modes. Refusing it here keeps the
|
|
65
|
+
// function total: with no hostname there is nothing to resolve and nothing to
|
|
66
|
+
// pin, so returning normally would hand the caller an unpinned fetch.
|
|
67
|
+
if (!hostname) {
|
|
68
|
+
throw new InvalidUrlError(url, new Error('URL has no hostname.'));
|
|
69
|
+
}
|
|
70
|
+
if (!allowPrivateAddresses && isPrivateHostname(hostname)) {
|
|
50
71
|
throw new PrivateHostnameError(hostname);
|
|
51
72
|
}
|
|
52
|
-
// If the hostname is already an IP literal, skip DNS resolution
|
|
53
|
-
// literal itself is the resolved address,
|
|
54
|
-
//
|
|
73
|
+
// If the hostname is already an IP literal, skip DNS resolution: the
|
|
74
|
+
// literal itself is the resolved address, so there is nothing to look up.
|
|
75
|
+
// In strict mode `isPrivateHostname` above has already refused a private
|
|
76
|
+
// literal. In relaxed mode that test did not run, which is the point of the
|
|
77
|
+
// mode: the literal is returned and pinned without a private-range check.
|
|
55
78
|
const literalFamily = isIP(hostname);
|
|
56
79
|
if (literalFamily === 4 || literalFamily === 6) {
|
|
57
|
-
return { address: hostname, family: literalFamily };
|
|
80
|
+
return { address: hostname, family: literalFamily, addresses: [{ address: hostname, family: literalFamily }] };
|
|
58
81
|
}
|
|
59
82
|
let records;
|
|
60
83
|
try {
|
|
61
|
-
|
|
84
|
+
const lookup = options?.lookup ?? dnsLookup;
|
|
85
|
+
records = await lookup(hostname, { family: options?.family ?? 0, all: true });
|
|
62
86
|
}
|
|
63
87
|
catch (cause) {
|
|
64
88
|
throw new ResolutionFailedError(hostname, cause);
|
|
@@ -67,28 +91,38 @@ export async function validatePublicUrl(url, options) {
|
|
|
67
91
|
throw new ResolutionEmptyError(hostname);
|
|
68
92
|
}
|
|
69
93
|
const privateRecords = [];
|
|
70
|
-
|
|
94
|
+
const validRecords = [];
|
|
71
95
|
for (const record of records) {
|
|
72
|
-
|
|
73
|
-
|
|
96
|
+
// Derive the record's family from the address string itself rather than
|
|
97
|
+
// trusting `record.family` (typed as a bare `number`, and DNS resolvers
|
|
98
|
+
// have shipped bugs that misreport it). A record whose address does not
|
|
99
|
+
// parse as an IP at all, or whose derived family disagrees with the
|
|
100
|
+
// resolver's claim, is contradictory metadata and is rejected outright
|
|
101
|
+
// rather than silently reconciled.
|
|
102
|
+
const derivedFamily = isIP(record.address);
|
|
103
|
+
if ((derivedFamily !== 4 && derivedFamily !== 6) || derivedFamily !== record.family) {
|
|
104
|
+
throw new ResolutionFailedError(hostname, new Error(`resolver returned a contradictory or unparseable record: ${record.address} (family ${record.family})`));
|
|
74
105
|
}
|
|
75
|
-
const isPrivate =
|
|
76
|
-
|
|
106
|
+
const isPrivate = derivedFamily === 4 ? isPrivateIpv4(record.address) : isPrivateIpv6(record.address);
|
|
107
|
+
validRecords.push({ address: record.address, family: derivedFamily });
|
|
108
|
+
if (isPrivate && !allowPrivateAddresses) {
|
|
77
109
|
privateRecords.push(record.address);
|
|
78
110
|
}
|
|
79
|
-
else if (!firstPublicRecord) {
|
|
80
|
-
firstPublicRecord = { address: record.address, family: record.family };
|
|
81
|
-
}
|
|
82
111
|
}
|
|
83
|
-
if (privateRecords.length > 0) {
|
|
112
|
+
if (!allowPrivateAddresses && privateRecords.length > 0) {
|
|
84
113
|
throw new PrivateAddressError(hostname, privateRecords);
|
|
85
114
|
}
|
|
86
|
-
// Defensive:
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
115
|
+
// Defensive: every record either throws above or is collected, so
|
|
116
|
+
// `records.length > 0` implies `validRecords` is non-empty. That reasoning
|
|
117
|
+
// holds in both modes; the pre-relaxation version reasoned from a public
|
|
118
|
+
// record existing, which is no longer what the loop collects. Throwing
|
|
119
|
+
// rather than `!`-asserting keeps the invariant explicit at the boundary. It
|
|
120
|
+
// throws a plain Error rather than a resolution failure so a defect in this
|
|
121
|
+
// loop can never be classified as a retryable DNS fault by a caller.
|
|
122
|
+
const [first] = validRecords;
|
|
123
|
+
if (!first) {
|
|
124
|
+
throw new Error('validatePublicUrl invariant: no record selected');
|
|
91
125
|
}
|
|
92
|
-
return
|
|
126
|
+
return { address: first.address, family: first.family, addresses: validRecords };
|
|
93
127
|
}
|
|
94
128
|
//# sourceMappingURL=validate-public-url.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-public-url.js","sourceRoot":"","sources":["../../src/node/validate-public-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate-public-url.js","sourceRoot":"","sources":["../../src/node/validate-public-url.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,13 @@ jest.unstable_mockModule('node:dns/promises', () => ({
|
|
|
6
6
|
lookup,
|
|
7
7
|
}));
|
|
8
8
|
const { validatePublicUrl } = await import('./validate-public-url.js');
|
|
9
|
+
/**
|
|
10
|
+
* The shape `validatePublicUrl` returns for a single validated address:
|
|
11
|
+
* `address` / `family` repeat the first entry of `addresses`.
|
|
12
|
+
*/
|
|
13
|
+
function validated(address, family) {
|
|
14
|
+
return { address, family, addresses: [{ address, family }] };
|
|
15
|
+
}
|
|
9
16
|
describe('validatePublicUrl', () => {
|
|
10
17
|
beforeEach(() => {
|
|
11
18
|
lookup.mockReset();
|
|
@@ -19,6 +26,10 @@ describe('validatePublicUrl', () => {
|
|
|
19
26
|
});
|
|
20
27
|
expect(lookup).not.toHaveBeenCalled();
|
|
21
28
|
});
|
|
29
|
+
it('retains parse rejection when private addresses are allowed', async () => {
|
|
30
|
+
await expect(validatePublicUrl('not a url', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(InvalidUrlError);
|
|
31
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
32
|
+
});
|
|
22
33
|
});
|
|
23
34
|
describe('scheme', () => {
|
|
24
35
|
it('throws UnsupportedSchemeError for an unallowed scheme', async () => {
|
|
@@ -31,10 +42,13 @@ describe('validatePublicUrl', () => {
|
|
|
31
42
|
});
|
|
32
43
|
it('accepts a caller-supplied allowedSchemes list', async () => {
|
|
33
44
|
lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
|
|
34
|
-
await expect(validatePublicUrl('wss://example.com/ws', { allowedSchemes: ['wss', 'ws'] })).resolves.toEqual(
|
|
35
|
-
|
|
36
|
-
|
|
45
|
+
await expect(validatePublicUrl('wss://example.com/ws', { allowedSchemes: ['wss', 'ws'] })).resolves.toEqual(validated('1.1.1.1', 4));
|
|
46
|
+
});
|
|
47
|
+
it('retains scheme rejection when private addresses are allowed', async () => {
|
|
48
|
+
await expect(validatePublicUrl('ftp://example.com/path', { allowPrivateAddresses: true })).rejects.toMatchObject({
|
|
49
|
+
name: 'UnsupportedSchemeError',
|
|
37
50
|
});
|
|
51
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
38
52
|
});
|
|
39
53
|
it('reports canonical scheme details on the error', async () => {
|
|
40
54
|
await expect(validatePublicUrl('ftp://example.com/')).rejects.toMatchObject({
|
|
@@ -45,10 +59,7 @@ describe('validatePublicUrl', () => {
|
|
|
45
59
|
});
|
|
46
60
|
it('compares schemes case-insensitively', async () => {
|
|
47
61
|
lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
|
|
48
|
-
await expect(validatePublicUrl('HTTPS://example.com/')).resolves.toEqual(
|
|
49
|
-
address: '1.1.1.1',
|
|
50
|
-
family: 4,
|
|
51
|
-
});
|
|
62
|
+
await expect(validatePublicUrl('HTTPS://example.com/')).resolves.toEqual(validated('1.1.1.1', 4));
|
|
52
63
|
});
|
|
53
64
|
});
|
|
54
65
|
describe('hostname', () => {
|
|
@@ -69,14 +80,11 @@ describe('validatePublicUrl', () => {
|
|
|
69
80
|
expect(lookup).not.toHaveBeenCalled();
|
|
70
81
|
});
|
|
71
82
|
it('returns the literal IP for a public IPv4 host without calling DNS', async () => {
|
|
72
|
-
await expect(validatePublicUrl('http://1.1.1.1/')).resolves.toEqual(
|
|
83
|
+
await expect(validatePublicUrl('http://1.1.1.1/')).resolves.toEqual(validated('1.1.1.1', 4));
|
|
73
84
|
expect(lookup).not.toHaveBeenCalled();
|
|
74
85
|
});
|
|
75
86
|
it('returns the literal IP for a public IPv6 host without calling DNS', async () => {
|
|
76
|
-
await expect(validatePublicUrl('http://[2606:4700:4700::1111]/')).resolves.toEqual(
|
|
77
|
-
address: '2606:4700:4700::1111',
|
|
78
|
-
family: 6,
|
|
79
|
-
});
|
|
87
|
+
await expect(validatePublicUrl('http://[2606:4700:4700::1111]/')).resolves.toEqual(validated('2606:4700:4700::1111', 6));
|
|
80
88
|
expect(lookup).not.toHaveBeenCalled();
|
|
81
89
|
});
|
|
82
90
|
it('rejects a literal 0.0.0.0 host without DNS lookup', async () => {
|
|
@@ -91,8 +99,39 @@ describe('validatePublicUrl', () => {
|
|
|
91
99
|
});
|
|
92
100
|
expect(lookup).not.toHaveBeenCalled();
|
|
93
101
|
});
|
|
102
|
+
it.each([undefined, false, 'true'])('keeps private literals strict when allowPrivateAddresses is %p', async (option) => {
|
|
103
|
+
await expect(validatePublicUrl('http://10.0.0.1/', { allowPrivateAddresses: option })).rejects.toBeInstanceOf(PrivateHostnameError);
|
|
104
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
105
|
+
});
|
|
106
|
+
it('rejects an empty hostname as malformed input even when private addresses are allowed', async () => {
|
|
107
|
+
await expect(validatePublicUrl('file:///', { allowedSchemes: ['file'], allowPrivateAddresses: true })).rejects.toBeInstanceOf(InvalidUrlError);
|
|
108
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
109
|
+
});
|
|
110
|
+
it.each(['localhost', 'db.internal'])('resolves local names when private addresses are allowed', async (hostname) => {
|
|
111
|
+
lookup.mockResolvedValue([{ address: '10.0.0.5', family: 4 }]);
|
|
112
|
+
await expect(validatePublicUrl(`http://${hostname}/`, { allowPrivateAddresses: true })).resolves.toEqual(validated('10.0.0.5', 4));
|
|
113
|
+
expect(lookup).toHaveBeenCalledWith(hostname, { family: 0, all: true });
|
|
114
|
+
});
|
|
115
|
+
it.each([
|
|
116
|
+
['127.0.0.1', 'http://127.0.0.1/'],
|
|
117
|
+
['169.254.169.254', 'http://169.254.169.254/'],
|
|
118
|
+
['224.0.0.1', 'http://224.0.0.1/'],
|
|
119
|
+
['0.0.0.0', 'http://0.0.0.0/'],
|
|
120
|
+
['::1', 'http://[::1]/'],
|
|
121
|
+
['fc00::1', 'http://[fc00::1]/'],
|
|
122
|
+
['::ffff:10.0.0.1', 'http://[::ffff:10.0.0.1]/'],
|
|
123
|
+
])('allows the non-public literal %s without DNS when opted in', async (_address, url) => {
|
|
124
|
+
const hostname = new URL(url).hostname.replace(/^\[|\]$/g, '');
|
|
125
|
+
await expect(validatePublicUrl(url, { allowPrivateAddresses: true })).resolves.toEqual(validated(hostname, url.includes('[') ? 6 : 4));
|
|
126
|
+
expect(lookup).not.toHaveBeenCalled();
|
|
127
|
+
});
|
|
94
128
|
});
|
|
95
129
|
describe('DNS resolution', () => {
|
|
130
|
+
it('uses a supplied lookup callback while still validating its addresses', async () => {
|
|
131
|
+
const suppliedLookup = jest.fn().mockResolvedValue([{ address: '10.0.0.5', family: 4 }]);
|
|
132
|
+
await expect(validatePublicUrl('https://example.com/', { lookup: suppliedLookup })).rejects.toBeInstanceOf(PrivateAddressError);
|
|
133
|
+
expect(suppliedLookup).toHaveBeenCalledWith('example.com', { family: 0, all: true });
|
|
134
|
+
});
|
|
96
135
|
it('throws ResolutionFailedError when dns.lookup rejects', async () => {
|
|
97
136
|
lookup.mockRejectedValue(new Error('ENOTFOUND example.com'));
|
|
98
137
|
await expect(validatePublicUrl('https://example.com/')).rejects.toMatchObject({
|
|
@@ -105,6 +144,18 @@ describe('validatePublicUrl', () => {
|
|
|
105
144
|
lookup.mockResolvedValue([]);
|
|
106
145
|
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(ResolutionEmptyError);
|
|
107
146
|
});
|
|
147
|
+
it('rejects a record whose address does not parse as an IP', async () => {
|
|
148
|
+
lookup.mockResolvedValue([{ address: 'not-an-ip-address', family: 4 }]);
|
|
149
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
|
|
150
|
+
});
|
|
151
|
+
it('rejects a record whose claimed family contradicts its address', async () => {
|
|
152
|
+
lookup.mockResolvedValue([{ address: '10.0.0.1', family: 6 }]);
|
|
153
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
|
|
154
|
+
});
|
|
155
|
+
it('requires family agreement even when the address itself is public', async () => {
|
|
156
|
+
lookup.mockResolvedValue([{ address: '93.184.216.34', family: 0 }]);
|
|
157
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
|
|
158
|
+
});
|
|
108
159
|
it('passes the family option through to dns.lookup with all: true', async () => {
|
|
109
160
|
lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
|
|
110
161
|
await validatePublicUrl('https://example.com/', { family: 4 });
|
|
@@ -119,6 +170,18 @@ describe('validatePublicUrl', () => {
|
|
|
119
170
|
lookup.mockResolvedValue([{ address: 'whatever', family: 7 }]);
|
|
120
171
|
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(ResolutionFailedError);
|
|
121
172
|
});
|
|
173
|
+
it('retains DNS rejection when private addresses are allowed', async () => {
|
|
174
|
+
const dnsError = new Error('EAI_AGAIN');
|
|
175
|
+
lookup.mockRejectedValue(dnsError);
|
|
176
|
+
await expect(validatePublicUrl('https://example.com/', { allowPrivateAddresses: true })).rejects.toMatchObject({
|
|
177
|
+
name: 'ResolutionFailedError',
|
|
178
|
+
cause: dnsError,
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
it('retains empty resolution when private addresses are allowed', async () => {
|
|
182
|
+
lookup.mockResolvedValue([]);
|
|
183
|
+
await expect(validatePublicUrl('https://example.com/', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(ResolutionEmptyError);
|
|
184
|
+
});
|
|
122
185
|
});
|
|
123
186
|
describe('rebind defence', () => {
|
|
124
187
|
it('rejects a hostname that resolves to AWS metadata', async () => {
|
|
@@ -158,12 +221,96 @@ describe('validatePublicUrl', () => {
|
|
|
158
221
|
resolvedAddresses: ['169.254.169.254'],
|
|
159
222
|
});
|
|
160
223
|
});
|
|
161
|
-
it('returns
|
|
224
|
+
it('returns every validated public record so callers can use them all as connect targets', async () => {
|
|
162
225
|
lookup.mockResolvedValue([
|
|
163
226
|
{ address: '1.1.1.1', family: 4 },
|
|
164
227
|
{ address: '8.8.8.8', family: 4 },
|
|
165
228
|
]);
|
|
166
|
-
await expect(validatePublicUrl('https://example.com/')).resolves.toEqual({
|
|
229
|
+
await expect(validatePublicUrl('https://example.com/')).resolves.toEqual({
|
|
230
|
+
address: '1.1.1.1',
|
|
231
|
+
family: 4,
|
|
232
|
+
addresses: [
|
|
233
|
+
{ address: '1.1.1.1', family: 4 },
|
|
234
|
+
{ address: '8.8.8.8', family: 4 },
|
|
235
|
+
],
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
it('allows private and public records and returns them all when opted in', async () => {
|
|
239
|
+
lookup.mockResolvedValue([
|
|
240
|
+
{ address: '10.0.0.1', family: 4 },
|
|
241
|
+
{ address: '1.1.1.1', family: 4 },
|
|
242
|
+
]);
|
|
243
|
+
await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).resolves.toEqual({
|
|
244
|
+
address: '10.0.0.1',
|
|
245
|
+
family: 4,
|
|
246
|
+
addresses: [
|
|
247
|
+
{ address: '10.0.0.1', family: 4 },
|
|
248
|
+
{ address: '1.1.1.1', family: 4 },
|
|
249
|
+
],
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
// The dual-stack `localhost` case that CI hit: only one of the two
|
|
253
|
+
// addresses has a listener, so the caller needs both to reach it.
|
|
254
|
+
it('returns both records for a dual-stack loopback name when opted in', async () => {
|
|
255
|
+
lookup.mockResolvedValue([
|
|
256
|
+
{ address: '::1', family: 6 },
|
|
257
|
+
{ address: '127.0.0.1', family: 4 },
|
|
258
|
+
]);
|
|
259
|
+
await expect(validatePublicUrl('http://localhost/', { allowPrivateAddresses: true })).resolves.toEqual({
|
|
260
|
+
address: '::1',
|
|
261
|
+
family: 6,
|
|
262
|
+
addresses: [
|
|
263
|
+
{ address: '::1', family: 6 },
|
|
264
|
+
{ address: '127.0.0.1', family: 4 },
|
|
265
|
+
],
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
it('returns every public record in strict mode', async () => {
|
|
269
|
+
lookup.mockResolvedValue([
|
|
270
|
+
{ address: '1.1.1.1', family: 4 },
|
|
271
|
+
{ address: '2606:4700:4700::1111', family: 6 },
|
|
272
|
+
]);
|
|
273
|
+
await expect(validatePublicUrl('https://example.com/')).resolves.toEqual({
|
|
274
|
+
address: '1.1.1.1',
|
|
275
|
+
family: 4,
|
|
276
|
+
addresses: [
|
|
277
|
+
{ address: '1.1.1.1', family: 4 },
|
|
278
|
+
{ address: '2606:4700:4700::1111', family: 6 },
|
|
279
|
+
],
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
it('still throws when a later record is private in strict mode', async () => {
|
|
283
|
+
lookup.mockResolvedValue([
|
|
284
|
+
{ address: '1.1.1.1', family: 4 },
|
|
285
|
+
{ address: '10.0.0.1', family: 4 },
|
|
286
|
+
]);
|
|
287
|
+
await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(PrivateAddressError);
|
|
288
|
+
});
|
|
289
|
+
it('leads with a public first record rather than preferring a later private record when opted in', async () => {
|
|
290
|
+
lookup.mockResolvedValue([
|
|
291
|
+
{ address: '1.1.1.1', family: 4 },
|
|
292
|
+
{ address: '10.0.0.1', family: 4 },
|
|
293
|
+
]);
|
|
294
|
+
await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).resolves.toEqual({
|
|
295
|
+
address: '1.1.1.1',
|
|
296
|
+
family: 4,
|
|
297
|
+
addresses: [
|
|
298
|
+
{ address: '1.1.1.1', family: 4 },
|
|
299
|
+
{ address: '10.0.0.1', family: 4 },
|
|
300
|
+
],
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
it('checks every record for contradictory metadata in relaxed mode', async () => {
|
|
304
|
+
lookup.mockResolvedValue([
|
|
305
|
+
{ address: '10.0.0.1', family: 4 },
|
|
306
|
+
{ address: 'not-an-ip', family: 4 },
|
|
307
|
+
]);
|
|
308
|
+
await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(ResolutionFailedError);
|
|
309
|
+
});
|
|
310
|
+
it('retains family validation and lookup hints in relaxed mode', async () => {
|
|
311
|
+
lookup.mockResolvedValue([{ address: '10.0.0.1', family: 6 }]);
|
|
312
|
+
await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true, family: 6 })).rejects.toBeInstanceOf(ResolutionFailedError);
|
|
313
|
+
expect(lookup).toHaveBeenCalledWith('mixed.example', { family: 6, all: true });
|
|
167
314
|
});
|
|
168
315
|
});
|
|
169
316
|
describe('hierarchy', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-public-url.test.js","sourceRoot":"","sources":["../../src/node/validate-public-url.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validate-public-url.test.js","sourceRoot":"","sources":["../../src/node/validate-public-url.test.ts"],"names":[],"mappings":"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"}
|