ipn/ipnlocal: make FileTargets check IPN state first

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2021-04-29 10:26:53 -07:00
parent b9f8dc7867
commit b7a497a30b
2 changed files with 33 additions and 3 deletions

View File

@ -2425,13 +2425,13 @@ func (b *LocalBackend) FileTargets() ([]*apitype.FileTarget, error) {
b.mu.Lock()
defer b.mu.Unlock()
if !b.capFileSharing {
return nil, errors.New("file sharing not enabled by Tailscale admin")
}
nm := b.netMap
if b.state != ipn.Running || nm == nil {
return nil, errors.New("not connected")
}
if !b.capFileSharing {
return nil, errors.New("file sharing not enabled by Tailscale admin")
}
for _, p := range nm.Peers {
if p.User != nm.User {
continue

View File

@ -504,3 +504,33 @@ func TestLazyMachineKeyGeneration(t *testing.T) {
// hit panicOnUseTransport).
time.Sleep(500 * time.Millisecond)
}
func TestFileTargets(t *testing.T) {
b := new(LocalBackend)
_, err := b.FileTargets()
if got, want := fmt.Sprint(err), "not connected"; got != want {
t.Errorf("before connect: got %q; want %q", got, want)
}
b.netMap = new(netmap.NetworkMap)
_, err = b.FileTargets()
if got, want := fmt.Sprint(err), "not connected"; got != want {
t.Errorf("non-running netmap: got %q; want %q", got, want)
}
b.state = ipn.Running
_, err = b.FileTargets()
if got, want := fmt.Sprint(err), "file sharing not enabled by Tailscale admin"; got != want {
t.Errorf("without cap: got %q; want %q", got, want)
}
b.capFileSharing = true
got, err := b.FileTargets()
if err != nil {
t.Fatal(err)
}
if len(got) != 0 {
t.Fatalf("unexpected %d peers", len(got))
}
// (other cases handled by TestPeerAPIBase above)
}