--- lib/A3C/LDAP.pm 2008/03/30 15:23:35 41 +++ lib/A3C/LDAP.pm 2008/03/30 16:58:21 42 @@ -6,7 +6,9 @@ use Net::LDAP; use Data::Dump qw/dump/; use base qw(Jifty::Object Class::Accessor::Fast); -__PACKAGE__->mk_accessors( qw(ldap server dn password current_search) ); +our @config_fields = qw( server dn password base ); +Jifty->log->debug("using fields from configuration: ",dump( @config_fields )); +__PACKAGE__->mk_accessors( qw(ldap current_search), @config_fields ); =head1 NAME @@ -34,9 +36,11 @@ my $ldap_config = Jifty->config->app('LDAP'); Jifty->log->debug( "config->app(LDAP) = ",dump( $ldap_config ) ); - $args->{server} ||= $ldap_config->{Server}; - $args->{dn} ||= $ldap_config->{DN}; - $args->{password} ||= $ldap_config->{Password}; + foreach my $f ( @config_fields ) { + if ( my $v = $ldap_config->{$f} ) { + $args->{$f} = $v; + } + } my $ldap = Net::LDAP->new( $args->{server} ) or die "$@"; @@ -54,9 +58,9 @@ =head2 search my $msg = A3C::LDAP->search( - base => 'dc=skole,dc=hr', - filter => '(objectClass=hrEduOrg)', - sizelimit => 10, + base => 'dc=skole,dc=hr', + filter => '(objectClass=hrEduOrg)', + sizelimit => 10, ); =cut @@ -66,7 +70,7 @@ my $search = $self->ldap->search( @_ ); if ( $search->code != 0 ) { - Jifty->log->error( $search->error ); + Jifty->log->error( $search->error, ' for ', dump( @_ ) ); } return $self->current_search( $search ); } @@ -98,6 +102,52 @@ $self->current_search->count; } +=head2 as_collection_of + + my $connection = $ldap->collection('Organization', $limit); + +=cut + +my $collection2filter = { + 'User' => '(objectClass=hrEduPerson)', + 'Organization' => '(objectClass=hrEduOrg)', +}; + +sub collection { + my ( $self, $model, $limit ) = @_; + + $limit ||= 100; # FIXME + + my $filter = $collection2filter->{$model}; + die "unknown model $model" unless $filter; + + $self->search( + base => $self->base, + filter => $filter, + sizelimit => $limit, + ); + + Jifty->log->info("searching LDAP for $model with $filter limit $limit returned ", $self->count, " results"); + + my $class = Jifty->app_class('Model', $model . 'Collection' ) or die "can't create ${model}Collection"; + my $collection = $class->new() or die "can't $class->new"; + + while ( my $entry = $self->next ) { + my $model_obj = Jifty->app_class('Model',$model)->new; + #warn dump( $model_obj ); + my $additional; +# if ( $model eq 'User' ) { +# my $organization = A3C::Model::Organization->new; +# $self->ldap2model( $organization, $entry ); +# $additional->{organization} = $organization; +# } + $self->ldap2model( $model_obj, $entry, %$additional ); + $collection->add_record( $model_obj ); + } + + return $collection; +} + =head1 INTERNAL METHODS Following methods map directly into L @@ -106,6 +156,38 @@ Result of last C<< $ldap->search >> request +=head2 model_to_entry + + $ldap->model_to_entry( $model, $entry, $additional ); + =cut +sub ldap2model { + my ( $self, $model, $entry, $additional ) = @_; + my $data; + + my @columns = map { $_->name } $model->columns; + #warn "# columns = ",dump( @columns ); + + foreach my $attr ( $entry->attributes ) { + if ( grep(/^\Q$attr\E$/, @columns ) ) { + $data->{$attr} = $entry->get_value( $attr ); + } elsif ( $attr !~ m/^(objectClass)$/i ) { + Jifty->log->error(ref($model)," doesn't have $attr"); + } + } + + Jifty->log->debug( ref($model), ' = ', dump( $data ) ); + + my ( $id, $message ) = $model->load_or_create( %$data, %$additional ); + + if ( $id ) { + Jifty->log->info( $message || 'Added', ' ', ref($model), ' ', $model->id ); + } else { + Jifty->log->error( ref($model), " ", $message ); + } +} + + + 1;