/[A3C]/lib/A3C/LDAP.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /lib/A3C/LDAP.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 47 by dpavlin, Mon Mar 31 21:11:45 2008 UTC revision 181 by dpavlin, Mon Jun 16 20:08:28 2008 UTC
# Line 6  use warnings; Line 6  use warnings;
6  use Net::LDAP;  use Net::LDAP;
7  use Data::Dump qw/dump/;  use Data::Dump qw/dump/;
8  use base qw(Jifty::Object Class::Accessor::Fast);  use base qw(Jifty::Object Class::Accessor::Fast);
9  our @config_fields = qw( server dn password base );  use Jifty;
10    our @config_fields = keys %{ Jifty->config->app('LDAP') };
11  Jifty->log->debug("using fields from configuration: ",dump( @config_fields ));  Jifty->log->debug("using fields from configuration: ",dump( @config_fields ));
12  __PACKAGE__->mk_accessors( qw(ldap current_search), @config_fields );  __PACKAGE__->mk_accessors( qw(ldap current_search), @config_fields );
13    
# Line 42  sub new { Line 43  sub new {
43                  }                  }
44          }          }
45    
46            # configuration sanity testing
47            foreach ( qw/server dn password base objectClass link/ ) {
48                    die "missing required field $_ in LDAP from etc/config.yaml" unless $args->{$_};
49            }
50            foreach ( qw/person organization/ ) {
51                    die "missing required field $_ in LDAP.objectClass.$_ from etc/config.yaml" unless $args->{objectClass}->{$_};
52            }
53            foreach ( qw/person_filter display_from value_from/ ) {
54                    die "missing required field $_ in LDAP.link.$_ from etc/config.yaml" unless $args->{link}->{$_};
55            }
56    
57          my $ldap = Net::LDAP->new( $args->{server} ) or die "$@";          my $ldap = Net::LDAP->new( $args->{server} ) or die "$@";
58    
59          # an anonymous bind          # an anonymous bind
# Line 102  sub count { Line 114  sub count {
114          $self->current_search->count;          $self->current_search->count;
115  }  }
116    
117  =head2 as_collection_of  =head2 collection
118    
119    my $connection = $ldap->collection(    my $connection = $ldap->collection(
120          # name of model to use          # name of model to use
121          'Organization',          $ldap->objectClass->{organization},
122          # optional params          # optional params
123          limit => $limit,          limit => $limit,
124            filter => '(uid=foobar)',
125    );    );
126    
127  =cut  =cut
128    
129  my $collection2filter = {  my $collection2filter = {
130          'User'                  => '(objectClass=hrEduPerson)',          'Person'                => '(objectClass=hrEduPerson)',
131          'Organization'  => '(objectClass=hrEduOrg)',          'Organization'  => '(objectClass=hrEduOrg)',
132  };  };
133    
# Line 126  sub collection { Line 139  sub collection {
139          $args->{limit} ||= 0;   # unlimited by default          $args->{limit} ||= 0;   # unlimited by default
140    
141          my $filter = $collection2filter->{$model};          my $filter = $collection2filter->{$model};
142          die "unknown model $model" unless $filter;  #       die "unknown model $model" unless $filter;
143            # fallback to model named as objectClass
144            $filter ||= "(objectClass=$model)";
145    
146            # add user filter
147            $filter = '(&' . $filter . $args->{filter} . ')' if $args->{filter};
148    
149          $self->search(          $self->search(
150                  base => $self->base,                  base => $self->base,
# Line 135  sub collection { Line 153  sub collection {
153          );          );
154    
155          Jifty->log->info(          Jifty->log->info(
156                  "searching LDAP for $model with $filter ",                  "Searching LDAP for $model with $filter ",
157                  $args->{limit} ? 'limit ' . $args->{limit} : '',                  $args->{limit} ? 'limit ' . $args->{limit} . ' ' : '',
158                  'returned ', $self->count, ' results'                  'returned ', $self->count, ' results'
159          );          );
160    
# Line 145  sub collection { Line 163  sub collection {
163    
164          while ( my $entry = $self->next ) {          while ( my $entry = $self->next ) {
165                  my $model_obj = Jifty->app_class('Model',$model)->new;                  my $model_obj = Jifty->app_class('Model',$model)->new;
                 #warn dump( $model_obj );  
166                  my $additional;                  my $additional;
167  #               if ( $model eq 'User' ) {                  $self->model_from_entry( $model_obj, $entry, %$additional );
 #                       my $organization = A3C::Model::Organization->new;  
 #                       $self->ldap2model( $organization, $entry );  
 #                       $additional->{organization} = $organization;  
 #               }  
                 $self->ldap2model( $model_obj, $entry, %$additional );  
168                  $collection->add_record( $model_obj );                  $collection->add_record( $model_obj );
169          }          }
170    
# Line 167  Following methods map directly into L<Ne Line 179  Following methods map directly into L<Ne
179    
180  Result of last C<< $ldap->search >> request  Result of last C<< $ldap->search >> request
181    
182  =head2 model_to_entry  =head2 model_from_entry
183    
184      $ldap->model_from_entry( $model, $entry, $additional );
185    
186    $ldap->model_to_entry( $model, $entry, $additional );  This method will join repeatable attributes by magic marker,
187    see C<XXX> in code!
188    
189  =cut  =cut
190    
191  sub ldap2model {  sub model_from_entry {
192          my ( $self, $model, $entry, $additional ) = @_;          my ( $self, $model, $entry, $additional ) = @_;
193          my $data;          my $data;
194    
# Line 182  sub ldap2model { Line 197  sub ldap2model {
197    
198          foreach my $attr ( $entry->attributes ) {          foreach my $attr ( $entry->attributes ) {
199                  if ( grep(/^\Q$attr\E$/, @columns ) ) {                  if ( grep(/^\Q$attr\E$/, @columns ) ) {
200                          $data->{$attr} = $entry->get_value( $attr );  #                       $data->{$attr} = $entry->get_value( $attr );
201                  } elsif ( $attr !~ m/^(objectClass)$/i ) {                          my @var = $entry->get_value( $attr );
202    #                       warn "--- $attr = ",dump( @var );
203                            # XXX this rolls repeatable values into single field
204                            my $var = join(' <*> ', @var);
205                            $data->{$attr} = $var;
206    #               } elsif ( $attr !~ m/^(objectClass)$/i ) {
207                    } else {
208                          Jifty->log->warn(ref($model)," doesn't have $attr");                          Jifty->log->warn(ref($model)," doesn't have $attr");
209                  }                  }
210          }          }

Legend:
Removed from v.47  
changed lines
  Added in v.181

  ViewVC Help
Powered by ViewVC 1.1.26