|
@@ -4,6 +4,7 @@ import (
|
|
|
"encoding/json"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
+ "maps"
|
|
|
"sort"
|
|
|
"sync"
|
|
|
"time"
|
|
@@ -680,6 +681,8 @@ func IsUserAllowedToCommunicate(userName string, peer models.Node) (bool, []mode
|
|
|
// IsPeerAllowed - checks if peer needs to be added to the interface
|
|
|
func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
|
|
|
var nodeId, peerId string
|
|
|
+ peerTags := maps.Clone(peer.Tags)
|
|
|
+ nodeTags := maps.Clone(node.Tags)
|
|
|
if node.IsStatic {
|
|
|
nodeId = node.StaticNode.ClientID
|
|
|
node = node.StaticNode.ConvertToStaticNode()
|
|
@@ -692,8 +695,8 @@ func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
|
|
|
} else {
|
|
|
peerId = peer.ID.String()
|
|
|
}
|
|
|
- node.Tags[models.TagID(nodeId)] = struct{}{}
|
|
|
- peer.Tags[models.TagID(peerId)] = struct{}{}
|
|
|
+ nodeTags[models.TagID(nodeId)] = struct{}{}
|
|
|
+ peerTags[models.TagID(peerId)] = struct{}{}
|
|
|
if checkDefaultPolicy {
|
|
|
// check default policy if all allowed return true
|
|
|
defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy)
|
|
@@ -718,7 +721,7 @@ func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
|
|
|
}
|
|
|
srcMap = convAclTagToValueMap(policy.Src)
|
|
|
dstMap = convAclTagToValueMap(policy.Dst)
|
|
|
- if checkTagGroupPolicy(srcMap, dstMap, node, peer) {
|
|
|
+ if checkTagGroupPolicy(srcMap, dstMap, node, peer, nodeTags, peerTags) {
|
|
|
return true
|
|
|
}
|
|
|
|
|
@@ -726,7 +729,7 @@ func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool {
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
-func checkTagGroupPolicy(srcMap, dstMap map[string]struct{}, node, peer models.Node) bool {
|
|
|
+func checkTagGroupPolicy(srcMap, dstMap map[string]struct{}, node, peer models.Node, nodeTags, peerTags map[models.TagID]struct{}) bool {
|
|
|
// check for node ID
|
|
|
if _, ok := srcMap[node.ID.String()]; ok {
|
|
|
if _, ok = dstMap[peer.ID.String()]; ok {
|
|
@@ -740,12 +743,12 @@ func checkTagGroupPolicy(srcMap, dstMap map[string]struct{}, node, peer models.N
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- for tagID := range node.Tags {
|
|
|
+ for tagID := range nodeTags {
|
|
|
if _, ok := dstMap[tagID.String()]; ok {
|
|
|
if _, ok := srcMap["*"]; ok {
|
|
|
return true
|
|
|
}
|
|
|
- for tagID := range peer.Tags {
|
|
|
+ for tagID := range peerTags {
|
|
|
if _, ok := srcMap[tagID.String()]; ok {
|
|
|
return true
|
|
|
}
|
|
@@ -755,19 +758,19 @@ func checkTagGroupPolicy(srcMap, dstMap map[string]struct{}, node, peer models.N
|
|
|
if _, ok := dstMap["*"]; ok {
|
|
|
return true
|
|
|
}
|
|
|
- for tagID := range peer.Tags {
|
|
|
+ for tagID := range peerTags {
|
|
|
if _, ok := dstMap[tagID.String()]; ok {
|
|
|
return true
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- for tagID := range peer.Tags {
|
|
|
+ for tagID := range peerTags {
|
|
|
if _, ok := dstMap[tagID.String()]; ok {
|
|
|
if _, ok := srcMap["*"]; ok {
|
|
|
return true
|
|
|
}
|
|
|
- for tagID := range node.Tags {
|
|
|
+ for tagID := range nodeTags {
|
|
|
|
|
|
if _, ok := srcMap[tagID.String()]; ok {
|
|
|
return true
|
|
@@ -778,7 +781,7 @@ func checkTagGroupPolicy(srcMap, dstMap map[string]struct{}, node, peer models.N
|
|
|
if _, ok := dstMap["*"]; ok {
|
|
|
return true
|
|
|
}
|
|
|
- for tagID := range node.Tags {
|
|
|
+ for tagID := range nodeTags {
|
|
|
if _, ok := dstMap[tagID.String()]; ok {
|
|
|
return true
|
|
|
}
|