FrameworkZ 10.8.3
Provides a framework for Project Zomboid with various systems.
Loading...
Searching...
No Matches
_Security.lua
Go to the documentation of this file.
1local internalObjects = {}
5FrameworkZ.Security.__internalObjects = internalObjects
6FrameworkZ.Security.RegisteredObjects = {}
7FrameworkZ.Security.LoadedObjects = {}
9
10local function createSecureFunction(originalFunction, object)
11 return setmetatable({}, {
12 __call = function(_, ...)
13 if not object.__valid(object) then
14 FrameworkZ.Notifications:AddToQueue("Tampering Detected: Object integrity check failed. This has been logged.", FrameworkZ.Notifications.Types.Danger)
15 return false
16 end
17 return originalFunction(...)
18 end,
19 __metatable = false
20 })
21end
22
23local function wrapFunctionsWithValidation(tbl, object, visited)
24 visited = visited or {}
25 if visited[tbl] then return end
26 visited[tbl] = true
28 for k, v in pairs(tbl) do
29 if type(v) == "function" and not k:match("^_") then
30 tbl[k] = createSecureFunction(v, object)
31 elseif type(v) == "table" and not k:match("^_") and not v.__skipWrap then
32 wrapFunctionsWithValidation(v, object, visited)
33 end
34 end
35end
36
37local function hashObject(object)
38 local components = {}
40 local function collect(tbl, prefix)
41 for k, v in pairs(tbl) do
42 local keyPath = prefix .. "." .. k
43 if type(v) == "function" and not k:match("^_") then
44 table.insert(components, keyPath .. ":" .. tostring(v))
45 elseif type(v) == "table" and not k:match("^_") and not v.__skipWrap then
46 collect(v, keyPath)
47 end
48 end
49 end
50
51 collect(object, object.Meta and object.Meta.Name or "object")
52 table.sort(components)
53
54 return table.concat(components, "|")
55end
56
58 __valid = function(object)
59 local currentHash = hashObject(object)
60 return object.__hash == currentHash
61 end,
62
63 __index = function(tbl, key)
64 return rawget(FrameworkZ.Security.BaseObject, key)
65 end
66}
68function FrameworkZ.Security:CreateObject(name)
69 local object = setmetatable({}, self.BaseObject)
70
71 object.Meta = {
72 Author = "N/A",
73 Name = name,
74 Description = "No description set.",
75 Version = "1.0.0",
76 Compatibility = ""
77 }
78
79 object.__valid = self.BaseObject.__valid
80 object.__locked = false
82 internalObjects[name] = object
84 return object
85end
86
87function FrameworkZ.Security:LockAndLoadObject(object)
88 if not object or not object.Meta or not object.Meta.Name then
89 error("Invalid object passed to LockAndLoadObject.")
90 end
92 if object.__locked then
93 error("Object '" .. object.Meta.Name .. "' is already locked.")
94 end
95
96 local name = object.Meta.Name
97
98 wrapFunctionsWithValidation(object, object)
99 object.__hash = hashObject(object)
100 object.__locked = true
101
102 local proxy = {}
103 local mt = {
104 __index = object,
105 __newindex = function(t, key, value)
106 if isClient() then
107 FrameworkZ.Notifications:AddToQueue("Tampering Attempt: Cannot override plugin after locking. This has been logged.", FrameworkZ.Notifications.Types.Danger, 60)
108 end
109 end,
110 __pairs = function() return pairs(object) end,
111 __ipairs = function() return ipairs(object) end,
112 __len = function() return #object end,
113 __metatable = false
114 }
115
116 local lockedObject = setmetatable(proxy, mt)
117 local loadedObject, message = self:LoadLockedObject(name, lockedObject)
118
119 if not loadedObject then
120 error("Failed to load locked object: " .. message)
121 end
122
123 return loadedObject
124end
125
126function FrameworkZ.Security:LoadLockedObject(objectName, lockedObject)
127 local object = self.RegisteredObjects[objectName]
128
129 if object and not self.LoadedObjects[objectName] then
130 self.RegisteredObjects[objectName] = lockedObject
131 internalObjects[objectName] = nil
132
133 if object.Initialize then
134 object:Initialize()
135 end
136
137 self.LoadedObjects[objectName] = lockedObject
138
139 return self.LoadedObjects[objectName], "Object '" .. objectName .. "' loaded successfully."
140 end
141
142 return false, "Object '" .. objectName .. "' is not registered or is already loaded."
143end
144
145function FrameworkZ.Security:UnloadObject(objectName)
146 if not self.__allowUnload then
147 if isClient() then
148 FrameworkZ.Notifications:AddToQueue("Security Warning: Unload attempt blocked for '" .. objectName .. "'. This has been logged.", FrameworkZ.Notifications.Types.Danger)
149 end
150
151 return false
152 end
153
154 self.RegisteredObjects[objectName] = nil
155 self.LoadedObjects[objectName] = nil
156 internalObjects[objectName] = nil
157
158 return true
159end
160
161function FrameworkZ.Security:RegisterObject(object)
162 if not object.Meta or not object.Meta.Name then
163 print("Plugin missing metadata or name.")
164
165 return false
166 end
167
168 if object.__locked then
169 if isClient() then
170 FrameworkZ.Notifications:AddToQueue("Security Alert: Attempted to re-register locked plugin '" .. object.Meta.Name .. "'. This has been logged.", FrameworkZ.Notifications.Types.Warning, 60)
171 end
172
173 return false
174 end
175
176 local name = object.Meta.Name
177 internalObjects[name] = object
178end
179
180function FrameworkZ.Security:GetAllObjectss()
181 local hasRegisteredObject = false
182
183 for k, v in pairs(self.RegisteredPlugins) do
184 if v then
185 hasRegisteredObject = true
186 break
187 end
188 end
189
190 return hasRegisteredObject and self.RegisteredObjects or internalObjects
191end
192
193function FrameworkZ.Security:GetObject(objectName)
194 return self.RegisteredObjects[objectName] or internalObjects[objectName]
195end
196
197function FrameworkZ.Security:GetLoadedObject(objectName)
198 return self.LoadedObjects[objectName]
199end
200
void local object()
void type()
void self FrameworkZ UI self nil
Definition MainMenu.lua:95
void self self
Definition MainMenu.lua:89
void local loadedObject
Definition _Security.lua:91
void visited()
void FrameworkZ Security BaseObject()
void local components()
void local mt()
void __valid()
void __pairs()
void __newindex()
void __len()
void object __locked()
void local internalObjects()
void local keyPath()
void local message()
void FrameworkZ Security __index()
void FrameworkZ Security LoadedObjects()
void FrameworkZ Security RegisteredObjects()
void FrameworkZ Security()
void if type v()
void local lockedObject()
void local currentHash()
void __ipairs()
void __call()
void __metatable()
void local name()
void return object __hash()
void local proxy()
void tbl()
void local isClient()
void FrameworkZ Foundation()
void key()
void plugin()
void value()
Foundation for FrameworkZ.
Notifications module for FrameworkZ. Queues and sends notifications.
void RegisterObject(object)
void GetLoadedObject(objectName)
void LockAndLoadObject(object)
void GetObject(objectName)
void LoadLockedObject(objectName, lockedObject)
void CreateObject(name)
void UnloadObject(objectName)