Ignore:
Timestamp:
02/03/16 05:29:32 (8 years ago)
Author:
nanardon
Message:

Properly handle rename when key_attr != dn_attr

Location:
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ldap
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ldap/User.pm

    r1702 r1705  
    4343 
    4444sub _key_attr { 'cn' }  
     45 
     46sub _key_attribute { 
     47    my ($self, $base) = @_; 
     48    $base ||= $self->base; 
     49 
     50    $base->config($self->type . '_key_attribute') || 'uid'; 
     51} 
    4552 
    4653sub _my_ldap_classes { qw( 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ldap/objects.pm

    r1616 r1705  
    146146 
    147147    my $mesg; 
    148     if ($class->_key_attribute($base) eq 
     148 
     149    if ($class->_key_attribute($base) ne 
    149150                $class->_dn_attribute($base)) { 
    150         $mesg = $base->ldap->moddn( $obj->{entry}, 
    151             newrdn => $class->_dn_attribute($base) . '=' .  escape_filter_value($newuid), 
    152             deleteoldrdn => 1,) 
    153     } else { 
    154         $obj->{entry}->replace($class->_key_attribute($base), $newuid); 
    155         $mesg = $obj->{entry}->update($base->ldap); 
    156     } 
     151 
     152        my $entry = $obj->{entry}->clone; 
     153        $entry->add( 
     154            $class->_key_attribute($base), 
     155            $newuid 
     156        ); 
     157        $mesg = $entry->update($base->ldap); 
     158        if ($mesg->code && $mesg->code ne 20) { 
     159            $base->log(LA_ERR, "Cannot update key_attribute for object %s: %s", $uid, $mesg->error); 
     160            return; 
     161        } 
     162    } 
     163 
     164 
     165    $mesg = $base->ldap->moddn( 
     166        $obj->{entry}, 
     167        newrdn => $class->_dn_attribute($base) . '=' .  escape_filter_value($newuid), 
     168        deleteoldrdn => 1, 
     169    ); 
     170    if ($mesg->code) { 
     171        $base->log(LA_ERR, "Cannot rename object %s: %s", $uid, $mesg->error); 
     172        return; 
     173    } 
     174 
     175    $mesg = $base->ldap->search( 
     176        filter => sprintf( 
     177            '(&%s (%s=%s))', 
     178            $class->_class_filter, 
     179            $class->_key_attribute($base), 
     180            escape_filter_value($newuid), 
     181        ), 
     182        base => $base->object_base_dn($class->type), 
     183        attrs => [ $class->_canonical_fields($base, 'r') ], 
     184    ); 
     185 
     186    if ($mesg->code)  { 
     187        $base->log(LA_ERR, 'Cannot fetch %s/%s: %s', $class->type, $uid, $mesg->code); 
     188        return; 
     189    } 
     190 
     191    my ($entry, @others) = $mesg->entries; 
     192 
     193    $obj->{entry} = $entry; 
     194 
     195    $obj->{entry}->replace( 
     196        $class->_key_attribute($base), 
     197        $newuid 
     198    ); 
     199    $mesg = $obj->{entry}->update($base->ldap); 
    157200 
    158201    if ($mesg->code) { 
Note: See TracChangeset for help on using the changeset viewer.