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 |
__PACKAGE__->mk_accessors( qw(ldap server dn password current_search) ); |
our @config_fields = qw( server dn password base ); |
10 |
|
Jifty->log->debug("using fields from configuration: ",dump( @config_fields )); |
11 |
|
__PACKAGE__->mk_accessors( qw(ldap current_search), @config_fields ); |
12 |
|
|
13 |
|
|
14 |
=head1 NAME |
=head1 NAME |
36 |
my $ldap_config = Jifty->config->app('LDAP'); |
my $ldap_config = Jifty->config->app('LDAP'); |
37 |
Jifty->log->debug( "config->app(LDAP) = ",dump( $ldap_config ) ); |
Jifty->log->debug( "config->app(LDAP) = ",dump( $ldap_config ) ); |
38 |
|
|
39 |
$args->{server} ||= $ldap_config->{Server}; |
foreach my $f ( @config_fields ) { |
40 |
$args->{dn} ||= $ldap_config->{DN}; |
if ( my $v = $ldap_config->{$f} ) { |
41 |
$args->{password} ||= $ldap_config->{Password}; |
$args->{$f} = $v; |
42 |
|
} |
43 |
|
} |
44 |
|
|
45 |
my $ldap = Net::LDAP->new( $args->{server} ) or die "$@"; |
my $ldap = Net::LDAP->new( $args->{server} ) or die "$@"; |
46 |
|
|
58 |
=head2 search |
=head2 search |
59 |
|
|
60 |
my $msg = A3C::LDAP->search( |
my $msg = A3C::LDAP->search( |
61 |
base => 'dc=skole,dc=hr', |
base => 'dc=skole,dc=hr', |
62 |
filter => '(objectClass=hrEduOrg)', |
filter => '(objectClass=hrEduOrg)', |
63 |
sizelimit => 10, |
sizelimit => 10, |
64 |
); |
); |
65 |
|
|
66 |
=cut |
=cut |
70 |
|
|
71 |
my $search = $self->ldap->search( @_ ); |
my $search = $self->ldap->search( @_ ); |
72 |
if ( $search->code != 0 ) { |
if ( $search->code != 0 ) { |
73 |
Jifty->log->error( $search->error ); |
Jifty->log->error( $search->error, ' for ', dump( @_ ) ); |
74 |
} |
} |
75 |
return $self->current_search( $search ); |
return $self->current_search( $search ); |
76 |
} |
} |
102 |
$self->current_search->count; |
$self->current_search->count; |
103 |
} |
} |
104 |
|
|
105 |
|
=head2 as_collection_of |
106 |
|
|
107 |
|
my $connection = $ldap->collection( |
108 |
|
# name of model to use |
109 |
|
'Organization', |
110 |
|
# optional params |
111 |
|
limit => $limit, |
112 |
|
); |
113 |
|
|
114 |
|
=cut |
115 |
|
|
116 |
|
my $collection2filter = { |
117 |
|
'User' => '(objectClass=hrEduPerson)', |
118 |
|
'Organization' => '(objectClass=hrEduOrg)', |
119 |
|
}; |
120 |
|
|
121 |
|
sub collection { |
122 |
|
my $self = shift; |
123 |
|
my $model = shift or die "no model?"; |
124 |
|
my $args = {@_}; |
125 |
|
|
126 |
|
$args->{limit} ||= 0; # unlimited by default |
127 |
|
|
128 |
|
my $filter = $collection2filter->{$model}; |
129 |
|
die "unknown model $model" unless $filter; |
130 |
|
|
131 |
|
$self->search( |
132 |
|
base => $self->base, |
133 |
|
filter => $filter, |
134 |
|
sizelimit => $args->{limit}, |
135 |
|
); |
136 |
|
|
137 |
|
Jifty->log->info( |
138 |
|
"searching LDAP for $model with $filter ", |
139 |
|
$args->{limit} ? 'limit ' . $args->{limit} : '', |
140 |
|
'returned ', $self->count, ' results' |
141 |
|
); |
142 |
|
|
143 |
|
my $class = Jifty->app_class('Model', $model . 'Collection' ) or die "can't create ${model}Collection"; |
144 |
|
my $collection = $class->new() or die "can't $class->new"; |
145 |
|
|
146 |
|
while ( my $entry = $self->next ) { |
147 |
|
my $model_obj = Jifty->app_class('Model',$model)->new; |
148 |
|
#warn dump( $model_obj ); |
149 |
|
my $additional; |
150 |
|
# if ( $model eq 'User' ) { |
151 |
|
# my $organization = A3C::Model::Organization->new; |
152 |
|
# $self->ldap2model( $organization, $entry ); |
153 |
|
# $additional->{organization} = $organization; |
154 |
|
# } |
155 |
|
$self->ldap2model( $model_obj, $entry, %$additional ); |
156 |
|
$collection->add_record( $model_obj ); |
157 |
|
} |
158 |
|
|
159 |
|
return $collection; |
160 |
|
} |
161 |
|
|
162 |
|
=head1 INTERNAL METHODS |
163 |
|
|
164 |
|
Following methods map directly into L<Net::LDAP> |
165 |
|
|
166 |
|
=head2 current_search |
167 |
|
|
168 |
|
Result of last C<< $ldap->search >> request |
169 |
|
|
170 |
|
=head2 model_to_entry |
171 |
|
|
172 |
|
$ldap->model_to_entry( $model, $entry, $additional ); |
173 |
|
|
174 |
|
=cut |
175 |
|
|
176 |
|
sub ldap2model { |
177 |
|
my ( $self, $model, $entry, $additional ) = @_; |
178 |
|
my $data; |
179 |
|
|
180 |
|
my @columns = map { $_->name } $model->columns; |
181 |
|
#warn "# columns = ",dump( @columns ); |
182 |
|
|
183 |
|
foreach my $attr ( $entry->attributes ) { |
184 |
|
if ( grep(/^\Q$attr\E$/, @columns ) ) { |
185 |
|
$data->{$attr} = $entry->get_value( $attr ); |
186 |
|
} elsif ( $attr !~ m/^(objectClass)$/i ) { |
187 |
|
Jifty->log->warn(ref($model)," doesn't have $attr"); |
188 |
|
} |
189 |
|
} |
190 |
|
|
191 |
|
Jifty->log->debug( ref($model), ' = ', dump( $data ) ); |
192 |
|
|
193 |
|
my ( $id, $message ) = $model->load_or_create( %$data, %$additional ); |
194 |
|
|
195 |
|
if ( $id ) { |
196 |
|
Jifty->log->info( $message || 'Added', ' ', ref($model), ' ', $model->id, ' ', $model->name ); |
197 |
|
} else { |
198 |
|
Jifty->log->error( ref($model), " ", $message ); |
199 |
|
} |
200 |
|
} |
201 |
|
|
202 |
|
|
203 |
|
|
204 |
1; |
1; |