diff --git a/logic/acls.go b/logic/acls.go index 7267fd58..77ee9999 100644 --- a/logic/acls.go +++ b/logic/acls.go @@ -575,12 +575,22 @@ func IsPeerAllowed(node, peer models.Node, checkDefaultPolicy bool) bool { if peer.IsStatic { peer = peer.StaticNode.ConvertToStaticNode() } - node.Mutex.Lock() - nodeTags := maps.Clone(node.Tags) - node.Mutex.Unlock() - peer.Mutex.Lock() - peerTags := maps.Clone(peer.Tags) - peer.Mutex.Unlock() + var nodeTags, peerTags map[models.TagID]struct{} + if node.Mutex != nil { + node.Mutex.Lock() + nodeTags = maps.Clone(node.Tags) + node.Mutex.Unlock() + } else { + nodeTags = node.Tags + } + if peer.Mutex != nil { + peer.Mutex.Lock() + peerTags = maps.Clone(peer.Tags) + peer.Mutex.Unlock() + } else { + peerTags = peer.Tags + } + if checkDefaultPolicy { // check default policy if all allowed return true defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy) @@ -662,12 +672,21 @@ func IsNodeAllowedToCommunicate(node, peer models.Node, checkDefaultPolicy bool) if peer.IsStatic { peer = peer.StaticNode.ConvertToStaticNode() } - node.Mutex.Lock() - nodeTags := maps.Clone(node.Tags) - node.Mutex.Unlock() - peer.Mutex.Lock() - peerTags := maps.Clone(peer.Tags) - peer.Mutex.Unlock() + var nodeTags, peerTags map[models.TagID]struct{} + if node.Mutex != nil { + node.Mutex.Lock() + nodeTags = maps.Clone(node.Tags) + node.Mutex.Unlock() + } else { + nodeTags = node.Tags + } + if peer.Mutex != nil { + peer.Mutex.Lock() + peerTags = maps.Clone(peer.Tags) + peer.Mutex.Unlock() + } else { + peerTags = peer.Tags + } if checkDefaultPolicy { // check default policy if all allowed return true defaultPolicy, err := GetDefaultPolicy(models.NetworkID(node.Network), models.DevicePolicy) diff --git a/logic/nodes.go b/logic/nodes.go index cdea2e38..b593337c 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -820,11 +820,16 @@ func GetTagMapWithNodes() (tagNodesMap map[models.TagID][]models.Node) { if nodeI.Tags == nil { continue } - nodeI.Mutex.RLock() + if nodeI.Mutex != nil { + nodeI.Mutex.RLock() + } for nodeTagID := range nodeI.Tags { tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI) } - nodeI.Mutex.RUnlock() + if nodeI.Mutex != nil { + nodeI.Mutex.RUnlock() + } + } return } @@ -836,11 +841,15 @@ func GetTagMapWithNodesByNetwork(netID models.NetworkID, withStaticNodes bool) ( if nodeI.Tags == nil { continue } - nodeI.Mutex.RLock() + if nodeI.Mutex != nil { + nodeI.Mutex.RLock() + } for nodeTagID := range nodeI.Tags { tagNodesMap[nodeTagID] = append(tagNodesMap[nodeTagID], nodeI) } - nodeI.Mutex.RUnlock() + if nodeI.Mutex != nil { + nodeI.Mutex.RUnlock() + } } tagNodesMap["*"] = nodes if !withStaticNodes { diff --git a/models/extclient.go b/models/extclient.go index e9d3708b..28e897a8 100644 --- a/models/extclient.go +++ b/models/extclient.go @@ -1,5 +1,7 @@ package models +import "sync" + // ExtClient - struct for external clients type ExtClient struct { ClientID string `json:"clientid" bson:"clientid"` @@ -55,5 +57,6 @@ func (ext *ExtClient) ConvertToStaticNode() Node { Tags: ext.Tags, IsStatic: true, StaticNode: *ext, + Mutex: &sync.RWMutex{}, } }