mirror of
https://github.com/kepler155c/opus
synced 2025-01-05 21:30:28 +00:00
pastebin rewrite
This commit is contained in:
parent
c633e935f8
commit
f011e7b14f
150
sys/apis/http/pastebin.lua
Normal file
150
sys/apis/http/pastebin.lua
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
|
||||||
|
--- Attempts to guess the pastebin ID from the given code or URL
|
||||||
|
local function extractId(paste)
|
||||||
|
local patterns = {
|
||||||
|
"^([%a%d]+)$",
|
||||||
|
"^https?://pastebin.com/([%a%d]+)$",
|
||||||
|
"^pastebin.com/([%a%d]+)$",
|
||||||
|
"^https?://pastebin.com/raw/([%a%d]+)$",
|
||||||
|
"^pastebin.com/raw/([%a%d]+)$",
|
||||||
|
}
|
||||||
|
|
||||||
|
for i = 1, #patterns do
|
||||||
|
local code = paste:match( patterns[i] )
|
||||||
|
if code then return code end
|
||||||
|
end
|
||||||
|
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
function download(url)
|
||||||
|
if type( url ) ~= "string" then
|
||||||
|
error( "bad argument #1 (expected string, got " .. type( url ) .. ")", 2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
if not http then
|
||||||
|
return false, "Pastebin requires http API"
|
||||||
|
end
|
||||||
|
|
||||||
|
local paste = extractId( url )
|
||||||
|
if not paste then
|
||||||
|
return false, "Invalid pastebin code. The code is the ID at the end of the pastebin.com URL."
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Add a cache buster so that spam protection is re-checked
|
||||||
|
local cacheBuster = ("%x"):format(math.random(0, 2^30))
|
||||||
|
local response, err = http.get(
|
||||||
|
"https://pastebin.com/raw/"..textutils.urlEncode( paste ).."?cb="..cacheBuster
|
||||||
|
)
|
||||||
|
|
||||||
|
if not response then
|
||||||
|
return response, err
|
||||||
|
end
|
||||||
|
|
||||||
|
-- If spam protection is activated, we get redirected to /paste with Content-Type: text/html
|
||||||
|
local headers = response.getResponseHeaders()
|
||||||
|
if not headers["Content-Type"] or not headers["Content-Type"]:find( "^text/plain" ) then
|
||||||
|
return false, "Pastebin blocked the download due to spam protection. Please complete the captcha in a web browser: https://pastebin.com/" .. textutils.urlEncode( paste )
|
||||||
|
end
|
||||||
|
|
||||||
|
local sResponse = response.readAll()
|
||||||
|
response.close()
|
||||||
|
return sResponse
|
||||||
|
end
|
||||||
|
|
||||||
|
local function put(sPath)
|
||||||
|
if type( sPath ) ~= "string" then
|
||||||
|
error( "bad argument #1 (expected string, got " .. type( sPath ) .. ")", 2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
if not http then
|
||||||
|
return false, "Pastebin requires http API"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Upload a file to pastebin.com
|
||||||
|
-- Determine file to upload
|
||||||
|
if not fs.exists( sPath ) or fs.isDir( sPath ) then
|
||||||
|
return false, "No such file"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Read in the file
|
||||||
|
local sName = fs.getName( sPath )
|
||||||
|
local file = fs.open( sPath, "r" )
|
||||||
|
local sText = file.readAll()
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
-- POST the contents to pastebin
|
||||||
|
local key = "0ec2eb25b6166c0c27a394ae118ad829"
|
||||||
|
local response = http.post(
|
||||||
|
"https://pastebin.com/api/api_post.php",
|
||||||
|
"api_option=paste&"..
|
||||||
|
"api_dev_key="..key.."&"..
|
||||||
|
"api_paste_format=lua&"..
|
||||||
|
"api_paste_name="..textutils.urlEncode(sName).."&"..
|
||||||
|
"api_paste_code="..textutils.urlEncode(sText)
|
||||||
|
)
|
||||||
|
|
||||||
|
if response then
|
||||||
|
local sResponse = response.readAll()
|
||||||
|
response.close()
|
||||||
|
|
||||||
|
return string.match( sResponse, "[^/]+$" )
|
||||||
|
end
|
||||||
|
return false, "Failed."
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get(sCode, sPath)
|
||||||
|
if type( sCode ) ~= "string" then
|
||||||
|
error( "bad argument #1 (expected string, got " .. type( sCode ) .. ")", 2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
if type( sPath ) ~= "string" then
|
||||||
|
error( "bad argument #2 (expected string, got " .. type( sPath ) .. ")", 2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
if not http then
|
||||||
|
return false, "Pastebin requires http API"
|
||||||
|
end
|
||||||
|
|
||||||
|
if fs.exists( sPath ) then
|
||||||
|
return false, "File already exists"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- GET the contents from pastebin
|
||||||
|
local res, msg = download(sCode)
|
||||||
|
if not res then
|
||||||
|
return res, msg
|
||||||
|
end
|
||||||
|
|
||||||
|
local file = fs.open( sPath, "w" )
|
||||||
|
file.write( res )
|
||||||
|
file.close()
|
||||||
|
|
||||||
|
return sPath
|
||||||
|
end
|
||||||
|
|
||||||
|
local function run(sCode, ...)
|
||||||
|
if not http then
|
||||||
|
return false, "Pastebin requires http API"
|
||||||
|
end
|
||||||
|
|
||||||
|
if type( sCode ) ~= "string" then
|
||||||
|
error( "bad argument #1 (expected string, got " .. type( sCode ) .. ")", 2 )
|
||||||
|
end
|
||||||
|
|
||||||
|
local res, msg = download(sCode)
|
||||||
|
if not res then
|
||||||
|
return res, msg
|
||||||
|
end
|
||||||
|
local func, err = load(res, sCode, "t", _ENV)
|
||||||
|
if not func then
|
||||||
|
return func, err
|
||||||
|
end
|
||||||
|
return pcall(func, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
get = get,
|
||||||
|
put = put,
|
||||||
|
run = run,
|
||||||
|
}
|
@ -1,146 +0,0 @@
|
|||||||
|
|
||||||
--- Attempts to guess the pastebin ID from the given code or URL
|
|
||||||
local function extractId(paste)
|
|
||||||
local patterns = {
|
|
||||||
"^([%a%d]+)$",
|
|
||||||
"^https?://pastebin.com/([%a%d]+)$",
|
|
||||||
"^pastebin.com/([%a%d]+)$",
|
|
||||||
"^https?://pastebin.com/raw/([%a%d]+)$",
|
|
||||||
"^pastebin.com/raw/([%a%d]+)$",
|
|
||||||
}
|
|
||||||
|
|
||||||
for i = 1, #patterns do
|
|
||||||
local code = paste:match( patterns[i] )
|
|
||||||
if code then return code end
|
|
||||||
end
|
|
||||||
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
function download(url)
|
|
||||||
if not http then
|
|
||||||
return false, "Pastebin requires http API"
|
|
||||||
end
|
|
||||||
|
|
||||||
if type( url ) ~= "string" then
|
|
||||||
error( "bad argument #1 (expected string, got " .. type( url ) .. ")", 2 )
|
|
||||||
end
|
|
||||||
|
|
||||||
local paste = extractId( url )
|
|
||||||
if not paste then
|
|
||||||
return false, "Invalid pastebin code."
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Add a cache buster so that spam protection is re-checked
|
|
||||||
local cacheBuster = ("%x"):format(math.random(0, 2^30))
|
|
||||||
local response, err = http.get(
|
|
||||||
"https://pastebin.com/raw/"..textutils.urlEncode( paste ).."?cb="..cacheBuster
|
|
||||||
)
|
|
||||||
|
|
||||||
if response then
|
|
||||||
-- If spam protection is activated, we get redirected to /paste with Content-Type: text/html
|
|
||||||
local headers = response.getResponseHeaders()
|
|
||||||
if not headers["Content-Type"] or not headers["Content-Type"]:find( "^text/plain" ) then
|
|
||||||
return false, "Pastebin blocked the download due to spam protection. Please complete the captcha in a web browser: https://pastebin.com/" .. textutils.urlEncode( paste )
|
|
||||||
end
|
|
||||||
|
|
||||||
local sResponse = response.readAll()
|
|
||||||
response.close()
|
|
||||||
return true, sResponse
|
|
||||||
end
|
|
||||||
|
|
||||||
return false, err
|
|
||||||
end
|
|
||||||
|
|
||||||
function put(sPath)
|
|
||||||
if not http then
|
|
||||||
return false, "Pastebin requires http API"
|
|
||||||
end
|
|
||||||
|
|
||||||
if type( sPath ) ~= "string" then
|
|
||||||
error( "bad argument #1 (expected string, got " .. type( sPath ) .. ")", 2 )
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Upload a file to pastebin.com
|
|
||||||
-- Determine file to upload
|
|
||||||
if not fs.exists( sPath ) or fs.isDir( sPath ) then
|
|
||||||
return false, "No such file"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Read in the file
|
|
||||||
local sName = fs.getName( sPath )
|
|
||||||
local file = fs.open( sPath, "r" )
|
|
||||||
local sText = file.readAll()
|
|
||||||
file.close()
|
|
||||||
|
|
||||||
-- POST the contents to pastebin
|
|
||||||
local key = "0ec2eb25b6166c0c27a394ae118ad829"
|
|
||||||
local response = http.post(
|
|
||||||
"https://pastebin.com/api/api_post.php",
|
|
||||||
"api_option=paste&"..
|
|
||||||
"api_dev_key="..key.."&"..
|
|
||||||
"api_paste_format=lua&"..
|
|
||||||
"api_paste_name="..textutils.urlEncode(sName).."&"..
|
|
||||||
"api_paste_code="..textutils.urlEncode(sText)
|
|
||||||
)
|
|
||||||
|
|
||||||
if response then
|
|
||||||
local sResponse = response.readAll()
|
|
||||||
response.close()
|
|
||||||
|
|
||||||
local sCode = string.match( sResponse, "[^/]+$" )
|
|
||||||
|
|
||||||
return true, sCode
|
|
||||||
end
|
|
||||||
return false, "Failed."
|
|
||||||
end
|
|
||||||
|
|
||||||
function get(sCode, sPath)
|
|
||||||
if not http then
|
|
||||||
return false, "Pastebin requires http API"
|
|
||||||
end
|
|
||||||
|
|
||||||
if type( sCode ) ~= "string" then
|
|
||||||
error( "bad argument #1 (expected string, got " .. type( sCode ) .. ")", 2 )
|
|
||||||
end
|
|
||||||
|
|
||||||
if type( sPath ) ~= "string" then
|
|
||||||
error( "bad argument #2 (expected string, got " .. type( sPath ) .. ")", 2 )
|
|
||||||
end
|
|
||||||
|
|
||||||
if fs.exists( sPath ) then
|
|
||||||
return false, "File already exists"
|
|
||||||
end
|
|
||||||
|
|
||||||
-- GET the contents from pastebin
|
|
||||||
local res, msg = download(sCode)
|
|
||||||
if not res then
|
|
||||||
return res, msg
|
|
||||||
end
|
|
||||||
|
|
||||||
local file = fs.open( sPath, "w" )
|
|
||||||
file.write( msg )
|
|
||||||
file.close()
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
function run(sCode, ...)
|
|
||||||
if not http then
|
|
||||||
return false, "Pastebin requires http API"
|
|
||||||
end
|
|
||||||
|
|
||||||
if type( sCode ) ~= "string" then
|
|
||||||
error( "bad argument #1 (expected string, got " .. type( sCode ) .. ")", 2 )
|
|
||||||
end
|
|
||||||
|
|
||||||
local res, msg = download(sCode)
|
|
||||||
if not res then
|
|
||||||
return res, msg
|
|
||||||
end
|
|
||||||
local func, err = load(msg, sCode, "t", _ENV)
|
|
||||||
if not func then
|
|
||||||
return func, err
|
|
||||||
end
|
|
||||||
return pcall(func, ...)
|
|
||||||
end
|
|
@ -1,5 +1,6 @@
|
|||||||
local Config = require('config')
|
local Config = require('config')
|
||||||
local Event = require('event')
|
local Event = require('event')
|
||||||
|
local pastebin = require('http.pastebin')
|
||||||
local UI = require('ui')
|
local UI = require('ui')
|
||||||
local Util = require('util')
|
local Util = require('util')
|
||||||
|
|
||||||
@ -7,7 +8,6 @@ local colors = _G.colors
|
|||||||
local fs = _G.fs
|
local fs = _G.fs
|
||||||
local multishell = _ENV.multishell
|
local multishell = _ENV.multishell
|
||||||
local os = _G.os
|
local os = _G.os
|
||||||
local pastebin = _G.pastebin
|
|
||||||
local shell = _ENV.shell
|
local shell = _ENV.shell
|
||||||
|
|
||||||
local FILE = 1
|
local FILE = 1
|
||||||
@ -44,7 +44,7 @@ local Browser = UI.Page {
|
|||||||
{ text = 'Run', event = 'run', flags = FILE },
|
{ text = 'Run', event = 'run', flags = FILE },
|
||||||
{ text = 'Edit e', event = 'edit', flags = FILE },
|
{ text = 'Edit e', event = 'edit', flags = FILE },
|
||||||
{ text = 'Cloud edit c', event = 'cedit', flags = FILE },
|
{ text = 'Cloud edit c', event = 'cedit', flags = FILE },
|
||||||
{ text = 'Pastebin put p', event = 'cedit', flags = FILE },
|
{ text = 'Pastebin put p', event = 'pastebin', flags = FILE },
|
||||||
{ text = 'Shell s', event = 'shell' },
|
{ text = 'Shell s', event = 'shell' },
|
||||||
{ spacer = true },
|
{ spacer = true },
|
||||||
{ text = 'Quit q', event = 'quit' },
|
{ text = 'Quit q', event = 'quit' },
|
||||||
@ -367,7 +367,7 @@ function Browser:eventHandler(event)
|
|||||||
local s, m = pastebin.put(file.fullName)
|
local s, m = pastebin.put(file.fullName)
|
||||||
if s then
|
if s then
|
||||||
os.queueEvent('clipboard_copy', s)
|
os.queueEvent('clipboard_copy', s)
|
||||||
self.notification:success(string.format('Uploaded as %s', m), 0)
|
self.notification:success(string.format('Uploaded as %s', s), 0)
|
||||||
else
|
else
|
||||||
self.notification:error(m)
|
self.notification:error(m)
|
||||||
end
|
end
|
||||||
|
@ -18,6 +18,8 @@ if not http then
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local pastebin = require('http.pastebin')
|
||||||
|
|
||||||
local sCommand = tArgs[1]
|
local sCommand = tArgs[1]
|
||||||
if sCommand == "put" then
|
if sCommand == "put" then
|
||||||
-- Upload a file to pastebin.com
|
-- Upload a file to pastebin.com
|
||||||
@ -29,14 +31,16 @@ if sCommand == "put" then
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local success, msg = pastebin.put(sFile)
|
print( "Connecting to pastebin.com... " )
|
||||||
|
|
||||||
if success then
|
local resp, msg = pastebin.put(sFile)
|
||||||
|
|
||||||
|
if resp then
|
||||||
print( "Uploaded as "..msg )
|
print( "Uploaded as "..msg )
|
||||||
print( "Run \"pastebin get "..msg.."\" to download anywhere" )
|
print( "Run \"pastebin get "..resp.."\" to download anywhere" )
|
||||||
|
|
||||||
else
|
else
|
||||||
print( msg )
|
printError( msg )
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif sCommand == "get" then
|
elseif sCommand == "get" then
|
||||||
@ -46,30 +50,36 @@ elseif sCommand == "get" then
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
print( "Connecting to pastebin.com... " )
|
||||||
|
|
||||||
-- Determine file to download
|
-- Determine file to download
|
||||||
local sCode = tArgs[2]
|
local sCode = tArgs[2]
|
||||||
local sFile = tArgs[3]
|
local sFile = tArgs[3]
|
||||||
local sPath = shell.resolve( sFile )
|
local sPath = shell.resolve( sFile )
|
||||||
if fs.exists( sPath ) then
|
if fs.exists( sPath ) then
|
||||||
print( "File already exists" )
|
printError( "File already exists" )
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local success, msg = pastebin.get(sCode, sPath)
|
local resp, msg = pastebin.get(sCode, sPath)
|
||||||
|
|
||||||
if success then
|
if resp then
|
||||||
print( "Downloaded as "..sFile )
|
print( "Downloaded as "..resp )
|
||||||
else
|
else
|
||||||
print(msg)
|
printError( msg )
|
||||||
end
|
end
|
||||||
|
|
||||||
elseif sCommand == "run" then
|
elseif sCommand == "run" then
|
||||||
local sCode = tArgs[2]
|
local sCode = tArgs[2]
|
||||||
|
|
||||||
local success, msg = pastebin.run(sCode, table.unpack(tArgs, 3))
|
print( "Connecting to pastebin.com... " )
|
||||||
if not success then
|
|
||||||
print(msg)
|
local resp, msg = pastebin.run(sCode, table.unpack(tArgs, 3))
|
||||||
|
if not resp then
|
||||||
|
printError( msg )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
|
||||||
printUsage()
|
printUsage()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -6,6 +6,7 @@ local Util = require('util')
|
|||||||
local multishell = _ENV.multishell
|
local multishell = _ENV.multishell
|
||||||
local os = _G.os
|
local os = _G.os
|
||||||
local read = _G.read
|
local read = _G.read
|
||||||
|
local shell = _ENV.shell
|
||||||
local term = _G.term
|
local term = _G.term
|
||||||
|
|
||||||
local args = { ... }
|
local args = { ... }
|
||||||
|
@ -2,6 +2,3 @@ fs.mount('sys/apps/pain.lua', 'urlfs', 'http://pastebin.com/raw/wJQ7jav0')
|
|||||||
fs.mount('sys/apps/update.lua', 'urlfs', 'http://pastebin.com/raw/UzGHLbNC')
|
fs.mount('sys/apps/update.lua', 'urlfs', 'http://pastebin.com/raw/UzGHLbNC')
|
||||||
fs.mount('sys/apps/Enchat.lua', 'urlfs', 'https://raw.githubusercontent.com/LDDestroier/enchat/master/enchat3.lua')
|
fs.mount('sys/apps/Enchat.lua', 'urlfs', 'https://raw.githubusercontent.com/LDDestroier/enchat/master/enchat3.lua')
|
||||||
fs.mount('sys/apps/cloud.lua', 'urlfs', 'https://cloud-catcher.squiddev.cc/cloud.lua')
|
fs.mount('sys/apps/cloud.lua', 'urlfs', 'https://cloud-catcher.squiddev.cc/cloud.lua')
|
||||||
|
|
||||||
-- baking this in before a PR to cc:tweaked
|
|
||||||
os.loadAPI('sys/apis/pastebin.lua')
|
|
Loading…
Reference in New Issue
Block a user