retrieve.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package nodeacls
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "maps"
  6. "sync"
  7. "github.com/gravitl/netmaker/logic/acls"
  8. )
  9. var NodesAllowedACLMutex = &sync.Mutex{}
  10. // AreNodesAllowed - checks if nodes are allowed to communicate in their network ACL
  11. func AreNodesAllowed(networkID NetworkID, node1, node2 NodeID) bool {
  12. NodesAllowedACLMutex.Lock()
  13. defer NodesAllowedACLMutex.Unlock()
  14. var currentNetworkACL, err = FetchAllACLs(networkID)
  15. if err != nil {
  16. return false
  17. }
  18. var allowed bool
  19. acls.AclMutex.Lock()
  20. currNetworkACLNode1 := currentNetworkACL[acls.AclID(node1)]
  21. currNetworkACLNode2 := currentNetworkACL[acls.AclID(node2)]
  22. acls.AclMutex.Unlock()
  23. allowed = currNetworkACLNode1.IsAllowed(acls.AclID(node2)) && currNetworkACLNode2.IsAllowed(acls.AclID(node1))
  24. return allowed
  25. }
  26. // FetchNodeACL - fetches a specific node's ACL in a given network
  27. func FetchNodeACL(networkID NetworkID, nodeID NodeID) (acls.ACL, error) {
  28. var currentNetworkACL, err = FetchAllACLs(networkID)
  29. if err != nil {
  30. return nil, err
  31. }
  32. var acl acls.ACL
  33. acls.AclMutex.RLock()
  34. if currentNetworkACL[acls.AclID(nodeID)] == nil {
  35. acls.AclMutex.RUnlock()
  36. return nil, fmt.Errorf("no node ACL present for node %s", nodeID)
  37. }
  38. acl = currentNetworkACL[acls.AclID(nodeID)]
  39. acls.AclMutex.RUnlock()
  40. return acl, nil
  41. }
  42. // FetchNodeACLJson - fetches a node's acl in given network except returns the json string
  43. func FetchNodeACLJson(networkID NetworkID, nodeID NodeID) (acls.ACLJson, error) {
  44. currentNodeACL, err := FetchNodeACL(networkID, nodeID)
  45. if err != nil {
  46. return "", err
  47. }
  48. acls.AclMutex.RLock()
  49. defer acls.AclMutex.RUnlock()
  50. jsonData, err := json.Marshal(&currentNodeACL)
  51. if err != nil {
  52. return "", err
  53. }
  54. return acls.ACLJson(jsonData), nil
  55. }
  56. // FetchAllACLs - fetchs all node
  57. func FetchAllACLs(networkID NetworkID) (acls.ACLContainer, error) {
  58. var err error
  59. var currentNetworkACL acls.ACLContainer
  60. currentNetworkACL, err = currentNetworkACL.Get(acls.ContainerID(networkID))
  61. if err != nil {
  62. return nil, err
  63. }
  64. return maps.Clone(currentNetworkACL), nil
  65. }