mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-21 23:53:14 +01:00
Rollback simple ACL rules processing. (#803)
This commit is contained in:
parent
251f2d7bc2
commit
0343c5f239
@ -283,7 +283,7 @@ func (a *Account) GetGroup(groupID string) *Group {
|
|||||||
|
|
||||||
// GetPeerNetworkMap returns a group by ID if exists, nil otherwise
|
// GetPeerNetworkMap returns a group by ID if exists, nil otherwise
|
||||||
func (a *Account) GetPeerNetworkMap(peerID, dnsDomain string) *NetworkMap {
|
func (a *Account) GetPeerNetworkMap(peerID, dnsDomain string) *NetworkMap {
|
||||||
aclPeers, _ := a.getPeersByPolicy(peerID)
|
aclPeers := a.getPeersByACL(peerID)
|
||||||
// exclude expired peers
|
// exclude expired peers
|
||||||
var peersToConnect []*Peer
|
var peersToConnect []*Peer
|
||||||
var expiredPeers []*Peer
|
var expiredPeers []*Peer
|
||||||
|
@ -286,9 +286,7 @@ func (s *FileStore) SaveAccount(account *Account) error {
|
|||||||
s.PrivateDomain2AccountID[accountCopy.Domain] = accountCopy.Id
|
s.PrivateDomain2AccountID[accountCopy.Domain] = accountCopy.Id
|
||||||
}
|
}
|
||||||
|
|
||||||
if accountCopy.Rules == nil {
|
accountCopy.Rules = make(map[string]*Rule)
|
||||||
accountCopy.Rules = make(map[string]*Rule)
|
|
||||||
}
|
|
||||||
for _, policy := range accountCopy.Policies {
|
for _, policy := range accountCopy.Policies {
|
||||||
for _, rule := range policy.Rules {
|
for _, rule := range policy.Rules {
|
||||||
accountCopy.Rules[rule.ID] = rule.ToRule()
|
accountCopy.Rules[rule.ID] = rule.ToRule()
|
||||||
|
@ -209,7 +209,7 @@ func (am *DefaultAccountManager) GetPeers(accountID, userID string) ([]*Peer, er
|
|||||||
// fetch all the peers that have access to the user's peers
|
// fetch all the peers that have access to the user's peers
|
||||||
for _, peer := range peers {
|
for _, peer := range peers {
|
||||||
// TODO: use firewall rules
|
// TODO: use firewall rules
|
||||||
aclPeers, _ := account.getPeersByPolicy(peer.ID)
|
aclPeers := account.getPeersByACL(peer.ID)
|
||||||
for _, p := range aclPeers {
|
for _, p := range aclPeers {
|
||||||
peersMap[p.ID] = p
|
peersMap[p.ID] = p
|
||||||
}
|
}
|
||||||
@ -816,7 +816,7 @@ func (am *DefaultAccountManager) GetPeer(accountID, peerID, userID string) (*Pee
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, p := range userPeers {
|
for _, p := range userPeers {
|
||||||
aclPeers, _ := account.getPeersByPolicy(p.ID)
|
aclPeers := account.getPeersByACL(p.ID)
|
||||||
for _, aclPeer := range aclPeers {
|
for _, aclPeer := range aclPeers {
|
||||||
if aclPeer.ID == peerID {
|
if aclPeer.ID == peerID {
|
||||||
return peer, nil
|
return peer, nil
|
||||||
@ -833,6 +833,98 @@ func updatePeerMeta(peer *Peer, meta PeerSystemMeta, account *Account) *Peer {
|
|||||||
return peer
|
return peer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetPeerRules returns a list of source or destination rules of a given peer.
|
||||||
|
func (a *Account) GetPeerRules(peerID string) (srcRules []*Rule, dstRules []*Rule) {
|
||||||
|
// Rules are group based so there is no direct access to peers.
|
||||||
|
// First, find all groups that the given peer belongs to
|
||||||
|
peerGroups := make(map[string]struct{})
|
||||||
|
|
||||||
|
for s, group := range a.Groups {
|
||||||
|
for _, peer := range group.Peers {
|
||||||
|
if peerID == peer {
|
||||||
|
peerGroups[s] = struct{}{}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Second, find all rules that have discovered source and destination groups
|
||||||
|
srcRulesMap := make(map[string]*Rule)
|
||||||
|
dstRulesMap := make(map[string]*Rule)
|
||||||
|
for _, rule := range a.Rules {
|
||||||
|
for _, g := range rule.Source {
|
||||||
|
if _, ok := peerGroups[g]; ok && srcRulesMap[rule.ID] == nil {
|
||||||
|
srcRules = append(srcRules, rule)
|
||||||
|
srcRulesMap[rule.ID] = rule
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, g := range rule.Destination {
|
||||||
|
if _, ok := peerGroups[g]; ok && dstRulesMap[rule.ID] == nil {
|
||||||
|
dstRules = append(dstRules, rule)
|
||||||
|
dstRulesMap[rule.ID] = rule
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return srcRules, dstRules
|
||||||
|
}
|
||||||
|
|
||||||
|
// getPeersByACL returns all peers that given peer has access to.
|
||||||
|
func (a *Account) getPeersByACL(peerID string) []*Peer {
|
||||||
|
var peers []*Peer
|
||||||
|
srcRules, dstRules := a.GetPeerRules(peerID)
|
||||||
|
|
||||||
|
groups := map[string]*Group{}
|
||||||
|
for _, r := range srcRules {
|
||||||
|
if r.Disabled {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if r.Flow == TrafficFlowBidirect {
|
||||||
|
for _, gid := range r.Destination {
|
||||||
|
if group, ok := a.Groups[gid]; ok {
|
||||||
|
groups[gid] = group
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, r := range dstRules {
|
||||||
|
if r.Disabled {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if r.Flow == TrafficFlowBidirect {
|
||||||
|
for _, gid := range r.Source {
|
||||||
|
if group, ok := a.Groups[gid]; ok {
|
||||||
|
groups[gid] = group
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
peersSet := make(map[string]struct{})
|
||||||
|
for _, g := range groups {
|
||||||
|
for _, pid := range g.Peers {
|
||||||
|
peer, ok := a.Peers[pid]
|
||||||
|
if !ok {
|
||||||
|
log.Warnf(
|
||||||
|
"peer %s found in group %s but doesn't belong to account %s",
|
||||||
|
pid,
|
||||||
|
g.ID,
|
||||||
|
a.Id,
|
||||||
|
)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// exclude original peer
|
||||||
|
if _, ok := peersSet[peer.ID]; peer.ID != peerID && !ok {
|
||||||
|
peersSet[peer.ID] = struct{}{}
|
||||||
|
peers = append(peers, peer.Copy())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return peers
|
||||||
|
}
|
||||||
|
|
||||||
// updateAccountPeers updates all peers that belong to an account.
|
// updateAccountPeers updates all peers that belong to an account.
|
||||||
// Should be called when changes have to be synced to peers.
|
// Should be called when changes have to be synced to peers.
|
||||||
func (am *DefaultAccountManager) updateAccountPeers(account *Account) error {
|
func (am *DefaultAccountManager) updateAccountPeers(account *Account) error {
|
||||||
|
@ -136,6 +136,8 @@ func TestAccountManager_GetNetworkMap(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestAccountManager_GetNetworkMapWithPolicy(t *testing.T) {
|
func TestAccountManager_GetNetworkMapWithPolicy(t *testing.T) {
|
||||||
|
// TODO: disable until we start use policy again
|
||||||
|
t.Skip()
|
||||||
manager, err := createManager(t)
|
manager, err := createManager(t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
Loading…
Reference in New Issue
Block a user