Changeset 92


Ignore:
Timestamp:
05/12/09 16:40:07 (15 years ago)
Author:
nanardon
Message:
  • allow to set memberUID everywhere
Location:
LATMOS-Accounts/lib/LATMOS/Accounts/Bases
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad/Group.pm

    r91 r92  
    3939sub _key_attr { 'cn' }  
    4040 
     41sub _delayed_fields { 
     42    my ($self)= @_; 
     43    return qw(memberUID member); 
     44} 
     45 
    4146sub _canonical_fields { 
    4247    my ($self, $base, $mode) = @_; 
    4348    ( 
    44         qw(gidNumber description sAMAccountName member), 
     49        qw(gidNumber description sAMAccountName member memberUID), 
    4550        ($mode !~ /w/ 
    4651            ? qw(cn dn) 
     
    8489            }, 
    8590        ); 
     91        sort(@res); 
    8692        return \@res 
     93    }; 
     94    $field eq 'memberUID' and do { 
     95        my $val = $self->SUPER::get_field($field); 
     96        return ref $val ? $val : [ grep { $_ } $val ]; 
    8797    }; 
    8898    $self->SUPER::get_field($field); 
     
    93103    my %ndata; 
    94104    while (my ($f, $val) = each(%data)) { 
     105        $f eq 'memberUID' and do { 
     106            my %users; 
     107            $users{$_}{e} = 1 foreach (@{ $self->get_field('memberUID') || []}); 
     108            $users{$_}{n} = 1 foreach (@{ $val || []}); 
     109            foreach (keys %users) { 
     110                $users{$_}{e} && $users{$_}{n} and next; 
     111                my $user = $self->base->get_object('user', $_) or next; 
     112                if ($users{$_}{e}) { 
     113                    $self->{entry}->del(memberUID => $_); 
     114                } elsif ($users{$_}{n}) { 
     115                    $self->{entry}->add(memberUID => $_); 
     116                } # else {} # can't happen 
     117                my $mesg = $self->{entry}->update($self->base->ldap); 
     118                if ($mesg->code) { 
     119                    warn $mesg->error; 
     120                } 
     121            } 
     122            next; 
     123        }; 
    95124        $f eq 'member' and do { 
    96125            my %users; 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad/User.pm

    r91 r92  
    3939sub _key_attr { 'cn' }  
    4040 
     41sub _delayed_fields { 
     42    my ($self)= @_; 
     43    return qw(memberOf); 
     44} 
     45 
    4146sub _canonical_fields { 
    4247    my ($self, $base, $mode) = @_; 
     
    5560        ipPhone otherTelephone department 
    5661        title modbile homePhone 
     62        memberOf 
    5763        ), 
    5864        ($mode !~ /w/ 
    59             ? qw(cn dn uSNCreated uSNChanged memberOf) 
     65            ? qw(cn dn uSNCreated uSNChanged) 
    6066            : () 
    6167        ) 
     
    9298} 
    9399 
     100sub get_field { 
     101    my ($self, $field) = @_; 
     102 
     103    $field eq 'memberOf' and do { 
     104        my @res; 
     105        $self->base->_unlimited_search( 
     106            base => $self->base->object_base_dn('group'), 
     107            filter => sprintf( 
     108                '(&(objectClass=group)(member=%s))', 
     109                escape_filter_value($self->{entry}->dn), 
     110            ), 
     111            callback => sub { 
     112                my ($mesg, $entry) = @_; 
     113                ref $entry eq 'Net::LDAP::Entry' or return; 
     114                push(@res, $entry->get_value('cn')); 
     115            }, 
     116        ); 
     117        sort(@res); 
     118        return \@res 
     119    }; 
     120    $self->SUPER::get_field($field); 
     121} 
     122 
     123sub set_fields { 
     124    my ($self, %data) = @_; 
     125    my %ndata; 
     126    while (my ($f, $val) = each(%data)) { 
     127        $f eq 'memberOf' and do { 
     128            my %users; 
     129            $users{$_}{e} = 1 foreach (@{ $self->get_field('memberOf') || []}); 
     130            $users{$_}{n} = 1 foreach (@{ $val || []}); 
     131            foreach (keys %users) { 
     132                $users{$_}{e} && $users{$_}{n} and next; 
     133                my $user = $self->base->get_object('group', $_) or next; 
     134                if ($users{$_}{e}) { 
     135                    $self->{entry}->del(memberOf => $user->get_field('dn')); 
     136                } elsif ($users{$_}{n}) { 
     137                    $self->{entry}->add(memberOf => $user->get_field('dn')); 
     138                } # else {} # can't happen 
     139                my $mesg = $self->{entry}->update($self->base->ldap); 
     140                if ($mesg->code) { 
     141                    warn $mesg->error; 
     142                } 
     143            } 
     144            next; 
     145        }; 
     146        $ndata{$f} = $val; 
     147    } 
     148    $self->SUPER::set_fields(%ndata); 
     149} 
     150 
    941511; 
    95152 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad/objects.pm

    r81 r92  
    108108 
    109109    $field eq 'dn' and return $self->{entry}->dn; 
    110     return $self->{entry}->get_value($field); 
     110    my ($first, @others) = $self->{entry}->get_value($field); 
     111    return @others ? [ sort($first, @others) ] : $first; 
    111112} 
    112113 
     
    132133} 
    133134 
    134 sub get_group_users { 
    135     my ($self, $groupname, @searchargs) = @_; 
    136     my $gr = $self->get_group($groupname, attrs => [ qw(cn member) ]); 
    137  
    138     my @res; 
    139     foreach my $dnu (@{ $gr->get_value('member', asref => 1) || [] }) { 
    140         my $mesg = $self->search( 
    141             filter => '(objectClass=*)', # TODO can we get something else than user ? 
    142             @searchargs, 
    143             base => $dnu, 
    144         ); 
    145  
    146         $mesg->code and return; # ensure error is propagate here 
    147         foreach my $entry ($mesg->entries) { 
    148            push(@res, $entry); 
    149        }  
    150     } 
    151     @res 
    152 } 
    153  
    154 sub get_user_groups { 
    155     my ($self, $username, @searchargs) = @_; 
    156     my $user = $self->get_user($username); 
    157  
    158     my @res; 
    159     $self->unlimited_search( 
    160         base => $self->top_dn, 
    161         filter => sprintf( 
    162             '(&(objectClass=group)(member=%s))', 
    163             escape_filter_value($user->dn), 
    164         ), 
    165         @searchargs, 
    166         callback => sub { 
    167             my ($mesg, $entry) = @_; 
    168             ref $entry eq 'Net::LDAP::Entry' or return; 
    169             push(@res, $entry); 
    170         }, 
    171     ); 
    172  
    173     @res 
    174 } 
    175  
    176 sub add_user_group { 
    177     my ($self, $username, $groupname) = @_; 
    178  
    179     my $user = $self->get_user($username) or return; 
    180     my $group = $self->get_group($groupname) or return; 
    181  
    182     $group->add(member => $user->dn); 
    183  
    184     my $mesg = $group->update($self); 
    185     if ($mesg->code) { 
    186         warn $mesg->error; 
    187         return; 
    188     } else { return 1 }; 
    189 } 
    190  
    1911351; 
    192136 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/User.pm

    r89 r92  
    4242 
    4343sub has_extended_attributes { 1 } 
     44 
     45sub _delayed_fields { 
     46    my ($self)= @_; 
     47    return qw(memberOf); 
     48} 
    4449 
    4550sub _inline_fields { 
Note: See TracChangeset for help on using the changeset viewer.