Advertisement
1lann

sandbox

Jun 13th, 2013
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 13.94 KB | None | 0 0
  1. -- Not written by me (1lann).
  2. -- I believe the author is AfterLifeLochie but I'm not sure.
  3.  
  4. print("Anything on this computer will not be saved.")
  5. print("The files will be deleted upon restart.")
  6. for k,v in pairs(fs.list("/")) do
  7.     if v ~= "startup" then
  8.         pcall(fs.delete, v)
  9.     end
  10. end
  11. if shell then pcall(shell.exit) end
  12.  
  13.     local dir="sandbox/"
  14.     local OS="sandbox"
  15.     local filepath="/startup"
  16.     local urlinstaller="http://pastebin.com/raw.php?i=7Z4MwAqz"
  17.     local Disks
  18.     local oSides=rs.getSides
  19.     local pErr=printError
  20.     local oIP=ipairs
  21.     local oInsert=table.insert
  22.  
  23.     if not fs.exists(".System/UserPerms/"..OS) then
  24.         fs.makeDir(".System")
  25.         fs.makeDir(".System/UserPerms")
  26.         local writeFirst=fs.open(".System/UserPerms/"..OS,"w")
  27.         writeFirst.write(textutils.serialize({}))
  28.         writeFirst.close()
  29.     end
  30.     local readPerms=fs.open(".System/UserPerms/"..OS,"r")
  31.     local Perms=textutils.unserialize(readPerms.readAll())
  32.     readPerms.close()
  33.  
  34.  
  35.     local firstTime=false
  36.  
  37.     local oCombine=fs.combine
  38.     local oSub=string.sub
  39.     local oLen=string.len
  40.     local function queue(word)
  41.         for p=1,#word do
  42.             os.queueEvent("char",word:sub(p,p))
  43.         end
  44.         os.queueEvent("key",keys.enter)
  45.     end
  46.  
  47.     local function activateInstaller(filepath)
  48.         if filepath then
  49.             shell.run(filepath)
  50.         end
  51.     end
  52.  
  53.  
  54.     sandbox=nil
  55.  local printStuff=false --Change to see printed stuff or not.
  56.  
  57. --Backup FS declaration...
  58. local oFs={}
  59. for k, v in pairs(fs) do
  60.     oFs[k]=v
  61. end
  62.  
  63. --Backup peripherals declaration...
  64. local oldP={}
  65. for k,v in pairs(peripheral) do
  66.     oldP[k]=v
  67. end
  68. --Backup others declaration...
  69. local oldDfile=dofile
  70. local oldLfile=loadfile
  71. local err = error
  72. local oldReboot=os.reboot
  73. local oldShutdown=os.shutdown
  74. local oMountPath=disk.getMountPath
  75. local oPresent=disk.isPresent
  76.  
  77.  
  78. local oldsenv=setfenv
  79. local oldmeta=setmetatable
  80. local orset=rawset
  81. local bPair=pairs
  82.  
  83. local function centerPrint(text, ny)
  84.     if type(text) == "table" then for _, v in pairs(text) do centerPrint(v) end
  85. else
  86.     local x, y = term.getCursorPos()
  87.     local w, h = term.getSize()
  88.     term.setCursorPos(w/2 - text:len()/2, ny or y)
  89.     print(text)
  90. end
  91. end
  92.  
  93. local function centerWrite(text, ny)
  94.     if type(text) == "table" then for _, v in pairs(text) do centerWrite(v) end
  95. else
  96.     local x, y = term.getCursorPos()
  97.     local w, h = term.getSize()
  98.     term.setCursorPos(w/2 - text:len()/2, ny or y)
  99.     write(text)
  100. end
  101. end
  102.  
  103. local function md(d)
  104.     os.queueEvent(" ")
  105.     os.pullEventRaw()
  106.     return fs.makeDir(dir.."/"..d)
  107. end
  108.  
  109. local function cp(f,ftwo)
  110.     ftwo=ftwo or dir.."/"..f
  111.     os.queueEvent(" ")
  112.     os.pullEventRaw()
  113.     return pcall(fs.copy,f,ftwo)
  114. end
  115.  
  116. local function clear()
  117.     term.clear()
  118.     term.setCursorPos(1,1)
  119. end
  120.  
  121. local function sandbox(directory)
  122.     local sandboxed = directory
  123.  
  124.     local rT={[1] = sandboxed, [2] = sandboxed.."rom"}
  125.     Disks = {}
  126.  
  127.     local function getDisks()
  128.         local Disks = {}
  129.         for i,v in bPair(oldP.getNames()) do
  130.             if oldP.getType(v)=="drive" and Perms[v] then
  131.                 local der = {}
  132.                 der[1] = v
  133.                 der[2] = oldP.call(v,"getMountPath")
  134.                 der[3] = "disk"
  135.                 if oFs.exists(sandboxed .. "disk") then
  136.                     local on = 1
  137.                     while true do
  138.                         local on = on + 1
  139.                         if not oFs.exists(sandboxed .. "disk" .. on) then
  140.                             der[3] = "disk" .. on
  141.                             break
  142.                         end
  143.                     end
  144.                 end
  145.                 table.insert(Disks, der)
  146.             end
  147.         end
  148. return Disks
  149.     end
  150.  
  151.     local function check(filename)
  152.         if oSub(filename,1,oLen(sandboxed)+4) == (sandboxed.."rom/" or sandboxed.."rom\\") then return true end
  153.         for k,v in bPair(rT) do
  154.             if v==filename then return true end
  155.         end
  156.         return false
  157.     end
  158.  
  159.     local function isAllowed()
  160.         return false
  161.     end
  162.  
  163.     local function errorout()
  164.         err("Access denied",3)
  165.     end
  166.  
  167.     local function returnResolved(path)
  168.         if path==nil then return sandboxed end
  169.         local nPath=oCombine("",path)
  170.         if (oSub(nPath,1,2)==".." and oLen(nPath)==2) or (oSub(nPath,1,3)=="../") then return nil end
  171.         local Disks=getDisks()
  172.         for i,v in bPair(Disks) do
  173.             if oSub(nPath, 1, oLen(v[3]) + 1) == v[3] .. "/" or nPath == v[3] then
  174.                 return "/" .. v[2] .. "/" .. oSub(nPath, oLen(v[3]) + 2)
  175.             end
  176.         end
  177.         return sandboxed..path
  178.     end
  179.  
  180.     function peripheral.call(side, method, ...)
  181.         local tA={...}
  182.         if not type(side)=="string" then err("Expected string",2) end
  183.         if not (oldP.isPresent(side) and Perms[side]) or method==nil then return nil end
  184.         if oldP.getType(side)=="modem" and not oldP.call(side,"isWireless") then
  185.             --Ugh....
  186.             if method=="getNamesRemote" then
  187.                 local tFakeNames={}
  188.                 local tNames=oldP.call(side,"getNamesRemote")
  189.                 for k,v in bPair(tNames) do
  190.                     if Perms[v] then tFakeNames[#tFakeNames+1]=v end
  191.                 end
  192.                 return tFakeNames
  193.             elseif method=="isPresentRemote" then
  194.                 if not type(tA[1])=="string" then err("Expected string",2) end
  195.                 return Perms[tA[1]] and oldP.call(side,"isPresentRemote",tA[1])
  196.             elseif method=="getTypeRemote" then
  197.                 if not type(tA[1])=="string" then err("Expected string",2) end
  198.                 return Perms[tA[1]] and oldP.call(side,"getTypeRemote",tA[1])
  199.             elseif method=="getMethodsRemote" then
  200.                 if not type(tA[1])=="string" then err("Expected string",2) end
  201.                 return Perms[tA[1]] and oldP.call(side,"getMethodsRemote",tA[1])
  202.             elseif method=="callRemote" then
  203.                 if not type(tA[1])=="string" then err("Expected string",2) end
  204.                 return Perms[tA[1]] and oldP.call(side,"callRemote",unpack(tA))
  205.             end
  206.         end
  207.         return oldP.call(side,method,unpack(tA))
  208.     end
  209.  
  210.     local newCall=peripheral.call
  211.  
  212.     function peripheral.getNames()
  213.         local tResults = {}
  214.         for n,sSide in oIP( rs.getSides() ) do
  215.             if oldP.isPresent( sSide ) and Perms[sSide] then
  216.                 table.insert( tResults, sSide )
  217.                 if oldP.getType( sSide ) == "modem" and not oldP.call( sSide, "isWireless" ) then
  218.                     local tRemote = oldP.call( sSide, "getNamesRemote" )
  219.                     for n,sName in oIP( tRemote ) do
  220.                         if Perms[sName] then table.insert( tResults, sName ) end
  221.                     end
  222.                 end
  223.             end
  224.         end
  225.         return tResults
  226.     end
  227.     function peripheral.isPresent( _sSide )
  228.         if oldP.isPresent( _sSide ) and Perms[_sSide] then
  229.             return true
  230.         end
  231.         for n,sSide in oIP( oSides() ) do
  232.             if Perms[sSide] and oldP.getType( sSide ) == "modem" and not oldP.call( sSide, "isWireless" ) then
  233.                 if oldP.call( sSide, "isPresentRemote", _sSide ) and Perms[_sSide]  then
  234.                     return true
  235.                 end
  236.             end
  237.         end
  238.         return false
  239.     end
  240.  
  241.     function peripheral.getType( _sSide )
  242.         if oldP.isPresent( _sSide ) and Perms[_sSide] then
  243.             return oldP.getType( _sSide )
  244.         end
  245.         for n,sSide in oIP( oSides() ) do
  246.             if Perms[sSide] and oldP.getType( sSide ) == "modem" and not oldP.call( sSide, "isWireless" ) then
  247.                 if oldP.call( sSide, "isPresentRemote", _sSide ) and Perms[_sSide] then
  248.                     return oldP.call( sSide, "getTypeRemote", _sSide )
  249.                 end
  250.             end
  251.         end
  252.         return nil
  253.     end
  254.  
  255.     function peripheral.getMethods( _sSide )
  256.         if oldP.isPresent( _sSide ) and Perms[_sSide] then
  257.             return oldP.getMethods( _sSide )
  258.         end
  259.         for n,sSide in oIP( oSides() ) do
  260.             if Perms[sSide] and oldP.getType( sSide ) == "modem" and not oldP.call( sSide, "isWireless" ) then
  261.                 if Perms[_sSide] and oldP.call( sSide, "isPresentRemote", _sSide )  then
  262.                     return oldP.call( sSide, "getMethodsRemote", _sSide )
  263.                 end
  264.             end
  265.         end
  266.         return nil
  267.     end
  268.  
  269.     local newP={}
  270.     for k,v in pairs(peripheral) do
  271.         newP[k]=v
  272.     end
  273.  
  274.     function peripheral.wrap( _sSide )
  275.         if newP.isPresent( _sSide ) then
  276.             local tMethods = newP.getMethods( _sSide )
  277.             local tResult = {}
  278.             for n,sMethod in oIP( tMethods ) do
  279.                 tResult[sMethod] = function( ... )
  280.                     return newP.call( _sSide, sMethod, ... )
  281.                 end
  282.             end
  283.             return tResult
  284.         end
  285.         return nil
  286.     end
  287.  
  288.     --[[function peripheral.isPresent(side)
  289.         if not type(side)=="string" then err("Expected string",2) end
  290.         if not (side=="top" or side=="bottom" or side=="front" or side=="back" or side=="left" or side=="right" or oldP.isPresent(side)) then
  291.             err("Invalid side.",2)
  292.         end
  293.         if not (oldP.isPresent(side) and Perms[side]) then return false end
  294.         return oldP.isPresent(side)
  295.     end
  296.     --]]
  297.  
  298.     --[[function peripheral.getType(side)
  299.         if not type(side)=="string" then err("Expected string",2) end
  300.         if not (side=="top" or side=="bottom" or side=="front" or side=="back" or side=="left" or side=="right") then
  301.             err("Invalid side.",2)
  302.         end
  303.         if not (oldP.isPresent(side) and Perms[side]) then return nil end
  304.         return oldP.getType(side)
  305.     end
  306.     --]]
  307.  
  308.     --[[function peripheral.getMethods(side)
  309.         if not type(side)=="string" then err("Expected string",2) end
  310.         if not (side=="top" or side=="bottom" or side=="front" or side=="back" or side=="left" or side=="right") then
  311.             err("Invalid side.",2)
  312.         end
  313.         if not (oldP.isPresent(side) and Perms[side]) then return nil end
  314.         return oldP.getMethods(side)
  315.     end
  316.     --]]
  317.  
  318.     function fs.open(f,v)
  319.         f=returnResolved(f)
  320.         if f==nil then return nil end
  321.         if isAllowed() then return oFs.open(f,v) end
  322.         if v ~= ("r" or "rb" or nil) then
  323.             if check(f) then
  324.                 errorout()
  325.             end
  326.         end
  327.         return oFs.open(f,v)
  328.     end
  329.  
  330.     function fs.exists(f)
  331.         f=returnResolved(f)
  332.         if f==nil then return false end
  333.         return oFs.exists(f)
  334.     end
  335.  
  336.     function fs.isDir(f)
  337.         f=returnResolved(f)
  338.         if f==nil then return false end
  339.         return oFs.isDir(f)
  340.     end
  341.  
  342.     function fs.delete(f)
  343.         f=returnResolved(f)
  344.         if f==nil then err("Invalid Path",2) return nil end
  345.         if isAllowed() then return oFs.delete(f) end
  346.         if check(f) then
  347.             errorout()
  348.         end
  349.         return oFs.delete(f)
  350.     end
  351.  
  352.     function fs.copy(f,v)
  353.         f=returnResolved(f)
  354.         v=returnResolved(v)
  355.         if f==nil or v==nil then err("Invalid Path",2) end
  356.         if isAllowed() then return oFs.copy(f,v) end
  357.         if check(v) then
  358.             errorout()
  359.         end
  360.         return oFs.copy(f,v)
  361.     end
  362.  
  363.     function fs.move(f,v)
  364.         f=returnResolved(f)
  365.         v=returnResolved(v)
  366.         if f==nil or v==nil then err("Invalid Path",2) end
  367.         if isAllowed() then return oFs.move(f,v) end
  368.         if check(f) or check(v) then
  369.             errorout()
  370.         end
  371.         return oFs.move(f,v)
  372.     end
  373.  
  374.     function fs.isReadOnly(f)
  375.         f=returnResolved(f)
  376.         if f==nil then return false end
  377.         if check(f) then
  378.             return true
  379.         end
  380.         return oFs.isReadOnly(f)
  381.     end
  382.  
  383.  
  384.     function fs.list(rawDir)
  385.         dir=returnResolved(rawDir)
  386.         if dir==nil then err("Invalid Path",2) end
  387.         getDisks()
  388.         local res = oFs.list(dir)
  389.         if oCombine("", rawDir) == "" then
  390.             for i,v in bPair(Disks) do
  391.                 table.insert(res, v[3])
  392.             end
  393.         end
  394.         return res
  395.     end
  396.  
  397.     function fs.getName(file)
  398.         file=returnResolved(file)
  399.         if file==nil then err("Invalid Path",2) end
  400.         if file==sandboxed then return "root" end
  401.         return oFs.getName(file)
  402.     end
  403.  
  404.     function fs.makeDir(dir)
  405.         dir=returnResolved(dir)
  406.         if dir==nil then err("Invalid Path",2) end
  407.         return oFs.makeDir(dir)
  408.     end
  409.  
  410.     function fs.getSize(filepath)
  411.         filepath=returnResolved(filepath)
  412.         if filepath==nil then err("Invalid Path",2) end
  413.         return oFs.getSize(filepath)
  414.     end
  415.  
  416.     function fs.getDrive(filepath)
  417.         filepath=returnResolved(filepath)
  418.         if filepath==nil then err("Invalid Path",2) end
  419.         if check(filepath) then return "rom" end
  420.         return oFs.getDrive(filepath)
  421.     end
  422.  
  423.     --[[
  424.     function setfenv(func,...)
  425.         for k,v in bPair(protectedFuncs) do
  426.             if v==func then errorout() end
  427.         end
  428.         return oldsenv(func,...)
  429.     end
  430.  
  431.     function setmetatable(table,...)
  432.         if table==fs or table==_G then errorout() end
  433.         return oldmeta(table,...)
  434.     end
  435.  
  436.     function rawset(table,...)
  437.         if table==fs then errorout() end
  438.         return orset(table,...)
  439.     end
  440.     function os.reboot()
  441.         local writeReboot=oFs.open(".OSRunner/rebootPath","w")
  442.         writeReboot.write(sandboxed:sub(1,#sandboxed-1))
  443.         writeReboot.close()
  444.         oldReboot()
  445.     end
  446.     local protectedFuncs={setfenv,setmetatable,rawset,bPair}
  447.     for k,v in bPair(fs) do
  448.         table.insert(protectedFuncs,v)
  449.     end
  450.     ]]
  451. end
  452.  
  453. local function restore()
  454.     _G.fs={}
  455.     for k,v in bPair(oFs) do
  456.         _G.fs[k]=v
  457.     end
  458.     for k,v in bPair(oldP) do
  459.         _G.peripheral[k]=v
  460.     end
  461.     _G.setfenv=oldsenv
  462.     _G.os.reboot=oldReboot
  463.     _G.os.shutdown=oldShutdown
  464.     _G.setmetatable=oldmeta
  465.     _G.rawset=orset
  466. end
  467.  
  468. --Main program begins here...
  469.  
  470.  
  471. if not fs.isDir(dir) then local firstTime=true
  472.     fs.delete(dir) fs.makeDir(dir)
  473.     term.setBackgroundColor(colors.black)
  474.     term.setTextColor(colors.white)
  475.     clear()
  476.     local mx,my=term.getSize()
  477.     term.setCursorPos(1, math.floor(my/2))
  478.     centerPrint("Creating User's Virtual Environment")
  479.     centerPrint("Please wait...")
  480.     if printStuff then centerPrint("Creating OS Environment for directory "..dir..".") end
  481.  
  482.     md("rom")
  483.     md("rom/programs")
  484.     md("rom/programs/secret")
  485.     md("rom/apis")
  486.     md("rom/help")
  487.     cp("rom/startup")
  488.     for k,v in pairs(fs.list("rom/programs")) do
  489.         cp("rom/programs/"..v)
  490.     end
  491.     for k,v in pairs(fs.list("rom/apis")) do
  492.         cp("rom/apis/"..v)
  493.     end
  494.     for k,v in pairs(fs.list("rom/help")) do
  495.         cp("rom/help/"..v)
  496.     end
  497.     if fs.isDir(".System/DefaultUserFiles/") then
  498.         for k,v in pairs(fs.list("System/DefaultUserFiles")) do
  499.             cp(".System/DefaultUserFiles/"..v,dir..v)
  500.         end
  501.     end
  502.  
  503.     if urlinstaller then
  504.         local gI=http.get(urlinstaller)
  505.         local text=gI.readAll()
  506.         gI.close()
  507.         local wI=fs.open(dir..filepath,"w")
  508.         wI.write(text)
  509.         wI.close()
  510.     end
  511.  
  512.  
  513. else
  514.     print("Loading User Environment for user "..OS..".")
  515.  
  516. end
  517.  
  518. term.setBackgroundColor(colors.black)
  519. term.setTextColor(colors.white)
  520. term.clear()
  521. term.setCursorPos(1,1)
  522.  
  523.  
  524.  
  525. if printStuff then write("Running environment for User: \""..OS.."\" in 3")
  526.     for i=1,2 do
  527.         sleep(.33)
  528.         write(".")
  529.     end
  530.     sleep(0.33)
  531.     write("2")
  532.     for i=1,2 do
  533.         sleep(.33)
  534.         write(".")
  535.     end
  536.     sleep(0.33)
  537.     write("1")
  538.     for i=1,2 do
  539.         sleep(.33)
  540.         write(".")
  541.     end
  542.     sleep(0.33)
  543. end
  544.  
  545. sandbox(dir)
  546.  
  547. os.shutdown=function()
  548.     restore()
  549.     term.setTextColor(colors.white)
  550.     term.setBackgroundColor(colors.black)
  551.     term.clear()
  552.     local mx,my=term.getSize()
  553.     term.setCursorPos(1, math.floor(my/2))
  554.     centerPrint("Done loading user, rebooting...")
  555.     pcall(sleep,1.5)
  556.     oldReboot()
  557. end
  558.  
  559.  
  560. term.setBackgroundColor(colors.black)
  561. term.setTextColor(colors.white)
  562. term.clear()
  563. term.setCursorPos(1,1)
  564.  
  565. os.run({},"rom/programs/shell")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement