|
|
|
|
@ -29,6 +29,7 @@ import ( |
|
|
|
|
"tailscale.com/client/tailscale" |
|
|
|
|
"tailscale.com/client/tailscale/apitype" |
|
|
|
|
"tailscale.com/ipn" |
|
|
|
|
"tailscale.com/net/tsaddr" |
|
|
|
|
"tailscale.com/version" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
@ -98,7 +99,7 @@ func runCp(ctx context.Context, args []string) error { |
|
|
|
|
|
|
|
|
|
peerAPIBase, lastSeen, isOffline, err := discoverPeerAPIBase(ctx, ip) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
return fmt.Errorf("can't send to %s: %v", target, err) |
|
|
|
|
} |
|
|
|
|
if isOffline { |
|
|
|
|
fmt.Fprintf(os.Stderr, "# warning: %s is offline\n", target) |
|
|
|
|
@ -203,7 +204,32 @@ func discoverPeerAPIBase(ctx context.Context, ipStr string) (base string, lastSe |
|
|
|
|
return ft.PeerAPIURL, lastSeen, isOffline, nil |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return "", time.Time{}, false, errors.New("target seems to be running an old Tailscale version") |
|
|
|
|
return "", time.Time{}, false, fileTargetErrorDetail(ctx, ip) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// fileTargetErrorDetail returns a non-nil error saying why ip is an
|
|
|
|
|
// invalid file sharing target.
|
|
|
|
|
func fileTargetErrorDetail(ctx context.Context, ip netaddr.IP) error { |
|
|
|
|
found := false |
|
|
|
|
if st, err := tailscale.Status(ctx); err == nil && st.Self != nil { |
|
|
|
|
for _, peer := range st.Peer { |
|
|
|
|
for _, pip := range peer.TailscaleIPs { |
|
|
|
|
if pip == ip { |
|
|
|
|
found = true |
|
|
|
|
if peer.UserID != st.Self.UserID { |
|
|
|
|
return errors.New("owned by different user; can only send files to your own devices") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if found { |
|
|
|
|
return errors.New("target seems to be running an old Tailscale version") |
|
|
|
|
} |
|
|
|
|
if !tsaddr.IsTailscaleIP(ip) { |
|
|
|
|
return fmt.Errorf("unknown target; %v is not a Tailscale IP address", ip) |
|
|
|
|
} |
|
|
|
|
return errors.New("unknown target; not in your Tailnet") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const maxSniff = 4 << 20 |
|
|
|
|
|