From faa891c1f2ff759f4e5cbc158f310b3201d91b59 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 19 Aug 2021 08:36:13 -0700 Subject: [PATCH] client/tailscale,ipn/localapi: warn on tailscale/tailscaled version skew Fixes #1905 Signed-off-by: Brad Fitzpatrick --- client/tailscale/tailscale.go | 5 +++++ ipn/localapi/localapi.go | 2 ++ 2 files changed, 7 insertions(+) diff --git a/client/tailscale/tailscale.go b/client/tailscale/tailscale.go index fb4f7153b..e5e22020a 100644 --- a/client/tailscale/tailscale.go +++ b/client/tailscale/tailscale.go @@ -17,6 +17,7 @@ import ( "net" "net/http" "net/url" + "os" "strconv" "strings" "time" @@ -28,6 +29,7 @@ import ( "tailscale.com/paths" "tailscale.com/safesocket" "tailscale.com/tailcfg" + "tailscale.com/version" ) // TailscaledSocket is the tailscaled Unix socket. @@ -94,6 +96,9 @@ func send(ctx context.Context, method, path string, wantStatus int, body io.Read return nil, err } defer res.Body.Close() + if server := res.Header.Get("Tailscale-Version"); server != version.Long { + fmt.Fprintf(os.Stderr, "Warning: client version %q != tailscaled server version %q\n", version.Long, server) + } slurp, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err diff --git a/ipn/localapi/localapi.go b/ipn/localapi/localapi.go index 6a5116d90..e424dc5d7 100644 --- a/ipn/localapi/localapi.go +++ b/ipn/localapi/localapi.go @@ -30,6 +30,7 @@ import ( "tailscale.com/ipn/ipnstate" "tailscale.com/tailcfg" "tailscale.com/types/logger" + "tailscale.com/version" ) func randHex(n int) string { @@ -64,6 +65,7 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.Error(w, "server has no local backend", http.StatusInternalServerError) return } + w.Header().Set("Tailscale-Version", version.Long) if h.RequiredPassword != "" { _, pass, ok := r.BasicAuth() if !ok {