| 21 | } |
| 22 | |
| 23 | func NodeToProto(n *Node) (*proto.Node, error) { |
| 24 | k, err := n.Key.MarshalBinary() |
| 25 | if err != nil { |
| 26 | return nil, err |
| 27 | } |
| 28 | disco, err := n.DiscoKey.MarshalText() |
| 29 | if err != nil { |
| 30 | return nil, err |
| 31 | } |
| 32 | derpForcedWebsocket := make(map[int32]string) |
| 33 | for i, s := range n.DERPForcedWebsocket { |
| 34 | // #nosec G115 - Safe conversion for DERP region IDs which are small positive integers |
| 35 | derpForcedWebsocket[int32(i)] = s |
| 36 | } |
| 37 | addresses := make([]string, len(n.Addresses)) |
| 38 | for i, prefix := range n.Addresses { |
| 39 | s, err := prefix.MarshalText() |
| 40 | if err != nil { |
| 41 | return nil, err |
| 42 | } |
| 43 | addresses[i] = string(s) |
| 44 | } |
| 45 | allowedIPs := make([]string, len(n.AllowedIPs)) |
| 46 | for i, prefix := range n.AllowedIPs { |
| 47 | s, err := prefix.MarshalText() |
| 48 | if err != nil { |
| 49 | return nil, err |
| 50 | } |
| 51 | allowedIPs[i] = string(s) |
| 52 | } |
| 53 | return &proto.Node{ |
| 54 | Id: int64(n.ID), |
| 55 | AsOf: timestamppb.New(n.AsOf), |
| 56 | Key: k, |
| 57 | Disco: string(disco), |
| 58 | // #nosec G115 - Safe conversion as DERP region IDs are small integers expected to be within int32 range |
| 59 | PreferredDerp: int32(n.PreferredDERP), |
| 60 | DerpLatency: n.DERPLatency, |
| 61 | DerpForcedWebsocket: derpForcedWebsocket, |
| 62 | Addresses: addresses, |
| 63 | AllowedIps: allowedIPs, |
| 64 | Endpoints: n.Endpoints, |
| 65 | }, nil |
| 66 | } |
| 67 | |
| 68 | func ProtoToNode(p *proto.Node) (*Node, error) { |
| 69 | k := key.NodePublic{} |