68 lines
1.3 KiB
Go
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
|
|
})
|
|
}
|