blob: 627f8f77c52b39e729b2bc66a6f22301478f37fd [file] [log] [blame]
--Copyright 2021 The casbin Authors. All Rights Reserved.
--
--Licensed under the Apache License, Version 2.0 (the "License");
--you may not use this file except in compliance with the License.
--You may obtain a copy of the License at
--
-- http://www.apache.org/licenses/LICENSE-2.0
--
--Unless required by applicable law or agreed to in writing, software
--distributed under the License is distributed on an "AS IS" BASIS,
--WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--See the License for the specific language governing permissions and
--limitations under the License.
local Util = require("src/util/Util")
--[[
* Assertion represents an expression in a section of the model.
* For example: r = sub, obj, act
policy = {{}}
]]
local Assertion = {}
function Assertion:new()
local o = {}
o.key = ""
o.value = ""
o.tokens = {}
o.policy = {}
o.RM = {}
o.policyMap={}
o.priorityIndex=-1
setmetatable(o,self)
self.__index = self
return o
end
function Assertion:buildRoleLinks(rm)
self.RM = rm
local count = 0
for i = 1, string.len(self.value) do
if string.sub(self.value,i,i) == '_' then
count = count + 1
end
end
if count < 2 then
error("the number of '_' in role definition should be at least 2")
end
for _, rule in pairs(self.policy) do
if #rule < count then
error("grouping policy elements do not meet role definition")
end
if rule[3] then
self.RM:addLink(rule[1], rule[2], rule[3])
else
self.RM:addLink(rule[1], rule[2])
end
end
end
function Assertion:buildIncrementalRoleLinks(rm, op, rules)
self.RM = rm
local count = 0
for i = 1, string.len(self.value) do
if string.sub(self.value,i,i) == '_' then
count = count + 1
end
end
if count < 2 then
error("the number of '_' in role definition should be at least 2")
end
for _, rule in pairs(rules) do
if #rule < count then
error("grouping policy elements do not meet role definition")
end
if op == "POLICY_ADD" then
if rule[3] then
self.RM:addLink(rule[1], rule[2], rule[3])
else
self.RM:addLink(rule[1], rule[2])
end
elseif op == "POLICY_REMOVE" then
if rule[3] then
self.RM:deleteLink(rule[1], rule[2], rule[3])
else
self.RM:deleteLink(rule[1], rule[2])
end
else
error("invalid operation")
end
end
end
function Assertion:initPriorityIndex()
self.priorityIndex = -1
end
function Assertion:copy()
return Util.deepCopy(self)
end
return Assertion