Pastebin
API
tools
faq
paste
Login
Sign up
Please fix the following errors:
New Paste
Syntax Highlighting
-- -- Firewolf Website Browser -- Made by GravityScore and 1lann -- License found here: https://raw.github.com/1lann/Firewolf/master/LICENSE -- -- Original Concept From RednetExplorer 2.4.1 -- RednetExplorer Made by ComputerCraftFan11 -- -- Feature stuffs -- Ya know, stuffs -- -------- Variables -- Version local version = "2.3.9" local build = 1 local browserAgentTemplate = "Firewolf " .. version browserAgent = browserAgentTemplate local tArgs = {...} -- Server Identification local serverID = "other" local serverList = {experimental = "Experimental", other = "Other"} -- Updating local autoupdate = "true" local incognito = "false" local noInternet = false -- Geometry local w, h = term.getSize() local graphics = {} local files = {} -- Debugging local debugFile = nil -- Environment local oldEnv = {} local env = {} local backupEnv = {} local api = {} -- Themes local theme = {} -- Databases local blacklist = {} local whitelist = {} local definitions = {} local verifiedDownloads = {} local dnsDatabase = {[1] = {}, [2] = {}} -- Website loading local website = "" local homepage = "" local timeout = 0.08 local openAddressBar = true local loadingRate = 0 local curSites = {} local menuBarOpen = false local internalWebsite = false local serverWebsiteID = nil -- Protocols local curProtocol = {} local protocols = {} -- History local history = {} local addressBarHistory = {} -- Events local event_loadWebsite = "firewolf_loadWebsiteEvent" local event_exitWebsite = "firewolf_exitWebsiteEvent" local event_openAddressBar = "firewolf_openAddressBarEvent" local event_exitApp = "firewolf_exitAppEvent" local event_redirect = "firewolf_redirectEvent" -- Download URLs local firewolfURL = "https://raw.github.com/1lann/firewolf/master/entities/" .. serverID .. ".lua" local databaseURL = "https://raw.github.com/1lann/firewolf/master/databases/" .. serverID .. "-database.txt" local versionURL = "https://raw.github.com/1lann/firewolf/master/version" local serverURL = "https://raw.github.com/1lann/firewolf/master/server/server-release.lua" if serverID == "experimental" then serverURL = "https://raw.github.com/1lann/firewolf/master/server/server-experimental.lua" end local availableThemesURL = "https://raw.github.com/1lann/firewolf/master/themes/available.txt" -- Data Locations local rootFolder = "/.Firewolf_Data" local cacheFolder = rootFolder .. "/cache" local serverFolder = rootFolder .. "/servers" local themeLocation = rootFolder .. "/theme" local defaultThemeLocation = rootFolder .. "/default_theme" local availableThemesLocation = rootFolder .. "/available_themes" local serverSoftwareLocation = rootFolder .. "/server_software" local settingsLocation = rootFolder .. "/settings" local historyLocation = rootFolder .. "/history" local debugLogLocation = "/firewolf-log" local firewolfLocation = "/" .. shell.getRunningProgram() local userBlacklist = rootFolder .. "/user_blacklist" local userWhitelist = rootFolder .. "/user_whitelist" -- -------- Firewolf API local function isAdvanced() return term.isColor and term.isColor() end api.clearPage = function(site, color, redraw, tcolor) -- Site titles local titles = {firewolf = "Firewolf Homepage", server = "Server Management", history = "Firewolf History", help = "Help Page", downloads = "Downloads Center", settings = "Firewolf Settings", credits = "Firewolf Credits", getinfo = "Website Information", nomodem = "No Modem Attached!", crash = "Website Has Crashed!", overspeed = "Too Fast!", incorrect = "Incorrect Website!"} local title = titles[site] -- Clear local c = color if c == nil then c = colors.black end term.setBackgroundColor(c) term.setTextColor(colors[theme["address-bar-text"]]) if redraw ~= true then term.clear() end if not(menuBarOpen) then -- URL bar term.setCursorPos(2, 1) term.setBackgroundColor(colors[theme["address-bar-background"]]) term.clearLine() term.setCursorPos(2, 1) local a = site if a:len() > w - 9 then a = a:sub(1, 39) .. "..." end if curProtocol == protocols.rdnt then write("rdnt://" .. a) elseif curProtocol == protocols.http then write("http://" .. a) end if title ~= nil then term.setCursorPos(w - title:len() - 1, 1) write(title) end term.setCursorPos(w, 1) term.setBackgroundColor(colors[theme["top-box"]]) term.setTextColor(colors[theme["text-color"]]) write("<") term.setBackgroundColor(c) if tcolor then term.setTextColor(tcolor) else term.setTextColor(colors.white) end print("") else term.setCursorPos(1, 1) term.setBackgroundColor(colors[theme["top-box"]]) term.setTextColor(colors[theme["text-color"]]) term.clearLine() write("> [- Exit Firewolf -] [- Incorrect Website -] ") print("") end end api.centerPrint = function(text) local w, h = term.getSize() local x, y = term.getCursorPos() term.setCursorPos(math.ceil((w + 1)/2 - text:len()/2), y) print(text) end api.centerWrite = function(text) local w, h = term.getSize() local x, y = term.getCursorPos() term.setCursorPos(math.ceil((w + 1)/2 - text:len()/2), y) write(text) end api.leftPrint = function(text) local x, y = term.getCursorPos() term.setCursorPos(4, y) print(text) end api.leftWrite = function(text) local x, y = term.getCursorPos() term.setCursorPos(4, y) write(text) end api.rightPrint = function(text) local x, y = term.getCursorPos() local w, h = term.getSize() term.setCursorPos(w - text:len() - 1, y) print(text) end api.rightWrite = function(text) local x, y = term.getCursorPos() local w, h = term.getSize() term.setCursorPos(w - text:len() - 1, y) write(text) end api.redirect = function(url) os.queueEvent(event_redirect, url:gsub("rdnt://", ""):gsub("http://", "")) end api.prompt = function(list, dir) if isAdvanced() then for _, v in pairs(list) do if v.bg then term.setBackgroundColor(v.bg) end if v.tc then term.setTextColor(v.tc) end if v[2] == -1 then v[2] = math.ceil((w + 1)/2 - (v[1]:len() + 6)/2) end term.setCursorPos(v[2], v[3]) write("[- " .. v[1]) term.setCursorPos(v[2] + v[1]:len() + 3, v[3]) write(" -]") end while true do local e, but, x, y = os.pullEvent() if e == "mouse_click" then for _, v in pairs(list) do if x >= v[2] and x <= v[2] + v[1]:len() + 5 and y == v[3] then return v[1] end end elseif e == event_exitWebsite then return nil end end else for _, v in pairs(list) do term.setBackgroundColor(colors.black) term.setTextColor(colors.white) if v[2] == -1 then v[2] = math.ceil((w + 1)/2 - (v[1]:len() + 4)/2) end term.setCursorPos(v[2], v[3]) write(" " .. v[1]) term.setCursorPos(v[2] + v[1]:len() + 2, v[3]) write(" ") end local key1 = 200 local key2 = 208 if dir == "horizontal" then key1 = 203 key2 = 205 end local curSel = 1 term.setCursorPos(list[curSel][2], list[curSel][3]) write("[") term.setCursorPos(list[curSel][2] + list[curSel][1]:len() + 3, list[curSel][3]) write("]") while true do local e, key = os.pullEvent() term.setCursorPos(list[curSel][2], list[curSel][3]) write(" ") term.setCursorPos(list[curSel][2] + list[curSel][1]:len() + 3, list[curSel][3]) write(" ") if e == "key" and key == key1 and curSel > 1 then curSel = curSel - 1 elseif e == "key" and key == key2 and curSel < #list then curSel = curSel + 1 elseif e == "key" and key == 28 then return list[curSel][1] elseif e == event_exitWebsite then return nil end term.setCursorPos(list[curSel][2], list[curSel][3]) write("[") term.setCursorPos(list[curSel][2] + list[curSel][1]:len() + 3, list[curSel][3]) write("]") end end end api.scrollingPrompt = function(list, x, y, len, width) local wid = width if wid == nil then wid = w - 3 end local function updateDisplayList(items, loc, len) local ret = {} for i = 1, len do local item = items[i + loc - 1] if item ~= nil then table.insert(ret, item) end end return ret end if isAdvanced() then local function draw(a) for i, v in ipairs(a) do term.setCursorPos(1, y + i - 1) api.centerWrite(string.rep(" ", wid + 2)) term.setCursorPos(x, y + i - 1) write("[ " .. v:sub(1, wid - 5)) term.setCursorPos(wid + x - 2, y + i - 1) write(" ]") end end local loc = 1 local disList = updateDisplayList(list, loc, len) draw(disList) while true do local e, but, clx, cly = os.pullEvent() if e == "key" and but == 200 and loc > 1 then loc = loc - 1 disList = updateDisplayList(list, loc, len) draw(disList) elseif e == "key" and but == 208 and loc + len - 1 < #list then loc = loc + 1 disList = updateDisplayList(list, loc, len) draw(disList) elseif e == "mouse_scroll" and but > 0 and loc + len - 1 < #list then loc = loc + but disList = updateDisplayList(list, loc, len) draw(disList) elseif e == "mouse_scroll" and but < 0 and loc > 1 then loc = loc + but disList = updateDisplayList(list, loc, len) draw(disList) elseif e == "mouse_click" then for i, v in ipairs(disList) do if clx >= x and clx <= x + wid and cly == i + y - 1 then return v end end elseif e == event_exitWebsite then return nil end end else local function draw(a) for i, v in ipairs(a) do term.setCursorPos(1, y + i - 1) api.centerWrite(string.rep(" ", wid + 2)) term.setCursorPos(x, y + i - 1) write("[ ] " .. v:sub(1, wid - 5)) end end local loc = 1 local curSel = 1 local disList = updateDisplayList(list, loc, len) draw(disList) term.setCursorPos(x + 1, y + curSel - 1) write("x") while true do local e, key = os.pullEvent() term.setCursorPos(x + 1, y + curSel - 1) write(" ") if e == "key" and key == 200 then if curSel > 1 then curSel = curSel - 1 elseif loc > 1 then loc = loc - 1 disList = updateDisplayList(list, loc, len) draw(disList) end elseif e == "key" and key == 208 then if curSel < #disList then curSel = curSel + 1 elseif loc + len - 1 < #list then loc = loc + 1 disList = updateDisplayList(list, loc, len) draw(disList) end elseif e == "key" and key == 28 then return list[curSel + loc - 1] elseif e == event_exitWebsite then return nil end term.setCursorPos(x + 1, y + curSel - 1) write("x") end end end api.clearArea = function() api.clearPage(website) end api.cPrint = function(text) api.centerPrint(text) end api.cWrite = function(text) api.centerWrite(text) end api.lPrint = function(text) api.leftPrint(text) end api.lWrite = function(text) api.leftWrite(text) end api.rPrint = function(text) api.rightPrint(text) end api.rWrite = function(text) api.rightWrite(text) end -- Set Environment for k, v in pairs(getfenv(0)) do env[k] = v end for k, v in pairs(getfenv(1)) do env[k] = v end for k, v in pairs(env) do oldEnv[k] = v end for k, v in pairs(api) do env[k] = v end for k, v in pairs(env) do backupEnv[k] = v end setfenv(1, env) -- -------- Utilities local function debugLog(n, ...) local lArgs = {...} if debugFile then if n == nil then n = "" end debugFile:write("\n" .. tostring(n) .. " : ") for k, v in pairs(lArgs) do if type(v) == "string" or type(v) == "number" or type(v) == nil or type(v) == "boolean" then debugFile:write(tostring(v) .. ", ") else debugFile:write("type-" .. type(v) .. ", ") end end end end local function modRead(replaceChar, his, maxLen, stopAtMaxLen, liveUpdates, exitOnControl) term.setCursorBlink(true) local line = "" local hisPos = nil local pos = 0 if replaceChar then replaceChar = replaceChar:sub(1, 1) end local w, h = term.getSize() local sx, sy = term.getCursorPos() local function redraw(repl) local scroll = 0 if line:len() >= maxLen then scroll = line:len() - maxLen end term.setCursorPos(sx, sy) local a = repl or replaceChar if a then term.write(string.rep(a, line:len() - scroll)) else term.write(line:sub(scroll + 1)) end term.setCursorPos(sx + pos - scroll, sy) end while true do local e, but, x, y, p4, p5 = os.pullEvent() if e == "char" and not(stopAtMaxLen == true and line:len() >= maxLen) then line = line:sub(1, pos) .. but .. line:sub(pos + 1, -1) pos = pos + 1 redraw() elseif e == "key" then if but == keys.enter then break elseif but == keys.left then if pos > 0 then pos = pos - 1 redraw() end elseif but == keys.right then if pos < line:len() then pos = pos + 1 redraw() end elseif (but == keys.up or but == keys.down) and his then redraw(" ") if but == keys.up then if hisPos == nil and #his > 0 then hisPos = #his elseif hisPos > 1 then hisPos = hisPos - 1 end elseif but == keys.down then if hisPos == #his then hisPos = nil elseif hisPos ~= nil then hisPos = hisPos + 1 end end if hisPos then line = his[hisPos] pos = line:len() else line = "" pos = 0 end redraw() if liveUpdates then local a, data = liveUpdates(line, "update_history", nil, nil, nil, nil, nil) if a == true and data == nil then term.setCursorBlink(false) return line elseif a == true and data ~= nil then term.setCursorBlink(false) return data end end elseif but == keys.backspace and pos > 0 then redraw(" ") line = line:sub(1, pos - 1) .. line:sub(pos + 1, -1) pos = pos - 1 redraw() if liveUpdates then local a, data = liveUpdates(line, "delete", nil, nil, nil, nil, nil) if a == true and data == nil then term.setCursorBlink(false) return line elseif a == true and data ~= nil then term.setCursorBlink(false) return data end end elseif but == keys.home then pos = 0 redraw() elseif but == keys.delete and pos < line:len() then redraw(" ") line = line:sub(1, pos) .. line:sub(pos + 2, -1) redraw() if liveUpdates then local a, data = liveUpdates(line, "delete", nil, nil, nil, nil, nil) if a == true and data == nil then term.setCursorBlink(false) return line elseif a == true and data ~= nil then term.setCursorBlink(false) return data end end elseif but == keys["end"] then pos = line:len() redraw() elseif (but == 29 or but == 157) and not(exitOnControl) then term.setCursorBlink(false) return nil end end if liveUpdates then local a, data = liveUpdates(line, e, but, x, y, p4, p5) if a == true and data == nil then term.setCursorBlink(false) return line elseif a == true and data ~= nil then term.setCursorBlink(false) return data end end end term.setCursorBlink(false) if line ~= nil then line = line:gsub("^%s*(.-)%s*$", "%1") end return line end -- -------- Graphics and Files graphics.githubImage = [[ f f fffffffff fffffffff f4244424f f4444444f fffffefffe fffe e fffff e ff f fe e e e ]] files.availableThemes = [[ https://raw.github.com/1lann/firewolf/master/themes/default.txt| |Fire (default) https://raw.github.com/1lann/firewolf/master/themes/ice.txt| |Ice https://raw.github.com/1lann/firewolf/master/themes/carbon.txt| |Carbon https://raw.github.com/1lann/firewolf/master/themes/christmas.txt| |Christmas https://raw.github.com/1lann/firewolf/master/themes/original.txt| |Original https://raw.github.com/1lann/firewolf/master/themes/ocean.txt| |Ocean https://raw.github.com/1lann/firewolf/master/themes/forest.txt| |Forest https://raw.github.com/1lann/firewolf/master/themes/pinky.txt| |Pinky ]] files.defaultTheme = [[ address-bar-text=white address-bar-background=gray address-bar-base=lightGray top-box=red bottom-box=orange background=gray text-color=white ]] files.newTheme = [[ -- Text color of the address bar address-bar-text= -- Background color of the address bar address-bar-background= -- Color of separator bar when live searching address-bar-base= -- Top box color top-box= -- Bottom box color bottom-box= -- Background color background= -- Main text color text-color= ]] files.blacklist = {} files.whitelist = {} files.downloads = {} files.antivirusDefinitions = {{"shell.", "Modify Filesystem"}, {"fs.", "Modify Files"}, {"io.", "Modify Files"}, {"os.run", "Run Files"}, {"io[", "Modify Files"}, {"fs[", "Modify Files"}, {"fs)", "Modify Files"}, {"io)", "Modify Files"}, {"os)", "Run Files"}, {"loadstring", "Execute Text"}, {"fs--", "Modify Files"}, {"io--", "Modify Files"}, {"os--", "Run Files"}, {"fsor", "Modify Files"}, {"fs,", "Modify Files"}, {"io,", "Modify Files"}, {"ioor", "Modify Files"}, {"osor", "Run Files"}, {"shell[", "Run Files"}, {"os[\"run", "Run Files"}, {"loadstring", "Run Files"}, {"loadfile", "Run Files"}, {"dofile", "Run Files"}, {"getfenv", "Modify Env"}, {"setfenv", "Modify Env"}, {"rawset", "Modify Anything"}, {"_g", "Modify Env"}, {"_G", "Modify Env"}} -- -------- Themes local defaultTheme = {["address-bar-text"] = "white", ["address-bar-background"] = "gray", ["address-bar-base"] = "lightGray", ["top-box"] = "red", ["bottom-box"] = "orange", ["text-color"] = "white", ["background"] = "gray"} local originalTheme = {["address-bar-text"] = "white", ["address-bar-background"] = "black", ["address-bar-base"] = "black", ["top-box"] = "black", ["bottom-box"] = "black", ["text-color"] = "white", ["background"] = "black"} local function loadTheme(path) if fs.exists(path) and not(fs.isDir(path)) then local a = {} local f = io.open(path, "r") local l = f:read("*l") while l ~= nil do l = l:gsub("^%s*(.-)%s*$", "%1") if l ~= "" and l ~= nil and l ~= "\n" and l:sub(1, 2) ~= "--" then local b = l:find("=") if a and b then local c = l:sub(1, b - 1) local d = l:sub(b + 1, -1) if c == "" or d == "" then return nil else a[c] = d end else return nil end end l = f:read("*l") end f:close() return a else return nil end end -- -------- Filesystem local function download(url, path) for i = 1, 3 do local response = http.get(url) if response then local data = response.readAll() response.close() if path then local f = io.open(path, "w") f:write(data) f:close() end return true end end return false end local function updateClient() for i = 1, 3 do local response = http.get(versionURL) if response then local data = response.readAll() response.close() if tonumber(data) then if tonumber(data) > build then break else return false end end end end local ret = false local source = nil local resp = pcall(function() http.request(firewolfURL) end) local a = os.startTimer(10) while resp do debugLog("Normal") local e, url, handle = os.pullEvent() if e == "http_success" then source = handle ret = true break elseif e == "http_failure" then ret = false break elseif e == "timer" and url == a then ret = false break end end local _, y = term.getCursorPos() term.setCursorPos(1, y - 1) centerWrite(string.rep(" ", 47)) centerWrite("Backup Mode...") print("") centerWrite(string.rep(" ", 47)) if not(ret) then sleep(0.1) debugLog("Abnormal") local ret = false local source = nil pcall(function() http.request("http://pastebin.com/raw.php?i=ppnsSi26") end) local a = os.startTimer(15) while true do local e, url, handle = os.pullEvent() if e == "http_success" then source = handle ret = true break elseif e == "http_failure" then ret = false break elseif e == "timer" and url == a then ret = false break end end if not(ret) then sleep(0.5) if isAdvanced() then term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["background"]]) term.clear() local f = io.open(rootFolder .. "/temp_file", "w") f:write(graphics.githubImage) f:close() local a = paintutils.loadImage(rootFolder .. "/temp_file") paintutils.drawImage(a, 5, 5) fs.delete(rootFolder .. "/temp_file") term.setCursorPos(19, 4) term.setBackgroundColor(colors[theme["top-box"]]) write(string.rep(" ", 32)) term.setCursorPos(19, 5) write(" Could Not Connect to GitHub! ") term.setCursorPos(19, 6) write(string.rep(" ", 32)) term.setBackgroundColor(colors[theme["bottom-box"]]) term.setCursorPos(19, 8) write(string.rep(" ", 32)) term.setCursorPos(19, 9) write(" Sorry, Firewolf could not ") term.setCursorPos(19, 10) write(" connect to GitHub to download ") term.setCursorPos(19, 11) write(" necessary files. Please check: ") term.setCursorPos(19, 12) write(" http://status.github.com ") term.setCursorPos(19, 13) write(string.rep(" ", 32)) term.setCursorPos(19, 14) write(" Click to exit... ") term.setCursorPos(19, 15) write(string.rep(" ", 32)) os.pullEvent("mouse_click") else term.clear() term.setCursorPos(1, 1) term.setBackgroundColor(colors.black) term.setTextColor(colors.white) print("\n") centerPrint("Could not connect to GitHub!") print("") centerPrint("Sorry, Firewolf could not connect to") centerPrint("GitHub to download necessary files.") centerPrint("Please check:") centerPrint("http://status.github.com") print("") centerPrint("Press any key to exit...") os.pullEvent("key") end return true elseif source and autoupdate == "true" then fs.delete(firewolfLocation) local f = io.open(firewolfLocation, "w") f:write(new) f:close() shell.run(firewolfLocation) return true end end end local function migrateFilesystem() if fs.exists("/.Firefox_Data") then fs.move("/.Firefox_Data", rootFolder) fs.delete(serverSoftwareLocation) end fs.delete(rootFolder .. "/database") end local function resetFilesystem() -- Folders if not(fs.exists(rootFolder)) then fs.makeDir(rootFolder) elseif not(fs.isDir(rootFolder)) then fs.move(rootFolder, "/old-firewolf-data-file") end if not(fs.exists(serverFolder)) then fs.makeDir(serverFolder) end if not(fs.exists(cacheFolder)) then fs.makeDir(cacheFolder) end -- Settings if not(fs.exists(settingsLocation)) then local f = io.open(settingsLocation, "w") f:write(textutils.serialize({auto = "true", incog = "false", home = "firewolf"})) f:close() end -- History if not(fs.exists(historyLocation)) then local f = io.open(historyLocation, "w") f:write(textutils.serialize({})) f:close() end -- Server Software if not(fs.exists(serverSoftwareLocation)) then if not pcall(function() download(serverURL, serverSoftwareLocation) end) then download("http://pastebin.com/raw.php?i=uTPhLfqj", serverSoftwareLocation) end end -- Themes if isAdvanced() then local f = io.open(availableThemesLocation, "w") f:write(files.availableThemes) f:close() if not(fs.exists(themeLocation)) then local f = io.open(themeLocation, "w") f:write(files.defaultTheme) f:close() end else fs.delete(availableThemesLocation) fs.delete(themeLocation) end -- Databases for _, v in pairs({userWhitelist, userBlacklist}) do if not(fs.exists(v)) then local f = io.open(v, "w") f:write("") f:close() end end -- Temp file fs.delete(rootFolder .. "/temp_file") return nil end local function appendToHistory(site) if incognito == "false" then if site == "home" or site == "homepage" then site = homepage end if site ~= "exit" and site ~= "" and site ~= "history" and site ~= history[1] then local a = "rdnt://" .. site if curProtocol == protocols.http then a = "http://" .. site end table.insert(history, 1, a) local f = io.open(historyLocation, "w") f:write(textutils.serialize(history)) f:close() end if site ~= addressBarHistory[#addressBarHistory] then table.insert(addressBarHistory, site) end end end -- -------- Databases local function loadDatabases() blacklist = files.blacklist whitelist = files.whitelist downloads = files.downloads definitions = files.antivirusDefinitions if not(fs.exists(userBlacklist)) then local bf = fio.open(userBlacklist, "w") bf:write("\n") bf:close() else local bf = io.open(userBlacklist, "r") local l = bf:read("*l") while l ~= nil do if l ~= nil and l ~= "" and l ~= "\n" then l = l:gsub("^%s*(.-)%s*$", "%1") table.insert(blacklist, l) end l = bf:read("*l") end bf:close() end if not(fs.exists(userWhitelist)) then local wf = io.open(userWhitelist, "w") wf:write("\n") wf:close() else local wf = io.open(userWhitelist, "r") local l = wf:read("*l") while l ~= nil do if l ~= nil and l ~= "" and l ~= "\n" then l = l:gsub("^%s*(.-)%s*$", "%1") local a, b = l:find("| |") table.insert(whitelist, {l:sub(1, a - 1), l:sub(b + 1, -1)}) end l = wf:read("*l") end wf:close() end end local function verify(database, ...) local args = {...} if database == "blacklist" and #args >= 1 then -- id local found = false for _, v in pairs(blacklist) do if tostring(args[1]) == v then found = true end end return found elseif database == "whitelist" and #args >= 2 then -- id, site local found = false for _, v in pairs(whitelist) do if v[2] == tostring(args[1]) and v[1] == tostring(args[2]) then found = true end end return found elseif database == "antivirus" and #args >= 1 then -- content local a = verify("antivirus offences", args[1]) if #a == 0 then return false else return true end elseif database == "antivirus offences" and #args >= 1 then -- content local c = args[1]:gsub(" ", ""):gsub("\n", ""):gsub("\t", "") local a = {} for _, v in pairs(definitions) do local b = false for _, c in pairs(a) do if c == v[2] then b = true end end if c:find(v[1], 1, true) and not(b) then table.insert(a, v[2]) end end table.sort(a) return a else return nil end end -- -------- Protocols protocols.http = {} protocols.rdnt = {} protocols.rdnt.getSearchResults = function() dnsDatabase = {[1] = {}, [2] = {}} local resultIDs = {} local conflict = {} rednet.broadcast("firewolf.broadcast.dns.list") local startClock = os.clock() while os.clock() - startClock < timeout do local id, i = rednet.receive(timeout) if id then if i:sub(1, 14) == "firewolf-site:" then i = i:sub(15, -1) local bl, wl = verify("blacklist", id), verify("whitelist", id, i) if not(i:find(" ")) and i:len() < 40 and (not(bl) or (bl and wl)) then if not(resultIDs[tostring(id)]) then resultIDs[tostring(id)] = 1 else resultIDs[tostring(id)] = resultIDs[tostring(id)] + 1 end if not(i:find("rdnt://")) then i = ("rdnt://" .. i) end local x = false if conflict[i] then x = true table.insert(conflict[i], id) else for m, n in pairs(dnsDatabase[1]) do if n:lower() == i:lower() then x = true table.remove(dnsDatabase[1], m) table.remove(dnsDatabase[2], m) if conflict[i] then table.insert(conflict[i], id) else conflict[i] = {} table.insert(conflict[i], id) end break end end end if not(x) and resultIDs[tostring(id)] <= 3 then table.insert(dnsDatabase[1], i) table.insert(dnsDatabase[2], id) end end end else break end end for k,v in pairs(conflict) do table.sort(v) table.insert(dnsDatabase[1], k) table.insert(dnsDatabase[2], v[1]) end return dnsDatabase[1] end protocols.rdnt.getWebsite = function(site) local id, content, status = nil, nil, nil local clock = os.clock() local websiteID = nil for k, v in pairs(dnsDatabase[1]) do local web = site:gsub("rdnt://", "") if web:find("/") then web = web:sub(1, web:find("/") - 1) end if web == v:gsub("rdnt://", "") then websiteID = dnsDatabase[2][k] break end end if not(websiteID) then return nil, nil, nil end sleep(timeout) rednet.send(websiteID, site) clock = os.clock() while os.clock() - clock < timeout do id, content = rednet.receive(timeout) if id then if id == websiteID then local bl = verify("blacklist", id) local av = verify("antivirus", content) local wl = verify("whitelist", id, site) status = nil if (bl and not(wl)) or site == "" or site == "." or site == ".." then -- Ignore elseif av and not(wl) then status = "antivirus" break else status = "safe" break end end end end serverWebsiteID = id return id, content, status end protocols.http.getSearchResults = function(input) dnsDatabase = {[1] = {}, [2] = {}} return dnsDatabase[1] end protocols.http.getWebsite = function(site) return nil, nil, nil end -- -------- Built-In Websites -- Homepage local pages = {} local errPages = {} pages.firewolf = function(site) internalWebsite = true clearPage(site, colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 43)) centerPrint([[ _,-='"-.__ /\_/\ ]]) centerPrint([[ -.} =._,.-==-._., @ @._, ]]) centerPrint([[ -.__ __,-. ) _,.-' ]]) centerPrint([[ Firewolf ]] .. version .. string.rep(" ", 8 - version:len()) .. [[" G..m-"^m m' ]]) centerPrint(string.rep(" ", 43)) print("\n") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 43)) centerPrint(" News: [- Sites -] ") centerPrint(" - Version 2.3.8 has just been released! ") centerPrint(" Check it out on the forums! It has ") centerPrint(" a massive overhaul of all the systems ") centerPrint(" - Version 2.3.7 has been released! It ") centerPrint(" includes a new mini menu and help! ") centerPrint(string.rep(" ", 43)) while true do local e, but, x, y = os.pullEvent() if e == "mouse_click" and x >= 35 and x <= 45 and y == 12 then redirect("sites") return elseif e == event_exitWebsite then return end end end pages.firefox = function(site) redirect("firewolf") end pages.sites = function(site) clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Firewolf Built-In Sites") centerPrint(string.rep(" ", 43)) print("") local sx = 8 term.setBackgroundColor(colors[theme["bottom-box"]]) term.setCursorPos(1, sx - 1) centerPrint(string.rep(" ", 43)) centerPrint(" rdnt://firewolf Homepage ") centerPrint(" rdnt://history History ") centerPrint(" rdnt://downloads Downloads Center ") centerPrint(" rdnt://server Server Management ") centerPrint(" rdnt://help Help Page ") centerPrint(" rdnt://settings Settings ") centerPrint(" rdnt://sites Built-In Sites ") centerPrint(" rdnt://credits Credits ") centerPrint(" rdnt://exit Exit ") centerPrint(string.rep(" ", 43)) local a = {"firewolf", "history", "downloads", "server", "help", "settings", "sites", "credits", "exit"} while true do local e, but, x, y = os.pullEvent() if e == "mouse_click" and x >= 7 and x <= 45 then for i, v in ipairs(a) do if y == sx + i - 1 then redirect(v) return end end elseif e == event_exitWebsite then os.queueEvent(event_exitWebsite) return end end end -- History pages.history = function(site) clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Firewolf History") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) if #history > 0 then for i = 1, 12 do centerPrint(string.rep(" ", 47)) end local a = {"Clear History"} for i, v in ipairs(history) do table.insert(a, v) end local opt = scrollingPrompt(a, 6, 8, 10, 40) if opt == "Clear History" then history = {} addressBarHistory = {} local f = io.open(historyLocation, "w") f:write(textutils.serialize(history)) f:close() clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Firewolf History") centerPrint(string.rep(" ", 47)) print("\n") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Cleared history.") centerPrint(string.rep(" ", 47)) openAddressBar = false sleep(1.3) openAddressBar = true redirect("history") return elseif opt then if opt:find("http://") then curProtocol = protocols.http else curProtocol = protocols.rdnt end redirect(opt:gsub("rdnt://", ""):gsub("http://", "")) return elseif opt == nil then os.queueEvent(event_exitWebsite) return end else print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("No Items in History!") centerPrint(string.rep(" ", 47)) end end -- Downloads Center pages.downloads = function(site) clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Download Center") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 5 do centerPrint(string.rep(" ", 47)) end local opt = prompt({{"Themes", 7, 8}, {"Plugins", 7, 10}}, "vertical") if opt == "Themes" and isAdvanced() then while true do local themes = {} local c = {"Make my Own", "Load my Own"} local f = io.open(availableThemesLocation, "r") local l = f:read("*l") while l ~= nil do l = l:gsub("^%s*(.-)%s*$", "%1") local a, b = l:find("| |") table.insert(themes, {l:sub(1, a - 1), l:sub(b + 1, -1)}) table.insert(c, l:sub(b + 1, -1)) l = f:read("*l") end f:close() clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Download Center - Themes") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 12 do centerPrint(string.rep(" ", 47)) end local t = scrollingPrompt(c, 4, 8, 10, 44) if t == nil then os.queueEvent(event_exitWebsite) return elseif t == "Make my Own" then term.setCursorPos(6, 18) write("Path: /") local n = modRead(nil, nil, 35) if n ~= "" and n ~= nil then n = "/" .. n local f = io.open(n, "w") f:write(files.newTheme) f:close() term.setCursorPos(1, 18) centerWrite(string.rep(" ", 47)) term.setCursorPos(6, 18) write("File Created!") openAddressBar = false sleep(1.1) openAddressBar = true elseif n == nil then os.queueEvent(event_exitWebsite) return end elseif t == "Load my Own" then term.setCursorPos(6, 18) write("Path: /") local n = modRead(nil, nil, 35) if n ~= "" and n ~= nil then n = "/" .. n term.setCursorPos(1, 18) centerWrite(string.rep(" ", 47)) if fs.exists(n) and not(fs.isDir(n)) then theme = loadTheme(n) if theme ~= nil then fs.delete(themeLocation) fs.copy(n, themeLocation) term.setCursorPos(6, 18) write("Theme File Loaded! :D") else term.setCursorPos(6, 18) write("Theme File is Corrupt! D:") theme = loadTheme(themeLocation) end openAddressBar = false sleep(1.1) openAddressBar = true elseif not(fs.exists(n)) then term.setCursorPos(6, 18) write("File does not exist!") openAddressBar = false sleep(1.1) openAddressBar = true elseif fs.isDir(n) then term.setCursorPos(6, 18) write("File is a directory!") openAddressBar = false sleep(1.1) openAddressBar = true end elseif n == nil then os.queueEvent(event_exitWebsite) return end else local url = "" for _, v in pairs(themes) do if v[2] == t then url = v[1] break end end term.setCursorPos(1, 4) term.setBackgroundColor(colors[theme["top-box"]]) centerWrite(string.rep(" ", 47)) centerWrite("Download Center - Downloading...") fs.delete(rootFolder .. "/temp_theme") download(url, rootFolder .. "/temp_theme") theme = loadTheme(rootFolder .. "/temp_theme") if theme == nil then theme = loadTheme(themeLocation) fs.delete(rootFolder .. "/temp_theme") centerWrite(string.rep(" ", 47)) centerWrite("Download Center - Theme Is Corrupt! D:") openAddressBar = false sleep(1.1) openAddressBar = true else fs.delete(themeLocation) fs.copy(rootFolder .. "/temp_theme", themeLocation) fs.delete(rootFolder .. "/temp_theme") centerWrite(string.rep(" ", 47)) centerWrite("Download Center - Done! :D") openAddressBar = false sleep(1.1) openAddressBar = true redirect("home") return end end end elseif opt == "Themes" and not(isAdvanced()) then clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Download Center") centerPrint(string.rep(" ", 47)) print("\n") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Themes are not available on normal") centerWrite(string.rep(" ", 47)) centerPrint("computers! :(") centerPrint(string.rep(" ", 47)) elseif opt == "Plugins" then clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Download Center - Plugins") centerPrint(string.rep(" ", 47)) print("\n") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Comming Soon! (hopefully :P)") centerPrint(string.rep(" ", 47)) centerPrint(string.rep(" ", 47)) centerPrint(string.rep(" ", 47)) local opt = prompt({{"Back", -1, 11}}, "vertical") if opt == nil then os.queueEvent(event_exitWebsite) return elseif opt == "Back" then redirect("downloads") end elseif opt == nil then os.queueEvent(event_exitWebsite) return end end -- Server Management local function manageServers(site, protocol, reloadServers, onNewServer, onStart, onEdit, onRunOnBoot, onDelete, startServerName) local servers = reloadServers() if startServerName == nil then startServerName = "Start" end if isAdvanced() then local function draw(l, sel) term.setBackgroundColor(colors[theme["bottom-box"]]) term.setCursorPos(4, 8) write("[- New Server -]") for i, v in ipairs(l) do term.setCursorPos(3, i + 8) write(string.rep(" ", 24)) term.setCursorPos(4, i + 8) local nv = v if nv:len() > 18 then nv = nv:sub(1, 15) .. "..." end if i == sel then write("[ " .. nv .. " ]") else write(" " .. nv) end end if #l < 1 then term.setCursorPos(4, 10) write("A website is literally") term.setCursorPos(4, 11) write("just a lua script!") term.setCursorPos(4, 12) write("Go ahead and make one!") term.setCursorPos(4, 14) write("Also, be sure to check") term.setCursorPos(4, 15) write("out Firewolf's APIs to") term.setCursorPos(4, 16) write("help you make your") term.setCursorPos(4, 17) write("site, at rdnt://help") end term.setCursorPos(30, 8) write(string.rep(" ", 19)) term.setCursorPos(30, 8) if l[sel] then local nl = l[sel] if nl:len() > 19 then nl = nl:sub(1, 16) .. "..." end write(nl) else write("No Server Selected!") end term.setCursorPos(30, 10) write("[- " .. startServerName .. " -]") term.setCursorPos(30, 12) write("[- Edit -]") term.setCursorPos(30, 14) if onRunOnBoot then write("[- Run on Boot -]") end term.setCursorPos(30, 16) write("[- Delete -]") end local function updateDisplayList(items, loc, len) local ret = {} for i = 1, len do local item = items[i + loc - 1] if item ~= nil then table.insert(ret, item) end end return ret end while true do clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Firewolf Server Management - " .. protocol:upper()) centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 12 do term.setCursorPos(3, i + 6) write(string.rep(" ", 24)) term.setCursorPos(29, i + 6) write(string.rep(" ", 21)) end local sel = 1 local loc = 1 local len = 10 local disList = updateDisplayList(servers, loc, len) draw(disList, sel) while true do local e, but, x, y = os.pullEvent() if e == "key" and but == 200 and #servers > 0 and loc > 1 then loc = loc - 1 disList = updateDisplayList(servers, loc, len) draw(disList, sel) elseif e == "key" and but == 208 and #servers > 0 and loc + len - 1 < #servers then loc = loc + 1 disList = updateDisplayList(servers, loc, len) draw(disList, sel) elseif e == "mouse_click" then if x >= 4 and x <= 25 then if y == 8 then onNewServer() servers = reloadServers() break elseif #servers > 0 then for i, v in ipairs(disList) do if y == i + 8 then sel = i draw(disList, sel) end end end elseif x >= 30 and x <= 40 and y == 10 and #servers > 0 then onStart(disList[sel]) servers = reloadServers() break elseif x >= 30 and x <= 39 and y == 12 and #servers > 0 then onEdit(disList[sel]) servers = reloadServers() break elseif x >= 30 and x <= 46 and y == 14 and #servers > 0 and onRunOnBoot then onRunOnBoot(disList[sel]) term.setBackgroundColor(colors[theme["bottom-box"]]) term.setCursorPos(32, 15) write("Will Run on Boot!") openAddressBar = false sleep(1.3) openAddressBar = true term.setCursorPos(32, 15) write(string.rep(" ", 18)) break elseif x >= 30 and x <= 41 and y == 16 and #servers > 0 then onDelete(disList[sel]) servers = reloadServers() break end elseif e == event_exitWebsite then return end end end else while true do clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Firewolf Server Management - " .. protocol:upper()) centerPrint(string.rep(" ", 47)) print("") local a = {"New Server"} for _, v in pairs(servers) do table.insert(a, v) end local server = scrollingPrompt(a, 4, 8, 10) if server == nil then os.queueEvent(event_exitWebsite) return elseif server == "New Server" then onNewServer() servers = reloadServers() else term.setCursorPos(30, 8) write(server) local a = {{"Start", 30, 10}, {"Edit", 30, 12}, {"Run on Boot", 30, 13}, {"Delete", 30, 14}, {"Back", 30, 16}} if not(onRunOnBoot) then a = {{"Start", 30, 10}, {"Edit", 30, 12}, {"Delete", 30, 14}, {"Back", 30, 16}} end local opt = prompt(a, "vertical") if opt == "Start" then onStart() servers = reloadServers() elseif opt == "Edit" then onEdit() servers = reloadServers() elseif opt == "Run on Boot" and onRunOnBoot then onRunOnBoot() term.setCursorPos(32, 17) write("Will Run on Boot!") openAddressBar = false sleep(1.1) openAddressBar = true elseif opt == "Delete" then onDelete() servers = reloadServers() elseif opt == nil then return end end end end end local function editPages(dir) openAddressBar = false local oldLoc = shell.dir() local commandHis = {} term.setBackgroundColor(colors.black) term.setTextColor(colors.white) term.clear() term.setCursorPos(1, 1) print("") print(" Server Shell Editing") print(" Type 'exit' to return to Firewolf.") print(" Note: The 'home' file is the index of your site.") print("") local allowed = {"move", "mv", "cp", "copy", "drive", "delete", "rm", "edit", "eject", "exit", "help", "id", "monitor", "rename", "alias", "clear", "paint", "firewolf", "lua", "redstone", "rs", "redprobe", "redpulse", "programs", "redset", "reboot", "hello", "label", "list", "ls", "easter", "pastebin", "dir"} while true do shell.setDir(dir) term.setBackgroundColor(colors.black) if isAdvanced() then term.setTextColor(colors.yellow) else term.setTextColor(colors.white) end write("> ") term.setTextColor(colors.white) local line = read(nil, commandHis) table.insert(commandHis, line) local words = {} for m in string.gmatch(line, "[^ \t]+") do local a = m:gsub("^%s*(.-)%s*$", "%1") table.insert(words, a) end local com = words[1] if com == "exit" then break elseif com then local a = false for _, v in pairs(allowed) do if com == v then a = true break end end if a then term.setBackgroundColor(colors.black) term.setTextColor(colors.white) shell.run(com, unpack(words, 2)) else term.setTextColor(colors.red) print("Program Not Allowed!") end end end shell.setDir(oldLoc) openAddressBar = true end local function newServer(onCreate) term.setBackgroundColor(colors[theme["background"]]) for i = 1, 12 do term.setCursorPos(3, i + 6) write(string.rep(" ", 47)) end term.setBackgroundColor(colors[theme["bottom-box"]]) term.setCursorPos(1, 8) for i = 1, 8 do centerPrint(string.rep(" ", 47)) end term.setCursorPos(5, 9) write("Name: ") local name = modRead(nil, nil, 28, true) if name == nil then os.queueEvent(event_exitWebsite) return end term.setCursorPos(5, 11) write("URL:") term.setCursorPos(8, 12) write("rdnt://") local url = modRead(nil, nil, 33) if url == nil then os.queueEvent(event_exitWebsite) return end url = url:gsub(" ", "") local a = {"/", "| |", " ", "@", "!", "$", "#", "%", "^", "&", "*", "(", ")", "rdnt://", "[", "]", "{", "}", "\\", "\"", "'", ":", ";", "?", "<", ">", ",", "`", "http://"} local b = false for k, v in pairs(a) do if url:find(v, 1, true) then term.setCursorPos(5, 14) write("URL Contains Illegal '" .. v .. "'!") openAddressBar = false sleep(1.5) openAddressBar = true b = true break elseif name == "" or url == "" then term.setCursorPos(5, 14) write("URL or Name Is Empty!") openAddressBar = false sleep(1.5) openAddressBar = true b = true break end end if not(b) then local c = onCreate(name, url) term.setCursorPos(5, 14) if c and c == "true" then write("Successfully Created Server!") elseif c == "false" or c == nil then write("Server Creation Failed!") else write(c) end openAddressBar = false sleep(1.5) openAddressBar = true end end local function serverHTTP(site, auser, apass) return nil end local function serverRDNT(site) manageServers(site, "rdnt", function() local servers = {} for _, v in pairs(fs.list(serverFolder)) do if fs.isDir(serverFolder .. "/" .. v) then table.insert(servers, v) end end return servers end, function() newServer(function(name, url) if fs.exists(serverFolder .. "/" .. url) then return "Server Already Exists!" end fs.makeDir(serverFolder .. "/" .. url) local f = io.open(serverFolder .. "/" .. url .. "/home", "w") f:write("print(\"\")\ncenterPrint(\"Welcome To " .. name .. "!\")\n") f:close() return "true" end) end, function(server) term.clear() term.setCursorPos(1, 1) term.setBackgroundColor(colors.black) term.setTextColor(colors.white) openAddressBar = false setfenv(1, oldEnv) shell.run(serverSoftwareLocation, server, serverFolder .. "/" .. server) setfenv(1, env) openAddressBar = true errPages.checkForModem() end, function(server) editPages(serverFolder .. "/" .. server) openAddressBar = true end, function(server) fs.delete("/old-startup") if fs.exists("/startup") then fs.move("/startup", "/old-startup") end local f = io.open("/startup", "w") f:write("shell.run(\"" .. serverSoftwareLocation .. "\", \"" .. server .. "\", \"" .. serverFolder .. "/" .. server .. "\")") f:close() end, function(server) fs.delete(serverFolder .. "/" .. server) end) end pages.server = function(site) if curProtocol == protocols.rdnt then serverRDNT(site) elseif curProtocol == protocols.http then serverHTTP(site) end end -- Help Page pages.help = function(site) clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Firewolf Help") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 12 do centerPrint(string.rep(" ", 47)) end term.setCursorPos(7, 15) write("View the full documentation here:") term.setCursorPos(7, 16) write("https://github.com/1lann/Firewolf/wiki") local opt = prompt({{"Getting Started", 7, 8}, {"Making a Theme", 7, 10}, {"API Documentation", 7, 12}}, "vertical") local pages = {} if opt == "Getting Started" then pages[1] = {title = "Getting Started - Intoduction", content = { "Hey there!", "", "Firewolf is an app that allows you to create", "and visit websites! Each site has name (the", "URL) which you can type into the address bar", "above, and then visit the site.", }} pages[2] = {title = "Getting Started - Searching", content = { "The address bar can be also be used to", "search for sites, by simply typing in the", "search term.", "", "To view all sites, just open it and hit", "enter (leave the field blank)." }} pages[3] = {title = "Getting Started - Built-In Websites", content = { "Firewolf has a set of built-in websites", "available for use:", "", "rdnt://firewolf Normal hompage", "rdnt://history Your history", "rdnt://downloads Download themes and plugins", "rdnt://server Create websites", "rdnt://help Help and documentation" }} pages[4] = {title = "Getting Started - Built-In Websites", content = { "More built-in websites:", "", "rdnt://settings Firewolf settings", "rdnt://credits View the credits", "rdnt://exit Exit the app" }} elseif opt == "Making a Theme" then pages[1] = {title = "Making a Theme - Introduction", content = { "Firewolf themes are files that tell Firewolf", "to color things certain colors.", "Several themes can already be downloaded for", "Firewolf from the Download Center.", "", "You can also make your own theme, use it in", "your copy of Firewolf, and submit it to the", "Firewolf Download Center!" }} pages[2] = {title = "Making a Theme - Example", content = { "A theme file consists of several lines of", "text. Here is the default theme file:", "", "address-bar-text=white", "address-bar-background=gray", "top-box=red", "bottom-box=orange", "background=gray", "text-color=white" }} pages[3] = {title = "Making a Theme - Explanation", content = { "On each line of the example, something is", "given a color, like on the last line, the", "text of the page is told to be white.", "", "The color specified after the = is the same", "as when you call colors.[color name].", "For example, specifying red after the =", "colors that object red." }} pages[4] = {title = "Making a Theme - Have a Go", content = { "To make a theme, go to rdnt://downloads,", "click on the themes section, and click on", "'Create my Own'.", "", "Enter a theme name, then exit Firewolf and", "edit the newly create file in the root", "folder. Specify the colors for the keys,", "and return to the themes section of the", "downloads center. Click 'Load my Own'." }} pages[5] = {title = "Making a Theme - Submitting", content = { "To submit a theme to the Downloads Center,", "send GravityScore a message on the CCForums", "that contains your theme file and name.", "", "He will message you back saying whether your", "theme has been added, or if anything needs to", "be changed before it is added." }} elseif opt == "API Documentation" then pages[1] = {title = "API Documentation - 1", content = { "The Firewolf API is a bunch of global", "functions that aim to simplify your life when", "designing and coding websites.", "", "For a full documentation on these functions,", "visit the Firewolf Wiki Page here:", "https://github.com/1lann/Firewolf/wiki" }} pages[2] = {title = "API Documentation - 2", content = { "centerPrint(string text)", "cPrint(string text)", "centerWrite(string text)", "cWrite(string text)", "", "leftPrint(string text)", "lPrint(string text)", }} pages[3] = {title = "API Documentation - 3", content = { "leftWrite(string text)", "lWrite(string text)", "", "rightPrint(string text)", "rPrint(string text)", "rightWrite(string text)", "rWrite(string text)" }} pages[4] = {title = "API Documentation - 4", content = { "prompt(table list, string direction)", "scrollingPrompt(table list, integer x,", " integer y, integer length[,", " integer width])", "", "urlDownload(string url)", "pastebinDownload(string code)", "redirect(string site)", }} pages[5] = {title = "API Documentation - 5", content = { "loadImageFromServer(string imagePath)", "ioReadFileFromServer(string filePath)", "", "Full documentation can be found here:", "https://github.com/1lann/Firewolf/wiki" }} elseif opt == nil then os.queueEvent(event_exitWebsite) return end local function drawPage(page) clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint(page.title) centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 12 do centerPrint(string.rep(" ", 47)) end for i, v in ipairs(page.content) do term.setCursorPos(4, i + 7) write(v) end end local curPage = 1 local a = {{"Prev", 26, 18}, {"Next", 38, 18}, {"Back", 14, 18}} drawPage(pages[curPage]) while true do local b = {a[3]} if curPage == 1 then table.insert(b, a[2]) elseif curPage == #pages then table.insert(b, a[1]) else table.insert(b, a[1]) table.insert(b, a[2]) end local opt = prompt(b, "horizontal") if opt == "Prev" then curPage = curPage - 1 elseif opt == "Next" then curPage = curPage + 1 elseif opt == "Back" then break elseif opt == nil then os.queueEvent(event_exitWebsite) return end drawPage(pages[curPage]) end redirect("help") end -- Settings pages.settings = function(site) while true do clearPage(site, colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Firewolf Settings") centerWrite(string.rep(" ", 43)) centerPrint("Build: " .. tostring(build)) centerWrite(string.rep(" ", 43)) centerPrint("Designed For: " .. serverList[serverID]) centerPrint(string.rep(" ", 43)) print("") local a = "Automatic Updating - On" if autoupdate == "false" then a = "Automatic Updating - Off" end local b = "Record History - On" if incognito == "true" then b = "Record History - Off" end local c = "Homepage - rdnt://" .. homepage term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 11 do centerPrint(string.rep(" ", 43)) end local opt = prompt({{a, 7, 9}, {b, 7, 11}, {c, 7, 13}, {"Reset Firewolf", 7, 17}}, "vertical") if opt == a then if autoupdate == "true" then autoupdate = "false" elseif autoupdate == "false" then autoupdate = "true" end elseif opt == b then if incognito == "true" then incognito = "false" elseif incognito == "false" then incognito = "true" end elseif opt == c then term.setCursorPos(9, 15) write("rdnt://") local a = modRead(nil, nil, 30) if a == nil then os.queueEvent(event_exitWebsite) return end if a ~= "" then homepage = a end elseif opt == "Reset Firewolf" then clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Reset Firewolf") centerPrint(string.rep(" ", 43)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 12 do centerPrint(string.rep(" ", 43)) end local opt = prompt({{"Reset History", 7, 8}, {"Reset Servers", 7, 9}, {"Reset Theme", 7, 10}, {"Reset Cache", 7, 11}, {"Reset Databases", 7, 12}, {"Reset Settings", 7, 13}, {"Back", 7, 14}, {"Reset All", 7, 16}}, "vertical") openAddressBar = false if opt == "Reset All" then fs.delete(rootFolder) elseif opt == "Reset History" then fs.delete(historyLocation) elseif opt == "Reset Servers" then fs.delete(serverFolder) fs.delete(serverSoftwareLocation) elseif opt == "Reset Cache" then fs.delete(cacheFolder) elseif opt == "Reset Databases" then fs.delete(userWhitelist) fs.delete(userBlacklist) elseif opt == "Reset Settings" then fs.delete(settingsLocation) elseif opt == "Reset Theme" then fs.delete(themeLocation) elseif opt == "Back" then openAddressBar = true redirect("settings") return elseif opt == nil then openAddressBar = true os.queueEvent(event_exitWebsite) return end clearPage(site, colors[theme["background"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Reset Firewolf") centerPrint(string.rep(" ", 43)) print("") term.setCursorPos(1, 10) term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Firewolf has been reset.") centerWrite(string.rep(" ", 43)) if isAdvanced() then centerPrint("Click to exit...") else centerPrint("Press any key to exit...") end centerPrint(string.rep(" ", 43)) while true do local e = os.pullEvent() if e == "mouse_click" or e == "key" then return true end end elseif opt == "Manage Blocked Servers" then openAddressBar = true clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) print("") centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Manage Blocked Servers") centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Click on ID to remove server") centerPrint(string.rep(" ", 43)) print("") for i = 1, 40 do centerPrint(string.rep(" ", 43)) end local rBlacklist = {} local f = io.open(userBlacklist, "r") for line in f:lines() do if line ~= nil and line ~= "" and line ~= "\n" then line = line:gsub("^%s*(.-)%s*$", "%1") table.insert(rBlacklist, line) end end f:close() table.insert(rBlacklist, "Add Button Comming Soon!") while true do local opt = scrollingPrompt(rBlacklist, 7, 8, 10, 38) if opt == "Add Button Comming Soon!" then elseif opt == nil then return else table.remove(rBlacklist, opt) table.remove(blacklist, opt) local data = "" f = io.open(userBlacklist, "w") for k,v in pairs(rBlacklist) do data = ("\n" .. v) end f:write(data) end end elseif opt == nil then os.queueEvent(event_exitWebsite) return end -- Save local f = io.open(settingsLocation, "w") f:write(textutils.serialize({auto = autoupdate, incog = incognito, home = homepage})) f:close() end end -- Other pages.credits = function(site) clearPage(site, colors[theme["background"]]) print("\n") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Firewolf Credits") centerPrint(string.rep(" ", 43)) print("\n") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 43)) centerPrint(" Coded by: GravityScore and 1lann ") centerPrint(" Art by: lieudusty ") centerPrint(string.rep(" ", 43)) centerPrint(" Based off: RednetExplorer 2.4.1 ") centerPrint(" Made by ComputerCraftFan11 ") centerPrint(string.rep(" ", 43)) end pages.kitteh = function(site) openAddressBar = false term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["background"]]) term.clear() term.setCursorPos(1, 3) centerPrint([[ .__....._ _.....__, ]]) centerPrint([[ .": o :': ;': o :". ]]) centerPrint([[ '. '-' .'. .'. '-' .' ]]) centerPrint([[ '---' '---' ]]) centerPrint([[ ]]) centerPrint([[ _...----... ... ... ...----..._ ]]) centerPrint([[ .-'__..-""'---- '. '"' .' ----'""-..__'-. ]]) centerPrint([['.-' _.--"""' '-._.-' '"""--._ '-.']]) centerPrint([[' .-"' : '"-. ']]) centerPrint([[ ' '. _.'"'._ .' ' ]]) centerPrint([[ '. ,.-'" "'-., .' ]]) centerPrint([[ '. .' ]]) centerPrint([[ '-._ _.-' ]]) centerPrint([[ '"'--.....--'"' ]]) print("") centerPrint("Firewolf Kitteh is Not Amused...") sleep(4) os.shutdown() end -- Error Pages errPages.overspeed = function() website = "overspeed" clearPage("overspeed", colors[theme["background"]]) print("\n") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Warning! D:") centerPrint(string.rep(" ", 43)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 43)) centerPrint(" Website browsing sleep limit reached! ") centerPrint(string.rep(" ", 43)) centerPrint(" To prevent Firewolf from spamming ") centerPrint(" rednet, Firewolf has stopped loading ") centerPrint(" the page. ") centerPrint(string.rep(" ", 43)) centerPrint(string.rep(" ", 43)) centerPrint(string.rep(" ", 43)) openAddressBar = false for i = 1, 5 do term.setCursorPos(1, 14) centerWrite(string.rep(" ", 43)) if 6 - i == 1 then centerWrite("Please wait 1 second...") else centerWrite("Please wait " .. tostring(6 - i) .. " seconds...") end sleep(1) end openAddressBar = true term.setCursorPos(1, 14) centerWrite(string.rep(" ", 43)) centerWrite("You may now browse normally...") end errPages.crash = function(err) if err:find("Firewolf Antivirus: Unauthorized Function") then clearPage("crash", colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Website Aborted!") centerPrint(string.rep(" ", 43)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 43)) centerPrint(" The website has attempted to use a ") centerPrint(" potentially malicious function that you ") centerPrint(" did not authorize! This might also be ") centerPrint(" a mistake. ") centerPrint(string.rep(" ", 43)) centerPrint(" Please ask 1lann or GravityScore if you ") centerPrint(" have any questions about this. ") centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("You may now browse normally!") centerWrite(string.rep(" ", 43)) else clearPage("crash", colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("The Website Has Crashed! D:") centerPrint(string.rep(" ", 43)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 43)) centerPrint(" It looks like the website has crashed! ") centerPrint(" Report this error to the website owner: ") centerPrint(string.rep(" ", 43)) term.setBackgroundColor(colors[theme["background"]]) print("") print(" " .. err) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("You may now browse normally!") centerPrint(string.rep(" ", 43)) end end errPages.checkForModem = function() while true do local present = false for _, v in pairs(rs.getSides()) do if peripheral.getType(v) == "modem" then rednet.open(v) present = true break end end if not(present) then website = "nomodem" clearPage("nomodem", colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("No Modem Attached! D:") centerPrint(string.rep(" ", 43)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 43)) centerPrint(" No wireless modem was found on this ") centerPrint(" computer, and Firewolf is not able to ") centerPrint(" run without one! ") centerPrint(string.rep(" ", 43)) centerWrite(string.rep(" ", 43)) centerPrint("Waiting for a modem to be attached...") centerWrite(string.rep(" ", 43)) if isAdvanced() then centerPrint("Click to exit...") else centerPrint("Press any key to exit...") end centerPrint(string.rep(" ", 43)) while true do local e, id = os.pullEvent() if e == "key" or e == "mouse_click" then return false elseif e == "peripheral" then break end end else return true end end end -- Run Pages local function loadSite(site) local shellAllowed = false local function runSite(cacheLoc, antivirusEnv) if not(antivirusEnv) then antivirusEnv = {} nenv = {} end -- Clear clearPage(site, colors.black) term.setBackgroundColor(colors.black) term.setTextColor(colors.white) -- Setup environment local cbc, ctc = colors.black, colors.white local nenv = antivirusEnv local safeFunc = true local unsafeFunc = {} if antivirusEnv[1] ~= "firewolf-override" then unsafeFunc = {"os", "shell", "fs", "io", "loadstring", "loadfile", "dofile", "getfenv", "setfenv", "rawset"} end for k, v in pairs(env) do safeFunc = true for ki, vi in pairs(unsafeFunc) do if k == vi then safeFunc = false break end end if safeFunc then if type(v) ~= "table" then nenv[k] = v else nenv[k] = {} for i, d in pairs(v) do nenv[k][i] = d end end end end nenv.term = {} local function ospullEvent(a) if a == "derp" then return true end while true do local e, p1, p2, p3, p4, p5 = env.os.pullEventRaw() if e == event_exitWebsite then queueWebsiteExit = true env.error(event_exitWebsite) elseif e == "terminate" then env.error() end if e ~= event_exitWebsite and e ~= event_redirect and e ~= event_exitApp and e ~= event_loadWebsite then if a then if e == a then return e, p1, p2, p3, p4, p5 end else return e, p1, p2, p3, p4, p5 end end end end nenv.term.getSize = function() local wid, hei = env.term.getSize() return wid, hei - 1 end nenv.term.setCursorPos = function(x, y) if not(y > 0) then y = 1 end return env.term.setCursorPos(x, y + 1) end nenv.term.getCursorPos = function() local x, y = env.term.getCursorPos() return x, y + 1 end nenv.term.clear = function() local x, y = env.term.getCursorPos() api.clearPage(website, cbc, nil, ctc) env.term.setCursorPos(x, y) end nenv.term.clearLine = function() return env.term.clearLine() end nenv.term.setBackgroundColor = function(col) cbc = col return env.term.setBackgroundColor(col) end nenv.term.setBackgroundColour = function(col) cbc = col return env.term.setBackgroundColour(col) end nenv.term.getBackgroundColor = function() return cbc end nenv.term.getBackgroundColour = function() return cbc end nenv.term.setTextColor = function(col) ctc = col return env.term.setTextColor(col) end nenv.term.setTextColour = function(col) ctc = col return env.term.setTextColour(col) end nenv.term.getTextColour = function() return ctc end nenv.term.getTextColor = function() return ctc end nenv.term.write = function(text) return env.term.write(text) end nenv.term.setCursorBlink = function(bool) return env.term.setCursorBlink(bool) end nenv.write = function(text) return env.write(text) end nenv.print = function(...) return env.print(...) end nenv.term.isColor = function() return isAdvanced() end nenv.term.isColour = function() return isAdvanced() end local oldScroll = term.scroll term.scroll = function(n) local x, y = env.term.getCursorPos() oldScroll(n) clearPage(website, cbc, true) env.term.setCursorPos(x, y) end nenv.prompt = function(list, dir) local fixPrompt = function(list, dir) if isAdvanced() then for _, v in pairs(list) do if v.bg then term.setBackgroundColor(v.bg) end if v.tc then term.setTextColor(v.tc) end if v[2] == -1 then v[2] = math.ceil((w + 1)/2 - (v[1]:len() + 6)/2) end term.setCursorPos(v[2], v[3]) write("[- " .. v[1]) term.setCursorPos(v[2] + v[1]:len() + 3, v[3]) write(" -]") end while true do local e, but, x, y = ospullEvent() if e == "mouse_click" then for _, v in pairs(list) do if x >= v[2] and x <= v[2] + v[1]:len() + 5 and y == v[3] then return v[1] end end elseif e == event_exitWebsite then os.queueEvent(event_exitWebsite) return nil end end else for _, v in pairs(list) do term.setBackgroundColor(colors.black) term.setTextColor(colors.white) if v[2] == -1 then v[2] = math.ceil((w + 1)/2 - (v[1]:len() + 4)/2) end term.setCursorPos(v[2], v[3]) write(" " .. v[1]) term.setCursorPos(v[2] + v[1]:len() + 2, v[3]) write(" ") end local key1 = 200 local key2 = 208 if dir == "horizontal" then key1 = 203 key2 = 205 end local curSel = 1 term.setCursorPos(list[curSel][2], list[curSel][3]) write("[") term.setCursorPos(list[curSel][2] + list[curSel][1]:len() + 3, list[curSel][3]) write("]") while true do local e, key = ospullEvent() term.setCursorPos(list[curSel][2], list[curSel][3]) write(" ") term.setCursorPos(list[curSel][2] + list[curSel][1]:len() + 3, list[curSel][3]) write(" ") if e == "key" and key == key1 and curSel > 1 then curSel = curSel - 1 elseif e == "key" and key == key2 and curSel < #list then curSel = curSel + 1 elseif e == "key" and key == 28 then return list[curSel][1] elseif e == event_exitWebsite then os.queueEvent(event_exitWebsite) return nil end term.setCursorPos(list[curSel][2], list[curSel][3]) write("[") term.setCursorPos(list[curSel][2] + list[curSel][1]:len() + 3, list[curSel][3]) write("]") end end end local a = {} for k, v in pairs(list) do local b, t = v.b, v.t if b == nil then b = cbg end if t == nil then t = ctc end table.insert(a, {v[1], v[2], v[3] + 1, bg = b, tc = t}) end return fixPrompt(a, dir) end nenv.scrollingPrompt = function(list, x, y, len, width) local y = y + 1 local wid = width if wid == nil then wid = w - 3 end local function updateDisplayList(items, loc, len) local ret = {} for i = 1, len do local item = items[i + loc - 1] if item ~= nil then table.insert(ret, item) end end return ret end if isAdvanced() then local function draw(a) for i, v in ipairs(a) do term.setCursorPos(1, y + i - 1) api.centerWrite(string.rep(" ", wid + 2)) term.setCursorPos(x, y + i - 1) write("[ " .. v:sub(1, wid - 5)) term.setCursorPos(wid + x - 2, y + i - 1) write(" ]") end end local loc = 1 local disList = updateDisplayList(list, loc, len) draw(disList) while true do local e, but, clx, cly = ospullEvent() if e == "key" and but == 200 and loc > 1 then loc = loc - 1 disList = updateDisplayList(list, loc, len) draw(disList) elseif e == "key" and but == 208 and loc + len - 1 < #list then loc = loc + 1 disList = updateDisplayList(list, loc, len) draw(disList) elseif e == "mouse_scroll" and but > 0 and loc + len - 1 < #list then loc = loc + but disList = updateDisplayList(list, loc, len) draw(disList) elseif e == "mouse_scroll" and but < 0 and loc > 1 then loc = loc + but disList = updateDisplayList(list, loc, len) draw(disList) elseif e == "mouse_click" then for i, v in ipairs(disList) do if clx >= x and clx <= x + wid and cly == i + y - 1 then return v end end elseif e == event_exitWebsite then os.queueEvent(event_exitWebsite) return nil end end else local function draw(a) for i, v in ipairs(a) do term.setCursorPos(1, y + i - 1) api.centerWrite(string.rep(" ", wid + 2)) term.setCursorPos(x, y + i - 1) write("[ ] " .. v:sub(1, wid - 5)) end end local loc = 1 local curSel = 1 local disList = updateDisplayList(list, loc, len) draw(disList) term.setCursorPos(x + 1, y + curSel - 1) write("x") while true do local e, key = ospullEvent() term.setCursorPos(x + 1, y + curSel - 1) write(" ") if e == "key" and key == 200 then if curSel > 1 then curSel = curSel - 1 elseif loc > 1 then loc = loc - 1 disList = updateDisplayList(list, loc, len) draw(disList) end elseif e == "key" and key == 208 then if curSel < #disList then curSel = curSel + 1 elseif loc + len - 1 < #list then loc = loc + 1 disList = updateDisplayList(list, loc, len) draw(disList) end elseif e == "key" and key == 28 then return list[curSel + loc - 1] elseif e == event_exitWebsite then os.queueEvent(event_exitWebsite) return nil end term.setCursorPos(x + 1, y + curSel - 1) write("x") end end end nenv.loadImageFromServer = function(image) sleep(0.05) local mid, msgImage = curProtocol.getWebsite(site .. "/" .. image) if mid then local f = env.io.open(rootFolder .. "/temp_file", "w") f:write(msgImage) f:close() local rImage = env.paintutils.loadImage(rootFolder .. "/temp_file") fs.delete(rootFolder .. "/temp_file") return rImage end return nil end nenv.ioReadFileFromServer = function(file) sleep(0.05) local mid, msgFile = curProtocol.getWebsite(site .. "/" .. file) if mid then local f = env.io.open(rootFolder .. "/temp_file", "w") f:write(msgFile) f:close() local rFile = env.io.open(rootFolder .. "/temp_file", "r") return rFile end return nil end --[[ nenv.getCookie = function(cookieId) sleep(0.1) env.rednet.send(id, textutils.serialize({"getCookie", cookieId})) local startClock = os.clock() while os.clock() - startClock < timeout do local mid, status = env.rednet.receive(timeout) if mid == id then if status == "[$notexist$]" then return false elseif env.string.find(status, "[$cookieData$]") then return env.string.gsub(status, "[$cookieData$]", "") end end end return false end nenv.takeFromCookieJar = function(cookieId) nenv.getCookie(cookieId) end nenv.createCookie = function(cookieId) sleep(0.1) env.rednet.send(id, textutils.serialize({"createCookie", cookieId})) local startClock = os.clock() while os.clock() - startClock < timeout do local mid, status = env.rednet.receive(timeout) if mid == id then if status == "[$notexist$]" then return false elseif env.string.find(status, "[$cookieData$]") then return env.string.gsub(status, "[$cookieData$]", "") end end end return false end nenv.bakeCookie = function(cookieId) nenv.createCookie(cookieId) end nenv.deleteCookie = function(cookieId) end nenv.eatCookie = function(cookieId) nenv.deleteCookie(cookieId) end ]]-- nenv.redirect = function(url) api.redirect(url) env.error() end if shellAllowed then nenv.shell.run = function(file, ...) if file == "clear" then api.clearPage(website, cbc) env.term.setCursorPos(1, 2) else env.shell.run(file, ...) end end end local queueWebsiteExit = false nenv.os.pullEvent = function(a) if a == "derp" then return true end while true do local e, p1, p2, p3, p4, p5 = env.os.pullEventRaw() if e == event_exitWebsite then queueWebsiteExit = true env.error(event_exitWebsite) elseif e == "terminate" then env.error() end if e ~= event_exitWebsite and e ~= event_redirect and e ~= event_exitApp and e ~= event_loadWebsite then if a then if e == a then return e, p1, p2, p3, p4, p5 end else return e, p1, p2, p3, p4, p5 end end end end nenv.sleep = function(_nTime) local timer = os.startTimer(_nTime) repeat local _, param = ospullEvent("timer") until param == timer end nenv.read = function(_sReplaceChar, _tHistory) term.setCursorBlink(true) local sLine = "" local nHistoryPos = nil local nPos = 0 if _sReplaceChar then _sReplaceChar = string.sub(_sReplaceChar, 1, 1) end local w, h = term.getSize() local sx, sy = term.getCursorPos() local function redraw(_sCustomReplaceChar) local nScroll = 0 if sx + nPos >= w then nScroll = (sx + nPos) - w end term.setCursorPos(sx, sy) local sReplace = _sCustomReplaceChar or _sReplaceChar if sReplace then term.write(string.rep(sReplace, string.len(sLine) - nScroll)) else term.write(string.sub(sLine, nScroll + 1)) end term.setCursorPos(sx + nPos - nScroll, sy) end while true do local sEvent, param = ospullEvent() if sEvent == "char" then sLine = string.sub(sLine, 1, nPos) .. param .. string.sub(sLine, nPos + 1) nPos = nPos + 1 redraw() elseif sEvent == "key" then if param == keys.enter then break elseif param == keys.left then if nPos > 0 then nPos = nPos - 1 redraw() end elseif param == keys.right then if nPos < string.len(sLine) then nPos = nPos + 1 redraw() end elseif param == keys.up or param == keys.down then if _tHistory then redraw(" "); if param == keys.up then if nHistoryPos == nil then if #_tHistory > 0 then nHistoryPos = #_tHistory end elseif nHistoryPos > 1 then nHistoryPos = nHistoryPos - 1 end else if nHistoryPos == #_tHistory then nHistoryPos = nil elseif nHistoryPos ~= nil then nHistoryPos = nHistoryPos + 1 end end if nHistoryPos then sLine = _tHistory[nHistoryPos] nPos = string.len(sLine) else sLine = "" nPos = 0 end redraw() end elseif param == keys.backspace then if nPos > 0 then redraw(" "); sLine = string.sub(sLine, 1, nPos - 1) .. string.sub(sLine, nPos + 1) nPos = nPos - 1 redraw() end elseif param == keys.home then nPos = 0 redraw() elseif param == keys.delete then if nPos < string.len(sLine) then redraw(" "); sLine = string.sub(sLine, 1, nPos) .. string.sub(sLine, nPos + 2) redraw() end elseif param == keys["end"] then nPos = string.len(sLine) redraw() end end end term.setCursorBlink(false) term.setCursorPos(w + 1, sy) print() return sLine end -- Download API nenv.urlDownload = function(url) local function webmodRead(replaceChar, his, maxLen, stopAtMaxLen, liveUpdates, exitOnControl) term.setCursorBlink(true) local line = "" local hisPos = nil local pos = 0 if replaceChar then replaceChar = replaceChar:sub(1, 1) end local w, h = term.getSize() local sx, sy = term.getCursorPos() local function redraw(repl) local scroll = 0 if line:len() >= maxLen then scroll = line:len() - maxLen end term.setCursorPos(sx, sy) local a = repl or replaceChar if a then term.write(string.rep(a, line:len() - scroll)) else term.write(line:sub(scroll + 1)) end term.setCursorPos(sx + pos - scroll, sy) end while true do local e, but, x, y, p4, p5 = ospullEvent() if e == "char" and not(stopAtMaxLen == true and line:len() >= maxLen) then line = line:sub(1, pos) .. but .. line:sub(pos + 1, -1) pos = pos + 1 redraw() elseif e == "key" then if but == keys.enter then break elseif but == keys.left then if pos > 0 then pos = pos - 1 redraw() end elseif but == keys.right then if pos < line:len() then pos = pos + 1 redraw() end elseif (but == keys.up or but == keys.down) and his then redraw(" ") if but == keys.up then if hisPos == nil and #his > 0 then hisPos = #his elseif hisPos > 1 then hisPos = hisPos - 1 end elseif but == keys.down then if hisPos == #his then hisPos = nil elseif hisPos ~= nil then hisPos = hisPos + 1 end end if hisPos then line = his[hisPos] pos = line:len() else line = "" pos = 0 end redraw() if liveUpdates then local a, data = liveUpdates(line, "update_history", nil, nil, nil, nil, nil) if a == true and data == nil then term.setCursorBlink(false) return line elseif a == true and data ~= nil then term.setCursorBlink(false) return data end end elseif but == keys.backspace and pos > 0 then redraw(" ") line = line:sub(1, pos - 1) .. line:sub(pos + 1, -1) pos = pos - 1 redraw() if liveUpdates then local a, data = liveUpdates(line, "delete", nil, nil, nil, nil, nil) if a == true and data == nil then term.setCursorBlink(false) return line elseif a == true and data ~= nil then term.setCursorBlink(false) return data end end elseif but == keys.home then pos = 0 redraw() elseif but == keys.delete and pos < line:len() then redraw(" ") line = line:sub(1, pos) .. line:sub(pos + 2, -1) redraw() if liveUpdates then local a, data = liveUpdates(line, "delete", nil, nil, nil, nil, nil) if a == true and data == nil then term.setCursorBlink(false) return line elseif a == true and data ~= nil then term.setCursorBlink(false) return data end end elseif but == keys["end"] then pos = line:len() redraw() elseif (but == 29 or but == 157) and not(exitOnControl) then term.setCursorBlink(false) return nil end end if liveUpdates then local a, data = liveUpdates(line, e, but, x, y, p4, p5) if a == true and data == nil then term.setCursorBlink(false) return line elseif a == true and data ~= nil then term.setCursorBlink(false) return data end end end term.setCursorBlink(false) if line ~= nil then line = line:gsub("^%s*(.-)%s*$", "%1") end return line end clearPage(website, colors[theme["background"]]) print("\n\n") nenv.term.setTextColor(colors[theme["text-color"]]) nenv.term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Processing Download Request...") centerPrint(string.rep(" ", 47)) openAddressBar = false local res = http.get(url) openAddressBar = true local data = nil if res then data = res.readAll() res.close() else term.setCursorPos(1, 5) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Error: Download Failed!") centerPrint(string.rep(" ", 47)) openAddressBar = false sleep(3) openAddressBar = true clearPage(website, colors.black) term.setCursorPos(1, 2) return nil end clearPage(website, colors[theme["background"]]) print("") nenv.term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Download Files") centerPrint(string.rep(" ", 47)) print("") local a = website if a:find("/") then a = a:sub(1, a:find("/") - 1) end nenv.term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 10 do centerPrint(string.rep(" ", 47)) end term.setCursorPos(1, 8) centerPrint(" The website: ") if curProtocol == protocols.rdnt then centerPrint(" rdnt://" .. a .. string.rep(" ", w - a:len() - 16)) elseif curProtocol == protocols.http then centerPrint(" http://" .. a .. string.rep(" ", w - a:len() - 16)) end centerPrint(" Is attempting to download a file to this ") centerPrint(" computer! ") local opt = nenv.prompt({{"Download", 6, 14}, {"Cancel", w - 16, 14}}, "horizontal") if opt == "Download" then clearPage(website, colors[theme["background"]]) print("") nenv.term.setTextColor(colors[theme["text-color"]]) nenv.term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Download Files") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 10 do centerPrint(string.rep(" ", 47)) end local a = tostring(math.random(1000, 9999)) term.setCursorPos(5, 8) write("This is for security purposes: " .. a) term.setCursorPos(5, 9) write("Enter the 4 numbers above: ") local b = webmodRead(nil, nil, 4, true) if b == nil then os.queueEvent(event_exitWebsite) return end if b == a then term.setCursorPos(5, 11) write("Save As: /") local c = webmodRead(nil, nil, w - 18, false) if c ~= "" and c ~= nil then c = "/" .. c local f = io.open(c, "w") f:write(data) f:close() term.setCursorPos(5, 13) centerWrite("Download Successful! Continuing to Website...") openAddressBar = false sleep(1.1) openAddressBar = true clearPage(website, colors.black) term.setCursorPos(1, 2) return c elseif c == nil then os.queueEvent(event_exitWebsite) return end else term.setCursorPos(5, 13) centerWrite("Incorrect! Cancelling Download...") openAddressBar = false sleep(1.1) openAddressBar = true end elseif opt == "Cancel" then term.setCursorPos(1, 15) centerWrite(" Download Canceled! ") openAddressBar = false sleep(1.1) openAddressBar = true elseif opt == nil then os.queueEvent(event_exitWebsite) return end clearPage(website, colors.black) term.setCursorPos(1, 2) return nil end nenv.pastebinDownload = function(code) return nenv.urlDownload("http://pastebin.com/raw.php?i=" .. code) end -- Run local fn, err = env.loadfile(cacheLoc) if fn and not(err) then env.setfenv(fn, nenv) _, err = env.pcall(fn) env.setfenv(1, backupEnv) end -- Catch website error if err and not(err:find(event_exitWebsite)) then errPages.crash(err) end if queueWebsiteExit then os.queueEvent(event_exitWebsite) end end local function allowFunctions(offences) local function appendTable(tableData, addTable, tableName, ignore, overrideFunc) if not(tableData[tableName]) then tableData[tableName] = {} end for k, v in pairs(addTable) do if ignore then if ignore ~= k then if overrideFunc then tableData[tableName][k] = function() env.error("Firewolf Antivirus: Unauthorized Function") end else tableData[tableName][k] = v end end else if overrideFunc then tableData[tableName][k] = function() env.error("Firewolf Antivirus: Unauthorized Function") end else tableData[tableName][k] = v end end end return tableData end local returnTable = appendTable({}, os, "os", nil, true) returnTable = appendTable(returnTable, fs, "fs", nil, true) returnTable = appendTable(returnTable, io, "io", nil, true) returnTable = appendTable(returnTable, shell, "shell", nil, true) shellAllowed = false returnTable["loadfile"] = function() env.error("Firewolf Antivirus: Unauthorized Function") end returnTable["loadstring"] = function() env.error("Firewolf Antivirus: Unauthorized Function") end returnTable["dofile"] = function() env.error("Firewolf Antivirus: Unauthorized Function") end returnTable["getfenv"] = function() env.error("Firewolf Antivirus: Unauthorized Function") end returnTable["setfenv"] = function() env.error("Firewolf Antivirus: Unauthorized Function") end returnTable["rawset"] = function() env.error("Firewolf Antivirus: Unauthorized Function") end returnTable = appendTable(returnTable, os, "os", "run") for k, v in pairs(offences) do if v == "Modify Files" then returnTable = appendTable(returnTable, io, "io") returnTable = appendTable(returnTable, fs, "fs") elseif v == "Run Files" then returnTable = appendTable(returnTable, os, "os") returnTable = appendTable(returnTable, shell, "shell") shellAllowed = true returnTable["loadfile"] = loadfile returnTable["dofile"] = dofile elseif v == "Execute Text" then returnTable["loadstring"] = loadstring elseif v == "Modify Env" then returnTable["getfenv"] = getfenv returnTable["setfenv"] = setfenv elseif v == "Modify Anything" then returnTable["rawset"] = rawset end end return returnTable end -- Draw openAddressBar = false clearPage(site, colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["background"]]) print("\n\n") centerWrite("Getting DNS Listing...") internalWebsite = true -- Redirection bots loadingRate = loadingRate + 1 term.clearLine() centerWrite("Getting Website...") -- Get website local id, content, status = curProtocol.getWebsite(site) term.clearLine() centerWrite("Processing Website...") -- Display website local cacheLoc = cacheFolder .. "/" .. site:gsub("/", "$slazh$") local antivirusProcessed = false local antivirusEnv = {} if id ~= nil and status ~= nil then openAddressBar = true if status == "antivirus" then local offences = verify("antivirus offences", content) if #offences > 0 then antivirusProcessed = true clearPage(site, colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Antivirus Triggered!") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerPrint(" The antivirus has been triggered on this ") centerPrint(" website! Do you want to give this website ") centerPrint(" permissions to: ") for i = 1, 8 do centerPrint(string.rep(" ", 47)) end for i, v in ipairs(offences) do if i > 3 then term.setCursorPos(w - 21, i + 8) else term.setCursorPos(6, i + 11) end write("[ " .. v) end while true do local opt = prompt({{"Allow", 5, 17}, {"Cancel", 17, 17}, {"View Source", 31, 17}}, "horizontal") if opt == "Allow" then antivirusEnv = allowFunctions(offences) status = "safe" break elseif opt == "Cancel" then clearPage(site, colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("O Noes!") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerPrint(" ______ __ ") centerPrint(" / ____/_____ _____ ____ _____ / / ") centerPrint(" / __/ / ___// ___// __ \\ / ___// / ") centerPrint(" / /___ / / / / / /_/ // / /_/ ") centerPrint(" /_____//_/ /_/ \\____//_/ (_) ") centerPrint(string.rep(" ", 47)) centerPrint(" Could not connect to the website! The ") centerPrint(" website was not given enough permissions to ") centerPrint(" execute properly! ") centerPrint(string.rep(" ", 47)) break elseif opt == "View Source" then local f = io.open(rootFolder .. "/temp-source", "w") f:write(content) f:close() openAddressBar = false shell.run("edit", rootFolder .. "/temp-source") fs.delete(rootFolder .. "/temp-source") clearPage(site, colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Antivirus Triggered!") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerPrint(" The antivirus has been triggered on this ") centerPrint(" website! Do you want to give this website ") centerPrint(" permissions to: ") for i = 1, 8 do centerPrint(string.rep(" ", 47)) end for i, v in ipairs(offences) do if i > 3 then term.setCursorPos(w - 21, i + 8) else term.setCursorPos(6, i + 11) end write("[ " .. v) end openAddressBar = true elseif opt == nil then os.queueEvent(event_exitWebsite) return end end else status = "safe" end end if status == "safe" and site ~= "" then if not(antivirusProcessed) then antivirusEnv = allowFunctions({""}) end internalWebsite = false local f = io.open(cacheLoc, "w") f:write(content) f:close() term.clearLine() centerWrite("Running Website...") runSite(cacheLoc, antivirusEnv) return end else if fs.exists(cacheLoc) and site ~= "" and site ~= "." and site ~= ".." and not(verify("blacklist", site)) then openAddressBar = true clearPage(site, colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Cache Exists!") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerPrint(" ______ __ __ ") centerPrint(" / ____/____ _ _____ / /_ ___ / / ") centerPrint(" / / / __ '// ___// __ \\ / _ \\ / / ") centerPrint(" / /___ / /_/ // /__ / / / // __/ /_/ ") centerPrint(" \\____/ \\__,_/ \\___//_/ /_/ \\___/ (_) ") centerPrint(string.rep(" ", 47)) centerPrint(" Could not connect to the website! It may be ") centerPrint(" down, or not exist! A cached version was ") centerPrint(" found! ") centerPrint(string.rep(" ", 47)) centerPrint(string.rep(" ", 47)) local opt = prompt({{"Load Cache", 6, 17}, {"Cancel", w - 16, 17}}, "horizontal") if opt == "Load Cache" then internalWebsite = false runSite(cacheLoc, {"firewolf-override"}) return elseif opt == "Cancel" then clearPage(site, colors[theme["background"]]) print("\n") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("O Noes!") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerPrint(" ______ __ ") centerPrint(" / ____/_____ _____ ____ _____ / / ") centerPrint(" / __/ / ___// ___// __ \\ / ___// / ") centerPrint(" / /___ / / / / / /_/ // / /_/ ") centerPrint(" /_____//_/ /_/ \\____//_/ (_) ") centerPrint(string.rep(" ", 47)) centerPrint(" Could not connect to the website! The ") centerPrint(" cached version was not loaded! ") centerPrint(string.rep(" ", 47)) elseif opt == nil then os.queueEvent(event_exitWebsite) return end else openAddressBar = true local res = {} if site ~= "" then for k, v in pairs(dnsDatabase[1]) do if v:find(site:lower()) then table.insert(res, v) end end else for k,v in pairs(dnsDatabase[1]) do table.insert(res, v) end end if #res > 0 then clearPage(site, colors[theme["background"]]) print("") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) if #res == 1 then centerPrint("1 Search Result") else centerPrint(#res .. " Search Results") end centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 12 do centerPrint(string.rep(" ", 47)) end local opt = scrollingPrompt(res, 4, 8, 10, 43) if opt then redirect(opt:gsub("rdnt://", ""):gsub("http://", "")) return else os.queueEvent(event_exitWebsite) return end elseif site == "" and #res == 0 then clearPage(site, colors[theme["background"]]) print("\n\n") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("No Websites are Currently Online! D:") centerWrite(string.rep(" ", 47)) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Why not make one yourself?") centerWrite(string.rep(" ", 47)) centerPrint("Visit rdnt://server!") centerPrint(string.rep(" ", 47)) while true do local e, p1, p2, p3 = os.pullEvent() if e == "mouse_click" then if p2 < 50 and p2 > 2 and p3 > 4 and p3 < 11 then redirect("server") break end elseif e == event_openAddressBar then break end end else clearPage(site, colors[theme["background"]]) print("\n") term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("O Noes!") centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) centerPrint(string.rep(" ", 47)) centerPrint(" ______ __ ") centerPrint(" / ____/_____ _____ ____ _____ / / ") centerPrint(" / __/ / ___// ___// __ \\ / ___// / ") centerPrint(" / /___ / / / / / /_/ // / /_/ ") centerPrint(" /_____//_/ /_/ \\____//_/ (_) ") centerPrint(string.rep(" ", 47)) if verify("blacklist", id) then centerPrint(" Could not connect to the website! It has ") centerPrint(" been blocked by a database admin! ") else centerPrint(" Could not connect to the website! It may ") centerPrint(" be down, or not exist! ") end centerPrint(string.rep(" ", 47)) end end end end -- -------- Websites local function websiteMain() -- Variables local loadingClock = os.clock() -- Main loop while true do -- Reset setfenv(1, backupEnv) browserAgent = browserAgentTemplate clearPage(website) w, h = term.getSize() term.setBackgroundColor(colors.black) term.setTextColor(colors.white) -- Exit if website == "exit" then os.queueEvent(event_exitApp) return end -- Perform Checks local skip = false local oldWebsite = website if not(errPages.checkForModem()) then os.queueEvent(event_exitApp) return end website = oldWebsite if os.clock() - loadingClock > 5 then loadingRate = 0 loadingClock = os.clock() elseif loadingRate >= 8 then errPages.overspeed() loadingClock = os.clock() loadingRate = 0 skip = true end if not(skip) then -- Add to history appendToHistory(website) -- Render site clearPage(website) term.setBackgroundColor(colors.black) term.setTextColor(colors.white) if pages[website] then local ex = pages[website](website) if ex == true then os.queueEvent(event_exitApp) return end else loadSite(website) end end -- Wait os.pullEvent(event_loadWebsite) end end -- -------- Address Bar local function retrieveSearchResults() local lastCheck = os.clock() curSites = curProtocol.getSearchResults() while true do local e = os.pullEvent() if website ~= "exit" and e == event_loadWebsite then if os.clock() - lastCheck > 5 then curSites = curProtocol.getSearchResults() lastCheck = os.clock() end elseif e == event_exitApp then os.queueEvent(event_exitApp) return end end end local function addressBarRead() local len = 4 local list = {} local function draw(l) local ox, oy = term.getCursorPos() for i = 1, len do term.setTextColor(colors[theme["address-bar-text"]]) term.setBackgroundColor(colors[theme["address-bar-background"]]) term.setCursorPos(1, i + 1) write(string.rep(" ", w)) end if theme["address-bar-base"] then term.setBackgroundColor(colors[theme["address-bar-base"]]) else term.setBackgroundColor(colors[theme["bottom-box"]]) end term.setCursorPos(1, len + 2) write(string.rep(" ", w)) term.setBackgroundColor(colors[theme["address-bar-background"]]) for i, v in ipairs(l) do term.setCursorPos(2, i + 1) write(v) end term.setCursorPos(ox, oy) end local function onLiveUpdate(cur, e, but, x, y, p4, p5) if e == "char" or e == "update_history" or e == "delete" then list = {} for _, v in pairs(curSites) do if #list < len and v:gsub("rdnt://", ""):gsub("http://", ""):find(cur:lower(), 1, true) then table.insert(list, v) end end table.sort(list) table.sort(list, function(a, b) local _, ac = a:gsub("rdnt://", ""):gsub("http://", ""):gsub(cur:lower(), "") local _, bc = b:gsub("rdnt://", ""):gsub("http://", ""):gsub(cur:lower(), "") return ac > bc end) draw(list) return false, nil elseif e == "mouse_click" then for i = 1, #list do if y == i + 1 then return true, list[i]:gsub("rdnt://", ""):gsub("http://", "") end end end end onLiveUpdate("", "delete", nil, nil, nil, nil, nil) return modRead(nil, addressBarHistory, 41, false, onLiveUpdate) end local function addressBarMain() while true do local e, but, x, y = os.pullEvent() if (e == "key" and (but == 29 or but == 157)) or (e == "mouse_click" and y == 1) then if openAddressBar then if e == "key" then x = 45 end if x == term.getSize() then menuBarOpen = true local list = nil if not(internalWebsite) then list = "> [- Exit Firewolf -] [- Incorrect Website -] " else list = "> [- Exit Firewolf -] " end term.setBackgroundColor(colors[theme["top-box"]]) term.setTextColor(colors[theme["text-color"]]) term.setCursorPos(1, 1) write(list) elseif menuBarOpen and (x == 1 or (but == 29 or but == 157)) then menuBarOpen = false clearPage(website, nil, true) elseif x < 18 and x > 2 and menuBarOpen then website = "exit" menuBarOpen = false os.queueEvent(event_openAddressBar) os.queueEvent(event_exitWebsite) sleep(0.0001) website = "exit" os.queueEvent(event_loadWebsite) elseif x < 38 and x > 18 and not(internalWebsite) and menuBarOpen then menuBarOpen = false clearPage("incorrect", colors[theme["background"]]) print("") term.setBackgroundColor(colors[theme["top-box"]]) term.setTextColor(colors[theme["text-color"]]) centerPrint(string.rep(" ", 47)) centerPrint(string.rep(" ", 47)) centerPrint(string.rep(" ", 47)) term.setCursorPos(1, 4) centerPrint("Incorrect Website: ID Block") term.setCursorPos(1, 7) term.setBackgroundColor(colors[theme["bottom-box"]]) for i = 1, 12 do centerPrint(string.rep(" ", 47)) end term.setCursorPos(1, 8) centerPrint("This feature is used to block a server's ID") centerPrint("if it's intercepting a website") centerPrint("Ex. You got onto a website you didn't expect") centerPrint("Managing servers comming soon!") --centerPrint("Manage blocked servers at rdnt://settings") centerPrint("") centerPrint("You are about to block the server ID: " .. tostring(serverWebsiteID)) local opt = prompt({{"Block", 8, 15}, {"Don't Block", 28, 15}}) if opt == "Block" then table.insert(blacklist, tostring(serverWebsiteID)) local f = io.open(userBlacklist,"a") f:write(tostring(serverWebsiteID)) f:close() centerPrint("") centerPrint("Server Blocked!") centerPrint("You may now browse normally!") else centerPrint("") centerPrint("Server Not Blocked!") centerPrint("You may now browse normally!") end -- Swap protocols by clicking them menubar. For 3.0 -- elseif x >= 2 and x <= 5 then -- -- Swap protocols -- if curProtocol == protocols.rdnt then curProtocol = protocols.http -- elseif curProtocol == protocols.http then curProtocol = protocols.rdnt -- end -- curSites = curProtocol.getSearchResults() -- clearPage(website, nil, true) -- redirect(homepage) elseif not(menuBarOpen) then internalWebsite = true -- Exit os.queueEvent(event_openAddressBar) os.queueEvent(event_exitWebsite) -- Read term.setBackgroundColor(colors[theme["address-bar-background"]]) term.setTextColor(colors[theme["address-bar-text"]]) term.setCursorPos(2, 1) term.clearLine() if curProtocol == protocols.rdnt then write("rdnt://") elseif curProtocol == protocols.http then write("http://") end local oldWebsite = website website = addressBarRead() if website == nil then website = oldWebsite elseif website == "home" or website == "homepage" then website = homepage end -- Load os.queueEvent(event_loadWebsite) end end elseif e == event_redirect then if openAddressBar then -- Redirect os.queueEvent(event_exitWebsite) if but == "home" or but == "homepage" then website = homepage else website = but end os.queueEvent(event_loadWebsite) end elseif e == event_exitApp then os.queueEvent(event_exitApp) break end end end -- -------- Main local function main() -- Logo term.setBackgroundColor(colors[theme["background"]]) term.setTextColor(colors[theme["text-color"]]) term.clear() term.setCursorPos(1, 2) term.setBackgroundColor(colors[theme["top-box"]]) centerPrint(string.rep(" ", 47)) centerPrint([[ ______ ____ ____ ______ ]]) centerPrint([[ ------- / ____// _// __ \ / ____/ ]]) centerPrint([[ ------ / /_ / / / /_/ // __/ ]]) centerPrint([[ ----- / __/ _/ / / _ _// /___ ]]) centerPrint([[ ---- / / /___//_/ |_|/_____/ ]]) centerPrint([[ --- / / _ __ ____ __ ______ ]]) centerPrint([[ -- /_/ | | / // __ \ / / / ____/ ]]) centerPrint([[ | | /| / // / / // / / /_ ]]) centerPrint([[ | |/ |/ // /_/ // /___ / __/ ]]) centerPrint([[ |__/|__/ \____//_____//_/ ]]) centerPrint(string.rep(" ", 47)) print("\n") term.setBackgroundColor(colors[theme["bottom-box"]]) -- Load settings data if fs.exists(settingsLocation) then local f = io.open(settingsLocation, "r") local a = textutils.unserialize(f:read("*l")) if a then autoupdate = a.auto incognito = a.incog homepage = a.home end f:close() else autoupdate = "true" incognito = "false" homepage = "firewolf" end curProtocol = protocols.rdnt -- Update centerPrint(string.rep(" ", 47)) centerWrite(string.rep(" ", 47)) centerPrint("Checking for Updates...") centerWrite(string.rep(" ", 47)) -- if not(noInternet) then if updateClient() then return end end -- Download Files local x, y = term.getCursorPos() term.setCursorPos(1, y - 1) centerWrite(string.rep(" ", 47)) centerWrite("Downloading Required Files...") migrateFilesystem() if not(noInternet) then resetFilesystem() end loadDatabases() -- Load history local b = io.open(historyLocation, "r") history = textutils.unserialize(b:read("*l")) b:close() -- Modem if not(errPages.checkForModem()) then return end website = homepage -- Run parallel.waitForAll(websiteMain, addressBarMain, retrieveSearchResults) return false end local function startup() -- HTTP API if not(http) and not(noInternet) then term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["background"]]) term.clear() term.setCursorPos(1, 2) term.setBackgroundColor(colors[theme["top-box"]]) api.centerPrint(string.rep(" ", 47)) api.centerWrite(string.rep(" ", 47)) api.centerPrint("HTTP API Not Enabled! D:") api.centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) api.centerPrint(string.rep(" ", 47)) api.centerPrint(" Firewolf is unable to run without the HTTP ") api.centerPrint(" API Enabled! Please enable it in the CC ") api.centerPrint(" Config! ") api.centerPrint(string.rep(" ", 47)) api.centerPrint(string.rep(" ", 47)) api.centerWrite(string.rep(" ", 47)) if isAdvanced() then api.centerPrint("Click to exit...") else api.centerPrint("Press any key to exit...") end api.centerPrint(string.rep(" ", 47)) while true do local e, but, x, y = os.pullEvent() if e == "mouse_click" or e == "key" then break end end return false end -- Turtle if turtle then term.clear() term.setCursorPos(1, 2) api.centerPrint("Advanced Comptuer Required!") print("\n") api.centerPrint(" This version of Firewolf requires ") api.centerPrint(" an Advanced Comptuer to run! ") print("") api.centerPrint(" Turtles may not be used to run ") api.centerPrint(" Firewolf! :( ") print("") api.centerPrint("Press any key to exit...") os.pullEvent("key") return false end -- Run local _, err = pcall(function() main() end) if err ~= nil then term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["background"]]) term.clear() term.setCursorPos(1, 2) term.setCursorBlink(false) term.setBackgroundColor(colors[theme["top-box"]]) api.centerPrint(string.rep(" ", 47)) api.centerWrite(string.rep(" ", 47)) api.centerPrint("Firewolf has Crashed! D:") api.centerPrint(string.rep(" ", 47)) print("") term.setBackgroundColor(colors[theme["background"]]) print("") print(" " .. err) print("") term.setBackgroundColor(colors[theme["bottom-box"]]) api.centerPrint(string.rep(" ", 47)) if autoupdate == "true" then api.centerPrint(" Please report this error to 1lann or ") api.centerPrint(" GravityScore so we are able to fix it! ") api.centerPrint(" If this problem persists, try deleting ") api.centerPrint(" " .. rootFolder .. " ") else api.centerPrint(" Automatic updating is off! A new version ") api.centerPrint(" may have have been released, which could ") api.centerPrint(" fix this problem! ") api.centerPrint(" If you didn't intend to turn auto-updating ") api.centerPrint(" off, delete " .. rootFolder .. " ") end api.centerPrint(string.rep(" ", 47)) api.centerWrite(string.rep(" ", 47)) if isAdvanced() then api.centerPrint("Click to exit...") else api.centerPrint("Press any key to exit...") end api.centerPrint(string.rep(" ", 47)) while true do local e, but, x, y = os.pullEvent() if e == "mouse_click" or e == "key" then break end end return false end return true end -- Check if read only if fs.isReadOnly(firewolfLocation) or fs.isReadOnly(rootFolder) then print("Firewolf cannot modify itself or its root folder!") print("") print("This cold be caused by Firewolf being placed in") print("the rom folder, or another program may be") print("preventing the modification of Firewolf.") -- Reset Environment and exit setfenv(1, backupEnv) error() end -- Theme if not(isAdvanced()) then theme = originalTheme else theme = loadTheme(themeLocation) if theme == nil then theme = defaultTheme end end -- Debugging if #tArgs > 0 and tArgs[1] == "debug" then term.setTextColor(colors[theme["text-color"]]) term.setBackgroundColor(colors[theme["background"]]) term.clear() term.setCursorPos(1, 4) api.centerPrint(string.rep(" ", 43)) api.centerWrite(string.rep(" ", 43)) api.centerPrint("Debug Mode Enabled...") api.centerPrint(string.rep(" ", 43)) if fs.exists(debugLogLocation) then debugFile = io.open(debugLogLocation, "a") else debugFile = io.open(debugLogLocation, "w") end debugFile:write("\n-- [" .. textutils.formatTime(os.time()) .. "] New Log --") sleep(1.3) end -- Start startup() -- Exit Message term.setBackgroundColor(colors.black) term.setTextColor(colors.white) term.setCursorBlink(false) term.clear() term.setCursorPos(1, 1) api.centerPrint("Thank You for Using Firewolf " .. version) api.centerPrint("Made by 1lann and GravityScore") term.setCursorPos(1, 3) -- Closes for _, v in pairs(rs.getSides()) do if peripheral.getType(v) == "modem" then rednet.close(v) end end if debugFile then debugFile:close() end -- Reset Environment setfenv(1, backupEnv)
Optional Paste Settings
Category:
None
Cryptocurrency
Cybersecurity
Fixit
Food
Gaming
Haiku
Help
History
Housing
Jokes
Legal
Money
Movies
Music
Pets
Photo
Science
Software
Source Code
Spirit
Sports
Travel
TV
Writing
Tags:
Syntax Highlighting:
None
Bash
C
C#
C++
CSS
HTML
JSON
Java
JavaScript
Lua
Markdown (PRO members only)
Objective C
PHP
Perl
Python
Ruby
Swift
4CS
6502 ACME Cross Assembler
6502 Kick Assembler
6502 TASM/64TASS
ABAP
AIMMS
ALGOL 68
APT Sources
ARM
ASM (NASM)
ASP
ActionScript
ActionScript 3
Ada
Apache Log
AppleScript
Arduino
Asymptote
AutoIt
Autohotkey
Avisynth
Awk
BASCOM AVR
BNF
BOO
Bash
Basic4GL
Batch
BibTeX
Blitz Basic
Blitz3D
BlitzMax
BrainFuck
C
C (WinAPI)
C Intermediate Language
C for Macs
C#
C++
C++ (WinAPI)
C++ (with Qt extensions)
C: Loadrunner
CAD DCL
CAD Lisp
CFDG
CMake
COBOL
CSS
Ceylon
ChaiScript
Chapel
Clojure
Clone C
Clone C++
CoffeeScript
ColdFusion
Cuesheet
D
DCL
DCPU-16
DCS
DIV
DOT
Dart
Delphi
Delphi Prism (Oxygene)
Diff
E
ECMAScript
EPC
Easytrieve
Eiffel
Email
Erlang
Euphoria
F#
FO Language
Falcon
Filemaker
Formula One
Fortran
FreeBasic
FreeSWITCH
GAMBAS
GDB
GDScript
Game Maker
Genero
Genie
GetText
Go
Godot GLSL
Groovy
GwBasic
HQ9 Plus
HTML
HTML 5
Haskell
Haxe
HicEst
IDL
INI file
INTERCAL
IO
ISPF Panel Definition
Icon
Inno Script
J
JCL
JSON
Java
Java 5
JavaScript
Julia
KSP (Kontakt Script)
KiXtart
Kotlin
LDIF
LLVM
LOL Code
LScript
Latex
Liberty BASIC
Linden Scripting
Lisp
Loco Basic
Logtalk
Lotus Formulas
Lotus Script
Lua
M68000 Assembler
MIX Assembler
MK-61/52
MPASM
MXML
MagikSF
Make
MapBasic
Markdown (PRO members only)
MatLab
Mercury
MetaPost
Modula 2
Modula 3
Motorola 68000 HiSoft Dev
MySQL
Nagios
NetRexx
Nginx
Nim
NullSoft Installer
OCaml
OCaml Brief
Oberon 2
Objeck Programming Langua
Objective C
Octave
Open Object Rexx
OpenBSD PACKET FILTER
OpenGL Shading
Openoffice BASIC
Oracle 11
Oracle 8
Oz
PARI/GP
PCRE
PHP
PHP Brief
PL/I
PL/SQL
POV-Ray
ParaSail
Pascal
Pawn
Per
Perl
Perl 6
Phix
Pic 16
Pike
Pixel Bender
PostScript
PostgreSQL
PowerBuilder
PowerShell
ProFTPd
Progress
Prolog
Properties
ProvideX
Puppet
PureBasic
PyCon
Python
Python for S60
QBasic
QML
R
RBScript
REBOL
REG
RPM Spec
Racket
Rails
Rexx
Robots
Roff Manpage
Ruby
Ruby Gnuplot
Rust
SAS
SCL
SPARK
SPARQL
SQF
SQL
SSH Config
Scala
Scheme
Scilab
SdlBasic
Smalltalk
Smarty
StandardML
StoneScript
SuperCollider
Swift
SystemVerilog
T-SQL
TCL
TeXgraph
Tera Term
TypeScript
TypoScript
UPC
Unicon
UnrealScript
Urbi
VB.NET
VBScript
VHDL
VIM
Vala
Vedit
VeriLog
Visual Pro Log
VisualBasic
VisualFoxPro
WHOIS
WhiteSpace
Winbatch
XBasic
XML
XPP
Xojo
Xorg Config
YAML
YARA
Z80 Assembler
ZXBasic
autoconf
jQuery
mIRC
newLISP
q/kdb+
thinBasic
Paste Expiration:
Never
Burn after read
10 Minutes
1 Hour
1 Day
1 Week
2 Weeks
1 Month
6 Months
1 Year
Paste Exposure:
Public
Unlisted
Private
Folder:
(members only)
Password
NEW
Enabled
Disabled
Burn after read
NEW
Paste Name / Title:
Create New Paste
Hello
Guest
Sign Up
or
Login
Sign in with Facebook
Sign in with Twitter
Sign in with Google
You are currently not logged in, this means you can not edit or delete anything you paste.
Sign Up
or
Login
Public Pastes
Untitled
18 min ago | 7.49 KB
⚠️ SCAM CAMPAIGN ON PASTEBIN ⚠️
CSS | 40 min ago | 0.34 KB
⚠️ Swapz0ne Method is a SCAM ⚠️
CSS | 40 min ago | 0.34 KB
Untitled
2 hours ago | 6.43 KB
Untitled
4 hours ago | 8.03 KB
Untitled
6 hours ago | 10.02 KB
Untitled
10 hours ago | 7.90 KB
Untitled
12 hours ago | 7.14 KB
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the
Cookies Policy
.
OK, I Understand
Not a member of Pastebin yet?
Sign Up
, it unlocks many cool features!