This is a fork of:
https://github.com/roglew/puppy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
318 lines
10 KiB
318 lines
10 KiB
import html |
|
import base64 |
|
import datetime |
|
import gzip |
|
import shlex |
|
import string |
|
import urllib |
|
|
|
from ..util import hexdump, printable_data, copy_to_clipboard, clipboard_contents, encode_basic_auth, parse_basic_auth |
|
from io import StringIO |
|
|
|
def print_maybe_bin(s): |
|
binary = False |
|
for c in s: |
|
if str(c) not in string.printable: |
|
binary = True |
|
break |
|
if binary: |
|
print(hexdump(s)) |
|
else: |
|
print(s) |
|
|
|
def asciihex_encode_helper(s): |
|
return ''.join('{0:x}'.format(c) for c in s) |
|
|
|
def asciihex_decode_helper(s): |
|
ret = [] |
|
try: |
|
for a, b in zip(s[0::2], s[1::2]): |
|
c = a+b |
|
ret.append(chr(int(c, 16))) |
|
return ''.join(ret) |
|
except Exception as e: |
|
raise PappyException(e) |
|
|
|
def gzip_encode_helper(s): |
|
out = StringIO.StringIO() |
|
with gzip.GzipFile(fileobj=out, mode="w") as f: |
|
f.write(s) |
|
return out.getvalue() |
|
|
|
def gzip_decode_helper(s): |
|
dec_data = gzip.GzipFile('', 'rb', 9, StringIO.StringIO(s)) |
|
dec_data = dec_data.read() |
|
return dec_data |
|
|
|
def base64_decode_helper(s): |
|
try: |
|
return base64.b64decode(s) |
|
except TypeError: |
|
for i in range(1, 5): |
|
try: |
|
s_padded = base64.b64decode(s + '='*i) |
|
return s_padded |
|
except: |
|
pass |
|
raise PappyException("Unable to base64 decode string") |
|
|
|
def html_encode_helper(s): |
|
return ''.join(['&#x{0:x};'.format(c) for c in s]) |
|
|
|
def html_decode_helper(s): |
|
return html.unescape(s) |
|
|
|
def _code_helper(args, func, copy=True): |
|
if len(args) == 0: |
|
s = clipboard_contents().encode() |
|
print('Will decode:') |
|
print(printable_data(s)) |
|
s = func(s) |
|
if copy: |
|
try: |
|
copy_to_clipboard(s) |
|
except Exception as e: |
|
print('Result cannot be copied to the clipboard. Result not copied.') |
|
raise e |
|
return s |
|
else: |
|
s = func(args[0].encode()) |
|
if copy: |
|
try: |
|
copy_to_clipboard(s) |
|
except Exception as e: |
|
print('Result cannot be copied to the clipboard. Result not copied.') |
|
raise e |
|
return s |
|
|
|
def base64_decode(client, args): |
|
""" |
|
Base64 decode a string. |
|
If no string is given, will decode the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, base64_decode_helper)) |
|
|
|
def base64_encode(client, args): |
|
""" |
|
Base64 encode a string. |
|
If no string is given, will encode the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, base64.b64encode)) |
|
|
|
def url_decode(client, args): |
|
""" |
|
URL decode a string. |
|
If no string is given, will decode the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, urllib.unquote)) |
|
|
|
def url_encode(client, args): |
|
""" |
|
URL encode special characters in a string. |
|
If no string is given, will encode the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, urllib.quote_plus)) |
|
|
|
def asciihex_decode(client, args): |
|
""" |
|
Decode an ascii hex string. |
|
If no string is given, will decode the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, asciihex_decode_helper)) |
|
|
|
def asciihex_encode(client, args): |
|
""" |
|
Convert all the characters in a line to hex and combine them. |
|
If no string is given, will encode the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, asciihex_encode_helper)) |
|
|
|
def html_decode(client, args): |
|
""" |
|
Decode an html encoded string. |
|
If no string is given, will decode the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, html_decode_helper)) |
|
|
|
def html_encode(client, args): |
|
""" |
|
Encode a string and escape html control characters. |
|
If no string is given, will encode the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, html_encode_helper)) |
|
|
|
def gzip_decode(client, args): |
|
""" |
|
Un-gzip a string. |
|
If no string is given, will decompress the contents of the clipboard. |
|
Results are copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, gzip_decode_helper)) |
|
|
|
def gzip_encode(client, args): |
|
""" |
|
Gzip a string. |
|
If no string is given, will decompress the contents of the clipboard. |
|
Results are NOT copied to the clipboard. |
|
""" |
|
print_maybe_bin(_code_helper(args, gzip_encode_helper, copy=False)) |
|
|
|
def base64_decode_raw(client, args): |
|
""" |
|
Same as base64_decode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, base64_decode_helper, copy=False)) |
|
|
|
def base64_encode_raw(client, args): |
|
""" |
|
Same as base64_encode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, base64.b64encode, copy=False)) |
|
|
|
def url_decode_raw(client, args): |
|
""" |
|
Same as url_decode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, urllib.unquote, copy=False)) |
|
|
|
def url_encode_raw(client, args): |
|
""" |
|
Same as url_encode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, urllib.quote_plus, copy=False)) |
|
|
|
def asciihex_decode_raw(client, args): |
|
""" |
|
Same as asciihex_decode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, asciihex_decode_helper, copy=False)) |
|
|
|
def asciihex_encode_raw(client, args): |
|
""" |
|
Same as asciihex_encode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, asciihex_encode_helper, copy=False)) |
|
|
|
def html_decode_raw(client, args): |
|
""" |
|
Same as html_decode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, html_decode_helper, copy=False)) |
|
|
|
def html_encode_raw(client, args): |
|
""" |
|
Same as html_encode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, html_encode_helper, copy=False)) |
|
|
|
def gzip_decode_raw(client, args): |
|
""" |
|
Same as gzip_decode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, gzip_decode_helper, copy=False)) |
|
|
|
def gzip_encode_raw(client, args): |
|
""" |
|
Same as gzip_encode but the output will never be printed as a hex dump and |
|
results will not be copied. It is suggested you redirect the output |
|
to a file. |
|
""" |
|
print(_code_helper(args, gzip_encode_helper, copy=False)) |
|
|
|
def unix_time_decode_helper(line): |
|
unix_time = int(line.strip()) |
|
dtime = datetime.datetime.fromtimestamp(unix_time) |
|
return dtime.strftime('%Y-%m-%d %H:%M:%S') |
|
|
|
def unix_time_decode(client, args): |
|
print(_code_helper(args, unix_time_decode_helper)) |
|
|
|
def http_auth_encode(client, args): |
|
args = shlex.split(args[0]) |
|
if len(args) != 2: |
|
raise PappyException('Usage: http_auth_encode <username> <password>') |
|
username, password = args |
|
print(encode_basic_auth(username, password)) |
|
|
|
def http_auth_decode(client, args): |
|
username, password = decode_basic_auth(args[0]) |
|
print(username) |
|
print(password) |
|
|
|
def load_cmds(cmd): |
|
cmd.set_cmds({ |
|
'base64_decode': (base64_decode, None), |
|
'base64_encode': (base64_encode, None), |
|
'asciihex_decode': (asciihex_decode, None), |
|
'asciihex_encode': (asciihex_encode, None), |
|
'url_decode': (url_decode, None), |
|
'url_encode': (url_encode, None), |
|
'html_decode': (html_decode, None), |
|
'html_encode': (html_encode, None), |
|
'gzip_decode': (gzip_decode, None), |
|
'gzip_encode': (gzip_encode, None), |
|
'base64_decode_raw': (base64_decode_raw, None), |
|
'base64_encode_raw': (base64_encode_raw, None), |
|
'asciihex_decode_raw': (asciihex_decode_raw, None), |
|
'asciihex_encode_raw': (asciihex_encode_raw, None), |
|
'url_decode_raw': (url_decode_raw, None), |
|
'url_encode_raw': (url_encode_raw, None), |
|
'html_decode_raw': (html_decode_raw, None), |
|
'html_encode_raw': (html_encode_raw, None), |
|
'gzip_decode_raw': (gzip_decode_raw, None), |
|
'gzip_encode_raw': (gzip_encode_raw, None), |
|
'unixtime_decode': (unix_time_decode, None), |
|
'httpauth_encode': (http_auth_encode, None), |
|
'httpauth_decode': (http_auth_decode, None) |
|
}) |
|
cmd.add_aliases([ |
|
('base64_decode', 'b64d'), |
|
('base64_encode', 'b64e'), |
|
('asciihex_decode', 'ahd'), |
|
('asciihex_encode', 'ahe'), |
|
('url_decode', 'urld'), |
|
('url_encode', 'urle'), |
|
('html_decode', 'htmld'), |
|
('html_encode', 'htmle'), |
|
('gzip_decode', 'gzd'), |
|
('gzip_encode', 'gze'), |
|
('base64_decode_raw', 'b64dr'), |
|
('base64_encode_raw', 'b64er'), |
|
('asciihex_decode_raw', 'ahdr'), |
|
('asciihex_encode_raw', 'aher'), |
|
('url_decode_raw', 'urldr'), |
|
('url_encode_raw', 'urler'), |
|
('html_decode_raw', 'htmldr'), |
|
('html_encode_raw', 'htmler'), |
|
('gzip_decode_raw', 'gzdr'), |
|
('gzip_encode_raw', 'gzer'), |
|
('unixtime_decode', 'uxtd'), |
|
('httpauth_encode', 'hae'), |
|
('httpauth_decode', 'had'), |
|
])
|
|
|