@blamejs/core 0.17.11 → 0.17.13

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/lib/ssrf-guard.js CHANGED
@@ -820,6 +820,56 @@ function isPrivate(ip) { return classify(ip) === "private"; }
820
820
  */
821
821
  function isLoopback(ip) { return classify(ip) === "loopback"; }
822
822
 
823
+ /**
824
+ * @primitive b.ssrfGuard.isLoopbackHost
825
+ * @signature b.ssrfGuard.isLoopbackHost(host)
826
+ * @since 0.17.13
827
+ * @status stable
828
+ * @related b.ssrfGuard.isExactLoopbackName, b.ssrfGuard.isLoopback, b.ssrfGuard.canonicalizeHost
829
+ *
830
+ * Hostname-aware loopback test. Unlike `isLoopback` (IP literals only) this
831
+ * canonicalizes `host` (strips `[]` brackets + trailing dots, folds an
832
+ * IPv4-mapped IPv6, lowercases) and returns `true` for a loopback IP literal
833
+ * OR the RFC 6761 §6.3 reserved names `localhost` and any `*.localhost`. Pure
834
+ * name-shape — never resolves DNS.
835
+ *
836
+ * @example
837
+ * b.ssrfGuard.isLoopbackHost("localhost"); // → true
838
+ * b.ssrfGuard.isLoopbackHost("[::1]"); // → true
839
+ * b.ssrfGuard.isLoopbackHost("app.localhost"); // → true
840
+ * b.ssrfGuard.isLoopbackHost("example.com"); // → false
841
+ */
842
+ function isLoopbackHost(host) {
843
+ if (typeof host !== "string" || host.length === 0) return false;
844
+ var canon = canonicalizeHost(host);
845
+ if (net.isIP(canon)) return classify(canon) === "loopback";
846
+ return canon === "localhost" || /\.localhost$/.test(canon);
847
+ }
848
+
849
+ /**
850
+ * @primitive b.ssrfGuard.isExactLoopbackName
851
+ * @signature b.ssrfGuard.isExactLoopbackName(host)
852
+ * @since 0.17.13
853
+ * @status stable
854
+ * @related b.ssrfGuard.isLoopbackHost
855
+ *
856
+ * Like `isLoopbackHost` but WITHOUT the `*.localhost` subdomain reservation —
857
+ * accepts only the exact `localhost` name or a loopback IP literal. For the
858
+ * OAuth/OIDC cleartext-redirect loopback exception (RFC 9700 §4.1.1), which
859
+ * must not widen to a `*.localhost` name an attacker could register in a resolver.
860
+ *
861
+ * @example
862
+ * b.ssrfGuard.isExactLoopbackName("localhost"); // → true
863
+ * b.ssrfGuard.isExactLoopbackName("127.0.0.1"); // → true
864
+ * b.ssrfGuard.isExactLoopbackName("app.localhost"); // → false
865
+ */
866
+ function isExactLoopbackName(host) {
867
+ if (typeof host !== "string" || host.length === 0) return false;
868
+ var canon = canonicalizeHost(host);
869
+ if (net.isIP(canon)) return classify(canon) === "loopback";
870
+ return canon === "localhost";
871
+ }
872
+
823
873
  /**
824
874
  * @primitive b.ssrfGuard.isLinkLocal
825
875
  * @signature b.ssrfGuard.isLinkLocal(ip)
@@ -958,6 +1008,8 @@ module.exports = {
958
1008
  createAllowlist: createAllowlist,
959
1009
  isPrivate: isPrivate,
960
1010
  isLoopback: isLoopback,
1011
+ isLoopbackHost: isLoopbackHost,
1012
+ isExactLoopbackName: isExactLoopbackName,
961
1013
  isLinkLocal: isLinkLocal,
962
1014
  isCloudMetadata: isCloudMetadata,
963
1015
  isReserved: isReserved,
@@ -18,7 +18,7 @@
18
18
  "hashes": {
19
19
  "server": "sha256:2b30a26f728c5349f4c4b47834f862a4f77393b1224fc12b22abe3ce2cfab78f"
20
20
  },
21
- "refreshedAt": "2026-07-16T01:51:24.609Z"
21
+ "refreshedAt": "2026-07-23T17:16:44.262Z"
22
22
  },
23
23
  "@noble/curves": {
24
24
  "version": "2.2.0",
@@ -40,7 +40,7 @@
40
40
  "hashes": {
41
41
  "server": "sha256:2880c288b1285ef51d356d057bee6f0c8a00de36638cf47b47617e8c1faf10d5"
42
42
  },
43
- "refreshedAt": "2026-07-16T01:51:24.609Z"
43
+ "refreshedAt": "2026-07-23T17:16:44.262Z"
44
44
  },
45
45
  "@noble/post-quantum": {
46
46
  "version": "0.6.1",
@@ -71,7 +71,7 @@
71
71
  "hashes": {
72
72
  "server": "sha256:f9c94094b3c10fe73dac5343289da582454ea6053494fab2bf66099d9103d6c3"
73
73
  },
74
- "refreshedAt": "2026-07-16T01:51:24.609Z"
74
+ "refreshedAt": "2026-07-23T17:16:44.262Z"
75
75
  },
76
76
  "@simplewebauthn/server": {
77
77
  "version": "13.3.2",
@@ -94,7 +94,7 @@
94
94
  "hashes": {
95
95
  "server": "sha256:e83195dc9f189385da9c856ef38843f4466f93ea8f3d7fc2efcb1e1b18da6f20"
96
96
  },
97
- "refreshedAt": "2026-07-16T01:51:24.609Z"
97
+ "refreshedAt": "2026-07-23T17:16:44.262Z"
98
98
  },
99
99
  "SecLists-common-passwords-top-10000": {
100
100
  "version": "10k-most-common (master)",
@@ -114,7 +114,7 @@
114
114
  },
115
115
  "runtime_artifact": "lib/vendor/common-passwords-top-10000.data.js",
116
116
  "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
117
- "refreshedAt": "2026-07-16T01:51:24.609Z"
117
+ "refreshedAt": "2026-07-23T17:16:44.262Z"
118
118
  },
119
119
  "bimi-trust-anchors": {
120
120
  "version": "operator-managed",
@@ -139,7 +139,7 @@
139
139
  },
140
140
  "runtime_artifact": "lib/vendor/bimi-trust-anchors.data.js",
141
141
  "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
142
- "refreshedAt": "2026-07-16T01:51:24.609Z"
142
+ "refreshedAt": "2026-07-23T17:16:44.262Z"
143
143
  },
144
144
  "publicsuffix-list": {
145
145
  "version": "master",
@@ -152,14 +152,14 @@
152
152
  "data_js": "lib/vendor/public-suffix-list.data.js"
153
153
  },
154
154
  "bundler": "curl https://publicsuffix.org/list/public_suffix_list.dat",
155
- "bundledAt": "2026-07-15T00:00:00Z",
155
+ "bundledAt": "2026-07-23T00:00:00Z",
156
156
  "hashes": {
157
- "server": "sha256:57323947e6a49f93c98cf417bc8dabbc99833d548add7b4fb1528382d2469c2b",
158
- "data_js": "sha256:e3ab29993abf04b4a89c2ad55fa7057c234076fb078a32daecf05d3f8ed379eb"
157
+ "server": "sha256:da358965c19dfbc44ad7fc4ba769203a61e13be67314645e502300c2e52cac21",
158
+ "data_js": "sha256:ce0071657db1097831ccafeb5a282214d2a06dcbab3ae4f4053c60b987223d5b"
159
159
  },
160
160
  "runtime_artifact": "lib/vendor/public-suffix-list.data.js",
161
161
  "integrity_layers": "sha256 + sha3-512 + SLH-DSA-SHAKE-256f signature + in-payload canary (where applicable)",
162
- "refreshedAt": "2026-07-16T01:51:24.609Z"
162
+ "refreshedAt": "2026-07-23T17:16:44.262Z"
163
163
  },
164
164
  "peculiar-pki": {
165
165
  "version": "2.0.0+pkijs-3.4.0",
@@ -190,7 +190,7 @@
190
190
  "hashes": {
191
191
  "server": "sha256:2307ef65e070757ffb13442b377e45efb9fa1a10432d9b39618387720ab990ed"
192
192
  },
193
- "refreshedAt": "2026-07-16T01:51:24.609Z"
193
+ "refreshedAt": "2026-07-23T17:16:44.262Z"
194
194
  }
195
195
  }
196
196
  }
@@ -5,8 +5,8 @@
5
5
  // Please pull this list from, and only from https://publicsuffix.org/list/public_suffix_list.dat,
6
6
  // rather than any other VCS sites. Pulling from any other URL is not guaranteed to be supported.
7
7
 
8
- // VERSION: 2026-07-15_18-13-59_UTC
9
- // COMMIT: 9b5c814414374aa19a93dc6dd7e47c01909524cc
8
+ // VERSION: 2026-07-23_05-57-33_UTC
9
+ // COMMIT: 438c5e02a9db7870300cb3108258aeefc8467c36
10
10
 
11
11
  // Instructions on pulling and using this list can be found at https://publicsuffix.org/list/.
12
12
 
@@ -1631,7 +1631,6 @@ trentin-sudtirol.it
1631
1631
  trentin-südtirol.it
1632
1632
  trentin-sued-tirol.it
1633
1633
  trentin-suedtirol.it
1634
- trentino.it
1635
1634
  trentino-a-adige.it
1636
1635
  trentino-aadige.it
1637
1636
  trentino-alto-adige.it
@@ -1652,7 +1651,6 @@ trentinos-tirol.it
1652
1651
  trentinostirol.it
1653
1652
  trentinosud-tirol.it
1654
1653
  trentinosüd-tirol.it
1655
- trentinosudtirol.it
1656
1654
  trentinosüdtirol.it
1657
1655
  trentinosued-tirol.it
1658
1656
  trentinosuedtirol.it
@@ -1668,7 +1666,6 @@ umbria.it
1668
1666
  val-d-aosta.it
1669
1667
  val-daosta.it
1670
1668
  vald-aosta.it
1671
- valdaosta.it
1672
1669
  valle-aosta.it
1673
1670
  valle-d-aosta.it
1674
1671
  valle-daosta.it
@@ -1705,7 +1702,6 @@ aosta.it
1705
1702
  aoste.it
1706
1703
  ap.it
1707
1704
  aq.it
1708
- aquila.it
1709
1705
  ar.it
1710
1706
  arezzo.it
1711
1707
  ascoli-piceno.it
@@ -1929,6 +1925,9 @@ sondrio.it
1929
1925
  sp.it
1930
1926
  sr.it
1931
1927
  ss.it
1928
+ su.it
1929
+ sud-sardegna.it
1930
+ sudsardegna.it
1932
1931
  südtirol.it
1933
1932
  suedtirol.it
1934
1933
  sv.it
@@ -1949,6 +1948,7 @@ trani-barletta-andria.it
1949
1948
  traniandriabarletta.it
1950
1949
  tranibarlettaandria.it
1951
1950
  trapani.it
1951
+ trentino.it
1952
1952
  trento.it
1953
1953
  treviso.it
1954
1954
  trieste.it
@@ -1967,6 +1967,7 @@ ve.it
1967
1967
  venezia.it
1968
1968
  venice.it
1969
1969
  verbania.it
1970
+ verbano-cusio-ossola.it
1970
1971
  vercelli.it
1971
1972
  verona.it
1972
1973
  vi.it
@@ -12576,12 +12577,6 @@ bubbleapps.io
12576
12577
  // Submitted by Klara Mall <dns@bwcloud-os.de>
12577
12578
  *.bwcloud-os-instance.de
12578
12579
 
12579
- // Bytemark Hosting : https://www.bytemark.co.uk
12580
- // Submitted by Paul Cammish <paul.cammish@bytemark.co.uk>
12581
- uk0.bigv.io
12582
- dh.bytemark.co.uk
12583
- vm.bytemark.co.uk
12584
-
12585
12580
  // Caf.js Labs LLC : https://www.cafjs.com
12586
12581
  // Submitted by Antonio Lain <antlai@cafjs.com>
12587
12582
  cafjs.com
@@ -12841,10 +12836,6 @@ craft.me
12841
12836
  // Submitted by Ales Krajnik <ales.krajnik@craynic.com>
12842
12837
  realm.cz
12843
12838
 
12844
- // Cryptonomic : https://cryptonomic.net/
12845
- // Submitted by Andrew Cady <public-suffix-list@cryptonomic.net>
12846
- *.cryptonomic.net
12847
-
12848
12839
  // cyber_Folks S.A. : https://cyberfolks.pl
12849
12840
  // Submitted by Bartlomiej Kida <security@cyberfolks.pl>
12850
12841
  cfolks.pl
@@ -12927,11 +12918,6 @@ deployagent.space
12927
12918
  // Submitted by Peter Thomassen <peter@desec.io>
12928
12919
  dedyn.io
12929
12920
 
12930
- // Deta : https://www.deta.sh/
12931
- // Submitted by Aavash Shrestha <aavash@deta.sh>
12932
- deta.app
12933
- deta.dev
12934
-
12935
12921
  // Deuxfleurs : https://deuxfleurs.fr
12936
12922
  // Submitted by Aeddis Desauw <ca@deuxfleurs.fr>
12937
12923
  deuxfleurs.eu
@@ -13511,10 +13497,6 @@ on.expo.app
13511
13497
  staging.expo.app
13512
13498
  on.staging.expo.app
13513
13499
 
13514
- // Fabrica Technologies, Inc. : https://www.fabrica.dev/
13515
- // Submitted by Eric Jiang <eric@fabrica.dev>
13516
- onfabrica.com
13517
-
13518
13500
  // fachschaften.org: https://fachschaften.org/
13519
13501
  // Submitted by Felix Schäfer <security@fachschaften.org>
13520
13502
  fspages.org
@@ -15267,10 +15249,6 @@ vki.kr
15267
15249
  // Submitted by yumenewa <admin@project-study.com>
15268
15250
  dev.project-study.com
15269
15251
 
15270
- // Protonet GmbH : http://protonet.io
15271
- // Submitted by Martin Meier <admin@protonet.io>
15272
- protonet.io
15273
-
15274
15252
  // PSL Sandbox : https://github.com/groundcat/PSL-Sandbox
15275
15253
  // Submitted by groundcat <psl-sandbox@alumni.upenn.edu>
15276
15254
  platter-app.dev
@@ -15452,10 +15430,6 @@ repl.run
15452
15430
  resindevice.io
15453
15431
  devices.resinstaging.io
15454
15432
 
15455
- // RethinkDB : https://www.rethinkdb.com/
15456
- // Submitted by Chris Kastorff <info@rethinkdb.com>
15457
- hzc.io
15458
-
15459
15433
  // Rico Developments Limited : https://adimo.co
15460
15434
  // Submitted by Colin Brown <hello@adimo.co>
15461
15435
  adimo.co.uk
@@ -15878,10 +15852,6 @@ indevs.in
15878
15852
  musician.io
15879
15853
  novecore.site
15880
15854
 
15881
- // Standard Library : https://stdlib.com
15882
- // Submitted by Jacob Lee <jacob@stdlib.com>
15883
- api.stdlib.com
15884
-
15885
15855
  // statichost.eu : https://www.statichost.eu
15886
15856
  // Submitted by Eric Selin <admin@statichost.eu>
15887
15857
  statichost.page
@@ -15908,10 +15878,6 @@ ipfs.w3s.link
15908
15878
  // Submitted by Tony Schirmer <tony@storebase.io>
15909
15879
  storebase.store
15910
15880
 
15911
- // Storj Labs Inc. : https://storj.io/
15912
- // Submitted by Philip Hutchins <hostmaster@storj.io>
15913
- storj.farm
15914
-
15915
15881
  // Strapi : https://strapi.io/
15916
15882
  // Submitted by Florent Baldino <security@strapi.io>
15917
15883
  strapiapp.com