· 5 years ago · Jan 17, 2021, 02:42 AM
1--Dusk's Lock Server v2 (Server Code)
2--(c)2021 by Christopher Yarch a.k.a.
3--Dusk the Dragon
4
5--Variable initalization
6config = {}
7domainName = nil
8serverSecurityKey = nil
9side = nil
10users = {}
11oldPull = os.pullEvent
12os.pullEvent = os.pullEventRaw
13
14--acquire required string utilities api
15if fs.exists("strutil") == false then
16 shell.run("pastebin get ppJ0ggSq strutil")
17 os.loadAPI("strutil")
18else
19 os.loadAPI("strutil")
20end
21
22function drawConsoleMenu()
23 term.clear()
24 term.setCursorPos(1,1)
25 print("Dusk's Lock Server v2 Console")
26 print(" ")
27 print("1: Add User")
28 print("2: Remove User")
29 print("3: Change User Password")
30 print("4: Change User Level")
31 print("5: Generate Client Config")
32 print("6: Create User Keycard")
33 print("7: Exit Program")
34 print(" ")
35 write("> ")
36end
37
38function handleRequests()
39 id, msg = rednet.receive(domainName)
40 msg = strutil.decrypt(msg,serverSecurityKey)
41 msg = textutils.unserialise(msg)
42 for i=1, #users do
43 if users[i][1] == msg[1] then
44 if users[i][2] == msg[2] then
45 if tonumber(users[i][3]) >= tonumber(msg[3]) then
46 response = "auth"
47 response = strutil.encrypt(response,serverSecurityKey)
48 rednet.broadcast(response,domainName)
49 return
50 end
51 end
52 end
53 end
54 response = "nope"
55 response = strutil.encrypt(response, serverSecurityKey)
56 rednet.broadcast(response,domainName)
57end
58
59
60function adminAuthorize()
61 term.clear()
62 term.setCursorPos(1,1)
63 print("Admin Authorization Required!")
64 print(" ")
65 write("Admin Username: ")
66 adminUsr = read()
67 print(" ")
68 write("Admin Password: ")
69 adminPwd = read("*")
70 for i=1, #users do
71 if users[i][1] == adminUsr then
72 if users[i][2] == adminPwd then
73 if users[i][3] == 5 then
74 print("Admin Authorized")
75 return true
76 end
77 end
78 end
79 end
80 print("Unable to authorize...")
81 return false
82end
83
84function handleConsoleInput()
85 drawConsoleMenu()
86 input = read()
87 if input == "1" then
88 success = adminAuthorize()
89 if success == true then
90 sleep(1)
91 local newUser = {}
92 term.clear()
93 term.setCursorPos(1,1)
94 write("Username: ")
95 username = read()
96 print(" ")
97 write("Password: ")
98 password = read("*")
99 print(" ")
100 write("Access Level (1-4): ")
101 level = tonumber(read())
102 table.insert(newUser,username)
103 table.insert(newUser,password)
104 table.insert(newUser,level)
105 table.insert(users,newUser)
106 print(" ")
107 print("Saving data...")
108 data = textutils.serialise(users)
109 data = strutil.encrypt(data,serverSecurityKey)
110 f = fs.open("serverUsers.dat","w")
111 f.write(data)
112 f.close()
113 print("Data saved!")
114 sleep(2)
115 else
116 print("Admin Authorization Not Obtained")
117 sleep(2)
118 end
119 elseif input == "2" then
120 success = adminAuthorize()
121 if success == true then
122 sleep(1)
123 term.clear()
124 term.setCursorPos(1,1)
125 write("Username to delete: ")
126 username = read()
127 for i=1, #users do
128 if users[i][1] == username then
129 table.remove(users,i)
130 print("User removed")
131 break
132 end
133 end
134 print("Saving Data...")
135 data = textutils.serialise(users)
136 data = strutil.encrypt(data,serverSecurityKey)
137 f = fs.open("serverUsers.dat","w")
138 f.write(data)
139 f.close()
140 print("Data saved!")
141 sleep(2)
142 else
143 print("Admin Authorization Not Obtained")
144 sleep(2)
145 end
146 elseif input == "3" then
147 success = adminAuthorize()
148 if success == true then
149 sleep(1)
150 term.clear()
151 term.setCursorPos(1,1)
152 write("Username to PwdChange: ")
153 username = read()
154 print(" ")
155 write("Password to Set: ")
156 password = read("*")
157 for i=1, #users do
158 if users[i][1] == username then
159 users[i][2] = password
160 print("Password changed.")
161 end
162 end
163 print("Saving data")
164 data = textutils.serialise(users)
165 data = strutil.encrypt(data,serverSecurityKey)
166 f = fs.open("serverUsers.dat","w")
167 f.write(data)
168 f.close()
169 print("Data saved!")
170 sleep(2)
171 else
172 print("Admin Authorization Not Obtained")
173 sleep(2)
174 end
175 elseif input == "4" then
176 success = adminAuthorize()
177 if success == true then
178 sleep(1)
179 term.clear()
180 term.setCursorPos(1,1)
181 write("User to LvlChange: ")
182 username = read()
183 print(" ")
184 write("New Access Level (1-4): ")
185 level = tonumber(read())
186 for i=1, #users do
187 if users[i][1] == username then
188 users[i][3] = level
189 print("Level Changed")
190 end
191 end
192 print("Saving Data")
193 data = textutils.serialise(users)
194 data = strutil.encrypt(data,serverSecurityKey)
195 f = fs.open("serverUsers.dat","w")
196 f.write(data)
197 f.close()
198 print("Data saved!")
199 sleep(2)
200 else
201 print("Admin Authorization Not Obtained")
202 sleep(2)
203 end
204 elseif input == "5" then
205 success = adminAuthorize()
206 if success == true then
207 sleep(1)
208 term.clear()
209 term.setCursorPos(1,1)
210 write("Insert blank disk and hit enter...")
211 read()
212 if disk.isPresent("bottom") and disk.hasData("bottom") then
213 local clientConfig = {}
214 table.insert(clientConfig,domainName)
215 table.insert(clientConfig,serverSecurityKey)
216 f = fs.open("disk/clientServer.dat","w")
217 f.write(textutils.serialise(clientConfig))
218 f.close()
219 print("Client Configuration Created!")
220 disk.eject("bottom")
221 sleep(2)
222 else
223 print("No disk found...")
224 sleep(2)
225 end
226 else
227 print("Admin Authorization Not Obtained")
228 end
229 elseif input == "6" then
230 success = adminAuthorize()
231 if success == true then
232 sleep(1)
233 term.clear()
234 term.setCursorPos(1,1)
235 print("Insert blank disk and hit enter...")
236 read()
237 write("User to KeyCreate: ")
238 username = read()
239 for i=1, #users do
240 if users[i][1] == username then
241 data = users[i]
242 data = textutils.serialise(data)
243 data = strutil.encrypt(data,serverSecurityKey)
244 f = fs.open("disk/keydata.dat","w")
245 f.write(data)
246 f.close()
247 print("Keycard created!")
248 end
249 end
250 sleep(2)
251 else
252 print("Admin Authorization Not Obtained")
253 sleep(2)
254 end
255 elseif input == "7" then
256 success = adminAuthorize()
257 if success == true then
258 os.pullEvent = oldPull
259 error("Exit Command Authorized")
260 else
261 print("Admin Authorization Not Obtained")
262 sleep(2)
263 end
264 end
265end
266
267
268--program initalization
269term.clear()
270term.setCursorPos(1,1)
271print("Dusk's Lock Server v2")
272print("Initalizing...")
273
274if fs.exists("serverConfig.dat") then
275 print("Found configuration...")
276 f = fs.open("serverConfig.dat", "r")
277 d = f.readAll()
278 f.close()
279 config = textutils.unserialise(d)
280 domainName = config[1]
281 serverSecurityKey = config[2]
282 side = config[3]
283 rednet.open(side)
284 print("Configuration loaded!")
285else
286 print("No config found.")
287 print("Entering First Time Setup!")
288 sleep(2)
289 term.clear()
290 term.setCursorPos(1,1)
291 term.write("New Domain Name?: ")
292 domainName = read()
293 table.insert(config, domainName)
294 print(" ")
295 print("Saved. Generating Local Security Key.")
296 data = http.get("https://www.uuidgenerator.net/api/version4")
297 serverSecurityKey = data.readAll()
298 serverSecurityKey = strutil.SHA1(serverSecurityKey)
299 print(serverSecurityKey)
300 data.close()
301 table.insert(config,serverSecurityKey)
302 print("LSK Generated! Saving Config...")
303 print(" ")
304 write("Modem Side: ")
305 side = read()
306 table.insert(config,side)
307 print(" ")
308 print("Side set!")
309 f = fs.open("serverConfig.dat","w")
310 f.write(textutils.serialise(config))
311 f.close()
312 print("Config saved!")
313 print("Resuming initalization...")
314end
315
316if fs.exists("serverUsers.dat") then
317 f = fs.open("serverUsers.dat","r")
318 data = f.readAll()
319 f.close()
320 data = strutil.decrypt(data,serverSecurityKey)
321 users = textutils.unserialise(data)
322 print(#users.." Users loaded.")
323else
324 print("No users found...")
325 print(" ")
326 local newUser = {}
327 write("New Admin Username: ")
328 username = read()
329 print(" ")
330 write("New Admin Password: ")
331 password = read("*")
332 table.insert(newUser,username)
333 table.insert(newUser,password)
334 table.insert(newUser,5)
335 table.insert(users,newUser)
336 print(" ")
337 print("User created, saving data...")
338 data = textutils.serialise(users)
339 data = strutil.encrypt(data,serverSecurityKey)
340 f = fs.open("serverUsers.dat","w")
341 f.write(data)
342 f.close()
343 print("Saved!")
344end
345
346if not rednet.isOpen(side) then
347 rednet.open(side)
348end
349sleep(3)
350while true do
351 parallel.waitForAny(handleRequests,handleConsoleInput)
352end