Skip to content

Commit 4cc5f60

Browse files
authored
feat: Add code relates with priorityIndex (#112)
Signed-off-by: Edmond <[email protected]>
1 parent 363976c commit 4cc5f60

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

src/model/Assertion.lua

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ function Assertion:new()
2727
o.policy = {}
2828
o.RM = {}
2929
o.policyMap={}
30+
o.priorityIndex=-1
3031
setmetatable(o,self)
3132
self.__index = self
3233
return o
@@ -98,4 +99,8 @@ function Assertion:buildIncrementalRoleLinks(rm, op, rules)
9899
end
99100
end
100101

102+
function Assertion:initPriorityIndex()
103+
self.priorityIndex = -1
104+
end
105+
101106
return Assertion

src/model/Model.lua

+4-5
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ function Model:addDef(sec, key, value)
7676
self.model[sec][key].key = key
7777
self.model[sec][key].value = value
7878
self.model[sec][key].policyMap={}
79+
self.model[sec][key]:initPriorityIndex()
7980
if sec == "r" or sec == "p" then
8081
self.model[sec][key].tokens = Util.splitCommaDelimited(self.model[sec][key].value)
8182
for k, v in pairs(self.model[sec][key].tokens) do
@@ -302,19 +303,17 @@ function Model:sortPoliciesByPriority()
302303
if not self.model["p"] then return end
303304

304305
for ptype, ast in pairs(self.model["p"]) do
305-
local priorityIndex = 0
306306
for inx, token in pairs(ast.tokens) do
307307
if token == ptype .. "_priority" then
308-
priorityIndex = inx
308+
ast.priorityIndex = inx
309309
break
310310
end
311311
end
312-
if priorityIndex == 0 then
312+
if ast.priorityIndex == -1 then
313313
return
314314
end
315-
316315
table.sort(ast.policy, function (a, b)
317-
return a[priorityIndex] < b[priorityIndex]
316+
return a[ast.priorityIndex] < b[ast.priorityIndex]
318317
end)
319318
for i,policy in pairs(ast.policy) do
320319
ast.policyMap[table.concat(policy,",")]=i

src/model/Policy.lua

+19
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,25 @@ function Policy:addPolicy(sec, ptype, rule)
226226
if not self:hasPolicy(sec, ptype, rule) then
227227
table.insert(self.model[sec][ptype].policy, rule)
228228
self.model[sec][ptype].policyMap[table.concat(rule,",")]=#self.model[sec][ptype].policy
229+
if sec == "p" and self.model[sec][ptype].priorityIndex > 0 then
230+
local idxInsert=tonumber(rule[self.model[sec][ptype].priorityIndex])
231+
if rule[self.model[sec][ptype].priorityIndex]~= nil then
232+
local i = #self.model[sec][ptype].policy-1
233+
for j=i, 1, -1 do
234+
local idx=tonumber(self.model[sec][ptype].policy[i+1][self.model[sec][ptype].priorityIndex])
235+
if idx < idxInsert then
236+
self.model[sec][ptype].policy[i+1] = self.model[sec][ptype].policy[i]
237+
self.model[sec][ptype].policyMap[table.concat(self.model[sec][ptype].policy[i+1], ",")]=i+1
238+
else
239+
i=j
240+
break
241+
end
242+
i=j
243+
end
244+
self.model[sec][ptype].policy[i] = rule
245+
self.model[sec][ptype].policyMap[table.concat(rule,",")] = i
246+
end
247+
end
229248
return true
230249
end
231250
return false

0 commit comments

Comments
 (0)