From 6633fccc096b970ed2f9c48f44e09c9ae2b2f8ef Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Thu, 16 Jul 2026 22:35:43 +0000 Subject: [PATCH 1/3] Require geoip2 5.2.0 for residential data geoip2 5.2.0 has been released on Maven Central with the AnonymizerFeed residential proxy data support. Bump the dependency from 5.1.0 to 5.2.0 so the Anonymizer.residential field added in the previous commit is actually populated. Co-Authored-By: Claude Opus 4.8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 21f83b00..819f9a54 100644 --- a/pom.xml +++ b/pom.xml @@ -73,7 +73,7 @@ com.maxmind.geoip2 geoip2 - 5.1.0 + 5.2.0 org.junit.jupiter From 1f7eb7a448494d306f5d317b491dd3b13c4bf84b Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Fri, 10 Jul 2026 21:12:26 +0000 Subject: [PATCH 2/3] Add residential field to Anonymizer response The minFraud Insights and Factors responses now include a residential object inside the ip_address anonymizer object. This is surfaced via the AnonymizerFeed record on the geoip2 Anonymizer record, which IpAddress reuses, so no model changes are needed here. Update the test fixtures and assertions to cover the new field and document the required geoip2 dependency bump in the changelog. Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 9 +++++++ .../response/InsightsResponseTest.java | 25 +++++++++++++++++++ .../resources/test-data/factors-response.json | 7 +++++- .../test-data/insights-response.json | 7 +++++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82e7dcad..9a6b96e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ CHANGELOG ========= +4.4.0 (unreleased) +------------------ + +* Added `residential` field to the `Anonymizer` response record. This is + an `AnonymizerFeed` record containing `confidence`, `networkLastSeen`, + and `providerName` fields with residential proxy data for the network. + `residential` may be populated even when none of the other fields on + `Anonymizer` are set. + 4.3.0 (2026-05-12) ------------------ diff --git a/src/test/java/com/maxmind/minfraud/response/InsightsResponseTest.java b/src/test/java/com/maxmind/minfraud/response/InsightsResponseTest.java index fd4f71e5..af3f8b98 100644 --- a/src/test/java/com/maxmind/minfraud/response/InsightsResponseTest.java +++ b/src/test/java/com/maxmind/minfraud/response/InsightsResponseTest.java @@ -6,6 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.fasterxml.jackson.jr.ob.JSON; +import com.maxmind.geoip2.record.AnonymizerFeed; import java.time.LocalDate; import java.util.UUID; import org.junit.jupiter.api.Test; @@ -39,6 +40,11 @@ public void testInsights() throws Exception { .put("is_tor_exit_node", true) .put("network_last_seen", "2025-01-15") .put("provider_name", "TestVPN") + .startObjectField("residential") + .put("confidence", 82) + .put("network_last_seen", "2026-05-11") + .put("provider_name", "quickshift") + .end() .end() .startObjectField("country") .put("iso_code", "US") @@ -152,5 +158,24 @@ public void testInsights() throws Exception { "correct networkLastSeen" ); assertEquals("TestVPN", insights.ipAddress().anonymizer().providerName(), "correct providerName"); + + AnonymizerFeed residential = insights.ipAddress().anonymizer().residential(); + + assertNotNull(residential, "anonymizer.residential() returns null"); + assertEquals( + Integer.valueOf(82), + residential.confidence(), + "correct anonymizer.residential().confidence()" + ); + assertEquals( + LocalDate.parse("2026-05-11"), + residential.networkLastSeen(), + "correct anonymizer.residential().networkLastSeen()" + ); + assertEquals( + "quickshift", + residential.providerName(), + "correct anonymizer.residential().providerName()" + ); } } diff --git a/src/test/resources/test-data/factors-response.json b/src/test/resources/test-data/factors-response.json index 1e8b789b..75a64e82 100644 --- a/src/test/resources/test-data/factors-response.json +++ b/src/test/resources/test-data/factors-response.json @@ -24,7 +24,12 @@ "is_residential_proxy": true, "is_tor_exit_node": true, "network_last_seen": "2025-01-15", - "provider_name": "TestVPN" + "provider_name": "TestVPN", + "residential": { + "confidence": 82, + "network_last_seen": "2026-05-11", + "provider_name": "quickshift" + } }, "city": { "confidence": 42, diff --git a/src/test/resources/test-data/insights-response.json b/src/test/resources/test-data/insights-response.json index 643f09ab..a052cf20 100644 --- a/src/test/resources/test-data/insights-response.json +++ b/src/test/resources/test-data/insights-response.json @@ -24,7 +24,12 @@ "is_residential_proxy": true, "is_tor_exit_node": true, "network_last_seen": "2025-01-15", - "provider_name": "TestVPN" + "provider_name": "TestVPN", + "residential": { + "confidence": 82, + "network_last_seen": "2026-05-11", + "provider_name": "quickshift" + } }, "city": { "confidence": 42, From 55d70818de378ad1ed8332eef2dfb4bd353a441c Mon Sep 17 00:00:00 2001 From: Gregory Oschwald Date: Thu, 16 Jul 2026 22:38:25 +0000 Subject: [PATCH 3/3] Update mise tools Run `mise up` to refresh mise.lock, which bumps hugo, lychee, and maven to their latest pinned versions. lychee 0.24.0 replaced the boolean `include_fragments` config key with an enum (`none`, `anchor-only`, `text-only`, `full`) that also supports checking text fragments. Migrate lychee.toml to `include_fragments = "full"` so both anchor fragments (`#section`) and text fragments (`#:~:text=`) are checked. Co-Authored-By: Claude Opus 4.8 --- lychee.toml | 6 ++-- mise.lock | 100 +++++++++++++++++++++++++++++++++------------------- 2 files changed, 68 insertions(+), 38 deletions(-) diff --git a/lychee.toml b/lychee.toml index f51c4df8..93e066a0 100644 --- a/lychee.toml +++ b/lychee.toml @@ -4,8 +4,10 @@ # Run locally with: # lychee './**/*.md' './src/**/*.java' './pom.xml' -# Include URL fragments in checks -include_fragments = true +# Include URL fragments in checks. lychee 0.24 replaced the boolean flag with +# an enum; "full" checks both anchor fragments (`#section`) and text fragments +# (`#:~:text=`). +include_fragments = "full" # Don't allow any redirects, so links that have moved are surfaced and updated # to their canonical destination. diff --git a/mise.lock b/mise.lock index 3f5ac0ff..67873b7a 100644 --- a/mise.lock +++ b/mise.lock @@ -1,41 +1,51 @@ # @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html [[tools.hugo]] -version = "0.161.1" +version = "0.164.0" backend = "aqua:gohugoio/hugo" [tools.hugo."platforms.linux-arm64"] -checksum = "sha256:382371ec3208236fb854ced51781f859b6c27a7d066b8fe90594eba14ba76d00" -url = "https://github.com/gohugoio/hugo/releases/download/v0.161.1/hugo_0.161.1_linux-arm64.tar.gz" +checksum = "sha256:948ee5f0ed30175f31937d592d63a2712f0761a69f1cbe812f780eb918a08b8e" +url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_linux-arm64.tar.gz" +url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320173" [tools.hugo."platforms.linux-arm64-musl"] -checksum = "sha256:382371ec3208236fb854ced51781f859b6c27a7d066b8fe90594eba14ba76d00" -url = "https://github.com/gohugoio/hugo/releases/download/v0.161.1/hugo_0.161.1_linux-arm64.tar.gz" +checksum = "sha256:948ee5f0ed30175f31937d592d63a2712f0761a69f1cbe812f780eb918a08b8e" +url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_linux-arm64.tar.gz" +url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320173" [tools.hugo."platforms.linux-x64"] -checksum = "sha256:fae28bf7909c1a42d1365b89d2e9e3d4194fbe5968ae0dd5504f562381018a1d" -url = "https://github.com/gohugoio/hugo/releases/download/v0.161.1/hugo_0.161.1_linux-amd64.tar.gz" +checksum = "sha256:d9c8b17285ea4ec004d9f814273ea910f2051ce02c284993fd1f91ba455ae50d" +url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_linux-amd64.tar.gz" +url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320170" [tools.hugo."platforms.linux-x64-musl"] -checksum = "sha256:fae28bf7909c1a42d1365b89d2e9e3d4194fbe5968ae0dd5504f562381018a1d" -url = "https://github.com/gohugoio/hugo/releases/download/v0.161.1/hugo_0.161.1_linux-amd64.tar.gz" +checksum = "sha256:d9c8b17285ea4ec004d9f814273ea910f2051ce02c284993fd1f91ba455ae50d" +url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_linux-amd64.tar.gz" +url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320170" [tools.hugo."platforms.macos-arm64"] -checksum = "sha256:b12e1cbebacf61f9cf67e0046c835142e70c829da7c16b05c1ec64a68885ee80" -url = "https://github.com/gohugoio/hugo/releases/download/v0.161.1/hugo_0.161.1_darwin-universal.pkg" +checksum = "sha256:c994e2cc6946838bb76521039509a7ce71282827e7035e344b6c225a83a5d0d3" +url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_darwin-universal.pkg" +url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320272" [tools.hugo."platforms.macos-x64"] -checksum = "sha256:b12e1cbebacf61f9cf67e0046c835142e70c829da7c16b05c1ec64a68885ee80" -url = "https://github.com/gohugoio/hugo/releases/download/v0.161.1/hugo_0.161.1_darwin-universal.pkg" +checksum = "sha256:c994e2cc6946838bb76521039509a7ce71282827e7035e344b6c225a83a5d0d3" +url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_darwin-universal.pkg" +url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320272" [tools.hugo."platforms.windows-x64"] -checksum = "sha256:7f8d030b37600c60bf2a782611257e6a768934fbe7724c1f3a1a501e6724cf0d" -url = "https://github.com/gohugoio/hugo/releases/download/v0.161.1/hugo_0.161.1_windows-amd64.zip" +checksum = "sha256:dadf3499d4c6a27f6bc9d56d5a992ba62d82a74a3771fcc165c364ec1eeaac1c" +url = "https://github.com/gohugoio/hugo/releases/download/v0.164.0/hugo_0.164.0_windows-amd64.zip" +url_api = "https://api.github.com/repos/gohugoio/hugo/releases/assets/468320283" [[tools.java]] version = "26.0.1" backend = "core:java" +[tools.java.options] +shorthand_vendor = "openjdk" + [tools.java."platforms.linux-arm64"] checksum = "sha256:12a3649b2f4a0c9f6491d220bdd04b4fff07cae502b435aaff46eac0e36f4df1" url = "https://download.java.net/java/GA/jdk26.0.1/458fda22e4c54d5ba572ab8d2b22eb83/8/GPL/openjdk-26.0.1_linux-aarch64_bin.tar.gz" @@ -57,54 +67,72 @@ checksum = "sha256:b381d30647aed9ff440abed5ab61af01d8578c290cd407c57e064ebc4b015 url = "https://download.java.net/java/GA/jdk26.0.1/458fda22e4c54d5ba572ab8d2b22eb83/8/GPL/openjdk-26.0.1_windows-x64_bin.zip" [[tools.lychee]] -version = "0.23.0" +version = "0.24.2" backend = "aqua:lycheeverse/lychee" [tools.lychee."platforms.linux-arm64"] -checksum = "sha256:97eb93b02a7d78a752fc33e5b0983439ccaadbf3db952b68a0a4401acd92e6e0" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-aarch64-unknown-linux-gnu.tar.gz" +checksum = "sha256:5d0b0e3aeab240f41920c633a6eaf97599be6eedda034b36e858ede7dba5e535" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409958602" [tools.lychee."platforms.linux-arm64-musl"] -checksum = "sha256:4eb6ff3ccd40dbb71843c41429683d3c60fe3b33b2042ffbbff9bb21cedacb39" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-aarch64-unknown-linux-musl.tar.gz" +checksum = "sha256:5d0b0e3aeab240f41920c633a6eaf97599be6eedda034b36e858ede7dba5e535" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409958602" [tools.lychee."platforms.linux-x64"] -checksum = "sha256:5538440d2c69a45a0a09983271e5dee0c2fe7137d8035d25b2632e10a66a090a" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-unknown-linux-musl.tar.gz" +checksum = "sha256:73657a111819a30c47c08352896796f23d64e4eb2b3ed39b6d32149241566fc5" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959271" [tools.lychee."platforms.linux-x64-musl"] -checksum = "sha256:5538440d2c69a45a0a09983271e5dee0c2fe7137d8035d25b2632e10a66a090a" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-unknown-linux-musl.tar.gz" +checksum = "sha256:73657a111819a30c47c08352896796f23d64e4eb2b3ed39b6d32149241566fc5" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959271" [tools.lychee."platforms.macos-arm64"] -checksum = "sha256:1953bb425486e1b887757201e54e8fdf866c9cada6c270d8f6ed21ffbed4145a" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-arm64-macos.tar.gz" +checksum = "sha256:c9d3740ea2d891854d37116c9fba840f37b6e7c89d330e7db84ac333631c4977" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409957951" + +[tools.lychee."platforms.macos-x64"] +checksum = "sha256:887503a9cff667d322b8d0892b40bf49976eb9507af8483220a3706cdad55978" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409957687" [tools.lychee."platforms.windows-x64"] -checksum = "sha256:0fda7ff0a60c0250939fc25361c2d4e6e7853c31c996733fdd5a1dd760bcb824" -url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.23.0/lychee-x86_64-windows.exe" +checksum = "sha256:32975d1493ee1a975d6bb41e4fb56fe419cb442ded628bb772ba2e614acfacad" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959491" [[tools.maven]] -version = "3.9.15" +version = "3.9.16" backend = "aqua:apache/maven" [tools.maven."platforms.linux-arm64"] -url = "https://archive.apache.org/dist/maven/maven-3/3.9.15/binaries/apache-maven-3.9.15-bin.tar.gz" +checksum = "sha512:831a8591fe20c8243b1dbe7d71e3244f31d1665b0804b2e825e38cbbe5ce0cafb8338851f90780735568773e0a6cd07bbec107cda0b896b008b861075358b6f6" +url = "https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz" [tools.maven."platforms.linux-arm64-musl"] -url = "https://archive.apache.org/dist/maven/maven-3/3.9.15/binaries/apache-maven-3.9.15-bin.tar.gz" +checksum = "sha512:831a8591fe20c8243b1dbe7d71e3244f31d1665b0804b2e825e38cbbe5ce0cafb8338851f90780735568773e0a6cd07bbec107cda0b896b008b861075358b6f6" +url = "https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz" [tools.maven."platforms.linux-x64"] -url = "https://archive.apache.org/dist/maven/maven-3/3.9.15/binaries/apache-maven-3.9.15-bin.tar.gz" +checksum = "sha512:831a8591fe20c8243b1dbe7d71e3244f31d1665b0804b2e825e38cbbe5ce0cafb8338851f90780735568773e0a6cd07bbec107cda0b896b008b861075358b6f6" +url = "https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz" [tools.maven."platforms.linux-x64-musl"] -url = "https://archive.apache.org/dist/maven/maven-3/3.9.15/binaries/apache-maven-3.9.15-bin.tar.gz" +checksum = "sha512:831a8591fe20c8243b1dbe7d71e3244f31d1665b0804b2e825e38cbbe5ce0cafb8338851f90780735568773e0a6cd07bbec107cda0b896b008b861075358b6f6" +url = "https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz" [tools.maven."platforms.macos-arm64"] -url = "https://archive.apache.org/dist/maven/maven-3/3.9.15/binaries/apache-maven-3.9.15-bin.tar.gz" +checksum = "sha512:831a8591fe20c8243b1dbe7d71e3244f31d1665b0804b2e825e38cbbe5ce0cafb8338851f90780735568773e0a6cd07bbec107cda0b896b008b861075358b6f6" +url = "https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz" [tools.maven."platforms.macos-x64"] -url = "https://archive.apache.org/dist/maven/maven-3/3.9.15/binaries/apache-maven-3.9.15-bin.tar.gz" +checksum = "sha512:831a8591fe20c8243b1dbe7d71e3244f31d1665b0804b2e825e38cbbe5ce0cafb8338851f90780735568773e0a6cd07bbec107cda0b896b008b861075358b6f6" +url = "https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz" [tools.maven."platforms.windows-x64"] -url = "https://archive.apache.org/dist/maven/maven-3/3.9.15/binaries/apache-maven-3.9.15-bin.tar.gz" +checksum = "sha512:831a8591fe20c8243b1dbe7d71e3244f31d1665b0804b2e825e38cbbe5ce0cafb8338851f90780735568773e0a6cd07bbec107cda0b896b008b861075358b6f6" +url = "https://archive.apache.org/dist/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz"