From db6992d0b3fa27a32a89a94a44d6ef498a0e5746 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Wed, 5 Aug 2026 10:15:14 +0000 Subject: [PATCH] chore(providers): remove perfect privacy --- .github/labels.yml | 2 - README.md | 6 +- .../settings/openvpnselection.go | 4 - .../configuration/settings/portforward.go | 1 - internal/constants/providers/providers.go | 2 - internal/models/markdown.go | 2 - .../provider/perfectprivacy/connection.go | 15 ---- .../provider/perfectprivacy/openvpnconf.go | 38 ---------- .../provider/perfectprivacy/portforward.go | 50 ------------- .../perfectprivacy/portforward_test.go | 32 -------- internal/provider/perfectprivacy/provider.go | 27 ------- .../perfectprivacy/updater/citytoserver.go | 47 ------------ .../perfectprivacy/updater/filename.go | 20 ----- .../perfectprivacy/updater/servers.go | 73 ------------------- .../perfectprivacy/updater/updater.go | 17 ----- internal/provider/providers.go | 2 - internal/provider/utils/portforward.go | 2 +- 17 files changed, 4 insertions(+), 336 deletions(-) delete mode 100644 internal/provider/perfectprivacy/connection.go delete mode 100644 internal/provider/perfectprivacy/openvpnconf.go delete mode 100644 internal/provider/perfectprivacy/portforward.go delete mode 100644 internal/provider/perfectprivacy/portforward_test.go delete mode 100644 internal/provider/perfectprivacy/provider.go delete mode 100644 internal/provider/perfectprivacy/updater/citytoserver.go delete mode 100644 internal/provider/perfectprivacy/updater/filename.go delete mode 100644 internal/provider/perfectprivacy/updater/servers.go delete mode 100644 internal/provider/perfectprivacy/updater/updater.go diff --git a/.github/labels.yml b/.github/labels.yml index 51486f96..8e27f5f3 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -64,8 +64,6 @@ color: "cfe8d4" - name: "☁️ NordVPN" color: "cfe8d4" -- name: "☁️ Perfect Privacy" - color: "cfe8d4" - name: "☁️ PIA" color: "cfe8d4" - name: "☁️ Privado" diff --git a/README.md b/README.md index 37d29627..bdd1ab8f 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,10 @@ Lightweight swiss-army-knife-like VPN client to multiple VPN service providers ## Features - Based on Alpine 3.23 for a small Docker image of 43.1MB -- Supports: **AirVPN**, **Cyberghost**, **ExpressVPN**, **FastestVPN**, **Giganews**, **HideMyAss**, **IPVanish**, **IVPN**, **Mullvad** (Wireguard only), **NordVPN**, **Perfect Privacy**, **Privado**, **Private Internet Access**, **PrivateVPN**, **ProtonVPN**, **PureVPN**, **SlickVPN**, **Surfshark**, **TorGuard**, **VPNSecure.me**, **VPNUnlimited**, **Vyprvpn**, **Windscribe** servers +- Supports: **AirVPN**, **Cyberghost**, **ExpressVPN**, **FastestVPN**, **Giganews**, **HideMyAss**, **IPVanish**, **IVPN**, **Mullvad** (Wireguard only), **NordVPN**, **Privado**, **Private Internet Access**, **PrivateVPN**, **ProtonVPN**, **PureVPN**, **SlickVPN**, **Surfshark**, **TorGuard**, **VPNSecure.me**, **VPNUnlimited**, **Vyprvpn**, **Windscribe** servers - Supports OpenVPN for all providers listed - Supports Wireguard both kernelspace and userspace - - For **AirVPN**, **FastestVPN**, **Ivpn**, **Mullvad**, **NordVPN**, **Perfect privacy**, **ProtonVPN**, **Surfshark** and **Windscribe** + - For **AirVPN**, **FastestVPN**, **Ivpn**, **Mullvad**, **NordVPN**, **ProtonVPN**, **Surfshark** and **Windscribe** - For **Cyberghost**, **Private Internet Access**, **PrivateVPN**, **PureVPN**, **Torguard**, **VPN Unlimited** and **VyprVPN** using [the custom provider](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/custom.md) - For custom Wireguard configurations using [the custom provider](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/custom.md) - More in progress, see [#134](https://github.com/passteque/gluetun/issues/134) @@ -78,7 +78,7 @@ Lightweight swiss-army-knife-like VPN client to multiple VPN service providers - [Connect other containers to it](https://github.com/qdm12/gluetun-wiki/blob/main/setup/connect-a-container-to-gluetun.md) - [Connect LAN devices to it](https://github.com/qdm12/gluetun-wiki/blob/main/setup/connect-a-lan-device-to-gluetun.md) - Compatible with amd64, i686 (32 bit), **ARM** 64 bit, ARM 32 bit v6 and v7, and even ppc64le 🎆 -- Custom VPN server side port forwarding for [Perfect Privacy](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/perfect-privacy.md#vpn-server-port-forwarding), [Private Internet Access](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/private-internet-access.md#vpn-server-port-forwarding), [PrivateVPN](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/privatevpn.md#vpn-server-port-forwarding) and [ProtonVPN](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/protonvpn.md#vpn-server-port-forwarding) +- Custom VPN server side port forwarding for [Private Internet Access](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/private-internet-access.md#vpn-server-port-forwarding), [PrivateVPN](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/privatevpn.md#vpn-server-port-forwarding) and [ProtonVPN](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/protonvpn.md#vpn-server-port-forwarding) - Possibility of split horizon DNS by selecting multiple DNS over TLS providers - Can work as a Kubernetes sidecar container, thanks @rorph diff --git a/internal/configuration/settings/openvpnselection.go b/internal/configuration/settings/openvpnselection.go index 268e2032..d862fd6c 100644 --- a/internal/configuration/settings/openvpnselection.go +++ b/internal/configuration/settings/openvpnselection.go @@ -59,7 +59,6 @@ func (o OpenVPNSelection) validate(vpnProvider string) (err error) { if o.Protocol == constants.TCP && helpers.IsOneOf(vpnProvider, providers.Giganews, providers.Ipvanish, - providers.Perfectprivacy, providers.Vyprvpn, ) { return fmt.Errorf("TCP protocol is not supported: for VPN service provider %s", vpnProvider) @@ -93,9 +92,6 @@ func (o OpenVPNSelection) validate(vpnProvider string) (err error) { case providers.Mullvad: allowedTCP = []uint16{80, 443, 1401} allowedUDP = []uint16{53, 1194, 1195, 1196, 1197, 1300, 1301, 1302, 1303, 1400} - case providers.Perfectprivacy: - allowedTCP = []uint16{44, 443, 4433} - allowedUDP = []uint16{44, 443, 4433} case providers.Privado: allowedTCP = []uint16{443, 1194, 8080, 8443} allowedUDP = []uint16{443, 1194, 8080, 8443} diff --git a/internal/configuration/settings/portforward.go b/internal/configuration/settings/portforward.go index 71850b75..23e5d3a9 100644 --- a/internal/configuration/settings/portforward.go +++ b/internal/configuration/settings/portforward.go @@ -66,7 +66,6 @@ func (p PortForwarding) Validate(vpnProvider string) (err error) { providerSelected = *p.Provider } validProviders := []string{ - providers.Perfectprivacy, providers.PrivateInternetAccess, providers.Privatevpn, providers.Protonvpn, diff --git a/internal/constants/providers/providers.go b/internal/constants/providers/providers.go index b8fdb51f..018db716 100644 --- a/internal/constants/providers/providers.go +++ b/internal/constants/providers/providers.go @@ -15,7 +15,6 @@ const ( Ivpn = "ivpn" Mullvad = "mullvad" Nordvpn = "nordvpn" - Perfectprivacy = "perfect privacy" Privado = "privado" PrivateInternetAccess = "private internet access" Privatevpn = "privatevpn" @@ -43,7 +42,6 @@ func All() []string { Ivpn, Mullvad, Nordvpn, - Perfectprivacy, Privado, PrivateInternetAccess, Privatevpn, diff --git a/internal/models/markdown.go b/internal/models/markdown.go index 27d6b274..139b862f 100644 --- a/internal/models/markdown.go +++ b/internal/models/markdown.go @@ -133,8 +133,6 @@ func getMarkdownHeaders(vpnProvider string) (headers []string, err error) { return []string{countryHeader, cityHeader, ispHeader, ownedHeader, hostnameHeader, vpnHeader}, nil case providers.Nordvpn: return []string{countryHeader, regionHeader, cityHeader, hostnameHeader, vpnHeader, categoriesHeader}, nil - case providers.Perfectprivacy: - return []string{cityHeader, tcpHeader, udpHeader}, nil case providers.Privado: return []string{countryHeader, regionHeader, cityHeader, hostnameHeader}, nil case providers.PrivateInternetAccess: diff --git a/internal/provider/perfectprivacy/connection.go b/internal/provider/perfectprivacy/connection.go deleted file mode 100644 index 9e3d0266..00000000 --- a/internal/provider/perfectprivacy/connection.go +++ /dev/null @@ -1,15 +0,0 @@ -package perfectprivacy - -import ( - "github.com/qdm12/gluetun/internal/configuration/settings" - "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/provider/utils" -) - -func (p *Provider) GetConnection(selection settings.ServerSelection, ipv6Supported bool) ( - connection models.Connection, err error, -) { - defaults := utils.NewConnectionDefaults(443, 443, 0) //nolint:mnd - return utils.GetConnection(p.Name(), - p.storage, selection, defaults, ipv6Supported, p.connPicker) -} diff --git a/internal/provider/perfectprivacy/openvpnconf.go b/internal/provider/perfectprivacy/openvpnconf.go deleted file mode 100644 index 93629b52..00000000 --- a/internal/provider/perfectprivacy/openvpnconf.go +++ /dev/null @@ -1,38 +0,0 @@ -package perfectprivacy - -import ( - "github.com/qdm12/gluetun/internal/configuration/settings" - "github.com/qdm12/gluetun/internal/constants/openvpn" - "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/provider/utils" -) - -func (p *Provider) OpenVPNConfig(connection models.Connection, - settings settings.OpenVPN, ipv6Supported bool, -) (lines []string) { - //nolint:mnd - providerSettings := utils.OpenVPNProviderSettings{ - AuthUserPass: true, - Ciphers: []string{ - openvpn.AES256cbc, - openvpn.AES256gcm, - }, - Auth: openvpn.SHA512, - MssFix: 1450, - Ping: 5, - CAs: []string{"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"}, //nolint:lll - Cert: "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", //nolint:lll - Key: "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", //nolint:lll - TLSCrypt: "d10a8e2641f5834f6c5e04a6ee9a798553d338fa2836ef2a91057c1f6174a3a12b36f16d1110b20e42ae94d3bd579213e9c3770be6c74804348dddba876945a5a3ab7660f9436f85f331641f6efc81315f0d12b2766a9f15c10a53cf9ba32dc80f03b5f15a6cc6987bda795dbe83443ec81f3d5e161cd47fab6b1f125b3adeee1eae33370d018594e0ff6b25b815228d27371b32c82a95f4929d3abb5fa36e57bf1f42353542568fbb8233f4645f05820275f79570cb8bbcf8010fc5d20f07d031a8227d45daf7349e34158c91a3d4e5add19cfa02f683f87609f6525fa0594016d11abf2de649f83ad54edd3e74e032e34b1bca685b8499916826d9aee11c13", //nolint:lll - TLSCipher: "TLS_CHACHA20_POLY1305_SHA256:TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS_AES_256_GCM_SHA384:TLS-RSA-WITH-AES-256-CBC-SHA", //nolint:lll - TunMTU: 1500, - TunMTUExtra: 32, - RenegSec: 3600, - KeyDirection: "1", - IPv6Lines: []string{ - "redirect-gateway def1", - `pull-filter ignore "redirect-gateway def1 ipv6"`, - }, - } - return utils.OpenVPNConfig(providerSettings, connection, settings, ipv6Supported) -} diff --git a/internal/provider/perfectprivacy/portforward.go b/internal/provider/perfectprivacy/portforward.go deleted file mode 100644 index 365b0fc9..00000000 --- a/internal/provider/perfectprivacy/portforward.go +++ /dev/null @@ -1,50 +0,0 @@ -package perfectprivacy - -import ( - "context" - "net/netip" - - "github.com/qdm12/gluetun/internal/provider/utils" -) - -// PortForward calculates and returns the VPN server side ports forwarded. -func (p *Provider) PortForward(_ context.Context, - objects utils.PortForwardObjects, -) (internalToExternalPorts map[uint16]uint16, err error) { - if !objects.InternalIP.IsValid() { - panic("internal ip is not set") - } - - ports := internalIPToPorts(objects.InternalIP) - internalToExternalPorts = make(map[uint16]uint16, len(ports)) - for _, port := range ports { - internalToExternalPorts[port] = port - } - return internalToExternalPorts, nil -} - -func (p *Provider) KeepPortForward(ctx context.Context, - _ utils.PortForwardObjects, -) (err error) { - <-ctx.Done() - return ctx.Err() -} - -// See https://www.perfect-privacy.com/en/faq section -// How are the default forwarding ports being calculated? -func internalIPToPorts(internalIP netip.Addr) (ports []uint16) { - internalIPBytes := internalIP.AsSlice() - // Convert the internal IP address to a bit string - // and keep only the last 12 bits - last16Bits := internalIPBytes[len(internalIPBytes)-2:] - last12Bits := []byte{ - last16Bits[0] & 0b00001111, // only keep 4 bits - last16Bits[1], - } - basePort := uint16(last12Bits[0])<<8 + uint16(last12Bits[1]) //nolint:mnd - return []uint16{ - 10000 + basePort, - 20000 + basePort, - 30000 + basePort, - } -} diff --git a/internal/provider/perfectprivacy/portforward_test.go b/internal/provider/perfectprivacy/portforward_test.go deleted file mode 100644 index 78c74a49..00000000 --- a/internal/provider/perfectprivacy/portforward_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package perfectprivacy - -import ( - "net/netip" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_internalIPToPorts(t *testing.T) { - t.Parallel() - - testCases := map[string]struct { - internalIP netip.Addr - ports []uint16 - }{ - "example_case": { - internalIP: netip.AddrFrom4([4]byte{10, 0, 203, 88}), - ports: []uint16{12904, 22904, 32904}, - }, - } - - for name, testCase := range testCases { - t.Run(name, func(t *testing.T) { - t.Parallel() - - ports := internalIPToPorts(testCase.internalIP) - - assert.Equal(t, testCase.ports, ports) - }) - } -} diff --git a/internal/provider/perfectprivacy/provider.go b/internal/provider/perfectprivacy/provider.go deleted file mode 100644 index e4488396..00000000 --- a/internal/provider/perfectprivacy/provider.go +++ /dev/null @@ -1,27 +0,0 @@ -package perfectprivacy - -import ( - "github.com/qdm12/gluetun/internal/constants/providers" - "github.com/qdm12/gluetun/internal/provider/common" - "github.com/qdm12/gluetun/internal/provider/perfectprivacy/updater" - "github.com/qdm12/gluetun/internal/provider/utils" -) - -type Provider struct { - storage common.Storage - connPicker *utils.ConnectionPicker - common.Fetcher -} - -func New(storage common.Storage, unzipper common.Unzipper, updaterWarner common.Warner, -) *Provider { - return &Provider{ - storage: storage, - connPicker: utils.NewConnectionPicker(), - Fetcher: updater.New(unzipper, updaterWarner), - } -} - -func (p *Provider) Name() string { - return providers.Perfectprivacy -} diff --git a/internal/provider/perfectprivacy/updater/citytoserver.go b/internal/provider/perfectprivacy/updater/citytoserver.go deleted file mode 100644 index 39b2c8f1..00000000 --- a/internal/provider/perfectprivacy/updater/citytoserver.go +++ /dev/null @@ -1,47 +0,0 @@ -package updater - -import ( - "net/netip" - - "github.com/qdm12/gluetun/internal/constants/vpn" - "github.com/qdm12/gluetun/internal/models" -) - -type cityToServer map[string]models.Server - -func (cts cityToServer) add(city string, ips []netip.Addr) { - server, ok := cts[city] - if !ok { - server.VPN = vpn.OpenVPN - server.City = city - server.IPs = ips - server.TCP = true - server.UDP = true - } else { - // Do not insert duplicate IP addresses - existingIPs := make(map[string]struct{}, len(server.IPs)) - for _, ip := range server.IPs { - existingIPs[ip.String()] = struct{}{} - } - - for _, ip := range ips { - ipString := ip.String() - _, ok := existingIPs[ipString] - if ok { - continue - } - existingIPs[ipString] = struct{}{} - server.IPs = append(server.IPs, ip) - } - } - - cts[city] = server -} - -func (cts cityToServer) toServersSlice() (servers []models.Server) { - servers = make([]models.Server, 0, len(cts)) - for _, server := range cts { - servers = append(servers, server) - } - return servers -} diff --git a/internal/provider/perfectprivacy/updater/filename.go b/internal/provider/perfectprivacy/updater/filename.go deleted file mode 100644 index 6b379392..00000000 --- a/internal/provider/perfectprivacy/updater/filename.go +++ /dev/null @@ -1,20 +0,0 @@ -package updater - -import ( - "strings" - "unicode" -) - -func parseFilename(fileName string) (city string) { - const suffix = ".conf" - s := strings.TrimSuffix(fileName, suffix) - - for i, r := range s { - if unicode.IsDigit(r) { - s = s[:i] - break - } - } - - return s -} diff --git a/internal/provider/perfectprivacy/updater/servers.go b/internal/provider/perfectprivacy/updater/servers.go deleted file mode 100644 index ea79e54c..00000000 --- a/internal/provider/perfectprivacy/updater/servers.go +++ /dev/null @@ -1,73 +0,0 @@ -package updater - -import ( - "context" - "fmt" - "net/url" - "sort" - "strings" - - "github.com/qdm12/gluetun/internal/models" - "github.com/qdm12/gluetun/internal/provider/common" - "github.com/qdm12/gluetun/internal/updater/openvpn" -) - -func (u *Updater) FetchServers(ctx context.Context, minServers int) ( - servers []models.Server, err error, -) { - zipURL := url.URL{ - Scheme: "https", - Host: "www.perfect-privacy.com", - Path: "/downloads/openvpn/get", - } - values := make(url.Values) - values.Set("system", "linux") - values.Set("scope", "server") - values.Set("filetype", "zip") - values.Set("protocol", "udp") // all support both TCP and UDP - zipURL.RawQuery = values.Encode() - - contents, err := u.unzipper.FetchAndExtract(ctx, zipURL.String()) - if err != nil { - return nil, err - } - - cts := make(cityToServer) - - for fileName, content := range contents { - err := addServerFromOvpn(cts, fileName, content) - if err != nil { - u.warner.Warn(err.Error() + " in " + fileName) - } - } - - if len(cts) < minServers { - return nil, fmt.Errorf("%w: %d and expected at least %d", - common.ErrNotEnoughServers, len(cts), minServers) - } - - servers = cts.toServersSlice() - - sort.Sort(models.SortableServers(servers)) - - return servers, nil -} - -func addServerFromOvpn(cts cityToServer, - fileName string, content []byte, -) (err error) { - if !strings.HasSuffix(fileName, ".conf") { - return nil // not an OpenVPN file - } - - ips, err := openvpn.ExtractIPs(content) - if err != nil { - return err - } - - city := parseFilename(fileName) - - cts.add(city, ips) - - return nil -} diff --git a/internal/provider/perfectprivacy/updater/updater.go b/internal/provider/perfectprivacy/updater/updater.go deleted file mode 100644 index 66a2b327..00000000 --- a/internal/provider/perfectprivacy/updater/updater.go +++ /dev/null @@ -1,17 +0,0 @@ -package updater - -import ( - "github.com/qdm12/gluetun/internal/provider/common" -) - -type Updater struct { - unzipper common.Unzipper - warner common.Warner -} - -func New(unzipper common.Unzipper, warner common.Warner) *Updater { - return &Updater{ - unzipper: unzipper, - warner: warner, - } -} diff --git a/internal/provider/providers.go b/internal/provider/providers.go index 07402096..fa926399 100644 --- a/internal/provider/providers.go +++ b/internal/provider/providers.go @@ -20,7 +20,6 @@ import ( "github.com/qdm12/gluetun/internal/provider/ivpn" "github.com/qdm12/gluetun/internal/provider/mullvad" "github.com/qdm12/gluetun/internal/provider/nordvpn" - "github.com/qdm12/gluetun/internal/provider/perfectprivacy" "github.com/qdm12/gluetun/internal/provider/privado" "github.com/qdm12/gluetun/internal/provider/privateinternetaccess" "github.com/qdm12/gluetun/internal/provider/privatevpn" @@ -67,7 +66,6 @@ func NewProviders(storage Storage, timeNow func() time.Time, providers.Ivpn: ivpn.New(storage, client, updaterWarner, parallelResolver), providers.Mullvad: mullvad.New(storage, client), providers.Nordvpn: nordvpn.New(storage, client, updaterWarner), - providers.Perfectprivacy: perfectprivacy.New(storage, unzipper, updaterWarner), providers.Privado: privado.New(storage, client, updaterWarner), providers.PrivateInternetAccess: privateinternetaccess.New(storage, timeNow, client), providers.Privatevpn: privatevpn.New(storage, unzipper, updaterWarner, parallelResolver), diff --git a/internal/provider/utils/portforward.go b/internal/provider/utils/portforward.go index 6f03646f..594c43f4 100644 --- a/internal/provider/utils/portforward.go +++ b/internal/provider/utils/portforward.go @@ -13,7 +13,7 @@ type PortForwardObjects struct { // Gateway is the VPN gateway IP address, used by Private Internet Access // and ProtonVPN. Gateway netip.Addr - // InternalIP is the VPN internal IP address assigned, used by Perfect Privacy. + // InternalIP is the VPN internal IP address assigned, used by PrivateVPN. InternalIP netip.Addr // Client is used to query the VPN gateway for Private Internet Access. Client *http.Client