vpndetection-fastapi 2.0.6__tar.gz → 2.0.7__tar.gz

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.
@@ -2,6 +2,12 @@
2
2
 
3
3
  What each release changed for you, newest first. Each line is a commit's summary, linked to its full description and diff. Releases before 2.0.5 are described by their release commits.
4
4
 
5
+ ## 2.0.7 - 2026-09-28
6
+
7
+ ### Fixes
8
+
9
+ - Require vpndetection 5.5.1: IPv4-mapped visitors are looked up, not waved through ([`976dc44`](https://github.com/vpndetection-io/sdk-python-fastapi/commit/976dc44ca5a65d2a13d6ce1d366a4582de24db89))
10
+
5
11
  ## 2.0.6 - 2026-09-27
6
12
 
7
13
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: vpndetection-fastapi
3
- Version: 2.0.6
3
+ Version: 2.0.7
4
4
  Summary: Official FastAPI and Starlette middleware for the VPNDetection API. Detect VPNs, proxies, Tor, hosting and CDN visitors on every request.
5
5
  Project-URL: Homepage, https://vpndetection.io
6
6
  Project-URL: Source, https://github.com/vpndetection-io/sdk-python-fastapi
@@ -20,7 +20,7 @@ Classifier: Topic :: Security
20
20
  Classifier: Typing :: Typed
21
21
  Requires-Python: >=3.11
22
22
  Requires-Dist: starlette>=0.37
23
- Requires-Dist: vpndetection<6,>=5.5.0
23
+ Requires-Dist: vpndetection<6,>=5.5.1
24
24
  Provides-Extra: dev
25
25
  Requires-Dist: mypy>=1.11; extra == 'dev'
26
26
  Requires-Dist: pytest>=8; extra == 'dev'
@@ -24,7 +24,7 @@ classifiers = [
24
24
  "Topic :: Security",
25
25
  "Typing :: Typed",
26
26
  ]
27
- dependencies = ["vpndetection>=5.5.0,<6", "starlette>=0.37"]
27
+ dependencies = ["vpndetection>=5.5.1,<6", "starlette>=0.37"]
28
28
 
29
29
  [project.urls]
30
30
  Homepage = "https://vpndetection.io"
@@ -39,7 +39,7 @@ __all__ = [
39
39
  "xff_ip_selector",
40
40
  ]
41
41
 
42
- __version__ = "2.0.6"
42
+ __version__ = "2.0.7"
43
43
 
44
44
  _SELECTORS: Selectors[Request] = bind_selectors(
45
45
  lambda request: RequestView(
@@ -231,6 +231,50 @@
231
231
  "why": "first address past 192.0.2.0/24; a mask one bit too wide claims it"
232
232
  }
233
233
  ],
234
+ "ipv4Mapped": [
235
+ {
236
+ "ip": "::ffff:8.8.8.8",
237
+ "carries": "8.8.8.8",
238
+ "expect": false,
239
+ "why": "a public IPv4 visitor, as a server listening on :: sees every one: judged, sent and cached as 8.8.8.8, never as a bogon in ::ffff:0:0/96"
240
+ },
241
+ {
242
+ "ip": "::ffff:10.0.0.1",
243
+ "carries": "10.0.0.1",
244
+ "expect": true,
245
+ "why": "RFC 1918, mapped: a bogon for the same reason 10.0.0.1 is"
246
+ },
247
+ {
248
+ "ip": "::ffff:127.0.0.1",
249
+ "carries": "127.0.0.1",
250
+ "expect": true,
251
+ "why": "loopback, mapped: a local client of a server listening on ::"
252
+ },
253
+ {
254
+ "ip": "::ffff:808:808",
255
+ "carries": "8.8.8.8",
256
+ "expect": false,
257
+ "why": "the same address with its IPv4 half in hex"
258
+ },
259
+ {
260
+ "ip": "0:0:0:0:0:ffff:808:808",
261
+ "carries": "8.8.8.8",
262
+ "expect": false,
263
+ "why": "the same address written in full"
264
+ },
265
+ {
266
+ "ip": "::FFFF:8.8.8.8",
267
+ "carries": "8.8.8.8",
268
+ "expect": false,
269
+ "why": "upper-case hex digits"
270
+ },
271
+ {
272
+ "ip": "::8.8.8.8",
273
+ "carries": "::8.8.8.8",
274
+ "expect": true,
275
+ "why": "IPv4-compatible, not mapped: stays IPv6 and inside ::/96"
276
+ }
277
+ ],
234
278
  "bogonResponse": {
235
279
  "why": "A bogon is answered locally in the full max shape. Every flag is present and false, every detail object is present and empty, and is_bogon marks it as computed rather than served.",
236
280
  "flagsFalse": [