diff options
author | Andreas Schneider <asn@cryptomilk.org> | 2017-02-22 09:53:54 +0100 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2017-02-22 09:54:12 +0100 |
commit | f1a7b08202fe20a974a6be4b3040ffa96384c489 (patch) | |
tree | fb8b42732d5b1fa0e555a08cb73a2b7c0f5036c2 | |
parent | e3b53a270ba8e7b56511aaba4be8b3dea65aebe3 (diff) | |
download | cpaste-f1a7b08202fe20a974a6be4b3040ffa96384c489.tar.gz cpaste-f1a7b08202fe20a974a6be4b3040ffa96384c489.tar.xz cpaste-f1a7b08202fe20a974a6be4b3040ffa96384c489.zip |
Refactor code to use functions
-rwxr-xr-x | cpaste | 217 |
1 files changed, 106 insertions, 111 deletions
@@ -123,140 +123,135 @@ def sjcl_encrypt(plaintext, passphrase): return cipher_data -default_lang = 'text' +def guess_lang_formatter(paste_plaintext, paste_filename=None): + paste_formatter = 'plaintext' + # Map numpy to python because the numpy lexer gives false positives + # when guessing. + lexer_lang_map = {'numpy': 'python'} -# Map numpy to python because the numpy lexer gives false positives -# when guessing. -lexer_lang_map = {'numpy': 'python'} - -paste_url = 'https://cpaste.org' -paste_formatter = 'Plain Text' -paste_burn = 0 -paste_opendicussion = 0 - -#valid_langs = [] -# -#try: -# r = requests.get(paste_url + '/api/json/parameter/language') -# valid_langs = json.loads(r.text)['result']['values'] -#except: -# print("Unable to retrieve list of valid languages from api.") - - -parser = OptionParser() -parser.add_option("-f", "--file", dest="filename", - help="Read from a file instead of stdin", metavar="FILE") -parser.add_option("-p", "--password", dest="password", - help="Create a password protected paste", metavar="PASSWORD") -parser.add_option("-e", "--expire", - action="store", type="string", dest="expire", default="86400", - help="Expire the paste in X minutes (default: 1 day (1440), valid: 30, 360, 1440, 43200)", metavar="X") -parser.add_option("-s", "--sourcecode", - action="store_true", dest="source", default=False, - help="Use source code highlighting") -parser.add_option("-m", "--markdown", - action="store_true", dest="markdown", default=False, - help="Parse paste as markdown") -parser.add_option("-b", "--burn", - action="store_true", dest="burn", default=False, - help="Burn paste after reading") -parser.add_option("-o", "--opendiscussion", - action="store_true", dest="opendiscussion", default=False, - help="Allow discussion for the paste") - -(options, args) = parser.parse_args() - -if options.filename: - f = open(options.filename) - if not f: - print("Oops, could not open file!") - - paste_data = f.read() -else: - paste_data = sys.stdin.read() - -if options.burn: - paste_burn = 1 - -if options.opendiscussion: - paste_opendiscussion = 1 - -if not paste_data: - print("Oops, we have no data") - sys.exit(1) - -lang = None -# API expects lower case language option -if options.source: - paste_formatter = 'Source Code' -elif options.markdown: - paste_formatter = 'Markdown' -elif guess_lang: # If we have a filename, try guessing using the more reliable # guess_lexer_for_filename function. # If that fails, try the guess_lexer function on the code. - if options.filename: + lang = None + if paste_filename: try: lang = guess_lexer_for_filename(options.filename, - paste_data).name.lower() - if lang: - paste_formatter = 'Source Code' + paste_plaintext).name.lower() except: print("No guess by filename") pass - if not options.source: + else: try: - lang = guess_lexer(paste_data).name.lower() - lang = lexer_lang_map.get(options.lang, options.lang) + #lang = guess_lexer(paste_plaintext).name.lower() + lang = guess_lexer('#!/usr/bin/python\nprint "Hello World!"').name.lower() except: pass -# Use default if no language specified or guessed -if lang != 'text only': - paste_formatter = 'Source Code' + if lang: + if lang == 'markdown': + paste_formatter = 'markdown' + if lang != 'text only': + paste_formatter = 'syntaxhighlighting' + + return paste_formatter + +def main(): + parser = OptionParser() + + parser.add_option("-f", "--file", dest="filename", + help="Read from a file instead of stdin", metavar="FILE") + parser.add_option("-p", "--password", dest="password", + help="Create a password protected paste", metavar="PASSWORD") + parser.add_option("-e", "--expire", + action="store", type="string", dest="expire", default="86400", + help="Expire the paste in X minutes (default: 1 day (1440), valid: 30, 360, 1440, 43200)", metavar="X") + parser.add_option("-s", "--sourcecode", + action="store_true", dest="source", default=False, + help="Use source code highlighting") + parser.add_option("-m", "--markdown", + action="store_true", dest="markdown", default=False, + help="Parse paste as markdown") + parser.add_option("-b", "--burn", + action="store_true", dest="burn", default=False, + help="Burn paste after reading") + parser.add_option("-o", "--opendiscussion", + action="store_true", dest="opendiscussion", default=False, + help="Allow discussion for the paste") + + (options, args) = parser.parse_args() + + paste_url = 'https://cpaste.org' + paste_formatter = 'plaintext' + paste_expire = 86400 + paste_opendicussion = 0 + paste_burn = 0 + paste_password = None + + if options.filename: + f = open(options.filename) + if not f: + print("Oops, could not open file!") + + paste_plaintext = f.read() + else: + paste_plaintext = sys.stdin.read() + + if not paste_plaintext: + print("Oops, we have no data") + sys.exit(1) + + if options.burn: + paste_burn = 1 + + if options.opendiscussion: + paste_opendiscussion = 1 -if int(options.expire) != 86400: - options.expire = int(options.expire) * 60 + if options.source: + paste_formatter = 'syntaxhighlighting' + elif options.markdown: + paste_formatter = 'markdown' + elif guess_lang: + paste_formatter = guess_lang_formatter(paste_plaintext, + options.filename) -paste_password = None -if options.password: - paste_password = options.password + if int(options.expire) != 86400: + paste_expire = int(options.expire) * 60 -paste_passphrase = base64.b64encode(bytes(os.urandom(32))) + if options.password: + paste_password = options.password -cipher_data = sjcl_encrypt(paste_data, paste_passphrase) + paste_otp = base64.b64encode(bytes(os.urandom(32))) -# json payload -payload = {'data': json.dumps(cipher_data, ensure_ascii=False), - 'expire': options.expire, - 'formatter': paste_formatter, - 'burnafterreading': paste_burn, - 'opendiscussion': paste_opendicussion} + cipher_json = sjcl_encrypt(paste_plaintext, paste_otp) -# http content type -headers = {'X-Requested-With':'JSONHttpRequest'} + # json payload + payload = {'data': json.dumps(cipher_json, ensure_ascii=False), + 'expire': paste_expire, + 'formatter': paste_formatter, + 'burnafterreading': paste_burn, + 'opendiscussion': paste_opendicussion} -r = requests.post(paste_url, - data=payload, - headers=headers) + # http content type + headers = {'X-Requested-With': 'JSONHttpRequest'} -#print('result: %s' % r.text) -#print('') -#print('') + r = requests.post(paste_url, + data=payload, + headers=headers) -paste_status = json.loads(r.text)['status'] -if paste_status: - paste_message = json.loads(r.text)['message'] - print("Oops, error: %s" % paste_message) - sys.exit(1) + paste_status = json.loads(r.text)['status'] + if paste_status: + paste_message = json.loads(r.text)['message'] + print("Oops, error: %s" % paste_message) + sys.exit(1) + paste_id = json.loads(r.text)['id'] + paste_deletetoken = json.loads(r.text)['deletetoken'] -# result: {"status":0,"id":"fceecc2ba163a632","url":"\/?fceecc2ba163a632","deletetoken":"b64e93f516a6e89801c6b2db0b22a22a531a3c8a0f53640592af9aec6c08fc41"} -paste_id = json.loads(r.text)['id'] -paste_deletetoken = json.loads(r.text)['deletetoken'] + print('Delete paste: %s/?pasteid=%s&deletetoken=%s' % (paste_url, paste_id, paste_deletetoken)) + print('') + print('### Paste (%s): %s/?%s#%s' % (paste_formatter, paste_url, paste_id, paste_otp.decode('utf-8'))) -print('Delete paste: %s/?pasteid=%s&deletetoken=%s' % (paste_url, paste_id, paste_deletetoken)) -print('') -print('### Paste (%s): %s/?%s#%s' % (paste_formatter, paste_url, paste_id, paste_passphrase.decode('utf-8'))) + sys.exit(0) -sys.exit(0) +if __name__ == "__main__": + main() |