3
0
corteza/pkg/permissions/ruleset_utils.go
2019-10-01 17:53:20 +02:00

68 lines
1.3 KiB
Go

package permissions
// merge applies new rules (changes) to existing set and mark all changes as dirty
func (set RuleSet) merge(rules ...*Rule) (out RuleSet) {
var (
o int
olen = len(set)
)
if olen == 0 {
// Nothing exists yet, mark all as dirty
for r := range rules {
rules[r].dirty = true
}
return rules
} else {
out = set
newRules:
for _, rule := range rules {
// Never go beyond the last old rule (olen)
for o = 0; o < olen; o++ {
if out[o].Equals(rule) {
out[o].dirty = out[o].Access != rule.Access
out[o].Access = rule.Access
// only one rule can match so proceed with next new rule
continue newRules
}
}
// none of the old rules matched, append
var c = *rule
c.dirty = true
out = append(out, &c)
}
}
return
}
// dirty returns list of changed (dirty==true) and deleted (Access==Inherit) rules
func (set RuleSet) dirty() (inherited, rest RuleSet) {
inherited, rest = RuleSet{}, RuleSet{}
for _, r := range set {
var c = *r
if r.Access == Inherit {
inherited = append(inherited, &c)
} else if r.dirty {
rest = append(rest, &c)
}
}
return
}
// reset dirty flag
func (set RuleSet) clear() {
_ = set.Walk(func(rule *Rule) error {
rule.dirty = false
return nil
})
}