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.") |