ext_acls.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. )
  8. // DenyClientNode - add a denied node to an ext client's list
  9. func DenyClientNode(ec *models.ExtClient, clientOrNodeID string) (ok bool) {
  10. if ec == nil || len(clientOrNodeID) == 0 {
  11. return
  12. }
  13. if ec.DeniedACLs == nil {
  14. ec.DeniedACLs = map[string]struct{}{}
  15. }
  16. ok = true
  17. ec.DeniedACLs[clientOrNodeID] = struct{}{}
  18. return
  19. }
  20. // IsClientNodeAllowed - checks if given ext client and node are allowed to communicate
  21. func IsClientNodeAllowed(ec *models.ExtClient, clientOrNodeID string) bool {
  22. if ec == nil || len(clientOrNodeID) == 0 {
  23. return false
  24. }
  25. if ec.DeniedACLs == nil {
  26. return true
  27. }
  28. _, ok := ec.DeniedACLs[clientOrNodeID]
  29. return !ok
  30. }
  31. // RemoveDeniedNodeFromClient - removes a node id from set of denied nodes
  32. func RemoveDeniedNodeFromClient(ec *models.ExtClient, clientOrNodeID string) bool {
  33. if ec.DeniedACLs == nil {
  34. return true
  35. }
  36. _, ok := ec.DeniedACLs[clientOrNodeID]
  37. if !ok {
  38. return false
  39. }
  40. delete(ec.DeniedACLs, clientOrNodeID)
  41. return true
  42. }
  43. // SetClientDefaultACLs - set's a client's default ACLs based on network and nodes in network
  44. func SetClientDefaultACLs(ec *models.ExtClient) error {
  45. networkNodes, err := logic.GetNetworkNodes(ec.Network)
  46. if err != nil {
  47. return err
  48. }
  49. network, err := logic.GetNetwork(ec.Network)
  50. if err != nil {
  51. return err
  52. }
  53. for i := range networkNodes {
  54. currNode := networkNodes[i]
  55. if network.DefaultACL == "no" || currNode.DefaultACL == "no" {
  56. DenyClientNode(ec, currNode.ID.String())
  57. } else {
  58. RemoveDeniedNodeFromClient(ec, currNode.ID.String())
  59. }
  60. }
  61. return nil
  62. }
  63. // SetClientACLs - overwrites an ext client's ACL
  64. func SetClientACLs(ec *models.ExtClient, newACLs map[string]struct{}) {
  65. if ec == nil || newACLs == nil {
  66. return
  67. }
  68. ec.DeniedACLs = newACLs
  69. }
  70. func UpdateProNodeACLs(node *models.Node) error {
  71. networkNodes, err := logic.GetNetworkNodes(node.Network)
  72. if err != nil {
  73. return err
  74. }
  75. if err = adjustNodeAcls(node, networkNodes[:]); err != nil {
  76. return err
  77. }
  78. return nil
  79. }
  80. // adjustNodeAcls - adjusts ACLs based on a node's default value
  81. func adjustNodeAcls(node *models.Node, networkNodes []models.Node) error {
  82. networkID := nodeacls.NetworkID(node.Network)
  83. nodeID := nodeacls.NodeID(node.ID.String())
  84. currentACLs, err := nodeacls.FetchAllACLs(networkID)
  85. if err != nil {
  86. return err
  87. }
  88. for i := range networkNodes {
  89. currentNodeID := nodeacls.NodeID(networkNodes[i].ID.String())
  90. if currentNodeID == nodeID {
  91. continue
  92. }
  93. // 2 cases
  94. // both allow - allow
  95. // either 1 denies - deny
  96. if node.DoesACLDeny() || networkNodes[i].DoesACLDeny() {
  97. currentACLs.ChangeAccess(acls.AclID(nodeID), acls.AclID(currentNodeID), acls.NotAllowed)
  98. } else if node.DoesACLAllow() || networkNodes[i].DoesACLAllow() {
  99. currentACLs.ChangeAccess(acls.AclID(nodeID), acls.AclID(currentNodeID), acls.Allowed)
  100. }
  101. }
  102. _, err = currentACLs.Save(acls.ContainerID(node.Network))
  103. return err
  104. }