Update dependencies
This commit is contained in:
104
vendor/tailscale.com/tailcfg/c2ntypes.go
generated
vendored
Normal file
104
vendor/tailscale.com/tailcfg/c2ntypes.go
generated
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// c2n (control-to-node) API types.
|
||||
|
||||
package tailcfg
|
||||
|
||||
import "net/netip"
|
||||
|
||||
// C2NSSHUsernamesRequest is the request for the /ssh/usernames.
|
||||
// A GET request without a request body is equivalent to the zero value of this type.
|
||||
// Otherwise, a POST request with a JSON-encoded request body is expected.
|
||||
type C2NSSHUsernamesRequest struct {
|
||||
// Exclude optionally specifies usernames to exclude
|
||||
// from the response.
|
||||
Exclude map[string]bool `json:",omitempty"`
|
||||
|
||||
// Max is the maximum number of usernames to return.
|
||||
// If zero, a default limit is used.
|
||||
Max int `json:",omitempty"`
|
||||
}
|
||||
|
||||
// C2NSSHUsernamesResponse is the response (from node to control) from the
|
||||
// /ssh/usernames handler.
|
||||
//
|
||||
// It returns username auto-complete suggestions for a user to SSH to this node.
|
||||
// It's only shown to people who already have SSH access to the node. If this
|
||||
// returns multiple usernames, only the usernames that would have access per the
|
||||
// tailnet's ACLs are shown to the user so as to not leak the existence of
|
||||
// usernames.
|
||||
type C2NSSHUsernamesResponse struct {
|
||||
// Usernames is the list of usernames to suggest. If the machine has many
|
||||
// users, this list may be truncated. If getting the list of usernames might
|
||||
// be too slow or unavailable, this list might be empty. This is effectively
|
||||
// just a best effort set of hints.
|
||||
Usernames []string
|
||||
}
|
||||
|
||||
// C2NUpdateResponse is the response (from node to control) from the /update
|
||||
// handler. It tells control the status of its request for the node to update
|
||||
// its Tailscale installation.
|
||||
type C2NUpdateResponse struct {
|
||||
// Err is the error message, if any.
|
||||
Err string `json:",omitempty"`
|
||||
|
||||
// Enabled indicates whether the user has opted in to updates triggered from
|
||||
// control.
|
||||
Enabled bool
|
||||
|
||||
// Supported indicates whether remote updates are supported on this
|
||||
// OS/platform.
|
||||
Supported bool
|
||||
|
||||
// Started indicates whether the update has started.
|
||||
Started bool
|
||||
}
|
||||
|
||||
// C2NPostureIdentityResponse contains either a set of identifying serial
|
||||
// numbers and hardware addresses from the client, or a boolean flag
|
||||
// indicating that the machine has opted out of posture collection.
|
||||
type C2NPostureIdentityResponse struct {
|
||||
// SerialNumbers is a list of serial numbers of the client machine.
|
||||
SerialNumbers []string `json:",omitempty"`
|
||||
|
||||
// IfaceHardwareAddrs is a list of hardware addresses (MAC addresses)
|
||||
// of the client machine's network interfaces.
|
||||
IfaceHardwareAddrs []string `json:",omitempty"`
|
||||
|
||||
// PostureDisabled indicates if the machine has opted out of
|
||||
// device posture collection.
|
||||
PostureDisabled bool `json:",omitempty"`
|
||||
}
|
||||
|
||||
// C2NAppConnectorDomainRoutesResponse contains a map of domains to
|
||||
// slice of addresses, indicating what IP addresses have been resolved
|
||||
// for each domain.
|
||||
type C2NAppConnectorDomainRoutesResponse struct {
|
||||
// Domains is a map of lower case domain names with no trailing dot,
|
||||
// to a list of resolved IP addresses.
|
||||
Domains map[string][]netip.Addr
|
||||
}
|
||||
|
||||
// C2NTLSCertInfo describes the state of a cached TLS certificate.
|
||||
type C2NTLSCertInfo struct {
|
||||
// Valid means that the node has a cached and valid (not expired)
|
||||
// certificate.
|
||||
Valid bool `json:",omitempty"`
|
||||
// Error is the error string if the certificate is not valid. If error is
|
||||
// non-empty, the other booleans below might say why.
|
||||
Error string `json:",omitempty"`
|
||||
|
||||
// Missing is whether the error string indicates a missing certificate
|
||||
// that's never been fetched or isn't on disk.
|
||||
Missing bool `json:",omitempty"`
|
||||
|
||||
// Expired is whether the error string indicates an expired certificate.
|
||||
Expired bool `json:",omitempty"`
|
||||
|
||||
NotBefore string `json:",omitempty"` // RFC3339, if Valid
|
||||
NotAfter string `json:",omitempty"` // RFC3339, if Valid
|
||||
|
||||
// TODO(bradfitz): add fields for whether an ACME fetch is currently in
|
||||
// process and when it started, etc.
|
||||
}
|
||||
205
vendor/tailscale.com/tailcfg/derpmap.go
generated
vendored
Normal file
205
vendor/tailscale.com/tailcfg/derpmap.go
generated
vendored
Normal file
@@ -0,0 +1,205 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package tailcfg
|
||||
|
||||
import (
|
||||
"net/netip"
|
||||
"sort"
|
||||
|
||||
"tailscale.com/types/key"
|
||||
)
|
||||
|
||||
// DERPMap describes the set of DERP packet relay servers that are available.
|
||||
type DERPMap struct {
|
||||
// HomeParams, if non-nil, is a change in home parameters.
|
||||
//
|
||||
// The rest of the DEPRMap fields, if zero, means unchanged.
|
||||
HomeParams *DERPHomeParams `json:",omitempty"`
|
||||
|
||||
// Regions is the set of geographic regions running DERP node(s).
|
||||
//
|
||||
// It's keyed by the DERPRegion.RegionID.
|
||||
//
|
||||
// The numbers are not necessarily contiguous.
|
||||
Regions map[int]*DERPRegion
|
||||
|
||||
// OmitDefaultRegions specifies to not use Tailscale's DERP servers, and only use those
|
||||
// specified in this DERPMap. If there are none set outside of the defaults, this is a noop.
|
||||
//
|
||||
// This field is only meaningful if the Regions map is non-nil (indicating a change).
|
||||
OmitDefaultRegions bool `json:"omitDefaultRegions,omitempty"`
|
||||
}
|
||||
|
||||
// / RegionIDs returns the sorted region IDs.
|
||||
func (m *DERPMap) RegionIDs() []int {
|
||||
ret := make([]int, 0, len(m.Regions))
|
||||
for rid := range m.Regions {
|
||||
ret = append(ret, rid)
|
||||
}
|
||||
sort.Ints(ret)
|
||||
return ret
|
||||
}
|
||||
|
||||
// DERPHomeParams contains parameters from the server related to selecting a
|
||||
// DERP home region (sometimes referred to as the "preferred DERP").
|
||||
type DERPHomeParams struct {
|
||||
// RegionScore scales latencies of DERP regions by a given scaling
|
||||
// factor when determining which region to use as the home
|
||||
// ("preferred") DERP. Scores in the range (0, 1) will cause this
|
||||
// region to be proportionally more preferred, and scores in the range
|
||||
// (1, ∞) will penalize a region.
|
||||
//
|
||||
// If a region is not present in this map, it is treated as having a
|
||||
// score of 1.0.
|
||||
//
|
||||
// Scores should not be 0 or negative; such scores will be ignored.
|
||||
//
|
||||
// A nil map means no change from the previous value (if any); an empty
|
||||
// non-nil map can be sent to reset all scores back to 1.0.
|
||||
RegionScore map[int]float64 `json:",omitempty"`
|
||||
}
|
||||
|
||||
// DERPRegion is a geographic region running DERP relay node(s).
|
||||
//
|
||||
// Client nodes discover which region they're closest to, advertise
|
||||
// that "home" DERP region (previously called "home node", when there
|
||||
// was only 1 node per region) and maintain a persistent connection
|
||||
// that region as long as it's the closest. Client nodes will further
|
||||
// connect to other regions as necessary to communicate with peers
|
||||
// advertising other regions as their homes.
|
||||
type DERPRegion struct {
|
||||
// RegionID is a unique integer for a geographic region.
|
||||
//
|
||||
// It corresponds to the legacy derpN.tailscale.com hostnames
|
||||
// used by older clients. (Older clients will continue to resolve
|
||||
// derpN.tailscale.com when contacting peers, rather than use
|
||||
// the server-provided DERPMap)
|
||||
//
|
||||
// RegionIDs must be non-zero, positive, and guaranteed to fit
|
||||
// in a JavaScript number.
|
||||
//
|
||||
// RegionIDs in range 900-999 are reserved for end users to run their
|
||||
// own DERP nodes.
|
||||
RegionID int
|
||||
|
||||
// RegionCode is a short name for the region. It's usually a popular
|
||||
// city or airport code in the region: "nyc", "sf", "sin",
|
||||
// "fra", etc.
|
||||
RegionCode string
|
||||
|
||||
// RegionName is a long English name for the region: "New York City",
|
||||
// "San Francisco", "Singapore", "Frankfurt", etc.
|
||||
RegionName string
|
||||
|
||||
// Latitude, Longitude are optional geographical coordinates of the DERP region's city, in degrees.
|
||||
Latitude float64 `json:",omitempty"`
|
||||
Longitude float64 `json:",omitempty"`
|
||||
|
||||
// Avoid is whether the client should avoid picking this as its home
|
||||
// region. The region should only be used if a peer is there.
|
||||
// Clients already using this region as their home should migrate
|
||||
// away to a new region without Avoid set.
|
||||
Avoid bool `json:",omitempty"`
|
||||
|
||||
// Nodes are the DERP nodes running in this region, in
|
||||
// priority order for the current client. Client TLS
|
||||
// connections should ideally only go to the first entry
|
||||
// (falling back to the second if necessary). STUN packets
|
||||
// should go to the first 1 or 2.
|
||||
//
|
||||
// If nodes within a region route packets amongst themselves,
|
||||
// but not to other regions. That said, each user/domain
|
||||
// should get a the same preferred node order, so if all nodes
|
||||
// for a user/network pick the first one (as they should, when
|
||||
// things are healthy), the inter-cluster routing is minimal
|
||||
// to zero.
|
||||
Nodes []*DERPNode
|
||||
}
|
||||
|
||||
// DERPNode describes a DERP packet relay node running within a DERPRegion.
|
||||
type DERPNode struct {
|
||||
// Name is a unique node name (across all regions).
|
||||
// It is not a host name.
|
||||
// It's typically of the form "1b", "2a", "3b", etc. (region
|
||||
// ID + suffix within that region)
|
||||
Name string
|
||||
|
||||
// RegionID is the RegionID of the DERPRegion that this node
|
||||
// is running in.
|
||||
RegionID int
|
||||
|
||||
// HostName is the DERP node's hostname.
|
||||
//
|
||||
// It is required but need not be unique; multiple nodes may
|
||||
// have the same HostName but vary in configuration otherwise.
|
||||
HostName string
|
||||
|
||||
// CertName optionally specifies the expected TLS cert common
|
||||
// name. If empty, HostName is used. If CertName is non-empty,
|
||||
// HostName is only used for the TCP dial (if IPv4/IPv6 are
|
||||
// not present) + TLS ClientHello.
|
||||
CertName string `json:",omitempty"`
|
||||
|
||||
// IPv4 optionally forces an IPv4 address to use, instead of using DNS.
|
||||
// If empty, A record(s) from DNS lookups of HostName are used.
|
||||
// If the string is not an IPv4 address, IPv4 is not used; the
|
||||
// conventional string to disable IPv4 (and not use DNS) is
|
||||
// "none".
|
||||
IPv4 string `json:",omitempty"`
|
||||
|
||||
// IPv6 optionally forces an IPv6 address to use, instead of using DNS.
|
||||
// If empty, AAAA record(s) from DNS lookups of HostName are used.
|
||||
// If the string is not an IPv6 address, IPv6 is not used; the
|
||||
// conventional string to disable IPv6 (and not use DNS) is
|
||||
// "none".
|
||||
IPv6 string `json:",omitempty"`
|
||||
|
||||
// Port optionally specifies a STUN port to use.
|
||||
// Zero means 3478.
|
||||
// To disable STUN on this node, use -1.
|
||||
STUNPort int `json:",omitempty"`
|
||||
|
||||
// STUNOnly marks a node as only a STUN server and not a DERP
|
||||
// server.
|
||||
STUNOnly bool `json:",omitempty"`
|
||||
|
||||
// DERPPort optionally provides an alternate TLS port number
|
||||
// for the DERP HTTPS server.
|
||||
//
|
||||
// If zero, 443 is used.
|
||||
DERPPort int `json:",omitempty"`
|
||||
|
||||
// InsecureForTests is used by unit tests to disable TLS verification.
|
||||
// It should not be set by users.
|
||||
InsecureForTests bool `json:",omitempty"`
|
||||
|
||||
// STUNTestIP is used in tests to override the STUN server's IP.
|
||||
// If empty, it's assumed to be the same as the DERP server.
|
||||
STUNTestIP string `json:",omitempty"`
|
||||
|
||||
// CanPort80 specifies whether this DERP node is accessible over HTTP
|
||||
// on port 80 specifically. This is used for captive portal checks.
|
||||
CanPort80 bool `json:",omitempty"`
|
||||
}
|
||||
|
||||
func (n *DERPNode) IsTestNode() bool {
|
||||
return n.STUNTestIP != "" || n.IPv4 == "127.0.0.1"
|
||||
}
|
||||
|
||||
// DotInvalid is a fake DNS TLD used in tests for an invalid hostname.
|
||||
const DotInvalid = ".invalid"
|
||||
|
||||
// DERPAdmitClientRequest is the JSON request body of a POST to derper's
|
||||
// --verify-client-url admission controller URL.
|
||||
type DERPAdmitClientRequest struct {
|
||||
NodePublic key.NodePublic // key to query for admission
|
||||
Source netip.Addr // derp client's IP address
|
||||
}
|
||||
|
||||
// DERPAdmitClientResponse is the response to a DERPAdmitClientRequest.
|
||||
type DERPAdmitClientResponse struct {
|
||||
Allow bool // whether to permit client
|
||||
|
||||
// TODO(bradfitz,maisem): bandwidth limits, etc?
|
||||
}
|
||||
187
vendor/tailscale.com/tailcfg/proto_port_range.go
generated
vendored
Normal file
187
vendor/tailscale.com/tailcfg/proto_port_range.go
generated
vendored
Normal file
@@ -0,0 +1,187 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package tailcfg
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"tailscale.com/types/ipproto"
|
||||
"tailscale.com/util/vizerror"
|
||||
)
|
||||
|
||||
var (
|
||||
errEmptyProtocol = errors.New("empty protocol")
|
||||
errEmptyString = errors.New("empty string")
|
||||
)
|
||||
|
||||
// ProtoPortRange is used to encode "proto:port" format.
|
||||
// The following formats are supported:
|
||||
//
|
||||
// "*" allows all TCP, UDP and ICMP traffic on all ports.
|
||||
// "<ports>" allows all TCP, UDP and ICMP traffic on the specified ports.
|
||||
// "proto:*" allows traffic of the specified proto on all ports.
|
||||
// "proto:<port>" allows traffic of the specified proto on the specified port.
|
||||
//
|
||||
// Ports are either a single port number or a range of ports (e.g. "80-90").
|
||||
// String named protocols support names that ipproto.Proto accepts.
|
||||
type ProtoPortRange struct {
|
||||
// Proto is the IP protocol number.
|
||||
// If Proto is 0, it means TCP+UDP+ICMP(4+6).
|
||||
Proto int
|
||||
Ports PortRange
|
||||
}
|
||||
|
||||
// UnmarshalText implements the encoding.TextUnmarshaler interface. See
|
||||
// ProtoPortRange for the format.
|
||||
func (ppr *ProtoPortRange) UnmarshalText(text []byte) error {
|
||||
ppr2, err := parseProtoPortRange(string(text))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*ppr = *ppr2
|
||||
return nil
|
||||
}
|
||||
|
||||
// MarshalText implements the encoding.TextMarshaler interface. See
|
||||
// ProtoPortRange for the format.
|
||||
func (ppr *ProtoPortRange) MarshalText() ([]byte, error) {
|
||||
if ppr.Proto == 0 && ppr.Ports == (PortRange{}) {
|
||||
return []byte{}, nil
|
||||
}
|
||||
return []byte(ppr.String()), nil
|
||||
}
|
||||
|
||||
// String implements the stringer interface. See ProtoPortRange for the
|
||||
// format.
|
||||
func (ppr ProtoPortRange) String() string {
|
||||
if ppr.Proto == 0 {
|
||||
if ppr.Ports == PortRangeAny {
|
||||
return "*"
|
||||
}
|
||||
}
|
||||
var buf strings.Builder
|
||||
if ppr.Proto != 0 {
|
||||
// Proto.MarshalText is infallible.
|
||||
text, _ := ipproto.Proto(ppr.Proto).MarshalText()
|
||||
buf.Write(text)
|
||||
buf.Write([]byte(":"))
|
||||
}
|
||||
pr := ppr.Ports
|
||||
if pr.First == pr.Last {
|
||||
fmt.Fprintf(&buf, "%d", pr.First)
|
||||
} else if pr == PortRangeAny {
|
||||
buf.WriteByte('*')
|
||||
} else {
|
||||
fmt.Fprintf(&buf, "%d-%d", pr.First, pr.Last)
|
||||
}
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
// ParseProtoPortRanges parses a slice of IP port range fields.
|
||||
func ParseProtoPortRanges(ips []string) ([]ProtoPortRange, error) {
|
||||
var out []ProtoPortRange
|
||||
for _, p := range ips {
|
||||
ppr, err := parseProtoPortRange(p)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out = append(out, *ppr)
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func parseProtoPortRange(ipProtoPort string) (*ProtoPortRange, error) {
|
||||
if ipProtoPort == "" {
|
||||
return nil, errEmptyString
|
||||
}
|
||||
if ipProtoPort == "*" {
|
||||
return &ProtoPortRange{Ports: PortRangeAny}, nil
|
||||
}
|
||||
if !strings.Contains(ipProtoPort, ":") {
|
||||
ipProtoPort = "*:" + ipProtoPort
|
||||
}
|
||||
protoStr, portRange, err := parseHostPortRange(ipProtoPort)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if protoStr == "" {
|
||||
return nil, errEmptyProtocol
|
||||
}
|
||||
|
||||
ppr := &ProtoPortRange{
|
||||
Ports: portRange,
|
||||
}
|
||||
if protoStr == "*" {
|
||||
return ppr, nil
|
||||
}
|
||||
var ipProto ipproto.Proto
|
||||
if err := ipProto.UnmarshalText([]byte(protoStr)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
ppr.Proto = int(ipProto)
|
||||
return ppr, nil
|
||||
}
|
||||
|
||||
// parseHostPortRange parses hostport as HOST:PORTS where HOST is
|
||||
// returned unchanged and PORTS is is either "*" or PORTLOW-PORTHIGH ranges.
|
||||
func parseHostPortRange(hostport string) (host string, ports PortRange, err error) {
|
||||
hostport = strings.ToLower(hostport)
|
||||
colon := strings.LastIndexByte(hostport, ':')
|
||||
if colon < 0 {
|
||||
return "", ports, vizerror.New("hostport must contain a colon (\":\")")
|
||||
}
|
||||
host = hostport[:colon]
|
||||
portlist := hostport[colon+1:]
|
||||
|
||||
if strings.Contains(host, ",") {
|
||||
return "", ports, vizerror.New("host cannot contain a comma (\",\")")
|
||||
}
|
||||
|
||||
if portlist == "*" {
|
||||
// Special case: permit hostname:* as a port wildcard.
|
||||
return host, PortRangeAny, nil
|
||||
}
|
||||
|
||||
if len(portlist) == 0 {
|
||||
return "", ports, vizerror.Errorf("invalid port list: %#v", portlist)
|
||||
}
|
||||
|
||||
if strings.Count(portlist, "-") > 1 {
|
||||
return "", ports, vizerror.Errorf("port range %#v: too many dashes(-)", portlist)
|
||||
}
|
||||
|
||||
firstStr, lastStr, isRange := strings.Cut(portlist, "-")
|
||||
|
||||
var first, last uint64
|
||||
first, err = strconv.ParseUint(firstStr, 10, 16)
|
||||
if err != nil {
|
||||
return "", ports, vizerror.Errorf("port range %#v: invalid first integer", portlist)
|
||||
}
|
||||
|
||||
if isRange {
|
||||
last, err = strconv.ParseUint(lastStr, 10, 16)
|
||||
if err != nil {
|
||||
return "", ports, vizerror.Errorf("port range %#v: invalid last integer", portlist)
|
||||
}
|
||||
} else {
|
||||
last = first
|
||||
}
|
||||
|
||||
if first == 0 {
|
||||
return "", ports, vizerror.Errorf("port range %#v: first port must be >0, or use '*' for wildcard", portlist)
|
||||
}
|
||||
|
||||
if first > last {
|
||||
return "", ports, vizerror.Errorf("port range %#v: first port must be >= last port", portlist)
|
||||
}
|
||||
|
||||
return host, newPortRange(uint16(first), uint16(last)), nil
|
||||
}
|
||||
|
||||
func newPortRange(first, last uint16) PortRange {
|
||||
return PortRange{First: first, Last: last}
|
||||
}
|
||||
2843
vendor/tailscale.com/tailcfg/tailcfg.go
generated
vendored
Normal file
2843
vendor/tailscale.com/tailcfg/tailcfg.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
808
vendor/tailscale.com/tailcfg/tailcfg_clone.go
generated
vendored
Normal file
808
vendor/tailscale.com/tailcfg/tailcfg_clone.go
generated
vendored
Normal file
@@ -0,0 +1,808 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// Code generated by tailscale.com/cmd/cloner; DO NOT EDIT.
|
||||
|
||||
package tailcfg
|
||||
|
||||
import (
|
||||
"maps"
|
||||
"net/netip"
|
||||
"time"
|
||||
|
||||
"tailscale.com/types/dnstype"
|
||||
"tailscale.com/types/key"
|
||||
"tailscale.com/types/opt"
|
||||
"tailscale.com/types/ptr"
|
||||
"tailscale.com/types/structs"
|
||||
"tailscale.com/types/tkatype"
|
||||
)
|
||||
|
||||
// Clone makes a deep copy of User.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *User) Clone() *User {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(User)
|
||||
*dst = *src
|
||||
dst.Logins = append(src.Logins[:0:0], src.Logins...)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _UserCloneNeedsRegeneration = User(struct {
|
||||
ID UserID
|
||||
LoginName string
|
||||
DisplayName string
|
||||
ProfilePicURL string
|
||||
Logins []LoginID
|
||||
Created time.Time
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of Node.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *Node) Clone() *Node {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(Node)
|
||||
*dst = *src
|
||||
dst.KeySignature = append(src.KeySignature[:0:0], src.KeySignature...)
|
||||
dst.Addresses = append(src.Addresses[:0:0], src.Addresses...)
|
||||
dst.AllowedIPs = append(src.AllowedIPs[:0:0], src.AllowedIPs...)
|
||||
dst.Endpoints = append(src.Endpoints[:0:0], src.Endpoints...)
|
||||
dst.Hostinfo = src.Hostinfo
|
||||
dst.Tags = append(src.Tags[:0:0], src.Tags...)
|
||||
dst.PrimaryRoutes = append(src.PrimaryRoutes[:0:0], src.PrimaryRoutes...)
|
||||
if dst.LastSeen != nil {
|
||||
dst.LastSeen = ptr.To(*src.LastSeen)
|
||||
}
|
||||
if dst.Online != nil {
|
||||
dst.Online = ptr.To(*src.Online)
|
||||
}
|
||||
dst.Capabilities = append(src.Capabilities[:0:0], src.Capabilities...)
|
||||
if dst.CapMap != nil {
|
||||
dst.CapMap = map[NodeCapability][]RawMessage{}
|
||||
for k := range src.CapMap {
|
||||
dst.CapMap[k] = append([]RawMessage{}, src.CapMap[k]...)
|
||||
}
|
||||
}
|
||||
if dst.SelfNodeV4MasqAddrForThisPeer != nil {
|
||||
dst.SelfNodeV4MasqAddrForThisPeer = ptr.To(*src.SelfNodeV4MasqAddrForThisPeer)
|
||||
}
|
||||
if dst.SelfNodeV6MasqAddrForThisPeer != nil {
|
||||
dst.SelfNodeV6MasqAddrForThisPeer = ptr.To(*src.SelfNodeV6MasqAddrForThisPeer)
|
||||
}
|
||||
if src.ExitNodeDNSResolvers != nil {
|
||||
dst.ExitNodeDNSResolvers = make([]*dnstype.Resolver, len(src.ExitNodeDNSResolvers))
|
||||
for i := range dst.ExitNodeDNSResolvers {
|
||||
if src.ExitNodeDNSResolvers[i] == nil {
|
||||
dst.ExitNodeDNSResolvers[i] = nil
|
||||
} else {
|
||||
dst.ExitNodeDNSResolvers[i] = src.ExitNodeDNSResolvers[i].Clone()
|
||||
}
|
||||
}
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _NodeCloneNeedsRegeneration = Node(struct {
|
||||
ID NodeID
|
||||
StableID StableNodeID
|
||||
Name string
|
||||
User UserID
|
||||
Sharer UserID
|
||||
Key key.NodePublic
|
||||
KeyExpiry time.Time
|
||||
KeySignature tkatype.MarshaledSignature
|
||||
Machine key.MachinePublic
|
||||
DiscoKey key.DiscoPublic
|
||||
Addresses []netip.Prefix
|
||||
AllowedIPs []netip.Prefix
|
||||
Endpoints []netip.AddrPort
|
||||
DERP string
|
||||
Hostinfo HostinfoView
|
||||
Created time.Time
|
||||
Cap CapabilityVersion
|
||||
Tags []string
|
||||
PrimaryRoutes []netip.Prefix
|
||||
LastSeen *time.Time
|
||||
Online *bool
|
||||
MachineAuthorized bool
|
||||
Capabilities []NodeCapability
|
||||
CapMap NodeCapMap
|
||||
UnsignedPeerAPIOnly bool
|
||||
ComputedName string
|
||||
computedHostIfDifferent string
|
||||
ComputedNameWithHost string
|
||||
DataPlaneAuditLogID string
|
||||
Expired bool
|
||||
SelfNodeV4MasqAddrForThisPeer *netip.Addr
|
||||
SelfNodeV6MasqAddrForThisPeer *netip.Addr
|
||||
IsWireGuardOnly bool
|
||||
IsJailed bool
|
||||
ExitNodeDNSResolvers []*dnstype.Resolver
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of Hostinfo.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *Hostinfo) Clone() *Hostinfo {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(Hostinfo)
|
||||
*dst = *src
|
||||
dst.RoutableIPs = append(src.RoutableIPs[:0:0], src.RoutableIPs...)
|
||||
dst.RequestTags = append(src.RequestTags[:0:0], src.RequestTags...)
|
||||
dst.WoLMACs = append(src.WoLMACs[:0:0], src.WoLMACs...)
|
||||
dst.Services = append(src.Services[:0:0], src.Services...)
|
||||
dst.NetInfo = src.NetInfo.Clone()
|
||||
dst.SSH_HostKeys = append(src.SSH_HostKeys[:0:0], src.SSH_HostKeys...)
|
||||
if dst.Location != nil {
|
||||
dst.Location = ptr.To(*src.Location)
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _HostinfoCloneNeedsRegeneration = Hostinfo(struct {
|
||||
IPNVersion string
|
||||
FrontendLogID string
|
||||
BackendLogID string
|
||||
OS string
|
||||
OSVersion string
|
||||
Container opt.Bool
|
||||
Env string
|
||||
Distro string
|
||||
DistroVersion string
|
||||
DistroCodeName string
|
||||
App string
|
||||
Desktop opt.Bool
|
||||
Package string
|
||||
DeviceModel string
|
||||
PushDeviceToken string
|
||||
Hostname string
|
||||
ShieldsUp bool
|
||||
ShareeNode bool
|
||||
NoLogsNoSupport bool
|
||||
WireIngress bool
|
||||
AllowsUpdate bool
|
||||
Machine string
|
||||
GoArch string
|
||||
GoArchVar string
|
||||
GoVersion string
|
||||
RoutableIPs []netip.Prefix
|
||||
RequestTags []string
|
||||
WoLMACs []string
|
||||
Services []Service
|
||||
NetInfo *NetInfo
|
||||
SSH_HostKeys []string
|
||||
Cloud string
|
||||
Userspace opt.Bool
|
||||
UserspaceRouter opt.Bool
|
||||
AppConnector opt.Bool
|
||||
Location *Location
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of NetInfo.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *NetInfo) Clone() *NetInfo {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(NetInfo)
|
||||
*dst = *src
|
||||
dst.DERPLatency = maps.Clone(src.DERPLatency)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _NetInfoCloneNeedsRegeneration = NetInfo(struct {
|
||||
MappingVariesByDestIP opt.Bool
|
||||
HairPinning opt.Bool
|
||||
WorkingIPv6 opt.Bool
|
||||
OSHasIPv6 opt.Bool
|
||||
WorkingUDP opt.Bool
|
||||
WorkingICMPv4 opt.Bool
|
||||
HavePortMap bool
|
||||
UPnP opt.Bool
|
||||
PMP opt.Bool
|
||||
PCP opt.Bool
|
||||
PreferredDERP int
|
||||
LinkType string
|
||||
DERPLatency map[string]float64
|
||||
FirewallMode string
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of Login.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *Login) Clone() *Login {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(Login)
|
||||
*dst = *src
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _LoginCloneNeedsRegeneration = Login(struct {
|
||||
_ structs.Incomparable
|
||||
ID LoginID
|
||||
Provider string
|
||||
LoginName string
|
||||
DisplayName string
|
||||
ProfilePicURL string
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of DNSConfig.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *DNSConfig) Clone() *DNSConfig {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(DNSConfig)
|
||||
*dst = *src
|
||||
if src.Resolvers != nil {
|
||||
dst.Resolvers = make([]*dnstype.Resolver, len(src.Resolvers))
|
||||
for i := range dst.Resolvers {
|
||||
if src.Resolvers[i] == nil {
|
||||
dst.Resolvers[i] = nil
|
||||
} else {
|
||||
dst.Resolvers[i] = src.Resolvers[i].Clone()
|
||||
}
|
||||
}
|
||||
}
|
||||
if dst.Routes != nil {
|
||||
dst.Routes = map[string][]*dnstype.Resolver{}
|
||||
for k := range src.Routes {
|
||||
dst.Routes[k] = append([]*dnstype.Resolver{}, src.Routes[k]...)
|
||||
}
|
||||
}
|
||||
if src.FallbackResolvers != nil {
|
||||
dst.FallbackResolvers = make([]*dnstype.Resolver, len(src.FallbackResolvers))
|
||||
for i := range dst.FallbackResolvers {
|
||||
if src.FallbackResolvers[i] == nil {
|
||||
dst.FallbackResolvers[i] = nil
|
||||
} else {
|
||||
dst.FallbackResolvers[i] = src.FallbackResolvers[i].Clone()
|
||||
}
|
||||
}
|
||||
}
|
||||
dst.Domains = append(src.Domains[:0:0], src.Domains...)
|
||||
dst.Nameservers = append(src.Nameservers[:0:0], src.Nameservers...)
|
||||
dst.CertDomains = append(src.CertDomains[:0:0], src.CertDomains...)
|
||||
dst.ExtraRecords = append(src.ExtraRecords[:0:0], src.ExtraRecords...)
|
||||
dst.ExitNodeFilteredSet = append(src.ExitNodeFilteredSet[:0:0], src.ExitNodeFilteredSet...)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _DNSConfigCloneNeedsRegeneration = DNSConfig(struct {
|
||||
Resolvers []*dnstype.Resolver
|
||||
Routes map[string][]*dnstype.Resolver
|
||||
FallbackResolvers []*dnstype.Resolver
|
||||
Domains []string
|
||||
Proxied bool
|
||||
Nameservers []netip.Addr
|
||||
CertDomains []string
|
||||
ExtraRecords []DNSRecord
|
||||
ExitNodeFilteredSet []string
|
||||
TempCorpIssue13969 string
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of RegisterResponse.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *RegisterResponse) Clone() *RegisterResponse {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(RegisterResponse)
|
||||
*dst = *src
|
||||
dst.User = *src.User.Clone()
|
||||
dst.NodeKeySignature = append(src.NodeKeySignature[:0:0], src.NodeKeySignature...)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _RegisterResponseCloneNeedsRegeneration = RegisterResponse(struct {
|
||||
User User
|
||||
Login Login
|
||||
NodeKeyExpired bool
|
||||
MachineAuthorized bool
|
||||
AuthURL string
|
||||
NodeKeySignature tkatype.MarshaledSignature
|
||||
Error string
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of RegisterResponseAuth.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *RegisterResponseAuth) Clone() *RegisterResponseAuth {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(RegisterResponseAuth)
|
||||
*dst = *src
|
||||
if dst.Oauth2Token != nil {
|
||||
dst.Oauth2Token = ptr.To(*src.Oauth2Token)
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _RegisterResponseAuthCloneNeedsRegeneration = RegisterResponseAuth(struct {
|
||||
_ structs.Incomparable
|
||||
Oauth2Token *Oauth2Token
|
||||
AuthKey string
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of RegisterRequest.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *RegisterRequest) Clone() *RegisterRequest {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(RegisterRequest)
|
||||
*dst = *src
|
||||
dst.Auth = src.Auth.Clone()
|
||||
dst.Hostinfo = src.Hostinfo.Clone()
|
||||
dst.NodeKeySignature = append(src.NodeKeySignature[:0:0], src.NodeKeySignature...)
|
||||
if dst.Timestamp != nil {
|
||||
dst.Timestamp = ptr.To(*src.Timestamp)
|
||||
}
|
||||
dst.DeviceCert = append(src.DeviceCert[:0:0], src.DeviceCert...)
|
||||
dst.Signature = append(src.Signature[:0:0], src.Signature...)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _RegisterRequestCloneNeedsRegeneration = RegisterRequest(struct {
|
||||
_ structs.Incomparable
|
||||
Version CapabilityVersion
|
||||
NodeKey key.NodePublic
|
||||
OldNodeKey key.NodePublic
|
||||
NLKey key.NLPublic
|
||||
Auth *RegisterResponseAuth
|
||||
Expiry time.Time
|
||||
Followup string
|
||||
Hostinfo *Hostinfo
|
||||
Ephemeral bool
|
||||
NodeKeySignature tkatype.MarshaledSignature
|
||||
SignatureType SignatureType
|
||||
Timestamp *time.Time
|
||||
DeviceCert []byte
|
||||
Signature []byte
|
||||
Tailnet string
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of DERPHomeParams.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *DERPHomeParams) Clone() *DERPHomeParams {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(DERPHomeParams)
|
||||
*dst = *src
|
||||
dst.RegionScore = maps.Clone(src.RegionScore)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _DERPHomeParamsCloneNeedsRegeneration = DERPHomeParams(struct {
|
||||
RegionScore map[int]float64
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of DERPRegion.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *DERPRegion) Clone() *DERPRegion {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(DERPRegion)
|
||||
*dst = *src
|
||||
if src.Nodes != nil {
|
||||
dst.Nodes = make([]*DERPNode, len(src.Nodes))
|
||||
for i := range dst.Nodes {
|
||||
if src.Nodes[i] == nil {
|
||||
dst.Nodes[i] = nil
|
||||
} else {
|
||||
dst.Nodes[i] = ptr.To(*src.Nodes[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _DERPRegionCloneNeedsRegeneration = DERPRegion(struct {
|
||||
RegionID int
|
||||
RegionCode string
|
||||
RegionName string
|
||||
Latitude float64
|
||||
Longitude float64
|
||||
Avoid bool
|
||||
Nodes []*DERPNode
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of DERPMap.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *DERPMap) Clone() *DERPMap {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(DERPMap)
|
||||
*dst = *src
|
||||
dst.HomeParams = src.HomeParams.Clone()
|
||||
if dst.Regions != nil {
|
||||
dst.Regions = map[int]*DERPRegion{}
|
||||
for k, v := range src.Regions {
|
||||
if v == nil {
|
||||
dst.Regions[k] = nil
|
||||
} else {
|
||||
dst.Regions[k] = v.Clone()
|
||||
}
|
||||
}
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _DERPMapCloneNeedsRegeneration = DERPMap(struct {
|
||||
HomeParams *DERPHomeParams
|
||||
Regions map[int]*DERPRegion
|
||||
OmitDefaultRegions bool
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of DERPNode.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *DERPNode) Clone() *DERPNode {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(DERPNode)
|
||||
*dst = *src
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _DERPNodeCloneNeedsRegeneration = DERPNode(struct {
|
||||
Name string
|
||||
RegionID int
|
||||
HostName string
|
||||
CertName string
|
||||
IPv4 string
|
||||
IPv6 string
|
||||
STUNPort int
|
||||
STUNOnly bool
|
||||
DERPPort int
|
||||
InsecureForTests bool
|
||||
STUNTestIP string
|
||||
CanPort80 bool
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of SSHRule.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *SSHRule) Clone() *SSHRule {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(SSHRule)
|
||||
*dst = *src
|
||||
if dst.RuleExpires != nil {
|
||||
dst.RuleExpires = ptr.To(*src.RuleExpires)
|
||||
}
|
||||
if src.Principals != nil {
|
||||
dst.Principals = make([]*SSHPrincipal, len(src.Principals))
|
||||
for i := range dst.Principals {
|
||||
if src.Principals[i] == nil {
|
||||
dst.Principals[i] = nil
|
||||
} else {
|
||||
dst.Principals[i] = src.Principals[i].Clone()
|
||||
}
|
||||
}
|
||||
}
|
||||
dst.SSHUsers = maps.Clone(src.SSHUsers)
|
||||
dst.Action = src.Action.Clone()
|
||||
dst.AcceptEnv = append(src.AcceptEnv[:0:0], src.AcceptEnv...)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _SSHRuleCloneNeedsRegeneration = SSHRule(struct {
|
||||
RuleExpires *time.Time
|
||||
Principals []*SSHPrincipal
|
||||
SSHUsers map[string]string
|
||||
Action *SSHAction
|
||||
AcceptEnv []string
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of SSHAction.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *SSHAction) Clone() *SSHAction {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(SSHAction)
|
||||
*dst = *src
|
||||
dst.Recorders = append(src.Recorders[:0:0], src.Recorders...)
|
||||
if dst.OnRecordingFailure != nil {
|
||||
dst.OnRecordingFailure = ptr.To(*src.OnRecordingFailure)
|
||||
}
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _SSHActionCloneNeedsRegeneration = SSHAction(struct {
|
||||
Message string
|
||||
Reject bool
|
||||
Accept bool
|
||||
SessionDuration time.Duration
|
||||
AllowAgentForwarding bool
|
||||
HoldAndDelegate string
|
||||
AllowLocalPortForwarding bool
|
||||
AllowRemotePortForwarding bool
|
||||
Recorders []netip.AddrPort
|
||||
OnRecordingFailure *SSHRecorderFailureAction
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of SSHPrincipal.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *SSHPrincipal) Clone() *SSHPrincipal {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(SSHPrincipal)
|
||||
*dst = *src
|
||||
dst.PubKeys = append(src.PubKeys[:0:0], src.PubKeys...)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _SSHPrincipalCloneNeedsRegeneration = SSHPrincipal(struct {
|
||||
Node StableNodeID
|
||||
NodeIP string
|
||||
UserLogin string
|
||||
Any bool
|
||||
PubKeys []string
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of ControlDialPlan.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *ControlDialPlan) Clone() *ControlDialPlan {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(ControlDialPlan)
|
||||
*dst = *src
|
||||
dst.Candidates = append(src.Candidates[:0:0], src.Candidates...)
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _ControlDialPlanCloneNeedsRegeneration = ControlDialPlan(struct {
|
||||
Candidates []ControlIPCandidate
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of Location.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *Location) Clone() *Location {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(Location)
|
||||
*dst = *src
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _LocationCloneNeedsRegeneration = Location(struct {
|
||||
Country string
|
||||
CountryCode string
|
||||
City string
|
||||
CityCode string
|
||||
Latitude float64
|
||||
Longitude float64
|
||||
Priority int
|
||||
}{})
|
||||
|
||||
// Clone makes a deep copy of UserProfile.
|
||||
// The result aliases no memory with the original.
|
||||
func (src *UserProfile) Clone() *UserProfile {
|
||||
if src == nil {
|
||||
return nil
|
||||
}
|
||||
dst := new(UserProfile)
|
||||
*dst = *src
|
||||
return dst
|
||||
}
|
||||
|
||||
// A compilation failure here means this code must be regenerated, with the command at the top of this file.
|
||||
var _UserProfileCloneNeedsRegeneration = UserProfile(struct {
|
||||
ID UserID
|
||||
LoginName string
|
||||
DisplayName string
|
||||
ProfilePicURL string
|
||||
Roles emptyStructJSONSlice
|
||||
}{})
|
||||
|
||||
// Clone duplicates src into dst and reports whether it succeeded.
|
||||
// To succeed, <src, dst> must be of types <*T, *T> or <*T, **T>,
|
||||
// where T is one of User,Node,Hostinfo,NetInfo,Login,DNSConfig,RegisterResponse,RegisterResponseAuth,RegisterRequest,DERPHomeParams,DERPRegion,DERPMap,DERPNode,SSHRule,SSHAction,SSHPrincipal,ControlDialPlan,Location,UserProfile.
|
||||
func Clone(dst, src any) bool {
|
||||
switch src := src.(type) {
|
||||
case *User:
|
||||
switch dst := dst.(type) {
|
||||
case *User:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **User:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *Node:
|
||||
switch dst := dst.(type) {
|
||||
case *Node:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **Node:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *Hostinfo:
|
||||
switch dst := dst.(type) {
|
||||
case *Hostinfo:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **Hostinfo:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *NetInfo:
|
||||
switch dst := dst.(type) {
|
||||
case *NetInfo:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **NetInfo:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *Login:
|
||||
switch dst := dst.(type) {
|
||||
case *Login:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **Login:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *DNSConfig:
|
||||
switch dst := dst.(type) {
|
||||
case *DNSConfig:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **DNSConfig:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *RegisterResponse:
|
||||
switch dst := dst.(type) {
|
||||
case *RegisterResponse:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **RegisterResponse:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *RegisterResponseAuth:
|
||||
switch dst := dst.(type) {
|
||||
case *RegisterResponseAuth:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **RegisterResponseAuth:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *RegisterRequest:
|
||||
switch dst := dst.(type) {
|
||||
case *RegisterRequest:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **RegisterRequest:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *DERPHomeParams:
|
||||
switch dst := dst.(type) {
|
||||
case *DERPHomeParams:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **DERPHomeParams:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *DERPRegion:
|
||||
switch dst := dst.(type) {
|
||||
case *DERPRegion:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **DERPRegion:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *DERPMap:
|
||||
switch dst := dst.(type) {
|
||||
case *DERPMap:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **DERPMap:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *DERPNode:
|
||||
switch dst := dst.(type) {
|
||||
case *DERPNode:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **DERPNode:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *SSHRule:
|
||||
switch dst := dst.(type) {
|
||||
case *SSHRule:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **SSHRule:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *SSHAction:
|
||||
switch dst := dst.(type) {
|
||||
case *SSHAction:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **SSHAction:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *SSHPrincipal:
|
||||
switch dst := dst.(type) {
|
||||
case *SSHPrincipal:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **SSHPrincipal:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *ControlDialPlan:
|
||||
switch dst := dst.(type) {
|
||||
case *ControlDialPlan:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **ControlDialPlan:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *Location:
|
||||
switch dst := dst.(type) {
|
||||
case *Location:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **Location:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
case *UserProfile:
|
||||
switch dst := dst.(type) {
|
||||
case *UserProfile:
|
||||
*dst = *src.Clone()
|
||||
return true
|
||||
case **UserProfile:
|
||||
*dst = src.Clone()
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
1453
vendor/tailscale.com/tailcfg/tailcfg_view.go
generated
vendored
Normal file
1453
vendor/tailscale.com/tailcfg/tailcfg_view.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
264
vendor/tailscale.com/tailcfg/tka.go
generated
vendored
Normal file
264
vendor/tailscale.com/tailcfg/tka.go
generated
vendored
Normal file
@@ -0,0 +1,264 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package tailcfg
|
||||
|
||||
import (
|
||||
"tailscale.com/types/key"
|
||||
"tailscale.com/types/tkatype"
|
||||
)
|
||||
|
||||
// TKAInitBeginRequest submits a genesis AUM to seed the creation of the
|
||||
// tailnet's key authority.
|
||||
type TKAInitBeginRequest struct {
|
||||
// Version is the client's capabilities.
|
||||
Version CapabilityVersion
|
||||
|
||||
// NodeKey is the client's current node key.
|
||||
NodeKey key.NodePublic
|
||||
|
||||
// GenesisAUM is the initial (genesis) AUM that the node generated
|
||||
// to bootstrap tailnet key authority state.
|
||||
GenesisAUM tkatype.MarshaledAUM
|
||||
}
|
||||
|
||||
// TKASignInfo describes information about an existing node that needs
|
||||
// to be signed into a node-key signature.
|
||||
type TKASignInfo struct {
|
||||
// NodeID is the ID of the node which needs a signature. It must
|
||||
// correspond to NodePublic.
|
||||
NodeID NodeID
|
||||
// NodePublic is the node (Wireguard) public key which is being
|
||||
// signed.
|
||||
NodePublic key.NodePublic
|
||||
|
||||
// RotationPubkey specifies the public key which may sign
|
||||
// a NodeKeySignature (NKS), which rotates the node key.
|
||||
//
|
||||
// This is necessary so the node can rotate its node-key without
|
||||
// talking to a node which holds a trusted network-lock key.
|
||||
// It does this by nesting the original NKS in a 'rotation' NKS,
|
||||
// which it then signs with the key corresponding to RotationPubkey.
|
||||
//
|
||||
// This field expects a raw ed25519 public key.
|
||||
RotationPubkey []byte
|
||||
}
|
||||
|
||||
// TKAInitBeginResponse is the JSON response from a /tka/init/begin RPC.
|
||||
// This structure describes node information which must be signed to
|
||||
// complete initialization of the tailnets' key authority.
|
||||
type TKAInitBeginResponse struct {
|
||||
// NeedSignatures specify information about the nodes in your tailnet
|
||||
// which need initial signatures to function once the tailnet key
|
||||
// authority is in use. The generated signatures should then be
|
||||
// submitted in a /tka/init/finish RPC.
|
||||
NeedSignatures []TKASignInfo
|
||||
}
|
||||
|
||||
// TKAInitFinishRequest is the JSON request of a /tka/init/finish RPC.
|
||||
// This RPC finalizes initialization of the tailnet key authority
|
||||
// by submitting node-key signatures for all existing nodes.
|
||||
type TKAInitFinishRequest struct {
|
||||
// Version is the client's capabilities.
|
||||
Version CapabilityVersion
|
||||
|
||||
// NodeKey is the client's current node key.
|
||||
NodeKey key.NodePublic
|
||||
|
||||
// Signatures are serialized tka.NodeKeySignatures for all nodes
|
||||
// in the tailnet.
|
||||
Signatures map[NodeID]tkatype.MarshaledSignature
|
||||
|
||||
// SupportDisablement is a disablement secret for Tailscale support.
|
||||
// This is only generated if --gen-disablement-for-support is specified
|
||||
// in an invocation to 'tailscale lock init'.
|
||||
SupportDisablement []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
// TKAInitFinishResponse is the JSON response from a /tka/init/finish RPC.
|
||||
// This schema describes the successful enablement of the tailnet's
|
||||
// key authority.
|
||||
type TKAInitFinishResponse struct {
|
||||
// Nothing. (yet?)
|
||||
}
|
||||
|
||||
// TKAInfo encodes the control plane's view of tailnet key authority (TKA)
|
||||
// state. This information is transmitted as part of the MapResponse.
|
||||
type TKAInfo struct {
|
||||
// Head describes the hash of the latest AUM applied to the authority.
|
||||
// Head is encoded as tka.AUMHash.MarshalText.
|
||||
//
|
||||
// If the Head state differs to that known locally, the node should perform
|
||||
// synchronization via a separate RPC.
|
||||
Head string `json:",omitempty"`
|
||||
|
||||
// Disabled indicates the control plane believes TKA should be disabled,
|
||||
// and the node should reach out to fetch a disablement
|
||||
// secret. If the disablement secret verifies, then the node should then
|
||||
// disable TKA locally.
|
||||
// This field exists to disambiguate a nil TKAInfo in a delta mapresponse
|
||||
// from a nil TKAInfo indicating TKA should be disabled.
|
||||
Disabled bool `json:",omitempty"`
|
||||
}
|
||||
|
||||
// TKABootstrapRequest is sent by a node to get information necessary for
|
||||
// enabling or disabling the tailnet key authority.
|
||||
type TKABootstrapRequest struct {
|
||||
// Version is the client's capabilities.
|
||||
Version CapabilityVersion
|
||||
|
||||
// NodeKey is the client's current node key.
|
||||
NodeKey key.NodePublic
|
||||
|
||||
// Head represents the node's head AUMHash (tka.Authority.Head), if
|
||||
// network lock is enabled.
|
||||
Head string
|
||||
}
|
||||
|
||||
// TKABootstrapResponse encodes values necessary to enable or disable
|
||||
// the tailnet key authority (TKA).
|
||||
type TKABootstrapResponse struct {
|
||||
// GenesisAUM returns the initial AUM necessary to initialize TKA.
|
||||
GenesisAUM tkatype.MarshaledAUM `json:",omitempty"`
|
||||
|
||||
// DisablementSecret encodes a secret necessary to disable TKA.
|
||||
DisablementSecret []byte `json:",omitempty"`
|
||||
}
|
||||
|
||||
// TKASyncOfferRequest encodes a request to synchronize tailnet key authority
|
||||
// state (TKA). Values of type tka.AUMHash are encoded as strings in their
|
||||
// MarshalText form.
|
||||
type TKASyncOfferRequest struct {
|
||||
// Version is the client's capabilities.
|
||||
Version CapabilityVersion
|
||||
|
||||
// NodeKey is the client's current node key.
|
||||
NodeKey key.NodePublic
|
||||
|
||||
// Head represents the node's head AUMHash (tka.Authority.Head). This
|
||||
// corresponds to tka.SyncOffer.Head.
|
||||
Head string
|
||||
// Ancestors represents a selection of ancestor AUMHash values ascending
|
||||
// from the current head. This corresponds to tka.SyncOffer.Ancestors.
|
||||
Ancestors []string
|
||||
}
|
||||
|
||||
// TKASyncOfferResponse encodes a response in synchronizing a node's
|
||||
// tailnet key authority state. Values of type tka.AUMHash are encoded as
|
||||
// strings in their MarshalText form.
|
||||
type TKASyncOfferResponse struct {
|
||||
// Head represents the control plane's head AUMHash (tka.Authority.Head).
|
||||
// This corresponds to tka.SyncOffer.Head.
|
||||
Head string
|
||||
// Ancestors represents a selection of ancestor AUMHash values ascending
|
||||
// from the control plane's head. This corresponds to
|
||||
// tka.SyncOffer.Ancestors.
|
||||
Ancestors []string
|
||||
// MissingAUMs encodes AUMs that the control plane believes the node
|
||||
// is missing.
|
||||
MissingAUMs []tkatype.MarshaledAUM
|
||||
}
|
||||
|
||||
// TKASyncSendRequest encodes AUMs that a node believes the control plane
|
||||
// is missing, and notifies control of its local TKA state (specifically
|
||||
// the head hash).
|
||||
type TKASyncSendRequest struct {
|
||||
// Version is the client's capabilities.
|
||||
Version CapabilityVersion
|
||||
|
||||
// NodeKey is the client's current node key.
|
||||
NodeKey key.NodePublic
|
||||
|
||||
// Head represents the node's head AUMHash (tka.Authority.Head) after
|
||||
// applying any AUMs from the sync-offer response.
|
||||
// It is encoded as tka.AUMHash.MarshalText.
|
||||
Head string
|
||||
|
||||
// MissingAUMs encodes AUMs that the node believes the control plane
|
||||
// is missing.
|
||||
MissingAUMs []tkatype.MarshaledAUM
|
||||
|
||||
// Interactive is true if additional error checking should be performed as
|
||||
// the request is on behalf of an interactive operation (e.g., an
|
||||
// administrator publishing new changes) as opposed to an automatic
|
||||
// synchronization that may be reporting lost data.
|
||||
Interactive bool
|
||||
}
|
||||
|
||||
// TKASyncSendResponse encodes the control plane's response to a node
|
||||
// submitting AUMs during AUM synchronization.
|
||||
type TKASyncSendResponse struct {
|
||||
// Head represents the control plane's head AUMHash (tka.Authority.Head),
|
||||
// after applying the missing AUMs.
|
||||
Head string
|
||||
}
|
||||
|
||||
// TKADisableRequest disables network-lock across the tailnet using the
|
||||
// provided disablement secret.
|
||||
//
|
||||
// This is the request schema for a /tka/disable noise RPC.
|
||||
type TKADisableRequest struct {
|
||||
// Version is the client's capabilities.
|
||||
Version CapabilityVersion
|
||||
|
||||
// NodeKey is the client's current node key.
|
||||
NodeKey key.NodePublic
|
||||
|
||||
// Head represents the node's head AUMHash (tka.Authority.Head).
|
||||
// It is encoded as tka.AUMHash.MarshalText.
|
||||
Head string
|
||||
|
||||
// DisablementSecret encodes the secret necessary to disable TKA.
|
||||
DisablementSecret []byte
|
||||
}
|
||||
|
||||
// TKADisableResponse is the JSON response from a /tka/disable RPC.
|
||||
// This schema describes the successful disablement of the tailnet's
|
||||
// key authority.
|
||||
type TKADisableResponse struct {
|
||||
// Nothing. (yet?)
|
||||
}
|
||||
|
||||
// TKASubmitSignatureRequest transmits a node-key signature to the control plane.
|
||||
//
|
||||
// This is the request schema for a /tka/sign noise RPC.
|
||||
type TKASubmitSignatureRequest struct {
|
||||
// Version is the client's capabilities.
|
||||
Version CapabilityVersion
|
||||
|
||||
// NodeKey is the client's current node key. The node-key which
|
||||
// is being signed is embedded in Signature.
|
||||
NodeKey key.NodePublic
|
||||
|
||||
// Signature encodes the node-key signature being submitted.
|
||||
Signature tkatype.MarshaledSignature
|
||||
}
|
||||
|
||||
// TKASubmitSignatureResponse is the JSON response from a /tka/sign RPC.
|
||||
type TKASubmitSignatureResponse struct {
|
||||
// Nothing. (yet?)
|
||||
}
|
||||
|
||||
// TKASignaturesUsingKeyRequest asks the control plane for
|
||||
// all signatures which are signed by the provided keyID.
|
||||
//
|
||||
// This is the request schema for a /tka/affected-sigs RPC.
|
||||
type TKASignaturesUsingKeyRequest struct {
|
||||
// Version is the client's capabilities.
|
||||
Version CapabilityVersion
|
||||
|
||||
// NodeKey is the client's current node key.
|
||||
NodeKey key.NodePublic
|
||||
|
||||
// KeyID is the key we are querying using.
|
||||
KeyID tkatype.KeyID
|
||||
}
|
||||
|
||||
// TKASignaturesUsingKeyResponse is the JSON response to
|
||||
// a /tka/affected-sigs RPC.
|
||||
//
|
||||
// It enumerates all signatures which are signed by the
|
||||
// queried keyID.
|
||||
type TKASignaturesUsingKeyResponse struct {
|
||||
Signatures []tkatype.MarshaledSignature
|
||||
}
|
||||
Reference in New Issue
Block a user