diff --git a/base/univention-python/modules/uldap.py b/base/univention-python/modules/uldap.py index 580feb2..85345a6 100644 --- a/base/univention-python/modules/uldap.py +++ b/base/univention-python/modules/uldap.py @@ -462,11 +462,14 @@ def modify(self, dn, changes, atomic=0): univention.debug.debug(univention.debug.LDAP, univention.debug.INFO, 'uldap.modify %s' % dn) + dn_parts = dict((x[0].lower(), x[1]) for x in ldap.dn.str2dn(dn)[0]) + dn_values = dict() rename=None ml=[] for key, oldvalue, newvalue in changes: - if dn.startswith(key+'='): - rename=key+'='+newvalue + if key.lower() in dn_parts: + dn_values[key.lower()] = newvalue + rename = True if oldvalue and newvalue: if oldvalue == newvalue: continue @@ -499,8 +502,10 @@ def modify(self, dn, changes, atomic=0): ml=self.__encode_entry(ml) if rename: univention.debug.debug(univention.debug.LDAP, univention.debug.WARN, 'rename %s' % rename) + rdn = [(x, dn_values.get(x.lower(), y), z) for x, y, z in ldap.dn.str2dn(dn)[0]] + rename = ldap.dn.dn2str([rdn]) self.lo.rename_s(dn, rename, None, delold=1) - dn=rename+dn[dn.find(','):] + dn = ldap.dn.dn2str([rdn] + ldap.dn.str2dn(dn)[1:]) if ml: try: self.lo.modify_s(dn, ml) diff --git a/management/univention-directory-manager-modules/modules/univention/admin/uldap.py b/management/univention-directory-manager-modules/modules/univention/admin/uldap.py index 6ec2be0..81ec3c2 100644 --- a/management/univention-directory-manager-modules/modules/univention/admin/uldap.py +++ b/management/univention-directory-manager-modules/modules/univention/admin/uldap.py @@ -147,10 +147,11 @@ def setDn(self, dn): self.__pos=string.join(dnlist, ',') components=explodeDn(self.__pos,0) for i in components: - mytype, ign = string.split(i,'=') - if mytype=='dc': - self.__indomain=1 - break + for x in i.split('+'): + mytype, ign = x.split('=', 1) + if mytype=='dc': + self.__indomain=1 + break except ValueError: raise univention.admin.uexceptions.noObject, _("DN not found: %s.") % dn @@ -171,7 +172,7 @@ def getDomain(self): components.reverse() domaincomponents=[] for i in components: - mytype, ign = string.split(i,'=') + mytype, ign = string.split(i,'=') # FIXME: doesn't recognize multiple components like cn=foo+dc=bar if mytype=='dc': domaincomponents.append(i) else: diff --git a/management/univention-management-console-module-udm/umc/python/udm/udm_ldap.py b/management/univention-management-console-module-udm/umc/python/udm/udm_ldap.py index 8514388..c757c13 100644 --- a/management/univention-management-console-module-udm/umc/python/udm/udm_ldap.py +++ b/management/univention-management-console-module-udm/umc/python/udm/udm_ldap.py @@ -333,6 +333,7 @@ def _tmp_cmp(i, j): @LDAP_Connection def create(self, ldap_object, container=None, superordinate=None, ldap_connection=None, ldap_position=None): """Creates a LDAP object""" + ldap_object = ldap_object.copy() if superordinate not in (None, 'None'): try: ldap_position.setDn(superordinate) @@ -419,6 +420,7 @@ def remove(self, ldap_dn, cleanup=False, recursive=False, ldap_connection=None, @LDAP_Connection def modify(self, ldap_object, ldap_connection=None, ldap_position=None): """Modifies a LDAP object""" + ldap_object = ldap_object.copy() superordinate = udm_objects.get_superordinate(self.module, None, ldap_connection, ldap_object['$dn$']) MODULE.info('Modifying object %s with superordinate %s' % (ldap_object['$dn$'], superordinate)) obj = self.module.object(None, ldap_connection, ldap_position, dn=ldap_object.get('$dn$'), superordinate=superordinate)