From 949b15d85837cd0a5b380007a0207754ac813a33 Mon Sep 17 00:00:00 2001 From: Andrea Gottardo Date: Tue, 30 Jul 2024 13:39:25 -0700 Subject: [PATCH] net/captivedetection: call SetHealthy once connectivity restored (#12974) Fixes tailscale/tailscale#12973 Updates tailscale/tailscale#1634 There was a logic issue in the captive detection code we shipped in https://github.com/tailscale/tailscale/pull/12707. Assume a captive portal has been detected, and the user notified. Upon switching to another Wi-Fi that does *not* have a captive portal, we were issuing a signal to interrupt any pending captive detection attempt. However, we were not also setting the `captive-portal-detected` warnable to healthy. The result was that any "captive portal detected" alert would not be cleared from the UI. Also fixes a broken log statement value. Signed-off-by: Andrea Gottardo --- ipn/ipnlocal/local.go | 3 +++ net/captivedetection/captivedetection.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go index 14b648b9f..39af4f86e 100644 --- a/ipn/ipnlocal/local.go +++ b/ipn/ipnlocal/local.go @@ -780,6 +780,9 @@ func (b *LocalBackend) onHealthChange(w *health.Warnable, us *health.UnhealthySt case <-ctx.Done(): } } else { + // If connectivity is not impacted, we know for sure we're not behind a captive portal, + // so drop any warning, and signal that we don't need captive portal detection. + b.health.SetHealthy(captivePortalWarnable) select { case b.needsCaptiveDetection <- false: case <-ctx.Done(): diff --git a/net/captivedetection/captivedetection.go b/net/captivedetection/captivedetection.go index 1b6e61e54..df0030c7d 100644 --- a/net/captivedetection/captivedetection.go +++ b/net/captivedetection/captivedetection.go @@ -97,7 +97,7 @@ func (d *Detector) detectCaptivePortalWithGOOS(ctx context.Context, netMon *netm d.logf("[v2] attempting to do captive portal detection on interface %s", ifName) res := d.detectOnInterface(ctx, i.Index, endpoints) if res { - d.logf("DetectCaptivePortal(found=true,ifName=%s)", found, ifName) + d.logf("DetectCaptivePortal(found=true,ifName=%s)", ifName) return true } }