Changeset 71


Ignore:
Timestamp:
05/05/09 02:24:50 (15 years ago)
Author:
nanardon
Message:
  • make objects path configurable
Location:
LATMOS-Accounts/lib/LATMOS/Accounts/Bases
Files:
5 edited

Legend:

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

    r63 r71  
    3939Create a new LATMOS::Ad object for windows AD $domain. 
    4040 
    41 domain / server: either the Ad domain or directly the server 
    42  
    43 ldap_args is an optionnal list of arguments to pass to L<Net::LDAP>. 
     41options: 
     42 
     43=over 4 
     44 
     45=item domain 
     46 
     47The Active directory domain 
     48 
     49=item server (optional) 
     50 
     51If set, try to connect to this server, if not set, a dns query is performed 
     52to find AD server, first responding is used. 
     53 
     54=item ssl 
     55 
     56If set, try to connect using ssl 
     57 
     58=item OBJECT_container 
     59 
     60The sub path where to find object type of OBJECT and where they should 
     61be created 
     62 
     63=back 
    4464 
    4565=cut 
     
    5676        _password => $options{password}, 
    5777        _ssl => $options{ssl}, 
     78        _param => { %options }, 
    5879    }; 
    5980 
    6081    bless($self, $class); 
     82} 
     83 
     84sub param { 
     85    my ($self, $var) = @_; 
     86    return $self->{_param}{$var} 
     87} 
     88 
     89sub object_base_dn { 
     90    my ($self, $otype) = @_; 
     91    warn $otype; 
     92    return join(',', 
     93        ($self->param($otype . '_container') || 'cn=Users'), 
     94        $self->top_dn, 
     95    ); 
    6196} 
    6297 
     
    191226} 
    192227 
    193 sub find_username { 
    194     my ($self, $lastname, $firstname) = @_; 
    195     if (!ref $self) { # if call w/o ldap connection 
    196         ($self, $lastname, $firstname) = (undef, $self, $lastname); 
    197     } 
    198  
    199     my $username = _username_format($lastname); 
    200     if (!$self) { return $username } 
    201  
    202     if (!$self->get_user($lastname, attrs => [ 'cn' ])) { 
    203         return $username; 
    204     } 
    205  
    206     foreach $username (map { _username_format($_) } ( 
    207             $lastname . substr($firstname, 0, 1), 
    208             $lastname . $firstname, 
    209         )) { 
    210         !$self->get_user($username, attrs => [ 'cn' ]) and return $username; 
    211     } 
    212  
    213     undef 
    214 } 
    215  
    216 sub _defaults_user_attrs { 
    217     my ($self, $entry, $attrs) = @_; 
    218  
    219     foreach my $attr (keys %{ $attrs || {} }) { 
    220         my $val = $attrs->{$attr}; 
    221  
    222         $attr =~ /^homeDirectory$/ and do { 
    223             $entry->replace('unixHomeDirectory', $val); 
    224         }; 
    225  
    226         $attr =~ /^(givenName|sn)$/ and do { 
    227             $entry->replace('displayName', 
    228                 join(' ', map { ucfirst($_ || '') } ( 
    229                     ($attrs->{'givenName'} || $entry->get_value('givenName')), # first name 
    230                     ($attrs->{'sn'} || $entry->get_value('sn')),           # last name 
    231                 )) 
    232             ); 
    233             $entry->replace('gecos', # TODO reencode to aovid accents 
    234                 join(' ', map { ucfirst($_ || '') } ( 
    235                     ($attrs->{'givenName'} || $entry->get_value('givenName')), # first name 
    236                     ($attrs->{'sn'} || $entry->get_value('sn')),           # last name 
    237                 )) 
    238             ); 
    239             $attr eq 'sn' and do { # TODO generate clean login here / UNIX uid 
    240                 $entry->add('sAMAccountName' => $val) unless ($entry->exists('sAMAccountName')); 
    241             }; 
    242         }; 
    243  
    244         # nothing special to do 
    245         $entry->replace($attr => $val); 
    246     } 
    247 } 
    248  
    249228sub _defaults_group_attrs { 
    250229    my ($self, $entry, $attrs) = @_; 
     
    253232        $entry->replace($attr => $val); 
    254233    } 
    255 } 
    256  
    257 =head2 get_user($username) 
    258  
    259 Return the entry for user $username 
    260  
    261 =cut 
    262  
    263 sub get_user { 
    264     my ($self, $username, @search_args) = @_; 
    265  
    266     my $mesg = $self->search( 
    267         @search_args, 
    268         filter => "(&(ObjectClass=user) (!(ObjectClass=computer)) (cn=$username))", 
    269         base => $self->top_dn, 
    270     ); 
    271  
    272     $mesg->code and return; 
    273  
    274     my ($entry, @others) = $mesg->entries; 
    275  
    276     return if(@others); # we cannot have multiple entries... 
    277     $entry 
    278 } 
    279  
    280 =head2 modify_user($username, $param) 
    281  
    282 =cut 
    283  
    284 sub modify_user { 
    285     my ($self, $username, $param) = @_; 
    286  
    287     my $mesg = $self->search( 
    288         base => $self->{_top_dn}, 
    289         filter => "(&(ObjectClass=user) (!(ObjectClass=computer)) (cn=$username))", 
    290     ); 
    291  
    292     $mesg->code and do { 
    293         warn $mesg->error; 
    294         return; 
    295     }; 
    296  
    297     my ($entry) = $mesg->entries; # TODO hopefully only one... 
    298  
    299     $self->_defaults_user_attrs( 
    300         $entry, 
    301         $param, 
    302     ); 
    303  
    304     $mesg = $entry->update($self); 
    305  
    306     if ($mesg->code) { 
    307         warn $mesg->error; 
    308         return; 
    309     } else { return 1 } 
    310 } 
    311  
    312 =head2 delete_user($username) 
    313  
    314 =cut 
    315  
    316 sub delete_user { 
    317     my ($self, $username) = @_; 
    318  
    319     my $mesg = $self->search( 
    320         base => $self->{_top_dn}, 
    321         filter => "(&(ObjectClass=user) (!(ObjectClass=computer)) (cn=$username))", 
    322     ); 
    323  
    324     $mesg->code and do { 
    325         warn $mesg->error; 
    326         return; 
    327     }; 
    328  
    329     my ($entry) = $mesg->entries; # TODO hopefully one 
    330  
    331     $mesg = $self->delete($entry->dn); 
    332  
    333     if ($mesg->code) { 
    334         warn $mesg->error; 
    335         return; 
    336     } else { return 1 } 
    337 } 
    338  
    339 =head2 create_group 
    340  
    341 =cut 
    342  
    343 sub create_group { 
    344     my ($self, $param) = @_; 
    345  
    346     my $entry = Net::LDAP::Entry->new; 
    347  
    348     my $groupname = $param->{name}; 
    349     $entry->dn("cn=$groupname,cn=Users," . $self->top_dn); 
    350  
    351     $param->{gidNumber} ||= $self->find_next_gid; 
    352  
    353     $self->_defaults_group_attrs($entry, 
    354         { 
    355             objectClass => [ qw(top group) ], 
    356             %{ $param || {} }, 
    357         } 
    358     ); 
    359  
    360     my $mesg = $self->add($entry); 
    361  
    362     if ($mesg->code) { 
    363         warn $mesg->error; 
    364         return; 
    365     } else { return 1 }; 
    366 } 
    367  
    368 =head2 delete_group 
    369  
    370 =cut 
    371  
    372 sub delete_group { 
    373     my ($self, $groupname) = @_; 
    374      
    375     my $mesg = $self->search( 
    376         base => $self->{_top_dn}, 
    377         filter => "(&(ObjectClass=group) (cn=$groupname))", 
    378     ); 
    379  
    380     $mesg->code and do { 
    381         warn $mesg->error; 
    382         return; 
    383     }; 
    384  
    385     my ($entry) = $mesg->entries; # TODO hopefully one 
    386  
    387     $mesg = $self->delete($entry->dn); 
    388  
    389     if ($mesg->code) { 
    390         warn $mesg->error; 
    391         return; 
    392     } else { return 1 } 
    393234} 
    394235 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad/Group.pm

    r69 r71  
    5757    $entry->dn(join(',', 
    5858        sprintf('cn=%s', escape_filter_value($id)), 
    59         'cn=Users', 
    60         $base->top_dn 
     59        $base->object_base_dn($class->type), 
    6160    )); 
    6261    $entry->replace(objectClass => [ qw(top group)],); 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad/User.pm

    r69 r71  
    7676    $entry->dn(join(',', 
    7777        sprintf('cn=%s', escape_filter_value($id)), 
    78         'cn=Users', 
    79         $base->top_dn 
     78        $base->object_base_dn($class->type), 
    8079    )); 
    8180    $entry->replace('sAMAccountName', $id); 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad/objects.pm

    r69 r71  
    4242    my $xx = $base->_unlimited_search( 
    4343        attrs => [ $class->_key_attr ], 
    44         base => $base->top_dn, 
     44        base => $base->object_base_dn($class->type), 
    4545        filter => $class->_class_filter, 
    4646        callback => sub { 
     
    7676            escape_filter_value($uid), 
    7777        ), 
    78         base => $base->top_dn, 
     78        base => $base->object_base_dn($class->type), 
    7979    ); 
    8080 
  • LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Objects.pm

    r66 r71  
    8585sub type { 
    8686    my ($self) = @_; 
    87     return $self->{_type} 
     87    if (ref $self) { 
     88        return $self->{_type} 
     89    } else { 
     90        return lc(($self =~ /::([^:]+)$/)[0]); 
     91    } 
    8892} 
    8993 
Note: See TracChangeset for help on using the changeset viewer.