|
|
|
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import json
|
|
|
|
import darkened
|
|
|
|
import pastee3
|
|
|
|
|
|
|
|
__version__ = (0, 1, 0)
|
|
|
|
|
|
|
|
pasteclient = pastee3.PasteClient()
|
|
|
|
|
|
|
|
def fromdarkive(msgid):
|
|
|
|
"""Retrieve all files in a "darkive" folder, and returns cipher and consolidated pads"""
|
|
|
|
folder = os.path.join('darkive',msgid)
|
|
|
|
if not os.path.isdir(folder):
|
|
|
|
sys.stderr.write('# Folder does not exist! {}\n'.format(folder))
|
|
|
|
return None, None
|
|
|
|
sys.stderr.write('# Scanning folder {}\n'.format(folder))
|
|
|
|
cipher = None
|
|
|
|
pads = None
|
|
|
|
for f in os.listdir(folder):
|
|
|
|
# sys.stderr.write('Reading {}\n'.format(f))
|
|
|
|
try:
|
|
|
|
d=json.load(open(os.path.join(folder,f)))
|
|
|
|
except Exception as e:
|
|
|
|
sys.stderr.write('Error reading {}! {}\n'.format(os.path.join(folder,f),e))
|
|
|
|
continue
|
|
|
|
if 'cipher' in d:
|
|
|
|
cipher = d
|
|
|
|
else:
|
|
|
|
if pads:
|
|
|
|
pads['pads'].update(d['pads']) # Todo: check conflicts?
|
|
|
|
else:
|
|
|
|
pads = d
|
|
|
|
return cipher, pads
|
|
|
|
|
|
|
|
def showmsg(msgid,trustees=[],detailed=True):
|
|
|
|
# Trick to allow e.g. 'darkive/DA14342254974005/' (like autocomplete does)
|
|
|
|
msgid = list(filter(None,msgid.split('/')))[-1]
|
|
|
|
cipher,pads = fromdarkive(msgid)
|
|
|
|
if cipher or pads:
|
|
|
|
d = cipher or pads
|
|
|
|
for k in ['msgid', 'sender', 'recipients', 'trustees', 'subject']:
|
|
|
|
if k in d:
|
|
|
|
print('{}: {}'.format(k,d[k]))
|
|
|
|
if detailed and cipher:
|
|
|
|
print()
|
|
|
|
# Todo: unmessify redact() so that we don't need this kludge :s
|
|
|
|
print(darkened.unredact(cipher,pads or {'pads':[]},trustees=trustees))
|
|
|
|
|
|
|
|
if __name__=='__main__':
|
|
|
|
if len(sys.argv)<2:
|
|
|
|
is_detailed = False
|
|
|
|
if not os.path.isdir('darkive'):
|
|
|
|
print('No "darkive" folder. You should run daget.py first')
|
|
|
|
sys.exit(1)
|
|
|
|
msgs = [m for m in sorted(os.listdir('darkive')) # Latest at bottom
|
|
|
|
if m!='corrupt' and
|
|
|
|
not m.startswith('.') and # Leave .git alone ;)
|
|
|
|
os.path.isdir(os.path.join('darkive',m))]
|
|
|
|
if not msgs:
|
|
|
|
print('No messages in "darkive" folder. You should run daget.py first')
|
|
|
|
sys.exit(0)
|
|
|
|
for msgid in msgs:
|
|
|
|
if msgid!='corrupt' and os.path.isdir(os.path.join('darkive',msgid)):
|
|
|
|
print('# {} {}'.format(sys.argv[0],msgid))
|
|
|
|
showmsg(msgid,detailed=False)
|
|
|
|
print()
|
|
|
|
else:
|
|
|
|
showmsg(sys.argv[1],trustees=sys.argv[2:])
|