summaryrefslogtreecommitdiffstats
path: root/lib/roles.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lib/roles.lua')
-rw-r--r--lib/roles.lua98
1 files changed, 56 insertions, 42 deletions
diff --git a/lib/roles.lua b/lib/roles.lua
index a07d290..e5786ba 100644
--- a/lib/roles.lua
+++ b/lib/roles.lua
@@ -8,17 +8,22 @@ module (..., package.seeall)
guest_role = "GUEST"
+-- Global variables so we don't have to figure out all the roles multiple times
+local defined_roles, default_roles, reverseroles, roles_candidates, role_table
+
-- returns a table of the *.roles files
-- startdir should be the app dir
local get_roles_candidates = function(self)
- local list = {}
- for p in string.gmatch(self.conf.appdir, "[^,]+") do
- local l = fs.find_files_as_array(".*%.roles", p, true) or {}
- for i,f in ipairs(l) do
- list[#list+1] = f
+ if not roles_candidates then
+ roles_candidates = {}
+ for p in string.gmatch(self.conf.appdir, "[^,]+") do
+ local l = fs.find_files_as_array(".*%.roles", p, true) or {}
+ for i,f in ipairs(l) do
+ roles_candidates[#roles_candidates+1] = f
+ end
end
end
- return list
+ return roles_candidates
end
-- Return a list of *controller.lua files
@@ -90,52 +95,61 @@ get_controllers_view = function(self,controller_info)
end
list_default_roles = function(self)
- local default_roles = {}
- local reverseroles = {}
+ if not default_roles then
+ default_roles = {}
+ reverseroles = {}
- -- find all of the default roles files and parse them
- local rolesfiles = get_roles_candidates(self)
+ -- find all of the default roles files and parse them
+ local rolesfiles = get_roles_candidates(self)
- for x,file in ipairs(rolesfiles) do
- f = fs.read_file_as_array(file) or {}
- local rolefile = string.match(file, "(/[^/]+/[^/]+)%.roles$")
- for y,line in pairs(f) do
- local role = string.match(line,"^[%w_]+")
- if role then
- if not reverseroles[rolefile.."/"..role] then
- default_roles[#default_roles+1] = rolefile.."/"..role
- reverseroles[default_roles[#default_roles]] = #default_roles
- end
- if not reverseroles[role] then
- default_roles[#default_roles+1] = role
- reverseroles[default_roles[#default_roles]] = #default_roles
+ for x,file in ipairs(rolesfiles) do
+ f = fs.read_file_as_array(file) or {}
+ local rolefile = string.match(file, "(/[^/]+/[^/]+)%.roles$")
+ for y,line in pairs(f) do
+ local role = string.match(line,"^[%w_]+")
+ if role then
+ if not reverseroles[rolefile.."/"..role] then
+ default_roles[#default_roles+1] = rolefile.."/"..role
+ reverseroles[default_roles[#default_roles]] = #default_roles
+ end
+ if not reverseroles[role] then
+ default_roles[#default_roles+1] = role
+ reverseroles[default_roles[#default_roles]] = #default_roles
+ end
end
end
end
- end
- table.sort(default_roles, function(a,b)
- if string.byte(a, 1) == 47 and string.byte(b,1) ~= 47 then return false
- elseif string.byte(a, 1) ~= 47 and string.byte(b,1) == 47 then return true
- else return a<b
- end
- end)
+ table.sort(default_roles, function(a,b)
+ if string.byte(a, 1) == 47 and string.byte(b,1) ~= 47 then return false
+ elseif string.byte(a, 1) ~= 47 and string.byte(b,1) == 47 then return true
+ else return a<b
+ end
+ end)
+ end
return default_roles, reverseroles
end
-list_roles = function(self)
- local defined_roles = {}
- local default_roles, reverseroles = list_default_roles(self)
-
- -- Open the roles file and parse for defined roles
- local entries = authenticator.auth.read_field(self, authenticator.roletable, "") or {}
- for x,entry in ipairs(entries) do
- if not reverseroles[entry.id] then
- defined_roles[#defined_roles + 1] = entry.id
+list_defined_roles = function(self)
+ if not defined_roles then
+ -- Open the roles file and parse for defined roles
+ defined_roles = {}
+ if not role_table then role_table = authenticator.auth.read_field(self, authenticator.roletable, "") or {} end
+ for x,entry in ipairs(role_table) do
+ if not reverseroles[entry.id] then
+ defined_roles[#defined_roles + 1] = entry.id
+ end
end
+ table.sort(defined_roles)
end
- table.sort(defined_roles)
+
+ return defined_roles
+end
+
+list_roles = function(self)
+ local default_roles = list_default_roles(self)
+ local defined_roles = list_defined_roles(self)
return defined_roles, default_roles
end
@@ -195,8 +209,8 @@ local determine_perms = function(self,roles)
end
-- then look in the user-editable roles
- local entries = authenticator.auth.read_field(self, authenticator.roletable, "") or {}
- for x,entry in ipairs(entries) do
+ if not role_table then role_table = authenticator.auth.read_field(self, authenticator.roletable, "") or {} end
+ for x,entry in ipairs(role_table) do
if reverseroles[entry.id] then
temp = format.string_to_table(entry.entry, ",")
for z,perm in pairs(temp) do