Browse Source

ipn: only use Prefs, not computed stateKey, to determine server mode

When the service was running without a client (e.g. after a reboot)
and then the owner logs in and the GUI attaches, the computed state
key changed to "" (driven by frontend prefs), and then it was falling
out of server mode, despite the GUI-provided prefs still saying it
wanted server mode.

Also add some logging. And remove a scary "Access denied" from a
user-visible error, making the two possible already-in-use error
messages consistent with each other.
Brad Fitzpatrick 5 years ago
parent
commit
07b6ffd55c
2 changed files with 3 additions and 2 deletions
  1. 1 1
      ipn/ipnserver/server.go
  2. 2 1
      ipn/local.go

+ 1 - 1
ipn/ipnserver/server.go

@@ -314,7 +314,7 @@ func (s *server) checkConnIdentityLocked(ci connIdentity) error {
 	}
 	}
 	if su := s.serverModeUser; su != nil && ci.UserID != su.Uid {
 	if su := s.serverModeUser; su != nil && ci.UserID != su.Uid {
 		//lint:ignore ST1005 we want to capitalize Tailscale here
 		//lint:ignore ST1005 we want to capitalize Tailscale here
-		return inUseOtherUserError{fmt.Errorf("Tailscale running as %s. Access denied.", su.Username)}
+		return inUseOtherUserError{fmt.Errorf("Tailscale already in use by %s", su.Username)}
 	}
 	}
 	return nil
 	return nil
 }
 }

+ 2 - 1
ipn/local.go

@@ -415,10 +415,11 @@ func (b *LocalBackend) Start(opts Options) error {
 		return fmt.Errorf("loading requested state: %v", err)
 		return fmt.Errorf("loading requested state: %v", err)
 	}
 	}
 
 
-	b.inServerMode = b.stateKey != ""
+	b.inServerMode = b.prefs.ForceDaemon
 	b.serverURL = b.prefs.ControlURL
 	b.serverURL = b.prefs.ControlURL
 	hostinfo.RoutableIPs = append(hostinfo.RoutableIPs, b.prefs.AdvertiseRoutes...)
 	hostinfo.RoutableIPs = append(hostinfo.RoutableIPs, b.prefs.AdvertiseRoutes...)
 	hostinfo.RequestTags = append(hostinfo.RequestTags, b.prefs.AdvertiseTags...)
 	hostinfo.RequestTags = append(hostinfo.RequestTags, b.prefs.AdvertiseTags...)
+	b.logf("Start: serverMode=%v; stateKey=%q; tags=%q; routes=%v; url=%v", b.inServerMode, b.stateKey, b.prefs.AdvertiseTags, b.prefs.AdvertiseRoutes, b.prefs.ControlURL)
 	applyPrefsToHostinfo(hostinfo, b.prefs)
 	applyPrefsToHostinfo(hostinfo, b.prefs)
 
 
 	b.notify = opts.Notify
 	b.notify = opts.Notify