Add UI for email forwarding
[mspang/pyceo.git] / ceo / ldapi.py
index c2fc690..6e5eb5a 100644 (file)
@@ -4,17 +4,25 @@ LDAP Utilities
 This module makes use of python-ldap, a Python module with bindings
 to libldap, OpenLDAP's native C client library.
 """
-import ldap.modlist
+import ldap.modlist, os, pwd
+from subprocess import Popen, PIPE
 
 
-def connect_sasl(uri, mech, realm):
+def connect_sasl(uri, mech, realm, password):
 
-    # open the connection
-    ld = ldap.initialize(uri)
+    try:
+        # open the connection
+        ld = ldap.initialize(uri)
+        
+        # authenticate
+        sasl = Sasl(mech, realm, password)
+        ld.sasl_interactive_bind_s('', sasl)
+
+    except ldap.LOCAL_ERROR, e:
+        raise e
 
-    # authenticate
-    sasl = Sasl(mech, realm)
-    ld.sasl_interactive_bind_s('', sasl)
+    except:
+        print "Shit, something went wrong!"
 
     return ld
 
@@ -30,7 +38,7 @@ def abslookup(ld, dn, objectclass=None):
             matches = ld.search_s(dn, ldap.SCOPE_BASE)
     except ldap.NO_SUCH_OBJECT:
         return None
-            
+
     # dn was found, but didn't match the objectclass filter
     if len(matches) < 1:
         return None
@@ -46,7 +54,7 @@ def lookup(ld, rdntype, rdnval, base, objectclass=None):
     return abslookup(ld, dn, objectclass)
 
 
-def search(ld, base, search_filter, params, scope=ldap.SCOPE_SUBTREE, attrlist=None, attrsonly=0):
+def search(ld, base, search_filter, params=[], scope=ldap.SCOPE_SUBTREE, attrlist=None, attrsonly=0):
 
     real_filter = search_filter % tuple(escape(x) for x in params)
 
@@ -111,11 +119,30 @@ def make_modlist(old, new):
     return mlist
 
 
+def format_ldaperror(ex):
+    desc = ex[0].get('desc', '')
+    info = ex[0].get('info', '')
+    if desc and info:
+        return "%s: %s" % (desc, info)
+    elif desc:
+        return desc
+    else:
+        return str(ex)
+
+
 class Sasl:
 
-    def __init__(self, mech, realm):
+    def __init__(self, mech, realm, password):
         self.mech = mech
         self.realm = realm
 
+        if mech == 'GSSAPI' and password is not None:
+            userid = pwd.getpwuid(os.getuid()).pw_name
+            kinit = '/usr/bin/kinit'
+            kinit_args = [ kinit, '%s@%s' % (userid, realm) ]
+            kinit = Popen(kinit_args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
+            kinit.stdin.write('%s\n' % password)
+            kinit.wait()
+
     def callback(self, id, challenge, prompt, defresult):
         return ''