@@ -60,6 +60,30 @@ function Policy:printPolicy()
6060 end
6161end
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
107133end
@@ -163,12 +189,11 @@ end
163189 * @return whether the rule exists.
164190]]
165191function 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
172197end
173198
174199--[[
200225function 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]]
239266function 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
249275end
250276
251277-- Updates multiple policy rules from the model.
@@ -268,12 +294,17 @@ end
268294 * @return succeeds or not.
269295]]
270296function 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
279310end
301332function 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
352383end
353384
0 commit comments