ext_acls.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package logic
  2. import (
  3. "github.com/gravitl/netmaker/logic"
  4. "github.com/gravitl/netmaker/logic/acls"
  5. "github.com/gravitl/netmaker/logic/acls/nodeacls"
  6. "github.com/gravitl/netmaker/models"
  7. "golang.org/x/exp/slog"
  8. )
  9. // DenyClientNode - add a denied node to an ext client's list
  10. func DenyClientNode(ec *models.ExtClient, clientOrNodeID string) (ok bool) {
  11. if ec == nil || len(clientOrNodeID) == 0 {
  12. return
  13. }
  14. if ec.DeniedACLs == nil {
  15. ec.DeniedACLs = map[string]struct{}{}
  16. }
  17. ok = true
  18. ec.DeniedACLs[clientOrNodeID] = struct{}{}
  19. return
  20. }
  21. // IsClientNodeAllowed - checks if given ext client and node are allowed to communicate
  22. func IsClientNodeAllowed(ec *models.ExtClient, clientOrNodeID string) bool {
  23. if ec == nil || len(clientOrNodeID) == 0 {
  24. return false
  25. }
  26. if ec.DeniedACLs == nil {
  27. return true
  28. }
  29. _, ok := ec.DeniedACLs[clientOrNodeID]
  30. return !ok
  31. }
  32. // RemoveDeniedNodeFromClient - removes a node id from set of denied nodes
  33. func RemoveDeniedNodeFromClient(ec *models.ExtClient, clientOrNodeID string) bool {
  34. if ec.DeniedACLs == nil {
  35. return true
  36. }
  37. _, ok := ec.DeniedACLs[clientOrNodeID]
  38. if !ok {
  39. return false
  40. }
  41. delete(ec.DeniedACLs, clientOrNodeID)
  42. return true
  43. }
  44. // SetClientDefaultACLs - set's a client's default ACLs based on network and nodes in network
  45. func SetClientDefaultACLs(ec *models.ExtClient) error {
  46. if !logic.GetServerSettings().OldAClsSupport {
  47. ec.DeniedACLs = make(map[string]struct{})
  48. return nil
  49. }
  50. networkNodes, err := logic.GetNetworkNodes(ec.Network)
  51. if err != nil {
  52. return err
  53. }
  54. network, err := logic.GetNetwork(ec.Network)
  55. if err != nil {
  56. return err
  57. }
  58. var networkAcls acls.ACLContainer
  59. networkAcls, err = networkAcls.Get(acls.ContainerID(ec.Network))
  60. if err != nil {
  61. slog.Error("failed to get network acls", "error", err)
  62. return err
  63. }
  64. networkAcls[acls.AclID(ec.ClientID)] = make(acls.ACL)
  65. for i := range networkNodes {
  66. currNode := networkNodes[i]
  67. nodeID := acls.AclID(currNode.ID.String())
  68. if networkAcls[nodeID] == nil {
  69. networkAcls[nodeID] = make(acls.ACL)
  70. }
  71. if network.DefaultACL == "no" || currNode.DefaultACL == "no" {
  72. DenyClientNode(ec, currNode.ID.String())
  73. networkAcls[acls.AclID(ec.ClientID)][nodeID] = acls.NotAllowed
  74. networkAcls[nodeID][acls.AclID(ec.ClientID)] = acls.NotAllowed
  75. } else {
  76. RemoveDeniedNodeFromClient(ec, currNode.ID.String())
  77. networkAcls[acls.AclID(ec.ClientID)][nodeID] = acls.Allowed
  78. networkAcls[nodeID][acls.AclID(ec.ClientID)] = acls.Allowed
  79. }
  80. }
  81. networkClients, err := logic.GetNetworkExtClients(ec.Network)
  82. if err != nil {
  83. slog.Error("failed to get network clients", "error", err)
  84. return err
  85. }
  86. for _, client := range networkClients {
  87. // TODO: revisit when client-client acls are supported
  88. if networkAcls[acls.AclID(client.ClientID)] == nil {
  89. networkAcls[acls.AclID(client.ClientID)] = make(acls.ACL)
  90. }
  91. networkAcls[acls.AclID(ec.ClientID)][acls.AclID(client.ClientID)] = acls.Allowed
  92. networkAcls[acls.AclID(client.ClientID)][acls.AclID(ec.ClientID)] = acls.Allowed
  93. }
  94. delete(networkAcls[acls.AclID(ec.ClientID)], acls.AclID(ec.ClientID)) // remove oneself
  95. if _, err = networkAcls.Save(acls.ContainerID(ec.Network)); err != nil {
  96. slog.Error("failed to update network acls", "error", err)
  97. return err
  98. }
  99. return nil
  100. }
  101. // SetClientACLs - overwrites an ext client's ACL
  102. func SetClientACLs(ec *models.ExtClient, newACLs map[string]struct{}) {
  103. if ec == nil || newACLs == nil {
  104. return
  105. }
  106. ec.DeniedACLs = newACLs
  107. }
  108. func UpdateProNodeACLs(node *models.Node) error {
  109. networkNodes, err := logic.GetNetworkNodes(node.Network)
  110. if err != nil {
  111. return err
  112. }
  113. if err = adjustNodeAcls(node, networkNodes[:]); err != nil {
  114. return err
  115. }
  116. return nil
  117. }
  118. // adjustNodeAcls - adjusts ACLs based on a node's default value
  119. func adjustNodeAcls(node *models.Node, networkNodes []models.Node) error {
  120. networkID := nodeacls.NetworkID(node.Network)
  121. nodeID := nodeacls.NodeID(node.ID.String())
  122. currentACLs, err := nodeacls.FetchAllACLs(networkID)
  123. if err != nil {
  124. return err
  125. }
  126. for i := range networkNodes {
  127. currentNodeID := nodeacls.NodeID(networkNodes[i].ID.String())
  128. if currentNodeID == nodeID {
  129. continue
  130. }
  131. // 2 cases
  132. // both allow - allow
  133. // either 1 denies - deny
  134. if node.DoesACLDeny() || networkNodes[i].DoesACLDeny() {
  135. currentACLs.ChangeAccess(acls.AclID(nodeID), acls.AclID(currentNodeID), acls.NotAllowed)
  136. } else if node.DoesACLAllow() || networkNodes[i].DoesACLAllow() {
  137. currentACLs.ChangeAccess(acls.AclID(nodeID), acls.AclID(currentNodeID), acls.Allowed)
  138. }
  139. }
  140. _, err = currentACLs.Save(acls.ContainerID(node.Network))
  141. return err
  142. }