2
0

retrieve.go 2.1 KB

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