Do SSL when connecting to the ldap server.
[mirror/userdir-ldap.git] / userdir_ldap.py
index 1b4299c..e90fffd 100644 (file)
@@ -17,7 +17,7 @@
 #   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 # Some routines and configuration that are used by the ldap progams
 #   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 # Some routines and configuration that are used by the ldap progams
-import termios, re, string, imp, ldap, sys, crypt, rfc822;
+import termios, re, imp, ldap, sys, crypt, rfc822;
 import userdir_gpg
 
 try:
 import userdir_gpg
 
 try:
@@ -41,8 +41,17 @@ PassDir = ConfModule.passdir;
 Ech_ErrorLog = ConfModule.ech_errorlog;
 Ech_MainLog = ConfModule.ech_mainlog;
 
 Ech_ErrorLog = ConfModule.ech_errorlog;
 Ech_MainLog = ConfModule.ech_mainlog;
 
+# For backwards compatibility, we default to the old behaviour
+MultipleSSHFiles = getattr(ConfModule, 'multiplesshfiles', False)
+SingleSSHFile = getattr(ConfModule, 'singlesshfile', True)
+
+try:
+   UseSSL = ConfModule.usessl;
+except AttributeError:
+   UseSSL = False;
+
 # Break up the keyring list
 # Break up the keyring list
-userdir_gpg.SetKeyrings(string.split(ConfModule.keyrings,":"));
+userdir_gpg.SetKeyrings(ConfModule.keyrings.split(":"))
 
 # This is a list of common last-name prefixes
 LastNamesPre = {"van": None, "von": None, "le": None, "de": None, "di": None};
 
 # This is a list of common last-name prefixes
 LastNamesPre = {"van": None, "von": None, "le": None, "de": None, "di": None};
@@ -98,6 +107,16 @@ def PrettyShow(DnRecord):
          Result = Result + "%s: %s\n" % (x,i);
    return Result[:-1];
 
          Result = Result + "%s: %s\n" % (x,i);
    return Result[:-1];
 
+def connectLDAP(server = None):
+   if server == None:
+      global LDAPServer
+      server = LDAPServer
+   l = ldap.open(server);
+   global UseSSL
+   if UseSSL:
+      l.start_tls_s();
+   return l;
+
 # Function to prompt for a password 
 def getpass(prompt = "Password: "):
    import termios, sys;
 # Function to prompt for a password 
 def getpass(prompt = "Password: "):
    import termios, sys;
@@ -120,7 +139,7 @@ def getpass(prompt = "Password: "):
    print;
    return passwd;
 
    print;
    return passwd;
 
-def passwdAccessLDAP(LDAPServer, BaseDn, AdminUser):
+def passwdAccessLDAP(BaseDn, AdminUser):
    """
    Ask for the AdminUser's password and connect to the LDAP server.
    Returns the connection handle.
    """
    Ask for the AdminUser's password and connect to the LDAP server.
    Returns the connection handle.
@@ -132,7 +151,7 @@ def passwdAccessLDAP(LDAPServer, BaseDn, AdminUser):
       if len(Password) == 0:
          sys.exit(0)
 
       if len(Password) == 0:
          sys.exit(0)
 
-      l = ldap.open(LDAPServer);
+      l = connectLDAP()
       UserDn = "uid=" + AdminUser + "," + BaseDn;
 
       # Connect to the ldap server
       UserDn = "uid=" + AdminUser + "," + BaseDn;
 
       # Connect to the ldap server
@@ -146,7 +165,7 @@ def passwdAccessLDAP(LDAPServer, BaseDn, AdminUser):
 # Split up a name into multiple components. This tries to best guess how
 # to split up a name
 def NameSplit(Name):
 # Split up a name into multiple components. This tries to best guess how
 # to split up a name
 def NameSplit(Name):
-   Words = re.split(" ",string.strip(Name));
+   Words = re.split(" ", Name.strip())
 
    # Insert an empty middle name
    if (len(Words) == 2):
 
    # Insert an empty middle name
    if (len(Words) == 2):
@@ -176,7 +195,7 @@ def NameSplit(Name):
       Words.append('');
    
    # Merge any of the last name prefixes into one big last name
       Words.append('');
    
    # Merge any of the last name prefixes into one big last name
