X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=userdir_ldap.py;h=1b4299c695f17ecdd234aaf27a756b1b808d4e8a;hb=efc48e4f01ce7f402a4c793727bf776bcf083c05;hp=d70167d9e3682fc21d086d2b998a6083332a4f29;hpb=fea6354172af1a49210329337dcf8daaa0778af1;p=mirror%2Fuserdir-ldap.git diff --git a/userdir_ldap.py b/userdir_ldap.py index d70167d..1b4299c 100644 --- a/userdir_ldap.py +++ b/userdir_ldap.py @@ -1,5 +1,23 @@ +# Copyright (c) 1999-2000 Jason Gunthorpe +# Copyright (c) 2001-2003 Ryan Murray +# Copyright (c) 2004-2005 Joey Schulze +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# 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, whrandom, crypt, rfc822; +import termios, re, string, imp, ldap, sys, crypt, rfc822; import userdir_gpg try: @@ -30,7 +48,16 @@ userdir_gpg.SetKeyrings(string.split(ConfModule.keyrings,":")); LastNamesPre = {"van": None, "von": None, "le": None, "de": None, "di": None}; # This is a list of common groups on Debian hosts -DebianGroups = {"Debian": 800, "guest": 60000} +DebianGroups = { + "Debian": 800, + "guest": 60000, + "nogroup": 65534 + } + +# ObjectClasses for different object types +UserObjectClasses = ("top", "inetOrgPerson", "debianAccount", "shadowAccount", "debianDeveloper") +RoleObjectClasses = ("top", "debianAccount", "shadowAccount", "debianRoleAccount") +GroupObjectClasses = ("top", "debianGroup") # SSH Key splitting. The result is: # (options,size,modulous,exponent,comment) @@ -80,12 +107,42 @@ def getpass(prompt = "Password: "): new[3] = new[3] & ~termios.ECHO; # lflags try: termios.tcsetattr(fd, termios.TCSADRAIN, new); - passwd = raw_input(prompt); + try: + passwd = raw_input(prompt); + except KeyboardInterrupt: + termios.tcsetattr(fd, termios.TCSADRAIN, old); + print + sys.exit(0) + except EOFError: + passwd = "" finally: termios.tcsetattr(fd, termios.TCSADRAIN, old); print; return passwd; +def passwdAccessLDAP(LDAPServer, BaseDn, AdminUser): + """ + Ask for the AdminUser's password and connect to the LDAP server. + Returns the connection handle. + """ + print "Accessing LDAP directory as '" + AdminUser + "'"; + while (1): + Password = getpass(AdminUser + "'s password: "); + + if len(Password) == 0: + sys.exit(0) + + l = ldap.open(LDAPServer); + UserDn = "uid=" + AdminUser + "," + BaseDn; + + # Connect to the ldap server + try: + l.simple_bind_s(UserDn,Password); + except ldap.INVALID_CREDENTIALS: + continue + break + return l + # Split up a name into multiple components. This tries to best guess how # to split up a name def NameSplit(Name): @@ -359,9 +416,18 @@ def GetUID(l,Name,UnknownMap = {}): return (None,None); -def Group2GID(name): - """Returns the numerical id of a common group""" +def Group2GID(l, name): + """ + Returns the numerical id of a common group + on error returns -1 + """ for g in DebianGroups.keys(): if name == g: return DebianGroups[g] - return name + + filter = "(gid=%s)" % name + res = l.search_s(BaseDn,ldap.SCOPE_ONELEVEL,filter,["gidNumber"]); + if res: + return int(GetAttr(res[0], "gidNumber")) + + return -1