from logging import debug, critical
import os
from lechat.Utils import pathLastItem, dnToPath
import imaplib
import managesieve

def onModify(db, cred, changes):
    debug('modify cyrus mailbox %s' % changes)

    name = pathLastItem(changes.path)
    if changes.new.has_key('lechatMailForward'):
        sieve = managesieve.MANAGESIEVE('localhost')
        if not sieve:
            critical("Cannot connect to cyrus on localhost")
            return
        result = sieve.login(name, 'admin', 'admin')
        if result != 'OK':
            critical("Cannot login to sieve server for user %s : %s" % (name, result))
            sieve.logout()
            return

        scriptname='default'
        
        script = 'require "fileinto";\n'
        for i in changes.new['lechatMailForward']:
            script += 'redirect "%s";\n' % i
        script += 'keep;\n'

        result = sieve.putscript(scriptname, script)
        if result != 'OK':
            critical("Cannot upload sieve script")
            sieve.logout()
            return
        
        sieve.setactive(scriptname)
        debug('sieve script successfully installed')
        sieve.logout()

    if changes.new.has_key('lechatUserMainDomain'):
        if changes.old.has_key('lechatUserMainDomain'):
            old_domain_dn = str(changes.old['lechatUserMainDomain'][0])
            old_domain = pathLastItem( dnToPath(old_domain_dn, db.base_dn) )
        else:
            old_domain = 'localhost'
        new_domain_dn = str(changes.new['lechatUserMainDomain'][0])
        new_domain = pathLastItem( dnToPath(new_domain_dn, db.base_dn) )
        debug('setting main domain from %s to %s' % (old_domain, new_domain))

        m = imaplib.IMAP4()
        m.login('admin', 'admin')
        
        try:
            m.rename('user/' + name + '@' + old_domain, 'user/' + name + '@' + new_domain)
        except Exception, error:
            critical('Error on cyrus rename: %s' % error )

        m.shutdown()

def onRename(db, cred, changes):
    m = imaplib.IMAP4()
    m.login('admin', 'admin')
    old_name = pathLastItem(changes.path)
    new_name = changes.new
    user = db.getTree(cred, changes.path)['people'][old_name]
    if user.has_key('lechatUserMainDomain'):
        domain_dn = user['lechatUserMainDomain'].get()[0]
        domain = pathLastItem(dnToPath(domain_dn, db.base_dn))
    else:
        domain = 'localhost'

    debug('rename cyrus mailbox from %s to %s' % (old_name, new_name))
    
    try:
        m.rename('user/' + old_name + '@' + domain, 'user/' + new_name + '@' + domain)
    except Exception, error:
        critical('Error on cyrus rename: %s' % error )
        
    m.shutdown()

def onCreate(db, cred, changes):
    m = imaplib.IMAP4()
    m.login('admin', 'admin')
    name = pathLastItem(changes.path)
    user = db.getTree(cred, changes.path)['people'][name]
    if user.has_key('lechatUserMainDomain'):
        domain = str(user['lechatUserMainDomain'])
    else:
        domain = 'localhost'
    debug('create cyrus mailbox for user %s@%s (%s)' % (name, domain, changes.path))
    
    try:
        m.create('user/' + name + '@' + domain)
        m.setacl('user/' + name + '@' + domain, 'cyrus', 'c')
    except Exception, error:
        critical('Error on cyrus create user: %s' % error )
        
    m.shutdown()

def onDelete(db, cred, changes):
    m = imaplib.IMAP4()
    m.login('admin', 'admin')
    name = pathLastItem(changes.path)
    user = db.getTree(cred, changes.path)['people'][name]
    if user.has_key('lechatUserMainDomain'):
        domain_dn = user['lechatUserMainDomain'].get()[0]
        domain = pathLastItem(dnToPath(domain_dn, db.base_dn))
    else:
        domain = 'localhost'
    debug('delete cyrus mailbox %s@%s (%s)' % (name, domain, changes.path))
    
    try:
        m.delete('user/' + name + '@' + domain)
    except Exception, error:
        critical('Error on cyrus delete user: %s' % error )
        
    m.shutdown()


