#!/usr/bin/env python

'''
Mutt addressbok-plugin.

Add this into your ~/.muttrc -> set query_command="/path/to/muttldap.py %s"

Latest changes:
* Translated some norwegian comments back into english
* Fixed bug in try/import while importing module ldap

Revision 1.2 2005/03/11 10:46:35 bgrotan

'''
import sys

try:
    import ldap
except:
    print 'Could not find module ldap'
    sys.exit()

import string,base64
import getopt,sys

debug = False

# some default values
server = "YOUR HOST"
user = ""
pwd = ""
base = "dc=YOUR DOMAIN,dc=com"
scope = ldap.SCOPE_SUBTREE

# get arguments from module getopt

def main(args): 
    keyword = ""
    if debug: print args
    for i in args:
        keyword += ' ' + i 
    keyword = keyword.strip()
    try:
        l = ldap.open(server)
        l.simple_bind_s(user,pwd)
        if debug:
            print "Successfully bound to server.\n"
            print "Searching..\n"
        search(l,keyword)
    except ldap.LDAPError,e:
        if debug:
            print "Couldn't connect. %s " % e
        else:
            pass

def search(l,keyword):
    filter = "cn=" + "*" + keyword + "*"
    retrieve_attributes = "cn","mail"
    count = 0
    result_set = []
    timeout = 0
    result = ""
    # still not able to do search on æ,ø or å. Use '*' for norwegian characters
    keyword = utf8_e(keyword)

    try:
        # asyncronous search... retrieve the id for the search instead
        result_id = l.search(base,scope,filter,retrieve_attributes)
        while 1:
            result_type, result_data = l.result(result_id, timeout)
            if (result_data == []):
                break
            else:
                if result_type == ldap.RES_SEARCH_ENTRY:
                    result_set.append(result_data)
        if len(result_set) == 0:
            print "No results."
            return
        for i in range(len(result_set)):
            for entry in result_set[i]:
                try:
                    name = entry[1]['cn'][0]
                    if needsbase64(name): name=utf8_d(name)
                    email = entry[1]['mail'][0]
                    count += 1
                    result += name + " <" + email + ">\n" 
                except:
                    pass
        print 'LDAPquery: found \n ' + result
    except ldap.LDAPError,e:
        if debug:
            print e
        else:
            pass

def usage():
    print "Usage:" +  sys.argv[0] + "<search string> "
    print "(... <search string> can be part of cn)"
    sys.exit(0)

def needsbase64(s):
    """ Returner true|false if 's' require base64-enkoding """
    if filter(lambda x: x>'\x7f', s):
        return 1
    else:
        return 0

def utf8_e(str):
    """ Return utf8-encoded string """
    return unicode(str, "iso-8859-1").encode("utf-8")

def utf8_d(str):
    """ Return utf8-decoded string """
    try:
        result = unicode(str,"utf-8").encode("iso-8859-1")
    except UnicodeError,e:
        result = str
    return result

if __name__ == "__main__":
    args = sys.argv[1:]
    main(args)
