This is an automated email from the ASF dual-hosted git repository.
hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin.git
The following commit(s) were added to refs/heads/master by this push:
new a771855 fix: keep PolicyMap in sync when UpdatePolicies reuses old
rules
a771855 is described below
commit a7718555c28cfa92e4c22c7ddd90c739b56f7af2
Author: Yang Luo <[email protected]>
AuthorDate: Sat Oct 31 09:02:07 2026 +0800
fix: keep PolicyMap in sync when UpdatePolicies reuses old rules
---
model/policy.go | 48 ++++++++++++++++++++----------------------------
1 file changed, 20 insertions(+), 28 deletions(-)
diff --git a/model/policy.go b/model/policy.go
index 7669dfe..c09527d 100644
--- a/model/policy.go
+++ b/model/policy.go
@@ -300,40 +300,32 @@ func (model Model) UpdatePolicy(sec string, ptype string,
oldRule []string, newR
// UpdatePolicies updates a policy rule from the model.
func (model Model) UpdatePolicies(sec string, ptype string, oldRules, newRules
[][]string) (bool, error) {
- _, err := model.GetAssertion(sec, ptype)
+ assertion, err := model.GetAssertion(sec, ptype)
if err != nil {
return false, err
}
- rollbackFlag := false
- // index -> []{oldIndex, newIndex}
- modifiedRuleIndex := make(map[int][]int)
- // rollback
- defer func() {
- if rollbackFlag {
- for index, oldNewIndex := range modifiedRuleIndex {
- model[sec][ptype].Policy[index] =
oldRules[oldNewIndex[0]]
- oldPolicy :=
strings.Join(oldRules[oldNewIndex[0]], DefaultSep)
- newPolicy :=
strings.Join(newRules[oldNewIndex[1]], DefaultSep)
- delete(model[sec][ptype].PolicyMap, newPolicy)
- model[sec][ptype].PolicyMap[oldPolicy] = index
- }
- }
- }()
-
- newIndex := 0
- for oldIndex, oldRule := range oldRules {
- oldPolicy := strings.Join(oldRule, DefaultSep)
- index, ok := model[sec][ptype].PolicyMap[oldPolicy]
- if !ok {
- rollbackFlag = true
+ if len(oldRules) != len(newRules) {
+ return false, fmt.Errorf("the length of oldRules should be
equal to the length of newRules, but got the length of oldRules is %d, the
length of newRules is %d", len(oldRules), len(newRules))
+ }
+
+ // Resolve all indexes before writing, since newRules may reuse keys of
oldRules.
+ indexes := make([]int, len(oldRules))
+ seen := make(map[int]bool, len(oldRules))
+ for i, oldRule := range oldRules {
+ index, ok := assertion.PolicyMap[strings.Join(oldRule,
DefaultSep)]
+ if !ok || seen[index] {
return false, nil
}
+ seen[index] = true
+ indexes[i] = index
+ }
- model[sec][ptype].Policy[index] = newRules[newIndex]
- delete(model[sec][ptype].PolicyMap, oldPolicy)
- model[sec][ptype].PolicyMap[strings.Join(newRules[newIndex],
DefaultSep)] = index
- modifiedRuleIndex[index] = []int{oldIndex, newIndex}
- newIndex++
+ for _, oldRule := range oldRules {
+ delete(assertion.PolicyMap, strings.Join(oldRule, DefaultSep))
+ }
+ for i, newRule := range newRules {
+ assertion.Policy[indexes[i]] = newRule
+ assertion.PolicyMap[strings.Join(newRule, DefaultSep)] =
indexes[i]
}
return true, nil
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]