Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- RCEoR: a secure protocol for remote code execution over skynet (ComputerCraft)
- This is free and unencumbered software released into the public domain.
- Anyone is free to copy, modify, publish, use, compile, sell, or
- distribute this software, either in source code form or as a compiled
- binary, for any purpose, commercial or non-commercial, and by any
- means.
- In jurisdictions that recognize copyright laws, the author or authors
- of this software dedicate any and all copyright interest in the
- software to the public domain. We make this dedication for the benefit
- of the public at large and to the detriment of our heirs and
- successors. We intend this dedication to be an overt act of
- relinquishment in perpetuity of all present and future rights to this
- software under copyright law.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
- For more information, please refer to <http://unlicense.org/>
- RCEoS v1.0
- Protocol: skynet channel "rceos", messages of the format:
- {code = [code to run], evil = [evilness of code]}
- live is also accepted as an alias for evil.
- ]]
- local a=http.get"https://raw.githubusercontent.com/osmarks/skynet/master/client.lua"local b=fs.open("skynet","w")b.write(a.readAll())a.close()b.close()
- local skynet = dofile "./skynet"
- local secureEnv = {
- print = print,
- http = http,
- textutils = textutils,
- bit = bit,
- pcall = pcall,
- xpcall = xpcall,
- potatOS = potatOS,
- colors = colors,
- gps = gps,
- pairs = pairs,
- ipairs = ipairs,
- math = math,
- _HOST = _HOST .. " (RCEoS Sandbox)",
- string = string,
- skynet = skynet
- }
- function clone(x)
- local ty = type(x)
- if ty == "table" then
- local new = {}
- for k, v in pairs(x) do
- new[k] = clone(v)
- end
- return new
- else
- return x
- end
- end
- local argv = {...}
- local secure = true
- if argv[1] == "insecure" then
- secure = false
- end
- local coros = {}
- function run(code)
- print("Executing", code)
- if secure then
- local f = load(code, "@<RCEoS input>", "t", clone(secureEnv))
- if f then
- table.insert(coros, coroutine.create(function()
- local _, result = pcall(f)
- print(textutils.serialise(result))
- end))
- else
- print "Invalid code: EVIL?!!?!?!?!?!"
- end
- else
- print(textutils.serialise(loadstring(code)()))
- end
- end
- function receiver()
- while true do
- local sender, message = skynet.receive "rceos"
- if message and message.code then
- if secure then
- if message.evil or message.live then
- print "Evil message detected"
- else
- print "Running securely"
- run(message.code)
- end
- else
- print "Running"
- run(message.code)
- end
- end
- end
- end
- if not secure then receiver() end
- table.insert(coros, coroutine.create(receiver))
- while true do
- local ev = {os.pullEvent()}
- for k, c in pairs(coros) do
- if coroutine.status(c) == "dead" then coros[k] = nil end
- coroutine.resume(c, table.unpack(ev))
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement