#!/usr/bin/python3
# Sieve pipe handler for processing Zoom login codes

import email
import email.policy
import os
import re
import subprocess
import sys
import syslog
from tempfile import NamedTemporaryFile

def fail(msg):
    syslog.syslog(syslog.LOG_ERR, msg)
    sys.exit(0)

def mumble(msg):
    syslog.syslog(syslog.LOG_INFO, msg)

def main():
    msg = email.message_from_file(sys.stdin, policy=email.policy.default)
    to = msg.get('To', "")
    m = re.match('(zoom(-m)?-[0-9]{1,2})@', to)
    if not m:
        fail('Cannot determine recipient account')
    user = m[1]

    body = msg.get_body()
    body_ct = body.get_content_type()
    if body_ct == 'text/html':
        tmpf = NamedTemporaryFile(mode='w')
        tmpf.write(body.get_content())
        tmpf.flush()

        res = subprocess.run(['/usr/bin/lynx', '-force_html', '-nolist', '-display_charset=utf-8', '-dump', tmpf.name], stdout=subprocess.PIPE, text=True)
        if res.returncode != 0:
            fail(f'Subprocess failed with return code {res.returncode}')

        out = res.stdout
    else:
        out = body.get_content()

    os.umask(0o022)
    with open(f"/srv/mffzoom/code/www/{user}.txt", "w") as f:
        f.write(out)

try:
    syslog.openlog('zoom-code')
    main()
    mumble('Login code stored')
except Exception as e:
    fail(str(e))