A twister-based game of intrigue and bad crypto
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.

61 lines
2.1 KiB

#!/usr/bin/env python3
import sys
import os
import json
import darkened
import pastee3
__version__ = (0, 1, 0)
pasteclient = pastee3.PasteClient()
def todarkive(s,folder,filename):
"""Store a string as a file in the "darkive", and notify the user"""
folder = os.path.join('darkive',folder)
os.makedirs(folder,0o700,True)
filename = os.path.join(folder,filename)
if os.path.exists(filename):
sys.stderr.write('# Skipping existing file! {}\n'.format(filename))
else:
open(filename,'w').write(s)
sys.stderr.write('# Wrote file: {}\n'.format(filename))
def daget(pasteid):
if '#' in pasteid:
p,needhash = pasteid.split('#')
else:
p,needhash = pasteid,None
# Split *after* we split by "#" (sometimes hash contains /).
p = p.split('/')[-1] # in case it's a full url
sys.stderr.write('# getting paste {}\n'.format(p))
payload = pasteclient.sloppy_get(p)
if not payload:
sys.stderr.write('# bad or missing pastee!\n')
return False
if needhash:
gothash = darkened.hash64(bytes(payload.strip(),'ascii','replace'))
if gothash == needhash:
sys.stderr.write('# Hash Matches\n')
d = json.loads(payload)
todarkive(payload,d['msgid'],'{}.json'.format(p))
return True
else:
sys.stderr.write('# Hash mismatch! need {}, got {}. Corrupt paste?\n'.format(repr(needhash),repr(gothash)))
todarkive(payload,'corrupt','{}.corrupt.json'.format(p))
return False
else:
sys.stderr.write('# Not checking hash(!)\n')
d = json.loads(payload)
todarkive(payload,d['msgid'],'{}.unverified.json'.format(p))
return True
if __name__=='__main__':
if len(sys.argv)<2:
sys.stderr.write("""Usage: {} pasteeurl[#hash] ...
E.g. {} https://pastee.org/69f38#V4F8BjwgSfzkaentZlcBsacuLNM= hzrk2
(second argument is in the shortest form: only id, no hash)
""")
sys.exit(1)
for pasteid in sys.argv[1:]:
sys.stderr.write('### getting {}\n'.format(pasteid))
daget(pasteid)