From a81bf938fe2b9409d1fa0175cc5f20635bb16127 Mon Sep 17 00:00:00 2001 From: "kali kaneko (leap communications)" Date: Wed, 24 Nov 2021 20:40:18 +0100 Subject: [feat] enable udp only if really announced --- gui/components/Preferences.qml | 10 +++++----- pkg/backend/README.md | 10 ++++++++++ pkg/backend/status.go | 2 ++ pkg/bitmask/bitmask.go | 1 + pkg/vpn/bonafide/eip_service.go | 20 ++++++++++++++++++++ pkg/vpn/main.go | 7 ++++++- 6 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 pkg/backend/README.md diff --git a/gui/components/Preferences.qml b/gui/components/Preferences.qml index 106af7a..f205358 100644 --- a/gui/components/Preferences.qml +++ b/gui/components/Preferences.qml @@ -5,10 +5,6 @@ import QtQuick.Controls.Material 2.1 import "../themes/themes.js" as Theme -// TODO -// [ ] disable UDP if provider doesn't support it -// [ ] disable UDP if the platform doesn't support it - ThemedPage { title: qsTr("Preferences") @@ -116,7 +112,7 @@ ThemedPage { } Label { - text: qsTr("UDP can make the VPN faster") + text: qsTr("UDP can make the VPN faster, but it might be blocked on certain networks") width: parent.width color: "gray" visible: true @@ -124,6 +120,7 @@ ThemedPage { font.pixelSize: Theme.fontSize - 3 Layout.leftMargin: 10 Layout.rightMargin: 10 + Layout.preferredWidth: 240 } MaterialCheckBox { @@ -232,5 +229,8 @@ ThemedPage { if (ctx && ctx.udp == "true") { useUDP.checked = true } + if (ctx && ctx.offersUdp == "false") { + useUDP.enabled = false + } } } diff --git a/pkg/backend/README.md b/pkg/backend/README.md new file mode 100644 index 0000000..1adefe8 --- /dev/null +++ b/pkg/backend/README.md @@ -0,0 +1,10 @@ +# how to add new fields to backend api + +1. add to the struct in `status.go` +2. populate it in `toJson()` method. +3. modify the `bitmask` interface in `pkg/bitmask/bitmask.go` (note: this is + a relict from the past, we can probably get rid of since there'll be + a single implementation in the foreseeable future). +4. modify the `bitmask` struct in `pkg/vpn/main.go` +5. modify the bitmask instantiation in `pkg/vpn/main.go:Init` +6. implement functionality... diff --git a/pkg/backend/status.go b/pkg/backend/status.go index f21fddd..2ed5cfd 100644 --- a/pkg/backend/status.go +++ b/pkg/backend/status.go @@ -52,6 +52,7 @@ type connectionCtx struct { BestLocation string `json:"bestLocation"` Transport string `json:"transport"` UseUDP bool `json:"udp"` + OffersUDP bool `json:"offersUdp"` ManualLocation bool `json:"manualLocation"` IsReady bool `json:"isReady"` CanUpgrade bool `json:"canUpgrade"` @@ -73,6 +74,7 @@ func (c *connectionCtx) toJson() ([]byte, error) { c.BestLocation = c.bm.GetBestLocation(transport) c.Transport = transport c.UseUDP = c.cfg.UDP // TODO initialize bitmask too + c.OffersUDP = c.bm.OffersUDP() c.ManualLocation = c.bm.IsManualLocation() c.CanUpgrade = c.bm.CanUpgrade() c.Motd = c.bm.GetMotd() diff --git a/pkg/bitmask/bitmask.go b/pkg/bitmask/bitmask.go index d02487b..80b502e 100644 --- a/pkg/bitmask/bitmask.go +++ b/pkg/bitmask/bitmask.go @@ -36,6 +36,7 @@ type Bitmask interface { GetTransport() string SetTransport(string) error UseUDP(bool) error + OffersUDP() bool GetCurrentGateway() string GetCurrentLocation() string GetCurrentCountry() string diff --git a/pkg/vpn/bonafide/eip_service.go b/pkg/vpn/bonafide/eip_service.go index 28d0479..1b8dc01 100644 --- a/pkg/vpn/bonafide/eip_service.go +++ b/pkg/vpn/bonafide/eip_service.go @@ -76,6 +76,26 @@ func (b *Bonafide) setupAuthentication(i interface{}) { } } +func (b *Bonafide) IsUDPAvailable() bool { + if b.eip == nil { + return false + } + for _, gw := range b.eip.Gateways { + for _, t := range gw.Capabilities.Transport { + if t.Type == "openvpn" { + for _, proto := range t.Protocols { + if proto == "udp" { + return true + } + } + } + + } + + } + return false +} + func (b *Bonafide) fetchEipJSON() error { eip3API := config.APIURL + "3/config/eip-service.json" resp, err := b.client.Post(eip3API, "", nil) diff --git a/pkg/vpn/main.go b/pkg/vpn/main.go index 619a10f..176c86f 100644 --- a/pkg/vpn/main.go +++ b/pkg/vpn/main.go @@ -43,6 +43,7 @@ type Bitmask struct { certPemPath string openvpnArgs []string udp bool + offersUdp bool failed bool canUpgrade bool motd []motd.Message @@ -67,7 +68,7 @@ func Init() (*Bitmask, error) { bonafide.Gateway{}, bonafide.Gateway{}, statusCh, nil, bf, launch, "", nil, "", []string{}, - false, false, false, + false, false, false, false, []motd.Message{}, ""} // FIXME multiprovider: need to pass provider name early on // XXX we want to block on these, but they can timeout if we're blocked. @@ -150,6 +151,10 @@ func (b *Bitmask) UseUDP(udp bool) error { return nil } +func (b *Bitmask) OffersUDP() bool { + return b.bonafide.IsUDPAvailable() +} + func (b *Bitmask) GetMotd() string { bytes, err := json.Marshal(b.motd) if err != nil { -- cgit v1.2.3