-   while LastNamesPre.has_key(string.lower(Words[-2])):
+   while LastNamesPre.has_key(Words[-2].lower()):
       Words[-1] = Words[-2] + " " + Words[-1];
       del Words[-2];
 
       Words[-1] = Words[-2] + " " + Words[-1];
       del Words[-2];
 
@@ -187,10 +206,10 @@ def NameSplit(Name):
    # If the name is multi-word then we glob them all into the last name and
    # do not worry about a middle name
    if (len(Words) > 3):
    # If the name is multi-word then we glob them all into the last name and
    # do not worry about a middle name
    if (len(Words) > 3):
-      Words[2] = string.join(Words[1:]);
+      Words[2] = " ".join(Words[1:])
       Words[1] = "";
 
       Words[1] = "";
 
-   return (string.strip(Words[0]),string.strip(Words[1]),string.strip(Words[2]));
+   return (Words[0].strip(), Words[1].strip(), Words[2].strip());
 
 # Compute a random password using /dev/urandom
 def GenPass():   
 
 # Compute a random password using /dev/urandom
 def GenPass():   
@@ -247,7 +266,7 @@ def FlushOutstanding(l,Outstanding,Fast=0):
 # Convert a lat/long attribute into Decimal degrees
 def DecDegree(Posn,Anon=0):
   Parts = re.match('[-+]?(\d*)\\.?(\d*)',Posn).groups();
 # Convert a lat/long attribute into Decimal degrees
 def DecDegree(Posn,Anon=0):
   Parts = re.match('[-+]?(\d*)\\.?(\d*)',Posn).groups();
-  Val = string.atof(Posn);
+  Val = float(Posn);
 
   if (abs(Val) >= 1806060.0):
      raise ValueError,"Too Big";
 
   if (abs(Val) >= 1806060.0):
      raise ValueError,"Too Big";
@@ -318,12 +337,12 @@ def FormatPGPKey(Str):
          I = I + 4;
    else:
       Res = Str;
          I = I + 4;
    else:
       Res = Str;
-   return string.strip(Res);
+   return Res.strip()
 
 # Take an email address and split it into 3 parts, (Name,UID,Domain)
 def SplitEmail(Addr):
    # Is not an email address at all
 
 # Take an email address and split it into 3 parts, (Name,UID,Domain)
 def SplitEmail(Addr):
    # Is not an email address at all
-   if string.find(Addr,'@') == -1:
+   if Addr.find('@') == -1:
       return (Addr,"","");
   
    Res1 = rfc822.AddrlistClass(Addr).getaddress();
       return (Addr,"","");
   
    Res1 = rfc822.AddrlistClass(Addr).getaddress();
@@ -335,7 +354,7 @@ def SplitEmail(Addr):
 
    # If there is no @ then the address was not parsed well. Try the alternate
    # Parsing scheme. This is particularly important when scanning PGP keys.
 
    # If there is no @ then the address was not parsed well. Try the alternate
    # Parsing scheme. This is particularly important when scanning PGP keys.
-   Res2 = string.split(Res1[1],"@");
+   Res2 = Res1[1].split("@");
    if len(Res2) != 2:
       Match = AddressSplit.match(Addr);
       if Match == None:
    if len(Res2) != 2:
       Match = AddressSplit.match(Addr);
       if Match == None:
@@ -396,8 +415,8 @@ def GetUID(l,Name,UnknownMap = {}):
          # deals with special purpose keys like 'James Troup (Alternate Debian key)'
         # Some people put their names backwards on their key too.. check that as well
          if len(Attrs) == 1 and \
          # deals with special purpose keys like 'James Troup (Alternate Debian key)'
         # Some people put their names backwards on their key too.. check that as well
          if len(Attrs) == 1 and \
-            (string.find(string.lower(sn),string.lower(Attrs[0][1]["sn"][0])) != -1 or \
-            string.find(string.lower(cn),string.lower(Attrs[0][1]["sn"][0])) != -1):
+            ( sn.lower().find(Attrs[0][1]["sn"][0].lower()) != -1 or \
+              cn.lower().find(Attrs[0][1]["sn"][0].lower()) != -1 ):
             Stat = EmailAppend+" hit for "+str(Name);
             return (Name[1],[Stat]);
 
             Stat = EmailAppend+" hit for "+str(Name);
             return (Name[1],[Stat]);