mirror of
				https://github.com/kepler155c/opus
				synced 2025-10-31 15:43:00 +00:00 
			
		
		
		
	pastebin rewrite
This commit is contained in:
		
							
								
								
									
										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 Event  = require('event') | ||||
| local pastebin = require('http.pastebin') | ||||
| local UI     = require('ui') | ||||
| local Util   = require('util') | ||||
|  | ||||
| @@ -7,7 +8,6 @@ local colors     = _G.colors | ||||
| local fs         = _G.fs | ||||
| local multishell = _ENV.multishell | ||||
| local os         = _G.os | ||||
| local pastebin   = _G.pastebin | ||||
| local shell      = _ENV.shell | ||||
|  | ||||
| local FILE    = 1 | ||||
| @@ -41,10 +41,10 @@ local Browser = UI.Page { | ||||
|     buttons = { | ||||
|       { text = '^-',   event = 'updir' }, | ||||
|       { text = 'File', dropdown = { | ||||
|           { text = 'Run',               event = 'run',   flags = FILE }, | ||||
|           { text = 'Edit         e',    event = 'edit',  flags = FILE }, | ||||
|           { text = 'Cloud edit   c',    event = 'cedit', flags = FILE }, | ||||
|           { text = 'Pastebin put p',    event = 'cedit', flags = FILE }, | ||||
|           { text = 'Run',               event = 'run',      flags = FILE }, | ||||
|           { text = 'Edit         e',    event = 'edit',     flags = FILE }, | ||||
|           { text = 'Cloud edit   c',    event = 'cedit',    flags = FILE }, | ||||
|           { text = 'Pastebin put p',    event = 'pastebin', flags = FILE }, | ||||
|           { text = 'Shell        s',    event = 'shell'  }, | ||||
|           { spacer = true }, | ||||
|           { text = 'Quit         q',    event = 'quit'   }, | ||||
| @@ -367,7 +367,7 @@ function Browser:eventHandler(event) | ||||
|       local s, m = pastebin.put(file.fullName) | ||||
|       if s then | ||||
|         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 | ||||
|         self.notification:error(m) | ||||
|       end | ||||
|   | ||||
| @@ -18,6 +18,8 @@ if not http then | ||||
|     return | ||||
| end | ||||
|  | ||||
| local pastebin = require('http.pastebin') | ||||
|  | ||||
| local sCommand = tArgs[1] | ||||
| if sCommand == "put" then | ||||
|     -- Upload a file to pastebin.com | ||||
| @@ -29,14 +31,16 @@ if sCommand == "put" then | ||||
|         return | ||||
|     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( "Run \"pastebin get "..msg.."\" to download anywhere" ) | ||||
|         print( "Run \"pastebin get "..resp.."\" to download anywhere" ) | ||||
|  | ||||
|     else | ||||
|         print( msg ) | ||||
|         printError( msg ) | ||||
|     end | ||||
|  | ||||
| elseif sCommand == "get" then | ||||
| @@ -46,30 +50,36 @@ elseif sCommand == "get" then | ||||
|         return | ||||
|     end | ||||
|  | ||||
|     print( "Connecting to pastebin.com... " ) | ||||
|  | ||||
|     -- Determine file to download | ||||
|     local sCode = tArgs[2] | ||||
|     local sFile = tArgs[3] | ||||
|     local sPath = shell.resolve( sFile ) | ||||
|     if fs.exists( sPath ) then | ||||
|         print( "File already exists" ) | ||||
|         printError( "File already exists" ) | ||||
|         return | ||||
|     end | ||||
|  | ||||
|     local success, msg = pastebin.get(sCode, sPath) | ||||
|     local resp, msg = pastebin.get(sCode, sPath) | ||||
|  | ||||
|     if success then | ||||
|         print( "Downloaded as "..sFile ) | ||||
|     if resp then | ||||
|         print( "Downloaded as "..resp ) | ||||
|     else | ||||
|         print(msg) | ||||
|         printError( msg ) | ||||
|     end | ||||
|  | ||||
| elseif sCommand == "run" then | ||||
|     local sCode = tArgs[2] | ||||
|  | ||||
|     local success, msg = pastebin.run(sCode, table.unpack(tArgs, 3)) | ||||
|     if not success then | ||||
|         print(msg) | ||||
|     print( "Connecting to pastebin.com... " ) | ||||
|  | ||||
|     local resp, msg = pastebin.run(sCode, table.unpack(tArgs, 3)) | ||||
|     if not resp then | ||||
|         printError( msg ) | ||||
|     end | ||||
| else | ||||
|  | ||||
|     printUsage() | ||||
|     return | ||||
| end | ||||
|   | ||||
| @@ -6,6 +6,7 @@ local Util     = require('util') | ||||
| local multishell = _ENV.multishell | ||||
| local os         = _G.os | ||||
| local read       = _G.read | ||||
| local shell      = _ENV.shell | ||||
| local term       = _G.term | ||||
|  | ||||
| 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/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') | ||||
|  | ||||
| -- baking this in before a PR to cc:tweaked | ||||
| os.loadAPI('sys/apis/pastebin.lua') | ||||
		Reference in New Issue
	
	Block a user
	 kepler155c@gmail.com
					kepler155c@gmail.com