diff --git a/logic/peers.go b/logic/peers.go index bded64b4..0759364a 100644 --- a/logic/peers.go +++ b/logic/peers.go @@ -24,13 +24,6 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) { var peerUpdate models.PeerUpdate var peers []wgtypes.PeerConfig var serverNodeAddresses = []models.ServerAddr{} - currentPeers, err := GetNetworkNodes(node.Network) - if err != nil { - return models.PeerUpdate{}, err - } - if node.IsRelayed == "yes" { - return GetPeerUpdateForRelayedNode(node) - } // udppeers = the peers parsed from the local interface // gives us correct port to reach @@ -39,6 +32,15 @@ func GetPeerUpdate(node *models.Node) (models.PeerUpdate, error) { logger.Log(2, errN.Error()) } + currentPeers, err := GetNetworkNodes(node.Network) + if err != nil { + return models.PeerUpdate{}, err + } + + if node.IsRelayed == "yes" { + return GetPeerUpdateForRelayedNode(node, udppeers) + } + // #1 Set Keepalive values: set_keepalive // #2 Set local address: set_local - could be a LOT BETTER and fix some bugs with additional logic // #3 Set allowedips: set_allowedips @@ -342,7 +344,7 @@ func getPeerDNS(network string) string { // GetPeerUpdateForRelayedNode - calculates peer update for a relayed node by getting the relay // copying the relay node's allowed ips and making appropriate substitutions -func GetPeerUpdateForRelayedNode(node *models.Node) (models.PeerUpdate, error) { +func GetPeerUpdateForRelayedNode(node *models.Node, udppeers map[string]string) (models.PeerUpdate, error) { var peerUpdate models.PeerUpdate var peers []wgtypes.PeerConfig var serverNodeAddresses = []models.ServerAddr{} @@ -352,6 +354,7 @@ func GetPeerUpdateForRelayedNode(node *models.Node) (models.PeerUpdate, error) { if relay == nil { return models.PeerUpdate{}, errors.New("not found") } + //add relay to lists of allowed ip if relay.Address != "" { relayIP := net.IPNet{ @@ -403,6 +406,25 @@ func GetPeerUpdateForRelayedNode(node *models.Node) (models.PeerUpdate, error) { if err != nil { return models.PeerUpdate{}, err } + var setUDPPort = false + if relay.UDPHolePunch == "yes" && CheckEndpoint(udppeers[relay.PublicKey]) { + endpointstring := udppeers[relay.PublicKey] + endpointarr := strings.Split(endpointstring, ":") + if len(endpointarr) == 2 { + port, err := strconv.Atoi(endpointarr[1]) + if err == nil { + setUDPPort = true + relay.ListenPort = int32(port) + } + } + } + // if udp hole punching is on, but udp hole punching did not set it, use the LocalListenPort instead + // or, if port is for some reason zero use the LocalListenPort + // but only do this if LocalListenPort is not zero + if ((relay.UDPHolePunch == "yes" && !setUDPPort) || relay.ListenPort == 0) && relay.LocalListenPort != 0 { + relay.ListenPort = relay.LocalListenPort + } + endpoint := relay.Endpoint + ":" + strconv.FormatInt(int64(relay.ListenPort), 10) address, err := net.ResolveUDPAddr("udp", endpoint) if err != nil {