feat: Add function addPoliciesWithAffected Signed-off-by: Edmond <edomondja@gmail.com>
diff --git a/src/model/Policy.lua b/src/model/Policy.lua index e9f7592..69f7fd7 100644 --- a/src/model/Policy.lua +++ b/src/model/Policy.lua
@@ -239,19 +239,25 @@ * @return succeeds or not. ]] function Policy:addPolicies(sec, ptype, rules) - local size = #self.model[sec][ptype].policy + return self:addPoliciesWithAffected(sec, ptype, rules)~=0 +end + +--[[ + * addPoliciesWithAffected adds policy rules to the model. + * @param sec the section, "p" or "g". + * @param ptype the policy type, "p", "p2", .. or "g", "g2", .. + * @param rules the policy rules. + * @return effected. +]] +function Policy:addPoliciesWithAffected(sec, ptype, rules) + local effected={} for _, rule in pairs(rules) do - if not self:hasPolicy(sec, ptype, rule) then - table.insert(self.model[sec][ptype].policy, rule) - self.model[sec][ptype].policyMap[table.concat(rule,",")]=#self.model[sec][ptype].policy + if self:addPolicy(sec, ptype, rule) then + table.insert(effected, rule) + end end - - if size < #self.model[sec][ptype].policy then - return true - else - return false - end + return effected end --[[ @@ -332,9 +338,8 @@ function Policy:removePoliciesWithEffected(sec, ptype, rules) local effected={} for _,rule in pairs(rules) do - if self:hasPolicy(sec, ptype, rule) then + if self:removePolicy(sec,ptype,rule) then table.insert(effected,rule) - self:removePolicy(sec,ptype,rule) end end return effected
diff --git a/tests/model/model_spec.lua b/tests/model/model_spec.lua index 82843c0..a5162a5 100644 --- a/tests/model/model_spec.lua +++ b/tests/model/model_spec.lua
@@ -59,7 +59,6 @@ assert.is.False(m:hasPolicies("p", "p", rulesnotmatched)) end) - it("test addPolicy", function () local m = Model:new() m:loadModel(basic_path) @@ -72,6 +71,25 @@ assert.is.True(m:hasPolicy("p", "p", rule)) end) + it("test addPoliciesWithAffected", function () + local m = Model:new() + m:loadModel(basic_path) + + local rules = {{'admin', 'domain1', 'data1', 'read'},{'admin', 'domain2', 'data2', 'read'},{'admin', 'domain1', 'data1', 'write'}} + assert.is.False(m:hasPolicies("p", "p", rules)) + + assert.are.same(rules,m:addPoliciesWithAffected("p", "p", rules)) + assert.is.True(m:hasPolicies("p", "p", rules)) + + local rules1 = {{'Alice', 'domain1', 'data1', 'read'},{'Bob', 'domain2', 'data2', 'read'},{'admin', 'domain1', 'data1', 'write'}} + assert.is.True(m:hasPolicies("p", "p", rules1)) + + assert.are.same({{'Alice', 'domain1', 'data1', 'read'},{'Bob', 'domain2', 'data2', 'read'}},m:addPoliciesWithAffected("p", "p", rules1)) + assert.is.True(m:hasPolicy("p", "p", {'Alice', 'domain1', 'data1', 'read'})) + assert.is.True(m:hasPolicy("p", "p", {'Bob', 'domain2', 'data2', 'read'})) + + end) + it("test removePolicy", function () local m = Model:new() m:loadModel(basic_path) @@ -100,6 +118,16 @@ assert.are.same(rules,m:removePoliciesWithEffected("p", "p", rules)) assert.is.False(m:hasPolicies("p", "p", rules)) assert.is.False(m:removePolicy("p", "p", rules[1])) + + m:addPolicies("p", "p", rules) + assert.is.True(m:hasPolicies("p", "p", rules)) + + local removeList={{'Alice', 'domain1', 'data1', 'read'},{'admin', 'domain2', 'data2', 'read'},{'admin', 'domain1', 'data1', 'write'}} + assert.is.False(m:hasPolicy("p", "p", {'Alice', 'domain1', 'data1', 'read'})) + + assert.are.same({{'admin', 'domain2', 'data2', 'read'},{'admin', 'domain1', 'data1', 'write'}},m:removePoliciesWithEffected("p", "p", removeList)) + assert.is.False(m:hasPolicy("p", "p", removeList[2])) + assert.is.False(m:removePolicy("p", "p", removeList[3])) end) it("test addRolePolicy", function ()