diff --git a/cmd/trayscale/default.pgo b/cmd/trayscale/default.pgo
index 282aed4..bbec9fb 100644
Binary files a/cmd/trayscale/default.pgo and b/cmd/trayscale/default.pgo differ
diff --git a/dev.deedles.Trayscale.metainfo.xml b/dev.deedles.Trayscale.metainfo.xml
index fd56257..f4ed515 100644
--- a/dev.deedles.Trayscale.metainfo.xml
+++ b/dev.deedles.Trayscale.metainfo.xml
@@ -58,6 +58,9 @@
Update to use new Libadwaita widgets.
Fix a bug with ordering of Mullvad nodes.
+ Remove deprecated hair pinning from netcheck and add captive portal detection.
+ Fix bug with netcheck that caused it to essentially not work and to be extremely slow.
+
diff --git a/go.mod b/go.mod
index 1e44e40..01c2d12 100644
--- a/go.mod
+++ b/go.mod
@@ -5,30 +5,30 @@ go 1.22.0
require (
deedles.dev/mk v0.1.0
fyne.io/systray v1.10.0
- github.com/diamondburned/gotk4-adwaita/pkg v0.0.0-20240107232253-5f283b5d35bc
+ github.com/diamondburned/gotk4-adwaita/pkg v0.0.0-20240512000724-8dc7455ee58f
github.com/diamondburned/gotk4/pkg v0.2.2
github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf
- golang.org/x/net v0.24.0
+ golang.org/x/net v0.26.0
honnef.co/go/tools v0.4.7
- tailscale.com v1.64.2
+ tailscale.com v1.68.1
)
require (
filippo.io/edwards25519 v1.1.0 // indirect
- github.com/BurntSushi/toml v1.3.2 // indirect
+ github.com/BurntSushi/toml v1.4.0 // indirect
github.com/KarpelesLab/weak v0.1.1 // indirect
github.com/akutz/memconn v0.1.0 // indirect
github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa // indirect
- github.com/coreos/go-iptables v0.7.0 // indirect
+ github.com/coreos/go-iptables v0.7.1-0.20240112124308-65c67c9f46e6 // indirect
github.com/dblohm7/wingoes v0.0.0-20240123200102-b75a8a7d7eb0 // indirect
github.com/fxamacker/cbor/v2 v2.6.0 // indirect
github.com/godbus/dbus/v5 v5.1.1-0.20230522191255-76236955d466 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/google/go-cmp v0.6.0 // indirect
- github.com/google/nftables v0.2.0 // indirect
+ github.com/google/nftables v0.2.1-0.20240414091927-5e242ec57806 // indirect
github.com/hdevalence/ed25519consensus v0.2.0 // indirect
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 // indirect
- github.com/jsimonetti/rtnetlink v1.4.1 // indirect
+ github.com/jsimonetti/rtnetlink v1.4.2 // indirect
github.com/mdlayher/netlink v1.7.2 // indirect
github.com/mdlayher/socket v0.5.1 // indirect
github.com/mitchellh/go-ps v1.0.0 // indirect
@@ -43,15 +43,15 @@ require (
go4.org/mem v0.0.0-20240501181205-ae6ca9944745 // indirect
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 // indirect
- golang.org/x/crypto v0.22.0 // indirect
- golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
- golang.org/x/exp/typeparams v0.0.0-20240416160154-fe59bbe5cc7f // indirect
- golang.org/x/mod v0.17.0 // indirect
+ golang.org/x/crypto v0.24.0 // indirect
+ golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect
+ golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8 // indirect
+ golang.org/x/mod v0.18.0 // indirect
golang.org/x/sync v0.7.0 // indirect
- golang.org/x/sys v0.19.0 // indirect
- golang.org/x/text v0.14.0 // indirect
+ golang.org/x/sys v0.21.0 // indirect
+ golang.org/x/text v0.16.0 // indirect
golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.20.0 // indirect
+ golang.org/x/tools v0.22.0 // indirect
golang.zx2c4.com/wireguard/windows v0.5.3 // indirect
nhooyr.io/websocket v1.8.11 // indirect
)
diff --git a/go.sum b/go.sum
index 22ea3a5..6370965 100644
--- a/go.sum
+++ b/go.sum
@@ -6,8 +6,8 @@ filippo.io/mkcert v1.4.4 h1:8eVbbwfVlaqUM7OwuftKc2nuYOoTDQWqsoXmzoXZdbc=
filippo.io/mkcert v1.4.4/go.mod h1:VyvOchVuAye3BoUsPUOOofKygVwLV2KQMVFJNRq+1dA=
fyne.io/systray v1.10.0 h1:Yr1D9Lxeiw3+vSuZWPlaHC8BMjIHZXJKkek706AfYQk=
fyne.io/systray v1.10.0/go.mod h1:oM2AQqGJ1AMo4nNqZFYU8xYygSBZkW2hmdJ7n4yjedE=
-github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8=
-github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
+github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/KarpelesLab/weak v0.1.1 h1:fNnlPo3aypS9tBzoEQluY13XyUfd/eWaSE/vMvo9s4g=
github.com/KarpelesLab/weak v0.1.1/go.mod h1:pzXsWs5f2bf+fpgHayTlBE1qJpO3MpJKo5sRaLu1XNw=
github.com/akutz/memconn v0.1.0 h1:NawI0TORU4hcOMsMr11g7vwlCdkYeLKXBcxWu2W/P8A=
@@ -16,12 +16,12 @@ github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7V
github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
github.com/cilium/ebpf v0.12.3 h1:8ht6F9MquybnY97at+VDZb3eQQr8ev79RueWeVaEcG4=
github.com/cilium/ebpf v0.12.3/go.mod h1:TctK1ivibvI3znr66ljgi4hqOT8EYQjz1KWBfb1UVgM=
-github.com/coreos/go-iptables v0.7.0 h1:XWM3V+MPRr5/q51NuWSgU0fqMad64Zyxs8ZUoMsamr8=
-github.com/coreos/go-iptables v0.7.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
+github.com/coreos/go-iptables v0.7.1-0.20240112124308-65c67c9f46e6 h1:8h5+bWd7R6AYUslN6c6iuZWTKsKxUFDlpnmilO6R2n0=
+github.com/coreos/go-iptables v0.7.1-0.20240112124308-65c67c9f46e6/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
github.com/dblohm7/wingoes v0.0.0-20240123200102-b75a8a7d7eb0 h1:vrC07UZcgPzu/OjWsmQKMGg3LoPSz9jh/pQXIrHjUj4=
github.com/dblohm7/wingoes v0.0.0-20240123200102-b75a8a7d7eb0/go.mod h1:Nx87SkVqTKd8UtT+xu7sM/l+LgXs6c0aHrlKusR+2EQ=
-github.com/diamondburned/gotk4-adwaita/pkg v0.0.0-20240107232253-5f283b5d35bc h1:qx5q0yTNuT30m0t/gugjsYOHjmGUVxsCekR5xcwGRVY=
-github.com/diamondburned/gotk4-adwaita/pkg v0.0.0-20240107232253-5f283b5d35bc/go.mod h1:fkvdR7MYO1sI0ex07VYLTc+YK87v24aRFYyMJQ/xAeA=
+github.com/diamondburned/gotk4-adwaita/pkg v0.0.0-20240512000724-8dc7455ee58f h1:1BGSLL+wWJjnMzRkRNR8oR5joi6gxyUSD4cI+L67wCc=
+github.com/diamondburned/gotk4-adwaita/pkg v0.0.0-20240512000724-8dc7455ee58f/go.mod h1:fkvdR7MYO1sI0ex07VYLTc+YK87v24aRFYyMJQ/xAeA=
github.com/diamondburned/gotk4/pkg v0.2.2 h1:6EBtg/7uhnN/sCJd7rZdc+PqMXmnEaEDNIC9K/hTZfQ=
github.com/diamondburned/gotk4/pkg v0.2.2/go.mod h1:DqeOW+MxSZFg9OO+esk4JgQk0TiUJJUBfMltKhG+ub4=
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
@@ -35,16 +35,16 @@ github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
-github.com/google/nftables v0.2.0 h1:PbJwaBmbVLzpeldoeUKGkE2RjstrjPKMl6oLrfEJ6/8=
-github.com/google/nftables v0.2.0/go.mod h1:Beg6V6zZ3oEn0JuiUQ4wqwuyqqzasOltcoXPtgLbFp4=
+github.com/google/nftables v0.2.1-0.20240414091927-5e242ec57806 h1:wG8RYIyctLhdFk6Vl1yPGtSRtwGpVkWyZww1OCil2MI=
+github.com/google/nftables v0.2.1-0.20240414091927-5e242ec57806/go.mod h1:Beg6V6zZ3oEn0JuiUQ4wqwuyqqzasOltcoXPtgLbFp4=
github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU=
github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo=
github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf h1:FtEj8sfIcaaBfAKrE1Cwb61YDtYq9JxChK1c7AKce7s=
github.com/inhies/go-bytesize v0.0.0-20220417184213-4913239db9cf/go.mod h1:yrqSXGoD/4EKfF26AOGzscPOgTTJcyAwM2rpixWT+t4=
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 h1:elKwZS1OcdQ0WwEDBeqxKwb7WB62QX8bvZ/FJnVXIfk=
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86/go.mod h1:aFAMtuldEgx/4q7iSGazk22+IcgvtiC+HIimFO9XlS8=
-github.com/jsimonetti/rtnetlink v1.4.1 h1:JfD4jthWBqZMEffc5RjgmlzpYttAVw1sdnmiNaPO3hE=
-github.com/jsimonetti/rtnetlink v1.4.1/go.mod h1:xJjT7t59UIZ62GLZbv6PLLo8VFrostJMPBAheR6OM8w=
+github.com/jsimonetti/rtnetlink v1.4.2 h1:Df9w9TZ3npHTyDn0Ev9e1uzmN2odmXd0QX+J5GTEn90=
+github.com/jsimonetti/rtnetlink v1.4.2/go.mod h1:92s6LJdE+1iOrw+F2/RO7LYI2Qd8pPpFNNUYW06gcoM=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -80,16 +80,16 @@ go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBs
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 h1:lGdhQUN/cnWdSH3291CUuxSEqc+AsGTiDxPP3r2J0l4=
go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E=
-golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
-golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
-golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ=
-golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
-golang.org/x/exp/typeparams v0.0.0-20240416160154-fe59bbe5cc7f h1:w8p7KAd5PAu3s2tyNEVMcoPd8LWrk29IUcx5uOwGQlE=
-golang.org/x/exp/typeparams v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
-golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
-golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
-golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
+golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
+golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
+golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY=
+golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI=
+golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8 h1:+ZJmEdDFzH5H0CnzOrwgbH3elHctfTecW9X0k2tkn5M=
+golang.org/x/exp/typeparams v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
+golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0=
+golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
+golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
@@ -98,14 +98,14 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
-golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
-golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
+golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
+golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
-golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY=
-golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg=
+golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA=
+golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
golang.zx2c4.com/wireguard/windows v0.5.3 h1:On6j2Rpn3OEMXqBq00QEDC7bWSZrPIHKIus8eIuExIE=
golang.zx2c4.com/wireguard/windows v0.5.3/go.mod h1:9TEe8TJmtwyQebdFwAkEWOPr3prrtqm+REGFifP60hI=
honnef.co/go/tools v0.4.7 h1:9MDAWxMoSnB6QoSqiVr7P5mtkT9pOc1kSxchzPCnqJs=
@@ -116,5 +116,5 @@ nhooyr.io/websocket v1.8.11 h1:f/qXNc2/3DpoSZkHt1DQu6rj4zGC8JmkkLkWss0MgN0=
nhooyr.io/websocket v1.8.11/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c=
software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k=
software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI=
-tailscale.com v1.64.2 h1:0VNwUsjK6CwgkqyaOANndBER2SMYl8JZ5uNRTvIqCnY=
-tailscale.com v1.64.2/go.mod h1:6kGByHNxnFfK1i4gVpdtvpdS1HicHohWXnsfwmXy64I=
+tailscale.com v1.68.1 h1:Fh0P1kNqI6EiN48dDiDWAIZguzIkuOo7UHDVG9ulQ2U=
+tailscale.com v1.68.1/go.mod h1:uqtoDEA8tw5+S+HLGqQGfpQsqeVtBS/EVVv5mXIaAoQ=
diff --git a/internal/tsutil/client.go b/internal/tsutil/client.go
index 743e20e..b53e813 100644
--- a/internal/tsutil/client.go
+++ b/internal/tsutil/client.go
@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"io"
+ "log/slog"
"net/netip"
"os/exec"
"strings"
@@ -14,20 +15,30 @@ import (
"tailscale.com/ipn"
"tailscale.com/ipn/ipnstate"
"tailscale.com/net/netcheck"
+ "tailscale.com/net/netmon"
"tailscale.com/tailcfg"
+ "tailscale.com/types/logger"
)
var (
localClient tailscale.LocalClient
+ monitor = initMonitor()
netcheckClient = netcheck.Client{
- Logf: func(format string, v ...any) {
- // Do nothing.
- },
+ NetMon: monitor,
+ Logf: logger.Discard,
}
defaultClient Client
)
+func initMonitor() *netmon.Monitor {
+ monitor, err := netmon.New(logger.Discard)
+ if err != nil {
+ slog.Error("init netmon monitor", "err", err)
+ }
+ return monitor
+}
+
// Client is a client for Tailscale's services. Some functionality is
// handled via the Go API, and some is handled via execution of the
// Tailscale CLI binary.
@@ -213,6 +224,11 @@ func (c *Client) SetControlURL(ctx context.Context, controlURL string) error {
}
func (c *Client) NetCheck(ctx context.Context, full bool) (*netcheck.Report, *tailcfg.DERPMap, error) {
+ err := netcheckClient.Standalone(ctx, "")
+ if err != nil {
+ return nil, nil, fmt.Errorf("standalone: %w", err)
+ }
+
dm, err := localClient.CurrentDERPMap(ctx)
if err != nil {
return nil, nil, fmt.Errorf("current DERP map: %w", err)
diff --git a/internal/ui/selfpage.go b/internal/ui/selfpage.go
index fd5b4cf..0f7f647 100644
--- a/internal/ui/selfpage.go
+++ b/internal/ui/selfpage.go
@@ -52,8 +52,8 @@ type SelfPage struct {
PMP *gtk.Image
PCPRow *adw.ActionRow
PCP *gtk.Image
- HairPinningRow *adw.ActionRow
- HairPinning *gtk.Image
+ CaptivePortalRow *adw.ActionRow
+ CaptivePortal *gtk.Image
PreferredDERPRow *adw.ActionRow
PreferredDERP *gtk.Label
DERPLatencies *adw.ExpanderRow
@@ -340,20 +340,20 @@ func (page *SelfPage) init(a *App, peer *ipnstate.PeerStatus, status tsutil.Stat
page.IPv4Icon.SetVisible(!r.IPv4)
page.IPv4Icon.SetFromIconName(boolIcon(r.IPv4))
page.IPv4Addr.SetVisible(r.IPv4)
- page.IPv4Addr.SetText(r.GlobalV4)
+ page.IPv4Addr.SetText(r.GlobalV4.String())
page.IPv6Row.SetVisible(true)
page.IPv6Icon.SetVisible(!r.IPv6)
page.IPv6Icon.SetFromIconName(boolIcon(r.IPv6))
page.IPv6Addr.SetVisible(r.IPv6)
- page.IPv6Addr.SetText(r.GlobalV6)
+ page.IPv6Addr.SetText(r.GlobalV6.String())
page.UPnPRow.SetVisible(true)
page.UPnP.SetFromIconName(optBoolIcon(r.UPnP))
page.PMPRow.SetVisible(true)
page.PMP.SetFromIconName(optBoolIcon(r.PMP))
page.PCPRow.SetVisible(true)
page.PCP.SetFromIconName(optBoolIcon(r.PCP))
- page.HairPinningRow.SetVisible(true)
- page.HairPinning.SetFromIconName(optBoolIcon(r.HairPinning))
+ page.CaptivePortalRow.SetVisible(true)
+ page.CaptivePortal.SetFromIconName(optBoolIcon(r.CaptivePortal))
page.PreferredDERPRow.SetVisible(true)
page.PreferredDERP.SetText(dm.Regions[r.PreferredDERP].RegionName)
diff --git a/internal/ui/selfpage.ui b/internal/ui/selfpage.ui
index 33fa4d9..1080bb0 100644
--- a/internal/ui/selfpage.ui
+++ b/internal/ui/selfpage.ui
@@ -131,22 +131,23 @@
-
-
- Preferred DERP
+
+ CaptivePortal
+ Captive portal detected
False
-
- Never
-
+
diff --git a/internal/ui/trayscale.cmb b/internal/ui/trayscale.cmb
index 3c227a8..c0202b5 100644
--- a/internal/ui/trayscale.cmb
+++ b/internal/ui/trayscale.cmb
@@ -83,14 +83,14 @@
(4,33,"GtkImage","PMP",32,None,None,None,None,None,None),
(4,34,"AdwActionRow","PCPRow",18,None,None,None,6,None,None),
(4,35,"GtkImage","PCP",34,None,None,None,None,None,None),
- (4,36,"AdwActionRow","HairPinningRow",18,None,None,None,7,None,None),
- (4,37,"GtkImage","HairPinning",36,None,None,None,None,None,None),
- (4,38,"AdwActionRow","PreferredDERPRow",18,None,None,None,8,None,None),
+ (4,38,"AdwActionRow","PreferredDERPRow",18,None,None,None,7,None,None),
(4,39,"GtkLabel","PreferredDERP",38,None,None,None,None,None,None),
(4,40,"AdwExpanderRow","DERPLatencies",18,None,None,None,9,None,None),
(4,41,"AdwSwitchRow","AdvertiseExitNodeRow",5,None,None,None,None,None,None),
(4,42,"AdwSwitchRow","AllowLANAccessRow",5,None,None,None,1,None,None),
(4,43,"AdwSwitchRow","AcceptRoutesRow",5,None,None,None,2,None,None),
+ (4,44,"AdwActionRow","CaptivePortalRow",18,None,None,None,8,None,None),
+ (4,45,"GtkImage","CaptivePortal",44,None,None,None,None,None,None),
(5,1,"AdwStatusPage","Page",None,None,None,None,None,None,None),
(5,2,"AdwClamp",None,1,None,None,None,None,None,None),
(5,3,"GtkBox",None,2,None,None,None,None,None,None),
@@ -187,8 +187,6 @@
(4,32,"GtkWidget","visible","False",None,None,None,None,None,None,None,None,None),
(4,34,"AdwPreferencesRow","title","Port control protocol",None,None,None,None,None,None,None,None,None),
(4,34,"GtkWidget","visible","False",None,None,None,None,None,None,None,None,None),
- (4,36,"AdwPreferencesRow","title","Hair pinning",None,None,None,None,None,None,None,None,None),
- (4,36,"GtkWidget","visible","False",None,None,None,None,None,None,None,None,None),
(4,38,"AdwPreferencesRow","title","Preferred DERP",None,None,None,None,None,None,None,None,None),
(4,38,"GtkWidget","visible","False",None,None,None,None,None,None,None,None,None),
(4,39,"GtkLabel","label","Never",None,None,None,None,None,None,None,None,None),
@@ -197,6 +195,9 @@
(4,41,"AdwPreferencesRow","title","Advertise exit node",None,None,None,None,None,None,None,None,None),
(4,42,"AdwPreferencesRow","title","Allow LAN access",None,None,None,None,None,None,None,None,None),
(4,43,"AdwPreferencesRow","title","Accept routes",None,None,None,None,None,None,None,None,None),
+ (4,44,"AdwActionRow","activatable-widget","45",None,None,None,None,None,None,None,None,None),
+ (4,44,"AdwPreferencesRow","title","Captive portal detected",None,None,None,None,None,None,None,None,None),
+ (4,44,"GtkWidget","visible","False",None,None,None,None,None,None,None,None,None),
(5,1,"AdwStatusPage","title","Mullvad Exit Nodes",None,None,None,None,None,None,None,None,None),
(5,3,"GtkBox","spacing","12",None,None,None,None,None,None,None,None,None),
(5,3,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None)