1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
--this module is for authorization help and group/role management
require ("posix")
require ("fs")
require ("format")
module (..., package.seeall)
-- Return a list of *controller.lua files
list_controllers = function(self)
local list = {}
local f = io.popen("/usr/bin/find /usr/share/acf/ |/bin/grep \"controller.lua$\" ")
for a in f:lines() do
list[#list + 1 ] = a
end
f:close()
return list
end
-- Return information about all or specified controller files
get_controllers = function(self,controller)
--we get all the controllers
local list = roles.list_controllers()
--we need to grab the directory and name of file
local temp = {}
for k,v in pairs(list) do
path = string.match(v,"[/%w-]+/")
filename = string.match(v,"[^/]*.lua")
name = string.match(filename,"[^.]*")
sname = string.match(filename,"[^-]*")
temp[sname] = {path=path,filename=filename,name=name,sname=sname}
end
if controller then
return temp[controller]
else
return temp
end
end
-- Find all public functions in a controller
get_controllers_func = function(self,controller_info)
if controller_info == nil then
return "Could not be processed"
else
package.path=package.path .. ";" .. controller_info.path .. "?.lua"
temp = require (controller_info.name)
temp1 = {}
for a,b in pairs(temp) do
local c = string.match(a,"mvc") or string.match(a,"^_")
if c == nil and type(temp[a])=="function" then
temp1[#temp1 +1] = a
end
end
--require (controller_info.name)
--we need to go through bobo and take out the mvc func and locals and --
return temp1
end
end
-- returns a table of the *.roles files
-- startdir should be the app dir
local get_roles_candidates = function (startdir)
local t = {}
local fh = io.popen('find ' .. startdir .. ' -name "*.roles"')
for x in fh:lines() do
t[#t + 1] = x
end
return t
end
-- Go through the roles files and determine the permissions for the specified roles
get_roles_perm = function(startdir,roles)
permissions = {}
-- find all of the roles files and add in the master file
local rolesfiles = get_roles_candidates(startdir)
rolesfiles[#rolesfiles + 1] = "/etc/acf/roles"
local reverseroles = {}
for x,role in ipairs(roles) do
reverseroles[role] = {}
end
reverseroles["ALL"] = {} -- always include ALL role
for x,file in ipairs(rolesfiles) do
f = fs.read_file_as_array(file)
for y,line in pairs(f) do
if reverseroles[string.match(line,"^[%a]+")] then
temp = format.string_to_table(string.match(line,"[,%a:]+$"),",")
for z,perm in pairs(temp) do
local control,action = string.match(perm,"(%a+):(%a+)")
if control then
if nil == permissions[control] then
permissions[control] = {}
end
if action and nil == permissions[control][action] then
permissions[control][action] = {}
end
end
end
end
end
end
return permissions
end
-- Go through the roles files and determine the permissions for the specified role
get_role_perm = function(startdir,role)
permissions = {}
-- find all of the roles files and add in the master file
local rolesfiles = get_roles_candidates(startdir)
rolesfiles[#rolesfiles + 1] = "/etc/acf/roles"
for x,file in ipairs(rolesfiles) do
f = fs.read_file_as_array(file)
for y,line in pairs(f) do
if role == string.match(line,"^[%a]+") then
temp = format.string_to_table(string.match(line,"[,%a:]+$"),",")
for z,perm in pairs(temp) do
local control,action = string.match(perm,"(%a+):(%a+)")
if control then
if nil == permissions[control] then
permissions[control] = {}
end
if action and nil == permissions[control][action] then
permissions[control][action] = {}
end
end
end
end
end
end
return permissions
end
|