Skip to content

Commit bfd4e78

Browse files
authored
Merge pull request #118 from Zxilly/master
feat: add update_policy()
2 parents 382546b + 7f7d26f commit bfd4e78

4 files changed

Lines changed: 107 additions & 1 deletion

File tree

casbin/internal_enforcer.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,40 @@ def _add_policies(self,sec,ptype,rules):
3737
self.watcher.update()
3838

3939
return rules_added
40+
41+
def _update_policy(self, sec, ptype, old_rule, new_rule):
42+
"""updates a rule from the current policy."""
43+
rule_updated = self.model.update_policy(sec, ptype, old_rule, new_rule)
44+
45+
if not rule_updated:
46+
return rule_updated
47+
48+
if self.adapter and self.auto_save:
49+
50+
if self.adapter.update_policy(sec, ptype, old_rule, new_rule) is False:
51+
return False
52+
53+
if self.watcher:
54+
self.watcher.update()
55+
56+
return rule_updated
57+
58+
def _update_policies(self, sec, ptype, old_rules, new_rules):
59+
"""updates rules from the current policy."""
60+
rules_updated = self.model.update_policies(sec, ptype, old_rules, new_rules)
61+
62+
if not rules_updated:
63+
return rules_updated
64+
65+
if self.adapter and self.auto_save:
66+
67+
if self.adapter.update_policies(sec, ptype, old_rules, new_rules) is False:
68+
return False
69+
70+
if self.watcher:
71+
self.watcher.update()
72+
73+
return rules_updated
4074

4175
def _remove_policy(self, sec, ptype, rule):
4276
"""removes a rule from the current policy."""

casbin/management_enforcer.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,22 @@ def add_named_policies(self,ptype,rules):
129129
Otherwise the function returns true for the corresponding by adding the new rule."""
130130
return self._add_policies('p',ptype,rules)
131131

132+
def update_policy(self, old_rule, new_rule):
133+
"""updates an authorization rule from the current policy."""
134+
return self.update_named_policy('p', old_rule, new_rule)
135+
136+
def update_policies(self, old_rules, new_rules):
137+
"""updates authorization rules from the current policy."""
138+
return self.update_named_policies('p', old_rules, new_rules)
139+
140+
def update_named_policy(self, ptype, old_rule, new_rule):
141+
"""updates an authorization rule from the current named policy."""
142+
return self._update_policy('p', ptype, old_rule, new_rule)
143+
144+
def update_named_policies(self, ptype, old_rules, new_rules):
145+
"""updates authorization rules from the current named policy."""
146+
return self._update_policies('p', ptype, old_rules, new_rules)
147+
132148
def remove_policy(self, *params):
133149
"""removes an authorization rule from the current policy."""
134150
return self.remove_named_policy('p', *params)

casbin/model/policy.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
from casbin import util
21
import logging
32

3+
from casbin import util
4+
45

56
class Policy:
67
def __init__(self):
@@ -88,6 +89,23 @@ def add_policies(self,sec,ptype,rules):
8889

8990
return True
9091

92+
def update_policy(self, sec, ptype, old_rule, new_rule):
93+
"""update a policy rule from the model."""
94+
95+
if not self.has_policy(sec, ptype, old_rule):
96+
return False
97+
98+
return self.remove_policy(sec, ptype, old_rule) and self.add_policy(sec, ptype, new_rule)
99+
100+
def update_policies(self, sec, ptype, old_rules, new_rules):
101+
"""update policy rules from the model."""
102+
103+
for rule in old_rules:
104+
if not self.has_policy(sec, ptype, rule):
105+
return False
106+
107+
return self.remove_policies(sec, ptype, old_rules) and self.add_policies(sec, ptype, new_rules)
108+
91109
def remove_policy(self, sec, ptype, rule):
92110
"""removes a policy rule from the model."""
93111

tests/model/test_policy.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from unittest import TestCase
2+
23
from casbin.model import Model
34
from tests.test_enforcer import get_examples
45

@@ -53,6 +54,43 @@ def test_add_role_policy(self):
5354
self.assertTrue(m.get_policy('p', 'p') == [p_rule1, p_rule2])
5455
self.assertTrue(m.get_policy('g', 'g') == [g_rule])
5556

57+
def test_update_policy(self):
58+
m = Model()
59+
m.load_model(get_examples("basic_model.conf"))
60+
61+
old_rule = ['admin', 'domain1', 'data1', 'read']
62+
new_rule = ['admin', 'domain1', 'data2', 'read']
63+
64+
m.add_policy('p', 'p', old_rule)
65+
self.assertTrue(m.has_policy('p', 'p', old_rule))
66+
67+
m.update_policy('p', 'p', old_rule, new_rule)
68+
self.assertFalse(m.has_policy('p', 'p', old_rule))
69+
self.assertTrue(m.has_policy('p', 'p', new_rule))
70+
71+
def test_update_policies(self):
72+
m = Model()
73+
m.load_model(get_examples("basic_model.conf"))
74+
75+
old_rules = [['admin', 'domain1', 'data1', 'read'],
76+
['admin', 'domain1', 'data2', 'read'],
77+
['admin', 'domain1', 'data3', 'read']]
78+
new_rules = [['admin', 'domain1', 'data4', 'read'],
79+
['admin', 'domain1', 'data5', 'read'],
80+
['admin', 'domain1', 'data6', 'read']]
81+
82+
m.add_policies('p', 'p', old_rules)
83+
84+
for old_rule in old_rules:
85+
self.assertTrue(m.has_policy('p', 'p', old_rule))
86+
87+
m.update_policies('p', 'p', old_rules, new_rules)
88+
89+
for old_rule in old_rules:
90+
self.assertFalse(m.has_policy('p', 'p', old_rule))
91+
for new_rule in new_rules:
92+
self.assertTrue(m.has_policy('p', 'p', new_rule))
93+
5694
def test_remove_policy(self):
5795
m = Model()
5896
m.load_model(get_examples("basic_model.conf"))

0 commit comments

Comments
 (0)