|
@@ -47,7 +47,7 @@ func GetProxyUpdateForHost(ctx context.Context, host *models.Host) (models.Proxy
|
|
|
relayPeersMap := make(map[string]models.RelayedConf)
|
|
|
for _, relayedHost := range relayedHosts {
|
|
|
relayedHost := relayedHost
|
|
|
- payload, err := GetPeerUpdateForHost(ctx, "", &relayedHost, nil)
|
|
|
+ payload, err := GetPeerUpdateForHost(ctx, "", &relayedHost, nil, nil)
|
|
|
if err == nil {
|
|
|
relayedEndpoint, udpErr := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", relayedHost.EndpointIP, GetPeerListenPort(&relayedHost)))
|
|
|
if udpErr == nil {
|
|
@@ -133,7 +133,7 @@ func ResetPeerUpdateContext() {
|
|
|
}
|
|
|
|
|
|
// GetPeerUpdateForHost - gets the consolidated peer update for the host from all networks
|
|
|
-func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host, deletedNode *models.Node) (models.HostPeerUpdate, error) {
|
|
|
+func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host, deletedNode *models.Node, deletedClient *models.ExtClient) (models.HostPeerUpdate, error) {
|
|
|
if host == nil {
|
|
|
return models.HostPeerUpdate{}, errors.New("host is nil")
|
|
|
}
|
|
@@ -250,6 +250,7 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
|
},
|
|
|
PeerKey: extPeerIdAndAddr.ID,
|
|
|
Allow: true,
|
|
|
+ ID: extPeerIdAndAddr.ID,
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -265,6 +266,7 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
|
},
|
|
|
PeerKey: peerHost.PublicKey.String(),
|
|
|
Allow: true,
|
|
|
+ ID: peer.ID.String(),
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -319,6 +321,7 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
|
},
|
|
|
PeerKey: extPeerIdAndAddr.ID,
|
|
|
Allow: true,
|
|
|
+ ID: extPeerIdAndAddr.ID,
|
|
|
}
|
|
|
}
|
|
|
hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, extPeers...)
|
|
@@ -331,6 +334,7 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
|
Name: extPeerIdAndAddr.Name,
|
|
|
Network: node.Network,
|
|
|
}
|
|
|
+
|
|
|
hostPeerUpdate.IngressInfo.ExtPeers[extPeerIdAndAddr.ID] = models.ExtClientInfo{
|
|
|
Masquerade: true,
|
|
|
IngGwAddr: net.IPNet{
|
|
@@ -343,7 +347,7 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
|
Mask: getCIDRMaskFromAddr(extPeerIdAndAddr.Address),
|
|
|
},
|
|
|
ExtPeerKey: extPeerIdAndAddr.ID,
|
|
|
- Peers: nodePeerMap,
|
|
|
+ Peers: filterNodeMapForClientACLs(extPeerIdAndAddr.ID, node.Network, nodePeerMap),
|
|
|
}
|
|
|
if node.Network == network {
|
|
|
hostPeerUpdate.PeerIDs[extPeerIdAndAddr.ID] = extPeerIdAndAddr
|
|
@@ -386,6 +390,16 @@ func GetPeerUpdateForHost(ctx context.Context, network string, host *models.Host
|
|
|
hostPeerUpdate.NodePeers[i] = peer
|
|
|
}
|
|
|
|
|
|
+ if deletedClient != nil {
|
|
|
+ key, err := wgtypes.ParseKey(deletedClient.PublicKey)
|
|
|
+ if err == nil {
|
|
|
+ hostPeerUpdate.Peers = append(hostPeerUpdate.Peers, wgtypes.PeerConfig{
|
|
|
+ PublicKey: key,
|
|
|
+ Remove: true,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return hostPeerUpdate, nil
|
|
|
}
|
|
|
|
|
@@ -414,6 +428,7 @@ func getExtPeers(node *models.Node) ([]wgtypes.PeerConfig, []models.IDandAddr, e
|
|
|
return peers, idsAndAddr, err
|
|
|
}
|
|
|
for _, extPeer := range extPeers {
|
|
|
+ extPeer := extPeer
|
|
|
pubkey, err := wgtypes.ParseKey(extPeer.PublicKey)
|
|
|
if err != nil {
|
|
|
logger.Log(1, "error parsing ext pub key:", err.Error())
|
|
@@ -645,3 +660,29 @@ func getCIDRMaskFromAddr(addr string) net.IPMask {
|
|
|
}
|
|
|
return cidr
|
|
|
}
|
|
|
+
|
|
|
+// accounts for ext client ACLs
|
|
|
+func filterNodeMapForClientACLs(publicKey, network string, nodePeerMap map[string]models.PeerRouteInfo) map[string]models.PeerRouteInfo {
|
|
|
+ if !isEE {
|
|
|
+ return nodePeerMap
|
|
|
+ }
|
|
|
+ if nodePeerMap == nil {
|
|
|
+ return map[string]models.PeerRouteInfo{}
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(publicKey) == 0 || len(network) == 0 {
|
|
|
+ return nodePeerMap
|
|
|
+ }
|
|
|
+
|
|
|
+ client, err := GetExtClientByPubKey(publicKey, network)
|
|
|
+ if err != nil {
|
|
|
+ return nodePeerMap
|
|
|
+ }
|
|
|
+ for k := range nodePeerMap {
|
|
|
+ currNodePeer := nodePeerMap[k]
|
|
|
+ if _, ok := client.ACLs[currNodePeer.ID]; ok {
|
|
|
+ delete(nodePeerMap, k)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nodePeerMap
|
|
|
+}
|