Advertisement
Pirnogion

PastebinEx.py

Jul 27th, 2015
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 14.34 KB | None | 0 0
  1. from HTMLParser import HTMLParser
  2.  
  3. import urllib
  4. from urllib2 import Request, build_opener, HTTPCookieProcessor, HTTPHandler
  5. import urllib2
  6. import cookielib
  7. import json
  8. import re
  9. import os.path
  10.  
  11. import sublime, sublime_plugin
  12.  
  13. def plugin_loaded():
  14.     sublime.message_dialog("LOADED")
  15.  
  16. #------------------------------------------------------------
  17. #Pastebin
  18. #------------------------------------------------------------
  19. class ERROR():
  20.     ERROR_CODES_LOGIN_API = {
  21.         'Bad API request, use POST request, not GET'                            :1,
  22.         'Bad API request, invalid api_dev_key'                                  :2,
  23.         'Bad API request, invalid login'                                        :3,
  24.         'Bad API request, account not active'                                   :4,
  25.         'Bad API request, invalid POST parameters'                              :5,
  26.         'Bad API request, too many logins in 5 minutes. Blocked for 5 minutes.' :6
  27.     }
  28.  
  29.     ERROR_CODES_CREATE_PASTE = {
  30.         'Bad API request, invalid api_option'                                           :1,
  31.         'Bad API request, invalid api_dev_key'                                          :2,
  32.         'Bad API request, IP blocked'                                                   :3,
  33.         'Bad API request, maximum number of 25 unlisted pastes for your free account'   :4,
  34.         'Bad API request, maximum number of 10 private pastes for your free account'    :5,
  35.         'Bad API request, api_paste_code was empty'                                     :6,
  36.         'Bad API request, maximum paste file size exceeded'                             :7,
  37.         'Bad API request, invalid api_expire_date'                                      :8,
  38.         'Bad API request, invalid api_paste_private'                                    :9,
  39.         'Bad API request, invalid api_paste_format'                                     :10
  40.     }
  41.  
  42.     ERROR_CODES_DELETE_PASTE = {
  43.         'Bad API request, invalid api_option'                   :1,
  44.         'Bad API request, invalid api_dev_key'                  :2,
  45.         'Bad API request, invalid api_user_key'                 :3,
  46.         'Bad API request, invalid permission to remove paste'   :4
  47.     }
  48.  
  49.     ERROR_CODES_LOGIN = {
  50.         'ERR': 1
  51.     }
  52.  
  53.     ERROR_CODES_MODIFY_PASTE = {
  54.         'ERR' :1
  55.     }
  56.  
  57.     ERROR_CODES_GET_PASTE = {
  58.         'ERR' :1
  59.     }
  60.  
  61.     UNEXPECTED_ERROR = 0
  62.  
  63. class PastebinShell():
  64.     #User info
  65.     post_key = None
  66.  
  67.     #Login with use pastebin API
  68.     dev_key = 'e98db6da803203282d172156bc46137c'
  69.  
  70.     #Pastebin urls
  71.     pastebin_api = "http://pastebin.com/api/api_post.php"
  72.     pastebin_api_login = "http://pastebin.com/api/api_login.php"
  73.  
  74.     pastebin_login = "http://pastebin.com/login.php"
  75.     pastebin_post = "http://pastebin.com/post.php"
  76.     pastebin_edit = "http://pastebin.com/edit.php"
  77.     pastebin_get = "http://pastebin.com/raw.php"
  78.  
  79.     def login(self, username, password):
  80.         cookiejar = cookielib.CookieJar()
  81.         opener = build_opener(HTTPCookieProcessor(cookiejar), HTTPHandler())
  82.  
  83.         login_value = {'submit_hidden':'submit_hidden', 'user_name':username, 'user_password':password, 'submit':'Login'}
  84.         try:
  85.             login_data = urllib.urlencode(login_value)
  86.             login_request = Request(self.pastebin_login, login_data)
  87.             login_response = opener.open(login_request)
  88.         except Exception, e:
  89.             return ERROR.UNEXPECTED_ERROR, e
  90.         else:
  91.             #Get session cookie
  92.             session_cookie = ''
  93.             for cookie in cookiejar:
  94.                 session_cookie = session_cookie + cookie.name + '=' + cookie.value + '; '
  95.  
  96.             return None, session_cookie
  97.         finally:
  98.             login_response.close()
  99.  
  100.     def modify_paste(self, paste_id, header, text, cookie):
  101.         #Send request for get post key
  102.         try:
  103.             pk_req = urllib2.Request(self.pastebin_edit + "?i=" + paste_id)
  104.             pk_req.add_header('Cookie', cookie)
  105.             pk_response = urllib2.urlopen(pk_req)
  106.             pk_html = pk_response.read()
  107.         except Exception, e:
  108.             return ERROR.UNEXPECTED_ERROR, e
  109.         else:
  110.             #Parse HTML response and get postkey
  111.             parser = getPostKey()
  112.             parser.feed(pk_html)
  113.             self.post_key = parser.pk
  114.  
  115.             #Modify paste
  116.             edit_value = {'submit_hidden':'submit_hidden', 'item_key':paste_id, 'post_key':self.post_key, 'paste_code':text, 'paste_format':'30', 'paste_expire_date':'DNC', 'paste_private':'0', 'paste_name':header, 'submit':'Submit'}
  117.             try:
  118.                 edit_data = urllib.urlencode(edit_value).encode('utf8')
  119.                 edit_req = urllib2.Request(self.pastebin_edit, edit_data)
  120.                 edit_req.add_header('Cookie', cookie)
  121.                 edit_response = urllib2.urlopen(edit_req)
  122.             except Exception, e:
  123.                 return ERROR.UNEXPECTED_ERROR, e
  124.             else:
  125.                 return None, True
  126.             finally:
  127.                 edit_response.close()
  128.         finally:
  129.             pk_response.close()
  130.  
  131.     def login_api(self, username, password):
  132.         #Get userkey
  133.         login_api_value = {'api_dev_key':self.dev_key, 'api_user_name':username, 'api_user_password':password}
  134.         try:
  135.             login_api_data = urllib.urlencode(login_api_value)
  136.             login_api_req = urllib2.Request(self.pastebin_api_login, login_api_data)
  137.             login_api_response = urllib2.urlopen(login_api_req)
  138.             login_html = login_api_response.read();
  139.         except Exception, e:
  140.             return ERROR.UNEXPECTED_ERROR, e
  141.         else:
  142.             return ERROR.ERROR_CODES_LOGIN_API.get(login_html, None), login_html
  143.         finally:
  144.             login_api_response.close()
  145.  
  146.     def create_paste(self, header, text, user_key):
  147.         cpaste_value = {'api_option':'paste', 'api_dev_key':self.dev_key, 'api_user_key':user_key, 'api_paste_private':'0', 'api_paste_format':'lua', 'api_paste_name':header, 'api_paste_code':text}
  148.         try:
  149.             cpaste_data = urllib.urlencode(cpaste_value)
  150.             cpaste_req = urllib2.Request(self.pastebin_api, cpaste_data)
  151.             cpaste_response = urllib2.urlopen(cpaste_req)
  152.             cpaste_html = cpaste_response.read()
  153.         except Exception, e:
  154.             return ERROR.UNEXPECTED_ERROR, e
  155.         else:
  156.             return ERROR.ERROR_CODES_CREATE_PASTE.get(cpaste_html, None), cpaste_html
  157.         finally:
  158.             cpaste_response.close()
  159.  
  160.     def delete_paste(self, paste_id, user_key):
  161.         dpaste_value = {'api_option':'delete', 'api_dev_key':self.dev_key, 'api_user_key':user_key, 'api_paste_key':paste_id}
  162.         try:
  163.             dpaste_data = urllib.urlencode(dpaste_value)
  164.             dpaste_req = urllib2.Request(self.pastebin_api, dpaste_data)
  165.             dpaste_response = urllib2.urlopen(dpaste_req)
  166.             dpaste_html = dpaste_response.read()
  167.         except Exception, e:
  168.             return ERROR.UNEXPECTED_ERROR, e
  169.         else:
  170.             return ERROR.ERROR_CODES_DELETE_PASTE.get(dpaste_html, None), dpaste_html
  171.         finally:
  172.             dpaste_response.close()
  173.  
  174.     def get_paste(self, paste_id):
  175.         try:
  176.             gpaste_req = urllib2.Request(self.pastebin_get + "?i=" + paste_id)
  177.             gpaste_response = urllib2.urlopen(gpaste_req)
  178.             gpaste_html = gpaste_response.read()
  179.         except Exception, e:
  180.             return ERROR.UNEXPECTED_ERROR, e
  181.         else:
  182.             return ERROR.ERROR_CODES_GET_PASTE.get(gpaste_html, None), gpaste_html
  183.         finally:
  184.             gpaste_response.close()
  185.  
  186.     #def list():
  187.         #nop
  188. #------------------------------------------------------------
  189. class getPostKey(HTMLParser):
  190.     def __init__(self):
  191.         HTMLParser.__init__(self)
  192.         self.isPostKey = False
  193.         self.pk = None
  194.     def handle_starttag(self, tag, attrs):
  195.         if tag == 'input':
  196.             for name, value in attrs:
  197.                 if value == 'post_key':
  198.                     self.isPostKey = True
  199.                     continue
  200.                 if name == 'value' and self.isPostKey == True:
  201.                     self.isPostKey = False
  202.                     self.pk = value
  203.                     break
  204.  
  205. #------------------------------------------------------------
  206. #Utils
  207. #------------------------------------------------------------
  208. class VisibleManager():
  209.     LoginVisible        = True
  210.     LogoutVisible       = False
  211.     CreatePasteVisible  = False
  212.     ModifyPasteVisible  = False
  213.     DeletePasteVisible  = False
  214.  
  215.     GetPasteVisible     = True
  216.  
  217.     def ToggleVisibleLoginLogout(self):
  218.         visibleManager.LoginVisible = not visibleManager.LoginVisible
  219.         visibleManager.LogoutVisible = not visibleManager.LogoutVisible
  220.  
  221.         visibleManager.CreatePasteVisible = not visibleManager.CreatePasteVisible
  222.         visibleManager.ModifyPasteVisible = not visibleManager.ModifyPasteVisible
  223.         visibleManager.DeletePasteVisible = not visibleManager.DeletePasteVisible
  224.         #visibleManager.GetPasteVisible = not visibleManager.GetPasteVisible
  225.  
  226. #------------------------------------------------------------
  227. #EventHandler
  228. #------------------------------------------------------------
  229. #class EventHandlerCommand(sublime_plugin.EventListener):
  230. #   def
  231.  
  232. #------------------------------------------------------------
  233. #Commands handlers
  234. #------------------------------------------------------------
  235. pastebin = PastebinShell()
  236. session_settings_base = "Session.sublime-settings"
  237. visibleManager = VisibleManager()
  238. prev_pasteid = ''
  239.  
  240. fileName = os.path.basename( sublime.active_window().active_view().file_name() )
  241.  
  242. class LoginCommand(sublime_plugin.TextCommand):
  243.     username = None
  244.     password = None
  245.  
  246.     def run(self, edit):
  247.         session_settings = sublime.load_settings(session_settings_base)
  248.  
  249.         if not session_settings.get('loggedin', False):
  250.             self.view.window().show_input_panel('Input your username: ', '', self.InputUsernameHandler, None, None)
  251.         else:
  252.             visibleManager.ToggleVisibleLoginLogout()
  253.  
  254.     def InputUsernameHandler(self, onEvent):
  255.         if len(onEvent) > 1:
  256.             self.username = onEvent
  257.             self.view.window().show_input_panel('Input your password: ', '', self.InputPasswordHandler, None, None)
  258.         else:
  259.             sublime.error_message("Please, enter minimum 1 symbol!")
  260.  
  261.     def InputPasswordHandler(self, onEvent):
  262.         if len(onEvent) > 1:
  263.             self.password = onEvent
  264.             self.Login()
  265.         else:
  266.             sublime.error_message("Please, enter minimum 1 symbol!")
  267.  
  268.     def Login(self):
  269.         session_settings = sublime.load_settings(session_settings_base)
  270.  
  271.         errcode, response = pastebin.login(self.username, self.password)
  272.         if errcode == ERROR.UNEXPECTED_ERROR or not(errcode is None):
  273.             sublime.error_message("Unexpected error.")
  274.         else:
  275.             cookie = response
  276.             session_settings.set('cookie', cookie)
  277.             session_settings.set('loggedin_browser', True)
  278.  
  279.         errcode, response = pastebin.login_api(self.username, self.password)
  280.         if errcode == 6:
  281.             sublime.error_message("Spam protection: login in 5 minutes.")
  282.         elif errcode == 3:
  283.             sublime.error_message("Invalid username or password.")
  284.         elif errcode == ERROR.UNEXPECTED_ERROR or not(errcode is None):
  285.             sublime.error_message("Unexpected error.")
  286.         else:
  287.             user_key = response
  288.             session_settings.set('user_key', user_key)
  289.             session_settings.set('loggedin_api', True)
  290.  
  291.         if session_settings.get('loggedin_browser', False) and session_settings.get('loggedin_api', False):
  292.             session_settings.set('loggedin', True)
  293.             visibleManager.ToggleVisibleLoginLogout()
  294.  
  295.             sublime.message_dialog('Logged in!')
  296.         else:
  297.             session_settings.set('loggedin_browser', False)
  298.             session_settings.set('loggedin_api', False)
  299.             session_settings.set('loggedin', False)
  300.  
  301.             sublime.error_message('Login failed!')
  302.  
  303.         sublime.save_settings(session_settings_base)
  304.  
  305.     def is_visible(self):
  306.         return visibleManager.LoginVisible
  307.  
  308. class LogoutCommand(sublime_plugin.TextCommand):
  309.     def run(self, edit):
  310.         session_settings = sublime.load_settings(session_settings_base)
  311.         session_settings.set('cookie', None)
  312.         session_settings.set('user_key', None)
  313.         session_settings.set('loggedin', False)
  314.         sublime.save_settings(session_settings_base)
  315.  
  316.         visibleManager.ToggleVisibleLoginLogout()
  317.  
  318.     def is_visible(self):
  319.         return visibleManager.LogoutVisible
  320.  
  321. class CreatePasteCommand(sublime_plugin.TextCommand):
  322.     def run(self, edit):
  323.         userkey = sublime.load_settings(session_settings_base).get('user_key', None)
  324.         if userkey is None:
  325.             sublime.error_message("Wrong session! Relogin, please.")
  326.         else:
  327.             paste = self.view.substr(sublime.Region(0, self.view.size()))
  328.  
  329.             errcode, response = pastebin.create_paste(fileName.encode('utf8'), paste, userkey)
  330.             if errcode == 7:
  331.                 sublime.error_message("maximum paste file size exceeded")
  332.             elif errcode == 3:
  333.                 sublime.error_message("Your IP addres blocked by Pastebin.com, sorry.")
  334.             elif errcode == 4:
  335.                 sublime.error_message("Maximum number of 25 unlisted pastes for your free account.")
  336.             elif errcode == 5:
  337.                 sublime.error_message("Maximum number of 10 private pastes for your free account.")
  338.             elif errcode == ERROR.UNEXPECTED_ERROR or not(errcode is None):
  339.                 sublime.error_message("Unexpected error.")
  340.             else:
  341.                 sublime.message_dialog("Paste " + response + " successfully created.")
  342.  
  343.     def is_visible(self):
  344.         return visibleManager.CreatePasteVisible
  345.  
  346. class ModifyPasteCommand(sublime_plugin.TextCommand):
  347.     def run(self, edit):
  348.         self.edit = edit
  349.         self.view.window().show_input_panel('Input pasteid: ', prev_pasteid, self.InputPasteIdHandler, None, None)
  350.  
  351.     def InputPasteIdHandler(self, onEvent):
  352.         cookie = sublime.load_settings(session_settings_base).get('cookie', None)
  353.         if cookie is None:
  354.             sublime.error_message("Wrong session! Relogin, please.")
  355.         else:
  356.             if len(onEvent) > 1:
  357.                 prev_pasteid = onEvent
  358.                 paste = self.view.substr(sublime.Region(0, self.view.size()))
  359.                 errcode, response = pastebin.modify_paste(prev_pasteid, fileName.encode('utf8'), paste, cookie)
  360.  
  361.                 if errcode == ERROR.UNEXPECTED_ERROR:
  362.                     sublime.error_message("Unexpected error.")
  363.                 else:
  364.                     sublime.message_dialog("Paste " + prev_pasteid + " successfuly modifed!")
  365.  
  366.             else:
  367.                 sublime.error_message("Please, enter minimum 1 symbol!")
  368.  
  369.     def is_visible(self):
  370.         return visibleManager.ModifyPasteVisible
  371.  
  372. class DeletePasteCommand(sublime_plugin.TextCommand):
  373.     def run(self, edit):
  374.         self.edit = edit
  375.         self.view.window().show_input_panel('Input pasteid: ', prev_pasteid, self.InputPasteIdHandler, None, None)
  376.  
  377.     def InputPasteIdHandler(self, onEvent):
  378.         userkey = sublime.load_settings(session_settings_base).get('user_key', None)
  379.         if userkey is None:
  380.             sublime.error_message("Wrong session! Relogin, please.")
  381.         else:
  382.             if len(onEvent) > 1:
  383.                 prev_pasteid = onEvent
  384.                 errcode, response = pastebin.delete_paste(prev_pasteid, userkey)
  385.                 print errcode
  386.                 print response
  387.                 if errcode == 4:
  388.                     sublime.error_message("Your don't remove this paste!")
  389.                 elif errcode == ERROR.UNEXPECTED_ERROR or not(errcode is None):
  390.                     sublime.error_message("Unexpected error.")
  391.                 else:
  392.                     paste = response.decode('utf8')
  393.                     sublime.message_dialog("Paste " + prev_pasteid + " successfuly deleted!")
  394.             else:
  395.                 sublime.error_message("Please, enter minimum 1 symbol!")
  396.  
  397.     def is_visible(self):
  398.         return visibleManager.DeletePasteVisible
  399.  
  400. class GetPasteCommand(sublime_plugin.TextCommand):
  401.     def run(self, edit):
  402.         self.edit = edit
  403.         self.view.window().show_input_panel('Input pasteid: ', prev_pasteid, self.InputPasteIdHandler, None, None)
  404.  
  405.     def InputPasteIdHandler(self, onEvent):
  406.         if len(onEvent) > 1:
  407.             prev_pasteid = onEvent
  408.             errcode, response = pastebin.get_paste(prev_pasteid)
  409.             if errcode == ERROR.UNEXPECTED_ERROR or not(errcode is None):
  410.                 sublime.error_message("Unexpected error.")
  411.             else:
  412.                 paste = response.decode('utf8')
  413.                 self.view.insert( self.edit, 0, paste )
  414.         else:
  415.             sublime.error_message("Please, enter minimum 1 symbol!")
  416.  
  417.     def is_visible(self):
  418.         return visibleManager.GetPasteVisible
  419.  
  420. #------------------------------------------------------------
  421. #Scrap
  422. #------------------------------------------------------------
  423. #self.content = self.view.substr(sublime.Region(0, self.view.size()))
  424. #self.paste_id = self.view.substr( self.view.line(0) )[1:]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement