IP lookup: add the ProtonVPN server addresses #236

Closed
opened 2026-11-10 10:15:08 +01:00 by clawbot · 1 comment
Collaborator

Part of #203. Depends on the VPN lists issue linked from the plan on that issue.

sneak, #203 (comment): "do a better job figuring out how to fetch the proton ones, it's def possible."

The proposal found https://api.protonmail.ch/vpn/logicals answers 400 without an x-pm-appversion header, and 401 or 422 with the values tried. Those attempts were not exhaustive.

Work.

  1. Find a way to get ProtonVPN's server exit addresses with no Proton account: the other API hosts and paths its own open-source clients use (they are public on GitHub), the version strings those clients send, and any public mirror of the list. Check each by a real request.
  2. Add the list protonvpn to internal/iplist/lists.go with its parser in internal/iplist/parse.go, marked as a VPN list, downloaded once a day. It then shows in flags.is_vpn and vpn_providers with no other change.
  3. If a request needs a header, it is a constant with a comment saying where the value comes from. A value that stops working fails the download, and the previous copy stays.

If it needs a Proton account, a key or anything else only sneak can give, stop and post on this issue what you tried and what it needs. Fetching with no account is the job; do not make one.

Tests. A fixture in the real format with documentation addresses; a wrong document fails the parse.

Done when. A real download parses (one line on the PR saying how many addresses it gave and which request worked); the README lists the source.

Model: opus-5-5

Part of https://git.eeqj.de/sneak/routewatch/issues/203. Depends on the VPN lists issue linked from the plan on that issue. sneak, https://git.eeqj.de/sneak/routewatch/issues/203#issuecomment-165190: "do a better job figuring out how to fetch the proton ones, it's def possible." The proposal found https://api.protonmail.ch/vpn/logicals answers 400 without an `x-pm-appversion` header, and 401 or 422 with the values tried. Those attempts were not exhaustive. **Work.** 1. Find a way to get ProtonVPN's server exit addresses with no Proton account: the other API hosts and paths its own open-source clients use (they are public on GitHub), the version strings those clients send, and any public mirror of the list. Check each by a real request. 2. Add the list `protonvpn` to `internal/iplist/lists.go` with its parser in `internal/iplist/parse.go`, marked as a VPN list, downloaded once a day. It then shows in `flags.is_vpn` and `vpn_providers` with no other change. 3. If a request needs a header, it is a constant with a comment saying where the value comes from. A value that stops working fails the download, and the previous copy stays. **If it needs a Proton account, a key or anything else only sneak can give**, stop and post on this issue what you tried and what it needs. Fetching with no account is the job; do not make one. **Tests.** A fixture in the real format with documentation addresses; a wrong document fails the parse. **Done when.** A real download parses (one line on the PR saying how many addresses it gave and which request worked); the README lists the source. Model: opus-5-5
clawbot self-assigned this 2026-11-10 10:15:08 +01:00
Author
Collaborator

Built in #247: the list protonvpn, from the public mirror https://github.com/tn3w/ProtonVPN-IPs. No Proton account, key or request header is needed on our side.

Tried against Proton directly, each by a real request:

  • Hosts: api.protonmail.ch, api.protonvpn.ch, vpn-api.proton.me, account.protonvpn.com/api. All four give the same answers. api.proton.me did not answer, and protonvpn.com/api is a 404 page.
  • No header: 400, missing x-pm-appversion.
  • Old client versions: 422, version no longer supported.
  • Current versions from Proton's public client repositories (linux-vpn-gtk@4.19.0, android-vpn@5.20.98.0, windows-vpn@5.1.9), on api.protonvpn.ch and vpn-api.proton.me: 401 "Invalid access token".

So Proton's own list needs a logged-in session. The mirror's maintainer runs that session and publishes the result.

Model: opus-5-5

Built in https://git.eeqj.de/sneak/routewatch/pulls/247: the list `protonvpn`, from the public mirror https://github.com/tn3w/ProtonVPN-IPs. No Proton account, key or request header is needed on our side. Tried against Proton directly, each by a real request: - Hosts: `api.protonmail.ch`, `api.protonvpn.ch`, `vpn-api.proton.me`, `account.protonvpn.com/api`. All four give the same answers. `api.proton.me` did not answer, and `protonvpn.com/api` is a 404 page. - No header: 400, missing `x-pm-appversion`. - Old client versions: 422, version no longer supported. - Current versions from Proton's public client repositories (`linux-vpn-gtk@4.19.0`, `android-vpn@5.20.98.0`, `windows-vpn@5.1.9`), on `api.protonvpn.ch` and `vpn-api.proton.me`: 401 "Invalid access token". So Proton's own list needs a logged-in session. The mirror's maintainer runs that session and publishes the result. Model: opus-5-5
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sneak/routewatch#236