Skip to content

Commit de2de0a

Browse files
authored
feat: Add code relates with policyMap (#96)
Signed-off-by: Edmond <edomondja@gmail.com>
1 parent 4cf7737 commit de2de0a

File tree

5 files changed

+73
-31
lines changed

5 files changed

+73
-31
lines changed

src/model/Assertion.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function Assertion:new()
2626
o.tokens = {}
2727
o.policy = {}
2828
o.RM = {}
29-
29+
o.policyMap={}
3030
setmetatable(o,self)
3131
self.__index = self
3232
return o

src/model/Model.lua

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function Model:addDef(sec, key, value)
7575
self.model[sec][key] = Assertion:new()
7676
self.model[sec][key].key = key
7777
self.model[sec][key].value = value
78-
78+
self.model[sec][key].policyMap={}
7979
if sec == "r" or sec == "p" then
8080
self.model[sec][key].tokens = Util.splitCommaDelimited(self.model[sec][key].value)
8181
for k, v in pairs(self.model[sec][key].tokens) do
@@ -227,6 +227,9 @@ function Model:sortPoliciesByPriority()
227227
table.sort(ast.policy, function (a, b)
228228
return a[priorityIndex] < b[priorityIndex]
229229
end)
230+
for i,policy in pairs(ast.policy) do
231+
ast.policyMap[table.concat(policy,",")]=i
232+
end
230233
end
231234
end
232235

src/model/Policy.lua

Lines changed: 58 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,30 @@ function Policy:printPolicy()
6060
end
6161
end
6262

63+
--[[
64+
* printPolicyMap prints the policyMap to log.
65+
]]
66+
function Policy:printPolicyMap()
67+
self.logger:info("policyMap: \n")
68+
if self.model["p"] then
69+
for k, ast in pairs(self.model["p"]) do
70+
self.logger:info("%s: key,value", k )
71+
for i,v in pairs(ast.policyMap) do
72+
self.logger:info("{%s,%s}", i, v)
73+
end
74+
end
75+
end
76+
77+
if self.model["g"] then
78+
for k, ast in pairs(self.model["g"]) do
79+
self.logger:info("%s: key,value", k )
80+
for i,v in pairs(ast.policyMap) do
81+
self.logger:info("{%s,%s}", i, v)
82+
end
83+
end
84+
end
85+
end
86+
6387
--[[
6488
* savePolicyToText saves the policy to the text.
6589
*
@@ -96,12 +120,14 @@ function Policy:clearPolicy()
96120
if self.model["p"] then
97121
for _, v in pairs(self.model["p"]) do
98122
v.policy = {}
123+
v.policyMap={}
99124
end
100125
end
101126

102127
if self.model["g"] then
103128
for _, v in pairs(self.model["g"]) do
104129
v.policy = {}
130+
v.policyMap={}
105131
end
106132
end
107133
end
@@ -163,12 +189,11 @@ end
163189
* @return whether the rule exists.
164190
]]
165191
function Policy:hasPolicy(sec, ptype, rule)
166-
for _, r in pairs(self.model[sec][ptype].policy) do
167-
if Util.arrayEquals(rule, r) then
168-
return true
169-
end
192+
if self.model[sec][ptype].policyMap[table.concat(rule,",")]==nil then
193+
return false
194+
else
195+
return true
170196
end
171-
return false
172197
end
173198

174199
--[[
@@ -200,6 +225,7 @@ end
200225
function Policy:addPolicy(sec, ptype, rule)
201226
if not self:hasPolicy(sec, ptype, rule) then
202227
table.insert(self.model[sec][ptype].policy, rule)
228+
self.model[sec][ptype].policyMap[table.concat(rule,",")]=#self.model[sec][ptype].policy
203229
return true
204230
end
205231
return false
@@ -217,6 +243,7 @@ function Policy:addPolicies(sec, ptype, rules)
217243
for _, rule in pairs(rules) do
218244
if not self:hasPolicy(sec, ptype, rule) then
219245
table.insert(self.model[sec][ptype].policy, rule)
246+
self.model[sec][ptype].policyMap[table.concat(rule,",")]=#self.model[sec][ptype].policy
220247
end
221248
end
222249

@@ -238,14 +265,13 @@ end
238265
]]
239266
function Policy:updatePolicy(sec, ptype, oldRule, newRule)
240267
if not self:hasPolicy(sec, ptype, oldRule) then return false end
241-
242-
for k, v in pairs(self.model[sec][ptype].policy) do
243-
if Util.arrayEquals(oldRule, v) then
244-
table.remove(self.model[sec][ptype].policy, k)
245-
table.insert(self.model[sec][ptype].policy, newRule)
246-
return true
247-
end
248-
end
268+
local key = table.concat(oldRule,",")
269+
local index = self.model[sec][ptype].policyMap[key]
270+
self.model[sec][ptype].policy[index]=newRule
271+
self.model[sec][ptype].policyMap[key]=nil
272+
local tempKey=table.concat(newRule,",")
273+
self.model[sec][ptype].policyMap[tempKey]=index
274+
return true
249275
end
250276

251277
-- Updates multiple policy rules from the model.
@@ -268,12 +294,17 @@ end
268294
* @return succeeds or not.
269295
]]
270296
function Policy:removePolicy(sec, ptype, rule)
271-
for i = 1, #self.model[sec][ptype].policy do
272-
local r = self.model[sec][ptype].policy[i]
273-
if Util.arrayEquals(r, rule) then
274-
table.remove(self.model[sec][ptype].policy, i)
275-
return true
297+
if self:hasPolicy(sec,ptype,rule) then
298+
local key = table.concat(rule,",")
299+
local index = self.model[sec][ptype].policyMap[key]
300+
table.remove(self.model[sec][ptype].policy, index)
301+
self.model[sec][ptype].policyMap[key]=nil
302+
local length = #self.model[sec][ptype].policy
303+
for i=index, length, 1 do
304+
local tempKey=table.concat(self.model[sec][ptype].policy[i],",")
305+
self.model[sec][ptype].policyMap[tempKey]=i
276306
end
307+
return true
277308
end
278309
return false
279310
end
@@ -301,12 +332,9 @@ end
301332
function Policy:removePoliciesWithEffected(sec, ptype, rules)
302333
local effected={}
303334
for _,rule in pairs(rules) do
304-
for k, v in pairs(self.model[sec][ptype].policy) do
305-
if Util.arrayEquals(rule, v) then
306-
table.insert(effected,rule)
307-
table.remove(self.model[sec][ptype].policy, k)
308-
break
309-
end
335+
if self:hasPolicy(sec, ptype, rule) then
336+
table.insert(effected,rule)
337+
self:removePolicy(sec,ptype,rule)
310338
end
311339
end
312340
return effected
@@ -329,7 +357,7 @@ function Policy:removeFilteredPolicy(sec, ptype, fieldIndex, fieldValues)
329357

