SHOW:
|
|
- or go back to the newest paste.
1 | - | --Encrypted password lock door. Uses valithor's tiny hashing algorithm. |
1 | + | --Hashed HOTEL lock door. Uses valithor's tiny hashing algorithm. |
2 | - | -- pastebin get uW0X4aKn lock |
2 | + | --Uses disks to open doors! |
3 | -- pastebin get RvnHaiTj lock | |
4 | ||
5 | --os.pullEvent = os.pullEventRaw --THIS IS DONE FOR A REASON. DO NOT UNCOMMENT. | |
6 | local doorSide = {} --If it is to side(s), then it will open a door. | |
7 | local diskSide = "bottom" --Set this to a side if you want one. | |
8 | local doorCorrectDelay = 6 --How long the door is open after getting it right | |
9 | local doorIncorrectDelay = 2 --How long you are locked out for getting it wrong | |
10 | local doorInvertRedstone = false --Inverts redstone for door locks that require it. | |
11 | local passwordFile = "/.lddlock" | |
12 | local logFile = "/.lddlog" | |
13 | local saltCode = tostring(os.getComputerID()^2) | |
14 | local palate | |
15 | ||
16 | if not diskSide then | |
17 | local periph = peripheral.getNames() | |
18 | for a = 1, #periph do | |
19 | if peripheral.getType(periph[a]) == "drive" then | |
20 | diskSide = periph[a] | |
21 | break | |
22 | end | |
23 | end | |
24 | end | |
25 | ||
26 | local log = fs.open(logFile,"a") | |
27 | ||
28 | local tArg = {...} | |
29 | ||
30 | if not term.isColor() then | |
31 | if _VERSION then | |
32 | palate = { | |
33 | bgcolor = colors.gray, --Background color | |
34 | fgcolor = colors.lightGray, --Foreground color | |
35 | bg_txtcolor = colors.white, --Text color when overlayed on bgcolor | |
36 | fg_txtcolor = colors.black, --Text color when overlayed on fgcolor | |
37 | bgcorrect = colors.white, --Background color when correct. | |
38 | bgincorrect = colors.black, --Background color when incorrect. | |
39 | txtcorrect = colors.gray, --Text color when correct. | |
40 | txtincorrect = colors.gray, --Text color when incorrect. | |
41 | } | |
42 | else | |
43 | palate = { | |
44 | bgcolor = colors.black, --Background color | |
45 | fgcolor = colors.white, --Foreground color | |
46 | bg_txtcolor = colors.white, --Text color when overlayed on bgcolor | |
47 | fg_txtcolor = colors.black, --Text color when overlayed on fgcolor | |
48 | bgcorrect = colors.white, --Background color when correct. | |
49 | bgincorrect = colors.black, --Background color when incorrect. | |
50 | txtcorrect = colors.black, --Text color when correct. | |
51 | txtincorrect = colors.white, --Text color when incorrect. | |
52 | } | |
53 | end | |
54 | else | |
55 | palate = { | |
56 | bgcolor = colors.gray, --Background color | |
57 | fgcolor = colors.lightGray, --Foreground color | |
58 | bg_txtcolor = colors.white, --Text color when overlayed on bgcolor | |
59 | fg_txtcolor = colors.black, --Text color when overlayed on fgcolor | |
60 | bgcorrect = colors.green, --Background color when correct. | |
61 | bgincorrect = colors.red, --Background color when incorrect. | |
62 | txtcorrect = colors.white, --Text color when correct. | |
63 | txtincorrect = colors.black, --Text color when incorrect. | |
64 | } | |
65 | end | |
66 | for a = 1, #doorSide do | |
67 | redstone.setOutput(doorSide[a], doorInvertRedstone) | |
68 | end | |
69 | ||
70 | local function writeLog(msg) | |
71 | log.writeLine("[day:"..os.day().."/time:"..os.time().."] "..msg) | |
72 | log.flush() | |
73 | end | |
74 | ||
75 | local function clearLines(top, bottom) | |
76 | for a = top, bottom do | |
77 | term.setCursorPos(1,a) | |
78 | term.clearLine() | |
79 | end | |
80 | end | |
81 | ||
82 | local function hash(msg,salt,bool) | |
83 | if not bool then | |
84 | for i = 1, 10 do | |
85 | msg = hash(msg,salt or "",true) | |
86 | end | |
87 | end | |
88 | local num = "" | |
89 | local salt = salt ~= nil and salt..msg or msg | |
90 | for i = 1, #salt do | |
91 | local let = salt:sub(i,i):byte() | |
92 | num = let <= 9 and num.."99"..let or let<=99 and num.."9"..let or num..let | |
93 | end | |
94 | math.randomseed(tonumber(num)) | |
95 | local hashed = "" | |
96 | for i = 1, 250 do | |
97 | hashed = hashed..string.char(math.random(32,127)) | |
98 | end | |
99 | return hashed | |
100 | end | |
101 | ||
102 | local function rollOver(input, max) | |
103 | return math.floor(input % max) | |
104 | end | |
105 | ||
106 | local number | |
107 | ||
108 | local function flashScreen(times, number) | |
109 | local flashes | |
110 | if term.isColor() then | |
111 | flashes = { | |
112 | colors.white, | |
113 | colors.black, | |
114 | colors.red, | |
115 | } | |
116 | else | |
117 | if _CC_VERSION then | |
118 | flashes = { | |
119 | colors.white, | |
120 | colors.black, | |
121 | colors.lightGray, | |
122 | } | |
123 | else | |
124 | flashes = { | |
125 | colors.white, | |
126 | colors.black, | |
127 | } | |
128 | end | |
129 | end | |
130 | local terminateMessages = { | |
131 | "TERMINATE AGAIN, I DARE YOU", | |
132 | "TERMINATE AGAIN, I DARE YOU", | |
133 | "NO PLEASE, I IMPLORE", | |
134 | "NO, REALLY", | |
135 | "MOST PEOPLE DISABLE TERMINATION...", | |
136 | "BUT THAT'S BORING.", | |
137 | "THIS IS AT LEAST FUNNY!", | |
138 | "I MEAN, YOU DIDN'T EXPECT MULTIPLE MESSAGES", | |
139 | "AT LEAST, I DON'T THINK...", | |
140 | "...", | |
141 | "OKAY, THIS IS GETTING OLD FAST", | |
142 | "STOP IT!", | |
143 | "STOP TERMINATING, OR ERRORING, OR WHATEVER", | |
144 | "I'LL TELL THE ADMIN!", | |
145 | "I WILL!", | |
146 | "I'M WARNING YOU!", | |
147 | ".....", | |
148 | "...YOU CALLED MY BLUFF.", | |
149 | "OKAY, I CAN DO SOMETHING THAT YOU WON'T LIKE", | |
150 | "NO, IT'S NOT TO TATTLE TO A MODERATOR...", | |
151 | "IT'S SOMETHING MUCH WORSE.", | |
152 | "OKAY NOT REALLY, UNLESS YOU HAVE EPILEPSY", | |
153 | "AREN'T YOUR FINGERS GETTING TIRED?", | |
154 | "I GUESS NOT...?", | |
155 | "OKAY, HERE IT GOES!", | |
156 | "YOU'D BETTER HEED MY WARNING!", | |
157 | "<<flash>>", | |
158 | "WHAT DID I TELL YOU?", | |
159 | "YOU THOUGHT YOU'D CALL MY BLUFF, BUT NOOOOO", | |
160 | "YOU MUST THINK YOU'RE SOOOOO CLEVER", | |
161 | "BUT LOOKIT YOU NOW! ALL DEAD AND STUFF", | |
162 | "....", | |
163 | "...OKAY, I'M GETTING BORED.", | |
164 | "ACTUALLY, I WAS ALREADY BORED...", | |
165 | "BUT I THOUGHT THIS WOULD BE FUN", | |
166 | "HOW WRONG WAS I?", | |
167 | "ANYHOW, JUST...UM...", | |
168 | "...DO WHATEVER IT IS YOU DO", | |
169 | "WHEN YOU'RE NOT DESTROYING THE FACILITY", | |
170 | "YOU SHOULD PLAY PORTAL NOW.", | |
171 | "IT'S MUCH MORE FUN THAN TERMINATING A LOCK.", | |
172 | "BELIEVE ME, YOU'LL HAVE A GREAT TIME DOING THAT", | |
173 | "...", | |
174 | "......", | |
175 | "OKAY, IF YOU'RE DOING THIS TO FIND OUT THE CODE...", | |
176 | "...OR GAIN ACCESS WITHOUT IT...", | |
177 | "...THEN YOU ARE WASTING YOUR TIME.", | |
178 | "THIS USES HASHING. THE PASSWORD ISN'T STORED...", | |
179 | "...IN PLAIN TEXT, THAT IS", | |
180 | "IF YOU WANT THAT, THEN GO BEG THE OWNER FOR IT", | |
181 | "AND BY THAT I MEAN THE OWNER OF THE COMPUTER", | |
182 | "NOT THE GUY WHO WROTE THE LOCK", | |
183 | "I'M SURE HE HAS BETTER THINGS TO DO THAN THIS.", | |
184 | "THIS IS THE LAST LINE OF DIALOGUE.", | |
185 | "THIS IS THE LAST LINE OF DIALOGUE.", | |
186 | "THIS IS THE LAST LINE OF DIALOGUE.", | |
187 | "THIS IS THE LAST LINE OF DIALOGUE.", | |
188 | "THIS IS TOTALLY THE LAST LINE OF DIALOGUE.", | |
189 | "GOD DAMN IT, MAN!", | |
190 | "YOU WANT ACCESS SO BAD?", | |
191 | "YOU DO?", | |
192 | "<<flash>>", | |
193 | "NOW YOU HAVE ACCESS TO THE FLOOR", | |
194 | "DON'T BREAK IT, FATTY", | |
195 | "OH, I'M SORRY...", | |
196 | "I ONLY SAID THAT BECAUSE...", | |
197 | "YOU LOOK LIKE YOU'RE SMUGGLING A CAR", | |
198 | "STUPID. STUPID FATTY.", | |
199 | "...", | |
200 | "*ROBOTIC COUGH*", | |
201 | "Damn is this script long!", | |
202 | "I can't wait until someone mods this and adds their own!", | |
203 | "Welp, I'm not adding anything else.", | |
204 | "Really, the last message will repeat.", | |
205 | "So, my ultimate message is:", | |
206 | "DO NOT TERMINATE.", | |
207 | } --THAT was a mouthful! | |
208 | if not number then | |
209 | number = 1 | |
210 | end | |
211 | if number >= #terminateMessages then | |
212 | number = #terminateMessages | |
213 | end | |
214 | local message = terminateMessages[number] | |
215 | local scr_x, scr_y = term.getSize() | |
216 | if message == "<<flash>>" then | |
217 | for a = 1, 64 do | |
218 | sleep(0) | |
219 | if term.isColor() then | |
220 | term.setBackgroundColor(2^math.random(0,15)) | |
221 | else | |
222 | if a % 2 == 0 then | |
223 | term.setBackgroundColor(colors.white) | |
224 | else | |
225 | term.setBackgroundColor(colors.black) | |
226 | end | |
227 | end | |
228 | term.clear() | |
229 | end | |
230 | else | |
231 | for a = 1, times do | |
232 | for b = 1, #flashes do | |
233 | term.setBackgroundColor(flashes[b]) | |
234 | term.setTextColor(flashes[rollOver(b+1,#flashes)+1]) | |
235 | term.clear() | |
236 | scr_x, scr_y = term.getSize() | |
237 | if #message >= scr_x then | |
238 | term.setCursorPos(1,scr_y/2) | |
239 | else | |
240 | term.setCursorPos(math.ceil(scr_x/2)-math.floor(#message/2),scr_y/2) | |
241 | end | |
242 | write(message) | |
243 | sleep(0) | |
244 | end | |
245 | end | |
246 | end | |
247 | end | |
248 | ||
249 | local terminateCount = 1 | |
250 | ||
251 | local isCurrentlyGood = false | |
252 | ||
253 | local function handleCrash(results) | |
254 | if not isCurrentlyGood then | |
255 | writeLog("Someone tried to terminate!") | |
256 | term.clear() | |
257 | term.setCursorBlink(false) | |
258 | local oldpullevent = os.pullEvent | |
259 | os.pullEvent = os.pullEventRaw | |
260 | flashScreen(10, terminateCount) --Gotta rub it in, man. | |
261 | os.pullEvent = oldpullevent | |
262 | terminateCount = terminateCount + 1 | |
263 | term.setCursorBlink(true) | |
264 | return false | |
265 | else | |
266 | return true | |
267 | end | |
268 | end | |
269 | ||
270 | local function cprint(txt) | |
271 | local scr_x, scr_y = term.getSize() | |
272 | local posX, posY = term.getCursorPos() | |
273 | term.setCursorPos(math.ceil(scr_x/2)-math.ceil(#txt/2),posY) | |
274 | return print(txt) | |
275 | end | |
276 | ||
277 | local function writeDiskpass(password, side) | |
278 | local file = fs.open(fs.combine(disk.getMountPath(side),".password"),"w") | |
279 | file.write(password) | |
280 | file.close() | |
281 | end | |
282 | ||
283 | local function writeConfig(password, overwrite) | |
284 | if overwrite then | |
285 | file = fs.open(passwordFile,"w") | |
286 | else | |
287 | file = fs.open(passwordFile,"a") | |
288 | end | |
289 | file.writeLine(password) | |
290 | file.close() | |
291 | end | |
292 | ||
293 | local function choice(filter, verbose) | |
294 | if verbose == true then | |
295 | write("[") | |
296 | for a = 1, #filter do | |
297 | write(string.upper(string.sub(filter,a,a))) | |
298 | if a ~= #filter then | |
299 | write(",") | |
300 | end | |
301 | end | |
302 | write("]?") | |
303 | end | |
304 | local event, key | |
305 | repeat | |
306 | event, key = os.pullEvent("char") | |
307 | until string.find(filter,key) | |
308 | if verbose then | |
309 | write(string.upper(key)) | |
310 | end | |
311 | return key, string.find(filter,key) | |
312 | end | |
313 | ||
314 | local function correctPassword() | |
315 | term.setBackgroundColor(palate.bgcorrect) | |
316 | term.setTextColor(palate.txtcorrect) | |
317 | local scr_x, scr_y = term.getSize() | |
318 | term.setCursorPos(1,scr_y) | |
319 | if #doorSide > 0 then | |
320 | isCurrentlyGood = true | |
321 | end | |
322 | for a = 2, scr_y do | |
323 | sleep(0) | |
324 | term.scroll(1) | |
325 | if a == math.ceil(scr_y/2) then | |
326 | cprint("Correct!") | |
327 | end | |
328 | end | |
329 | if #doorSide > 0 then | |
330 | term.setCursorPos(1,math.floor(scr_y/2)+1) | |
331 | cprint("Applying RS to "..table.concat(doorSide,", ")) | |
332 | for a = 1, #doorSide do | |
333 | redstone.setOutput(doorSide[a], not doorInvertRedstone) | |
334 | end | |
335 | if type(doorCorrectDelay) == "number" then | |
336 | sleep(doorCorrectDelay) | |
337 | else | |
338 | sleep(6) | |
339 | end | |
340 | isCurrentlyGood = false | |
341 | for a = 1, #doorSide do | |
342 | redstone.setOutput(doorSide[a], doorInvertRedstone) | |
343 | end | |
344 | return | |
345 | else | |
346 | sleep(0.6) | |
347 | if _VERSION then | |
348 | term.setCursorPos(1,scr_y/2) | |
349 | term.setTextColor(colors.lightGray) | |
350 | term.setBackgroundColor(colors.lightGray) | |
351 | term.clear() | |
352 | cprint("Correct!") | |
353 | sleep(0) | |
354 | term.setTextColor(colors.black) | |
355 | term.setBackgroundColor(colors.gray) | |
356 | term.clear() | |
357 | sleep(0) | |
358 | end | |
359 | term.setBackgroundColor(colors.black) | |
360 | - | cprint("Password:") |
360 | + | |
361 | term.setCursorPos(1,1) | |
362 | return true | |
363 | end | |
364 | - | local password |
364 | + | |
365 | ||
366 | - | term.setCursorPos(1,posY) |
366 | + | |
367 | - | term.clearLine() |
367 | + | |
368 | - | write(">") |
368 | + | |
369 | - | password = read("*") |
369 | + | |
370 | - | until string.gsub(password," ","") ~= "" |
370 | + | |
371 | - | local hashpassword = hash(password,saltCode) |
371 | + | |
372 | if string.lower(pswd) == "bepis" then | |
373 | cprint("Bepis.") | |
374 | else | |
375 | - | local a, correct = nil, false |
375 | + | |
376 | end | |
377 | if type(doorIncorrectDelay) == "number" then | |
378 | sleep(doorIncorrectDelay) | |
379 | else | |
380 | sleep(2) | |
381 | end | |
382 | end | |
383 | ||
384 | local function gui() | |
385 | scr_x, scr_y = term.getSize() | |
386 | - | incorrectPassword(password) |
386 | + | writeLog("Lock has turned on!") |
387 | while true do | |
388 | term.setBackgroundColor(palate.bgcolor) | |
389 | term.setTextColor(palate.bg_txtcolor) | |
390 | term.clear() | |
391 | - | if not fs.exists(passwordFile) then |
391 | + | |
392 | cprint("Enter keycard:") | |
393 | local posX, posY = term.getCursorPos() | |
394 | term.setBackgroundColor(palate.fgcolor) | |
395 | term.setTextColor(palate.fg_txtcolor) | |
396 | - | cprint("No password file!") |
396 | + | local password, evt |
397 | - | local newpassword, confpassword |
397 | + | |
398 | evt = {os.pullEvent("disk")} | |
399 | until evt[2] == diskSide | |
400 | - | cprint("Enter a new password.") |
400 | + | writeLog("Disk was inserted in side "..diskSide) |
401 | - | local posX, posY = term.getCursorPos() |
401 | + | local diskDir = disk.getMountPath(diskSide) |
402 | - | term.setBackgroundColor(palate.fgcolor) |
402 | + | |
403 | - | term.setTextColor(palate.fg_txtcolor) |
403 | + | local file = fs.open(fs.combine(diskDir,".password"),"r") |
404 | - | repeat |
404 | + | local hashpassword = file.readLine() |
405 | - | term.setCursorPos(1,posY) |
405 | + | file.close() |
406 | - | term.clearLine() |
406 | + | |
407 | - | write(">") |
407 | + | |
408 | - | newpassword = read("*") |
408 | + | |
409 | - | until string.gsub(newpassword," ","") ~= "" |
409 | + | |
410 | - | term.setBackgroundColor(palate.bgcolor) |
410 | + | local a, b, correct = nil, 0, false |
411 | - | term.setTextColor(palate.bg_txtcolor) |
411 | + | |
412 | - | |
412 | + | |
413 | - | cprint("Confirm that.") |
413 | + | b = b + 1 |
414 | - | |
414 | + | |
415 | - | local posX, posY = term.getCursorPos() |
415 | + | |
416 | - | term.setBackgroundColor(palate.fgcolor) |
416 | + | writeLog("Accepted password (line "..b..")") |
417 | - | term.setTextColor(palate.fg_txtcolor) |
417 | + | |
418 | - | repeat |
418 | + | |
419 | - | term.setCursorPos(1,posY) |
419 | + | |
420 | - | term.clearLine() |
420 | + | |
421 | - | write(">") |
421 | + | |
422 | - | confpassword = read("*") |
422 | + | |
423 | - | until string.gsub(confpassword," ","") ~= "" |
423 | + | writeLog("Rejected password.") |
424 | - | term.setBackgroundColor(palate.bgcolor) |
424 | + | incorrectPassword(hashpassword) |
425 | - | term.setTextColor(palate.bg_txtcolor) |
425 | + | |
426 | - | if newpassword ~= confpassword then |
426 | + | |
427 | - | cprint("They don't match!") |
427 | + | |
428 | - | local posX, posY = term.getCursorPos() |
428 | + | |
429 | - | posY = posY + 1 |
429 | + | local alphabet = "qwertyuiopasdfghjklzxcvbnm1234567890" |
430 | ||
431 | - | until newpassword == confpassword |
431 | + | if not fs.exists(passwordFile) or tArg[1] == "store" then |
432 | - | |
432 | + | writeLog("Making new keycard.") |
433 | - | writeConfig(hash(newpassword,saltCode), false) |
433 | + | |
434 | - | cprint("Wrote! Do another password?") |
434 | + | |
435 | - | local input = choice("yn",true) |
435 | + | |
436 | - | until input == "n" |
436 | + | |
437 | cprint("Enter a disk.") | |
438 | local _,side = os.pullEvent("disk") | |
439 | local newpass = "" | |
440 | for a = 1, 128 do | |
441 | local b = math.random(1,#alphabet) | |
442 | newpass = newpass..alphabet:sub(a,a) | |
443 | end | |
444 | writeConfig(hash(newpass,saltCode),false) | |
445 | writeDiskpass(hash(newpass,saltCode),diskSide) | |
446 | term.setBackgroundColor(colors.black) | |
447 | term.clear() | |
448 | term.setCursorPos(1,1) | |
449 | cprint("Got it, man.") | |
450 | - | return true |
450 | + | |
451 | return true | |
452 | end | |
453 | ||
454 | while true do | |
455 | - | end |
455 | + | |
456 | if not status then | |
457 | local a = handleCrash(res) | |
458 | if a then | |
459 | break | |
460 | end | |
461 | else | |
462 | break | |
463 | end | |
464 | end | |
465 | writeLog("Lock has stopped.") |