This is a snapshot of Indico's old Trac site. Any information contained herein is most probably outdated. Access our new GitHub site here.

Ticket #600: indico_ldap.patch

File indico_ldap.patch, 23.0 KB (added by makub, 5 years ago)

A patch made by diff against the 0.97_rc2 release of Indico

  • authentication/AuthenticationMgr.py

    diff -urNB --exclude-from=files.txt /root/orig_cds_indico-0.97_rc2-py2.5.egg/MaKaC/authentication/AuthenticationMgr.py ./authentication/AuthenticationMgr.py
    old new  
    3737            if auth == "Nice": 
    3838                from MaKaC.authentication.NiceAuthentication import NiceAuthenticator 
    3939                self.AuthenticatorList.append( NiceAuthenticator() ) 
     40            if auth == "LDAP": 
     41                from MaKaC.authentication.LdapAuthentication import LdapAuthenticator 
     42                self.AuthenticatorList.append( LdapAuthenticator() ) 
    4043        self.create = True 
    4144 
    4245 
  • authentication/LdapAuthentication.py

    diff -urNB --exclude-from=files.txt /root/orig_cds_indico-0.97_rc2-py2.5.egg/MaKaC/authentication/LdapAuthentication.py ./authentication/LdapAuthentication.py
    old new  
     1# -*- coding: utf-8 -*- 
     2## 
     3## LDAP authentication fo Indico 
     4## 
     5## written by Martin Kuba makub@ics.muni.cz 
     6# 
     7# This code expects a simple LDAP structure with users on one level like: 
     8# 
     9# dn: uid=john,ou=people,dc=example,dc=com 
     10# objectClass: inetOrgPerson 
     11# uid: john 
     12# cn: John Doe 
     13# mail: john@example.com 
     14# o: Example Inc. 
     15# postalAddress: Example Inc., Some City, Some Country 
     16#  
     17# and groups listing their members by DNs, like: 
     18# 
     19# dn: cn=somegroup,ou=groups,dc=example,dc=com 
     20# objectClass: groupOfNames 
     21# cn: somegroup 
     22# member: uid=john,ou=people,dc=example,dc=com 
     23# member: uid=alice,ou=people,dc=example,dc=com 
     24# member: uid=bob,ou=people,dc=example,dc=com 
     25# description: Just a group of people ... 
     26# 
     27# Adjust it to your needs if your LDAP structure is different. 
     28 
     29 
     30import ldap 
     31import os 
     32import time 
     33import sys 
     34import re 
     35 
     36from MaKaC.common.general import * 
     37from MaKaC.authentication.baseAuthentication import Authenthicator, PIdentity 
     38from MaKaC.errors import MaKaCError 
     39 
     40from MaKaC.common.logger import Logger 
     41from MaKaC.common import Configuration 
     42from MaKaC.common.Configuration import Config 
     43 
     44 
     45class LdapAuthenticator(Authenthicator): 
     46    idxName = "LdapIdentities" 
     47    id = 'LDAP' 
     48    name = 'LDAP' 
     49    description = "LDAP Login" 
     50 
     51    def __init__(self): 
     52        Authenthicator.__init__(self) 
     53        self.UserCreator = LdapUserCreator() 
     54     
     55    def createIdentity(self, li, avatar): 
     56        Logger.get("LdapAuthenticator").info("createIdentity(login="+li.getLogin()+",avatar="+avatar.getName()+" "+avatar.getSurName()+")"); 
     57        if LdapChecker().check(li.getLogin(), li.getPassword()): 
     58            return LdapIdentity( li.getLogin(), avatar ) 
     59        else: 
     60            return None 
     61     
     62class LdapIdentity(PIdentity): 
     63    def __str__(self):  
     64        return '<LdapIdentity{login:'+self.getLogin()+',tag:'+self.getAuthenticatorTag()+'}>' 
     65    def authenticate( self, id ): 
     66        "id is MaKaC.user.LoginInfo instance, self.user is Avatar" 
     67        Logger.get('LdapIdentity').info("authenticate("+id.getLogin()+")") 
     68        data = LdapChecker().check(id.getLogin(), id.getPassword()) 
     69        if data: 
     70                if self.getLogin() == id.getLogin(): 
     71                    #modify Avatar with the up-to-date info from LDAP 
     72                    av = self.user 
     73                    if 'postalAddress' in data: 
     74                        postalAddress=fromLDAPmultiline(data['postalAddress']) 
     75                        if av.getAddress()!=postalAddress: 
     76                            av.setAddress(postalAddress) 
     77                            Logger.get('LdapIdentity').debug("authenticate("+id.getLogin()+") modified address to "+postalAddress); 
     78                    if 'cn' in data: 
     79                        name = data.get('cn'); 
     80                        firstName = name.split(None,1)[0] 
     81                        surName = name.split(None,1)[-1] 
     82                        if av.getName()!=firstName: 
     83                            av.setName(firstName) 
     84                            Logger.get('LdapIdentity').debug("authenticate("+id.getLogin()+") modified name to "+firstName) 
     85                        if av.getSurName()!=surName: 
     86                            av.setSurName(surName) 
     87                            Logger.get('LdapIdentity').debug("authenticate("+id.getLogin()+") modified surName to "+surName) 
     88                    org = None 
     89                    if 'ou' in data and data.get('ou')!='other' and data.get('ou'): 
     90                        org = data.get('ou') 
     91                    elif 'o' in data: 
     92                        org = data.get('o') 
     93                    if org!=av.getOrganisation(): 
     94                        av.setOrganisation(org) 
     95                        Logger.get('LdapIdentity').debug("authenticate("+id.getLogin()+") modified org to "+org) 
     96                    if 'mail' in data: 
     97                        mail = data['mail'] 
     98                        if mail!= av.getEmail(): 
     99                            av.setEmail(mail) 
     100                            Logger.get('LdapIdentity').debug("authenticate("+id.getLogin()+") modified email to "+mail) 
     101                    return self.user 
     102                else: 
     103                    return None 
     104        return None 
     105    def getAuthenticatorTag(self): 
     106        return LdapAuthenticator.getId() 
     107 
     108def objectAttributes(result_data,attributeNames): 
     109    """adds selected attributes""" 
     110    object = {'dn':result_data[0][0]} 
     111    mapa = result_data[0][1] 
     112    for name in attributeNames: 
     113        addAttribute(object,mapa,name) 
     114    return object 
     115 
     116def addAttribute(object,attrMap,attrName): 
     117    """safely adds attribute""" 
     118    if attrName in attrMap: 
     119        attr = attrMap[attrName] 
     120        if len(attr)==1: 
     121            object[attrName]=attr[0] 
     122        else: 
     123            object[attrName]=attr 
     124 
     125# handles communication with the LDAP server specified in indico.conf 
     126# 
     127# defualt values as specified in Configuration.py are 
     128# LDAPhost="ldap.example.com" 
     129# LDAPpeopleDN="ou=people,dc=example,dc=com" 
     130# LDAPgroupsDN="ou=groups,dc=example,dc=com" 
     131# 
     132# the code expects the users to be (in the LDAP) objects of type inetOrgPerson 
     133# identified by thier "uid" attribute, and the groups to be objects of type groupOfNames 
     134# with the "member" multivalued attribute containing complete DNs of users 
     135# which seems to be the standard LDAP setup 
     136# 
     137class LdapLDAP: 
     138    l = None 
     139    def __init__(self): 
     140        conf = Configuration.Config.getInstance() 
     141        self.ldapHost = conf.getLDAPhost() 
     142        self.ldapPeopleDN = conf.getLDAPpeopleDN() 
     143        self.ldapGroupsDN = conf.getLDAPgroupsDN() 
     144    # opens an anonymous LDAP connection 
     145    def open(self): 
     146        self.l = ldap.open(self.ldapHost) 
     147        self.l.protocol_version = ldap.VERSION3 
     148        return self.l 
     149    # verifies username and password by binding to the LDAP server 
     150    def openAsUser(self,userName,password): 
     151        self.open() 
     152        self.l.simple_bind_s("uid="+userName+","+self.ldapPeopleDN, password) 
     153    # closes LDAP connection 
     154    def close(self): 
     155        self.l.unbind_s() 
     156        l = None 
     157    # finds a user in LDAP 
     158    # returns a map containing dn,cn,uid,mail,o,ou and postalAddress as keys and strings as values 
     159    # returns None if a user is not found 
     160    def lookupUser(self,uid): 
     161        ldap_result_id = self.l.search("uid="+uid+","+self.ldapPeopleDN, ldap.SCOPE_BASE, "objectClass=inetOrgPerson") 
     162        while 1: 
     163            result_type, result_data = self.l.result(ldap_result_id, 0) 
     164            if (result_data == []): 
     165                break 
     166            else: 
     167                if result_type == ldap.RES_SEARCH_ENTRY: 
     168                    return objectAttributes(result_data,['uid','cn','mail','o','ou','postalAddress']) 
     169        return None 
     170    # finds users according to a specified filter 
     171    def findUsers(self,filter): 
     172        dict = {} 
     173        ldap_result_id = self.l.search(self.ldapPeopleDN, ldap.SCOPE_SUBTREE, filter) 
     174        while 1: 
     175                result_type, result_data = self.l.result(ldap_result_id, 0) 
     176                if (result_data == []): 
     177                    break 
     178                else: 
     179                    if result_type == ldap.RES_SEARCH_ENTRY: 
     180                        ret = objectAttributes(result_data,['uid','cn','mail','o','ou','postalAddress']) 
     181                        av= dictToAv(ret) 
     182                        dict[ret['mail']] = av 
     183        return dict 
     184 
     185    # finds a group in LDAP 
     186    # returns an array of groups matching the group name, each group is represented 
     187    # by a map with keys cn and description 
     188    def findGroups(self,name,exact): 
     189        if exact==0: 
     190            star='*' 
     191        else: 
     192            star='' 
     193        name = name.strip() 
     194        if len(name)>0: 
     195            filter='(&(objectClass=groupOfNames)(cn='+star+name+star+'))' 
     196        else: 
     197            return [] 
     198        ldap_result_id = self.l.search(self.ldapGroupsDN, ldap.SCOPE_SUBTREE, filter) 
     199        groupDicts = [] 
     200        while 1: 
     201            result_type, result_data = self.l.result(ldap_result_id, 0) 
     202            if (result_data == []): 
     203                break 
     204            else: 
     205                if result_type == ldap.RES_SEARCH_ENTRY: 
     206                    groupDicts.append( objectAttributes(result_data,['cn','description'])) 
     207        return groupDicts 
     208    # finds uids of users referenced by the member attribute of the group LDAP object 
     209    def findGroupMemberUids(self,name): 
     210        ldap_result_id = self.l.search("cn="+name+","+self.ldapGroupsDN, ldap.SCOPE_BASE, "objectClass=groupOfNames") 
     211        members = None 
     212        while 1: 
     213            result_type, result_data = self.l.result(ldap_result_id, 0) 
     214            if (result_data == []): 
     215                break 
     216            else: 
     217                if result_type == ldap.RES_SEARCH_ENTRY: 
     218                    members = result_data[0][1]['member'] 
     219        if not members: 
     220            return [] 
     221        memberUids = [] 
     222        for memberDN in members: 
     223            m = re.search('uid=([^,]*),',memberDN) 
     224            if m: 
     225                uid = m.group(1) 
     226                memberUids.append( uid )  
     227        return memberUids 
     228 
     229class LdapChecker: 
     230    def check(self, userName, password): 
     231        try: 
     232            ret = {} 
     233            ldapLdap = LdapLDAP() 
     234            ldapLdap.openAsUser(userName,password) 
     235            ret = ldapLdap.lookupUser(userName) 
     236            ldapLdap.close() 
     237            Logger.get('LdapChecker').debug("Username: %s checked: %s"%(userName,ret)) 
     238            return ret 
     239        except ldap.INVALID_CREDENTIALS, e: 
     240            Logger.get('LdapChecker').warn("Username: %s - invalid credentials"%userName) 
     241            return None 
     242 
     243#conversion for inetOrgPerson.postalAddress attribute that can contain newlines encoded following the RFC 2252 
     244def fromLDAPmultiline(s): 
     245    if s: 
     246        return s.replace('$',"\r\n").replace('\\24','$').replace('\\5c','\\') 
     247    else: 
     248        return s 
     249 
     250class LdapUserCreator: 
     251    def create(self, li): 
     252        Logger.get('LdapUserCreator').info("create("+li.getLogin()+",password=****)") 
     253        # first, check if authentication is OK 
     254        data = LdapChecker().check(li.getLogin(), li.getPassword()) 
     255        if not data: 
     256            return None 
     257         
     258        # Search if user already exist, using email address 
     259        import MaKaC.user as user 
     260        ah = user.AvatarHolder() 
     261        userList = ah.match({"email":data["mail"]}, forceWithoutExtAuth=True) 
     262        if len(userList) == 0: 
     263            # User doesn't exist, create it 
     264            try: 
     265                av = user.Avatar() 
     266                name = data.get('cn'); 
     267                av.setName(name.split()[0]) 
     268                av.setSurName(name.split()[-1]) 
     269                av.setOrganisation(data.get('o', "")) 
     270                av.setEmail(data['mail']) 
     271                if 'postalAddress' in data: 
     272                    av.setAddress(fromLDAPmultiline(data.get('postalAddress'))) 
     273                #av.setTelephone(data.get('telephonenumber',"")) 
     274                ah.add(av) 
     275                av.activateAccount() 
     276            except KeyError, e: 
     277                raise MaKaCError("LDAP account does not contain the mandatory data to create \ 
     278                                  an Indico account. You can create an Indico \ 
     279                                  account manually in order to use your LDAP login"%(urlHandlers.UHUserRegistration.getURL())) 
     280        else: 
     281            # user founded 
     282            av = userList[0] 
     283        #now create the nice identity for the user 
     284        na = LdapAuthenticator() 
     285        id = na.createIdentity( li, av) 
     286        na.add(id) 
     287        return av 
     288 
     289 
     290# for MaKaC.externUsers 
     291def dictToAv(ret): 
     292    av= {} 
     293    av["email"] = [ret['mail']] 
     294    av["name"]= ret['cn'].split()[0] 
     295    av["surName"]= ret['cn'].split()[-1] 
     296    if 'o' in ret: 
     297        av["organisation"] = [ret['o']] 
     298    else: 
     299        av["organisation"] = [''] 
     300    if 'postalAddress' in ret: 
     301        av['address'] = [ fromLDAPmultiline(ret['postalAddress']) ] 
     302    av["id"] = 'LDAP:'+ret['uid'] 
     303    av["status"] = "NotCreated" 
     304    av["login"] = ret['uid'] 
     305    return av 
     306 
     307def is_empty(dict,key): 
     308    if key not in dict: 
     309        return False 
     310    if dict[key]: 
     311        return True 
     312    else: 
     313        return False 
     314 
     315class LdapUser: 
     316 
     317    def match(self, criteria, exact=0): 
     318        Logger.get('LdapUser').debug("match(criteria"+str(criteria)+",exact="+str(exact)+")") 
     319        allEmpty=True 
     320        filter='objectClass=inetOrgPerson' 
     321        if exact==0: 
     322            star='*' 
     323        else: 
     324            star='' 
     325        for k, v in criteria.items(): 
     326            if k=='email' and len(v.strip())>0: 
     327                filter='&('+filter+')(mail='+star+v+star+')' 
     328                allEmpty=False 
     329            elif k=='name' and len(v.strip())>0: 
     330                filter='&('+filter+')(cn='+star+v+star+')' 
     331                allEmpty=False 
     332            elif k=='surName' and len(v.strip())>0: 
     333                filter='&('+filter+')(sn='+star+v+star+')' 
     334                allEmpty=False 
     335            elif k=='organisation' and len(v.strip())>0: 
     336                filter='&('+filter+')(|(o='+star+v+star+')(ou='+star+v+star+'))' 
     337                allEmpty=False 
     338            elif k=='login' and len(v.strip())>0: 
     339                filter='&('+filter+')(uid='+star+v+star+')' 
     340                allEmpty=False 
     341        if allEmpty: 
     342            return {} 
     343        filter='('+filter+')' 
     344        ldapLdap = LdapLDAP() 
     345        ldapLdap.open() 
     346        dict = ldapLdap.findUsers(filter)  
     347        ldapLdap.close() 
     348        return dict 
     349 
     350    def getById(self, id): 
     351        Logger.get('LdapUser').debug("getById('"+str(id)+"')") 
     352        ldapLdap = LdapLDAP() 
     353        l = ldapLdap.open() 
     354        ret = ldapLdap.lookupUser(id) 
     355        ldapLdap.close() 
     356        if(ret==None): 
     357             return None 
     358        av = dictToAv(ret) 
     359        av["id"] = id 
     360        av["identity"] = LdapIdentity 
     361        av["authenticator"] = LdapAuthenticator() 
     362        return av 
     363 
     364def ldapFindGroups(name,exact): 
     365    ldapLdap = LdapLDAP() 
     366    ldapLdap.open() 
     367    ret = ldapLdap.findGroups(name,exact) 
     368    ldapLdap.close() 
     369    return ret 
     370     
     371def ldapFindGroupMemberUids(name):     
     372    ldapLdap = LdapLDAP() 
     373    ldapLdap.open() 
     374    ret = ldapLdap.findGroupMemberUids(name) 
     375    ldapLdap.close() 
     376    return ret 
  • common/Configuration.py

    diff -urNB --exclude-from=files.txt /root/orig_cds_indico-0.97_rc2-py2.5.egg/MaKaC/common/Configuration.py ./common/Configuration.py
    old new  
    418418            'ApacheUser'                : 'nobody', 
    419419            'ApacheGroup'               : 'nogroup', 
    420420            'Profile'                   : 'no', 
     421            #LDAP auth 
     422            'LDAPhost'                  : 'ldap.example.com', 
     423            'LDAPpeopleDN'              : 'ou=people,dc=example,dc=com', 
     424            'LDAPgroupsDN'              : 'ou=groups,dc=example,dc=com', 
    421425 
    422426            # Room Booking Related 
    423427            'LightboxCssStylesheetName' : "lightbox/lightbox.css", 
  • common/ObjectHolders.py

    diff -urNB --exclude-from=files.txt /root/orig_cds_indico-0.97_rc2-py2.5.egg/MaKaC/common/ObjectHolders.py ./common/ObjectHolders.py
    old new  
    5353    """ 
    5454    __allowedIdxs = ["conferences", "avatars", "groups", "counters",  
    5555                    "identities", "principals", "categories",  
    56                     "localidentities", "niceidentities", "groupsregistration",  
     56                    "localidentities", "niceidentities", "ldapidentities", "groupsregistration",  
    5757                    "fieldsregistration", "registrationform", "domains", "indexes", 
    5858                    "trashcan", "roomsmapping", "deletedobject", "shorturl", "modules", "plugins"] 
    5959    idxName = None 
  • externUsers.py

    diff -urNB --exclude-from=files.txt /root/orig_cds_indico-0.97_rc2-py2.5.egg/MaKaC/externUsers.py ./externUsers.py
    old new  
    2727from MaKaC.common.Configuration import Config 
    2828from MaKaC.i18n import _ 
    2929from MaKaC.errors import MaKaCError 
     30from MaKaC.authentication.LdapAuthentication import LdapAuthenticator, LdapUser 
    3031 
    3132class ExtUserHolder: 
    3233    def __init__(self): 
    33         self.extUserList = {"Nice":NiceUser} 
     34        self.extUserList = {"Nice":NiceUser, LdapAuthenticator.getId():LdapUser} 
    3435 
    3536    def getById(self, id): 
    3637        if id in self.extUserList.keys(): 
     
    230231            if doc.getElementsByTagName("login")[0].childNodes: 
    231232                login = doc.getElementsByTagName("login")[0].childNodes[0].nodeValue.encode("utf-8") 
    232233        av["login"] = login 
    233         return av 
    234  No newline at end of file 
     234        return av 
  • user.py

    diff -urNB --exclude-from=files.txt /root/orig_cds_indico-0.97_rc2-py2.5.egg/MaKaC/user.py ./user.py
    old new  
    324324    def __init__(self,criteria={}): 
    325325        filters.FilterCriteria.__init__(self,None,criteria) 
    326326 
     327#makub 
     328from MaKaC.authentication.LdapAuthentication import LdapAuthenticator, ldapFindGroups, ldapFindGroupMemberUids 
     329 
     330class LdapGroup(Group): 
     331    groupType = "LDAP" 
     332    def __str__(self): 
     333        return "LdapGroup{id:"+self.getId()+',name:'+self.getName()+',desc:'+self.getDescription() 
     334 
     335    def addMember( self, newMember ): 
     336        egiLog('LdapGroup','addMember('+str(newMember)+')') 
     337        pass 
     338 
     339    def removeMember( self, member ): 
     340        egiLog('LdapGroup','removeMember('+str(newMember)+')') 
     341        pass 
     342 
     343    def getMemberList( self ): 
     344        uidList = ldapFindGroupMemberUids(self.getName()) 
     345        avatarLists = [] 
     346        for uid in uidList: 
     347            # First, try localy (fast) 
     348            lst = AvatarHolder().match( { 'login': uid }, exact = 1, forceWithoutExtAuth = True ) 
     349            if not lst: 
     350                # If not found, try external 
     351                lst = AvatarHolder().match( { 'login': uid }, exact =1 ) 
     352            avatarLists.append( lst ) 
     353        return [ avList[0] for avList in avatarLists if avList ] 
     354 
     355    # used when checking acces to private events restricted for certain groups 
     356    def containsUser( self, avatar ): 
     357        if not avatar: 
     358            return False 
     359        login = None 
     360        for id in avatar.getIdentityList(): 
     361            if id.getAuthenticatorTag()=='LDAP': 
     362                login = id.getLogin() 
     363        if not login: 
     364            return False 
     365        uidList = ldapFindGroupMemberUids(self.getName()) 
     366        ret = login in uidList 
     367        return ret 
     368 
     369    # not implemented in CERNGroup, is it used for anything ? 
     370    def containsMember( self, avatar ): 
     371        return 0 
     372 
     373class EGIGroup(LdapGroup): 
     374    "Legacy group" 
     375#makub end 
     376 
     377 
    327378 
    328379class GroupHolder(ObjectHolder): 
    329380    """ 
     
    384435            crit["name"] = crit["groupname"] 
    385436        if "Nice" in Config.getInstance().getAuthenticatorList() and not forceWithoutExtAuth: 
    386437            self.updateCERNGroupMatch(crit["name"][0],exact) 
     438        if "LDAP" in Config.getInstance().getAuthenticatorList() and not forceWithoutExtAuth: 
     439            self.updateLdapGroupMatch(crit["name"][0],exact) 
    387440        match = self.getIndex().matchGroup(crit["name"][0], exact=exact) 
    388441 
    389442        if match != None: 
     
    393446                    result.append(gr) 
    394447        return result 
    395448 
     449    def updateLdapGroupMatch(self, name, exact=False): 
     450           logger.Logger.get('GroupHolder').debug("updateLdapGroupMatch(name="+name+")") 
     451           for grDict in ldapFindGroups(name, exact): 
     452               grName = grDict['cn'] 
     453               if not self.hasKey(grName): 
     454                   gr = LdapGroup() 
     455                   gr.setId(grName) 
     456                   gr.setName(grName) 
     457                   gr.setDescription('LDAP group: '+grDict['description']) 
     458                   self.add(gr) 
     459                   logger.Logger.get('GroupHolder').debug("updateLdapGroupMatch() added"+str(gr)) 
     460 
     461 
    396462    def updateCERNGroupMatch(self, name, exact=False): 
    397463        if not exact: 
    398464            name = "*%s*" % name 
     
    13951461        if not forceWithoutExtAuth: 
    13961462            euh = ExtUserHolder() 
    13971463            from MaKaC.authentication import NiceAuthentication 
     1464            from MaKaC.authentication import LdapAuthentication 
    13981465            for authId in Config.getInstance().getAuthenticatorList(): 
    13991466                if not authId == "Local": 
    14001467                    dict = euh.getById(authId).match(criteria, exact=exact) 
    1401                     auth = NiceAuthentication.NiceAuthenticator() 
    1402  
    1403  
     1468                    if authId == "Nice": 
     1469                        auth = NiceAuthentication.NiceAuthenticator() 
     1470                    elif authId == "LDAP": 
     1471                        auth = LdapAuthentication.LdapAuthenticator() 
     1472                    else: 
     1473                       raise MaKaCError( _("Authentication type "+authId+" is not known."))  
    14041474                    for email in dict.keys(): 
    14051475                        # TODO and TOSTUDY: result.keys should be replace it with 
    14061476                        # l=[]; for av in result.values(): l.append(av.getAllEmails()) 
  • webinterface/pages/admins.py

    diff -urNB --exclude-from=files.txt /root/orig_cds_indico-0.97_rc2-py2.5.egg/MaKaC/webinterface/pages/admins.py ./webinterface/pages/admins.py
    old new  
    18611861        else: 
    18621862            self.__setGroupVars( self._group, vars ) 
    18631863            vars["locator"] = self._group.getLocator().getWebForm() 
    1864             if isinstance(self._group, CERNGroup): 
     1864            if isinstance(self._group, CERNGroup) or isinstance(self._group, user.LdapGroup): 
    18651865                vars["allowModif"] = False 
    18661866        return vars 
    18671867