330358
if not self.model[sec] then return res end
331359
if not self.model[sec][ptype] then return res end
332-
360+
self.model[sec][ptype].policyMap={}
333361
for _, rule in pairs(self.model[sec][ptype].policy) do
334362
local matched = true
335363
for i, value in pairs(fieldValues) do
@@ -344,10 +372,13 @@ function Policy:removeFilteredPolicy(sec, ptype, fieldIndex, fieldValues)
344372
res = true
345373
else
346374
table.insert(tmp, rule)
375+
local tempKey=table.concat(rule,",")
376+
self.model[sec][ptype].policyMap[tempKey]=#tmp
347377
end
348378
end
349-
350-
self.model[sec][ptype].policy = tmp
379+
if #tmp~=#self.model[sec][ptype].policy then
380+
self.model[sec][ptype].policy = tmp
381+
end
351382
return res, effects
352383
end
353384

src/util/Util.lua

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,11 +270,19 @@ function Util.loadPolicyLine(line, model)
270270
end
271271

272272
model.model[sec][key].policy = model.model[sec][key].policy or {}
273+
model.model[sec][key].policyMap={}
274+
for i,policy in pairs(model.model[sec][key].policy) do
275+
model.model[sec][key].policyMap[table.concat(policy,",")]=i
276+
end
273277
local rules = {}
274278
for i = 2, #tokens do
275279
table.insert(rules, tokens[i])
276280
end
277281
table.insert(model.model[sec][key].policy, rules)
282+
model.model[sec][key].policyMap={}
283+
for i,policy in pairs(model.model[sec][key].policy) do
284+
model.model[sec][key].policyMap[table.concat(policy,",")]=i
285+
end
278286
end
279287

280288

tests/model/model_spec.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
--Copyright 2021 The casbin Authors. All Rights Reserved.
1+
--Copyright 2021 The casbin Authors. All Rights Reserved.
22
--
33
--Licensed under the Apache License, Version 2.0 (the "License");
44
--you may not use this file except in compliance with the License.
@@ -99,7 +99,7 @@ describe("model tests", function()
9999

100100
assert.are.same(m:removePoliciesWithEffected("p", "p", rules),rules)
101101
assert.is.False(m:hasPolicies("p", "p", rules))
102-
assert.is.False(m:removePolicy("p", "p", rules))
102+
assert.is.False(m:removePolicy("p", "p", rules[1]))
103103
end)
104104

105105
it("test addRolePolicy", function ()

0 commit comments

Comments
 (0)