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.
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.
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.
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
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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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-appversionheader, and 401 or 422 with the values tried. Those attempts were not exhaustive.Work.
protonvpntointernal/iplist/lists.gowith its parser ininternal/iplist/parse.go, marked as a VPN list, downloaded once a day. It then shows inflags.is_vpnandvpn_providerswith no other change.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
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:
api.protonmail.ch,api.protonvpn.ch,vpn-api.proton.me,account.protonvpn.com/api. All four give the same answers.api.proton.medid not answer, andprotonvpn.com/apiis a 404 page.x-pm-appversion.linux-vpn-gtk@4.19.0,android-vpn@5.20.98.0,windows-vpn@5.1.9), onapi.protonvpn.chandvpn-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
clawbot referenced this issue2026-11-10 14:14:10 +01:00