ipn/ipnstate: add PeerStatus.AltSharerUserID, stop mangling Node.User

In b987b2ab18 (2021-01-12) when we introduced sharing we mapped
the sharer to the userid at a low layer, mostly to fix the display of
"tailscale status" and the client UIs, but also some tests.

The commit earlier today, 7dec09d169, removed the 2.5yo option
to let clients disable that automatic mapping, as clearly we were never
getting around to it.

This plumbs the Sharer UserID all the way to ipnstatus so the CLI
itself can choose to print out the Sharer's identity over the node's
original owner.

Then we stop mangling Node.User and let clients decide how they want
to render things.

To ease the migration for the Windows GUI (which currently operates on
tailcfg.Node via the NetMap from WatchIPNBus, instead of PeerStatus),
a new method Node.SharerOrUser is added to do the mapping of
Sharer-else-User.

Updates #1909
Updates tailscale/corp#1183

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick
2023-08-19 15:06:23 -07:00
committed by Brad Fitzpatrick
parent d483ed7774
commit 4511e7d64e
5 changed files with 45 additions and 19 deletions

View File

@@ -23,6 +23,7 @@ import (
"tailscale.com/ipn"
"tailscale.com/ipn/ipnstate"
"tailscale.com/net/interfaces"
"tailscale.com/util/cmpx"
"tailscale.com/util/dnsname"
)
@@ -308,12 +309,20 @@ func dnsOrQuoteHostname(st *ipnstate.Status, ps *ipnstate.PeerStatus) string {
}
func ownerLogin(st *ipnstate.Status, ps *ipnstate.PeerStatus) string {
if ps.UserID.IsZero() {
// We prioritize showing the name of the sharer as the owner of a node if
// it's different from the node's user. This is less surprising: if user B
// from a company shares user's C node from the same company with user A who
// don't know user C, user A might be surprised to see user C listed in
// their netmap. We've historically (2021-01..2023-08) always shown the
// sharer's name in the UI. Perhaps we want to show both here? But the CLI's
// a bit space constrained.
uid := cmpx.Or(ps.AltSharerUserID, ps.UserID)
if uid.IsZero() {
return "-"
}
u, ok := st.User[ps.UserID]
u, ok := st.User[uid]
if !ok {
return fmt.Sprint(ps.UserID)
return fmt.Sprint(uid)
}
if i := strings.Index(u.LoginName, "@"); i != -1 {
return u.LoginName[:i+1]