summaryrefslogtreecommitdiffhomepage
path: root/ipn
diff options
context:
space:
mode:
Diffstat (limited to 'ipn')
-rw-r--r--ipn/backend.go14
-rw-r--r--ipn/ipnlocal/local.go10
-rw-r--r--ipn/ipnlocal/local_test.go42
3 files changed, 12 insertions, 54 deletions
diff --git a/ipn/backend.go b/ipn/backend.go
index b5aa78c2d..89356c30b 100644
--- a/ipn/backend.go
+++ b/ipn/backend.go
@@ -17,13 +17,13 @@ import (
type State int
const (
- NoState = State(iota)
- InUseOtherUser
- NeedsLogin
- NeedsMachineAuth
- Stopped
- Starting
- Running
+ NoState = State(iota)
+ InUseOtherUser // backend is in use by another user
+ NeedsLogin // an *interactive* user login is required; URL available
+ NeedsMachineAuth // logged in, but machine key needs approval
+ Stopped // user requested WantRunning=false
+ Starting // in transition from stopped to running
+ Running // network is connected
)
// GoogleIDToken Type is the tailcfg.Oauth2Token.TokenType for the Google
diff --git a/ipn/ipnlocal/local.go b/ipn/ipnlocal/local.go
index b04061b7f..503df874d 100644
--- a/ipn/ipnlocal/local.go
+++ b/ipn/ipnlocal/local.go
@@ -627,7 +627,6 @@ func (b *LocalBackend) Start(opts ipn.Options) error {
return errors.New("no state key or prefs provided")
}
- defer b.stateMachine()
if opts.Prefs != nil {
b.logf("Start: %v", opts.Prefs.Pretty())
} else {
@@ -786,9 +785,10 @@ func (b *LocalBackend) Start(opts ipn.Options) error {
b.send(ipn.Notify{BackendLogID: &blid})
b.send(ipn.Notify{Prefs: prefs})
- if wantRunning {
- cc.Login(nil, controlclient.LoginDefault)
- }
+ // Even if we don't want to be *connected* to tailscale right now,
+ // we can attempt the non-interactive login process right away,
+ // which will make connecting fast later.
+ cc.Login(nil, controlclient.LoginDefault)
return nil
}
@@ -2105,7 +2105,7 @@ func (b *LocalBackend) nextState() ipn.State {
switch {
case netMap == nil:
- if cc.AuthCantContinue() {
+ if cc.AuthCantContinue() && b.authURL != "" {
// Auth was interrupted or waiting for URL visit,
// so it won't proceed without human help.
return ipn.NeedsLogin
diff --git a/ipn/ipnlocal/local_test.go b/ipn/ipnlocal/local_test.go
index fa2f7cef2..733a7a066 100644
--- a/ipn/ipnlocal/local_test.go
+++ b/ipn/ipnlocal/local_test.go
@@ -5,20 +5,15 @@
package ipnlocal
import (
- "bytes"
- "fmt"
"net/http"
"reflect"
- "sync"
"testing"
"inet.af/netaddr"
- "tailscale.com/ipn"
"tailscale.com/net/interfaces"
"tailscale.com/net/tsaddr"
"tailscale.com/tailcfg"
"tailscale.com/types/netmap"
- "tailscale.com/wgengine"
"tailscale.com/wgengine/wgcfg"
)
@@ -433,40 +428,3 @@ func (panicOnUseTransport) RoundTrip(*http.Request) (*http.Response, error) {
}
var nl = []byte("\n")
-
-func TestStartsInNeedsLoginState(t *testing.T) {
- var (
- mu sync.Mutex
- logBuf bytes.Buffer
- )
- logf := func(format string, a ...interface{}) {
- mu.Lock()
- defer mu.Unlock()
- fmt.Fprintf(&logBuf, format, a...)
- if !bytes.HasSuffix(logBuf.Bytes(), nl) {
- logBuf.Write(nl)
- }
- }
- store := new(ipn.MemoryStore)
- eng, err := wgengine.NewFakeUserspaceEngine(logf, 0)
- if err != nil {
- t.Fatalf("NewFakeUserspaceEngine: %v", err)
- }
- lb, err := NewLocalBackend(logf, "logid", store, eng)
- if err != nil {
- t.Fatalf("NewLocalBackend: %v", err)
- }
-
- lb.SetHTTPTestClient(&http.Client{
- Transport: panicOnUseTransport{}, // validate we don't send HTTP requests
- })
-
- if err := lb.Start(ipn.Options{
- StateKey: ipn.GlobalDaemonStateKey,
- }); err != nil {
- t.Fatalf("Start: %v", err)
- }
- if st := lb.State(); st != ipn.NeedsLogin {
- t.Errorf("State = %v; want NeedsLogin", st)
- }
-}