#!/usr/local/bin/python
# -*- Mode: Python -*-

import os
import sys

def EXIT (n):
    # don't use sys.exit, which will simply raise an exception.
    os._exit (n)

def log (msg):
    path = os.path.join (os.environ['HOME'], 'mail_filter_log.txt')
    open (path, 'ab').write (
        msg + ' $SENDER=%s RECIPIENT=%s\n' % (
            os.environ['SENDER'], os.environ['RECIPIENT']
            )
        )

def build_filename (maildir):
    import socket
    import time
    dir_path = os.path.join (os.environ['HOME'], 'Maildir', maildir)
    if not os.path.isdir (dir_path):
        log ('calling "/var/qmail/bin/maildirmake %s"' % (dir_path))
        os.system ('/var/qmail/bin/maildirmake %s' % (dir_path))
    name = '%d.%d.%s:2' % (
        int(time.time()),
        os.getpid(),
        socket.gethostname()
        )
    return os.path.join (dir_path, 'new', name)

def write_message (maildir):
    fname = build_filename (maildir)
    log ('fname=%r' % (fname,))
    f = open (fname, 'wb')
    while 1:
        block = sys.stdin.read (16360)
        if not block:
            break
        else:
            f.write (block)
    f.close()

def get_hash_from_rcpt (rcpt):
    user, host = rcpt.split ('@')
    parts = user.split ('-')
    if len(parts) > 1:
        hash = parts[1]
    else:
        hash = '00000'
    return hash

def get_hash_from_sndr (sndr):
    user, host = sndr.split ('@')
    parts = host.split ('.')
    domain = parts[-2].lower()
    return domain, hashlib.sha1 (domain).hexdigest()[:5]

import hashlib

# domains that get their own box
domain_box = {
    'nightmare' : 'nightmare',
    }

# sndr=xxx@yahoo.com rcpt=q-HASH@my.domain.com

try:
    sndr = os.environ['SENDER']
    rcpt = os.environ['RECIPIENT']
    domain, hash0 = get_hash_from_sndr (sndr)
    hash1         = get_hash_from_rcpt (rcpt)
    log ('sndr=%r hash0=%r hash1=%r RCPT=%r' % (sndr, hash0, hash1, rcpt))
    if hash0 == hash1:
        box = domain_box.get (domain, 'junk')
        write_message ('.q.%s' % box)
    else:
        write_message ('.q.badhash')
    EXIT (0)
except:
    log ('an exception of some kind: %r' % (sys.exc_info(),))
    EXIT (111)
