/[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

Contents of /lib/A3C/LDAP.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 47 - (show annotations)
Mon Mar 31 21:11:45 2008 UTC (16 years ago) by dpavlin
File size: 4145 byte(s)
make optional parametars named
1 package A3C::LDAP;
2
3 use strict;
4 use warnings;
5
6 use Net::LDAP;
7 use Data::Dump qw/dump/;
8 use base qw(Jifty::Object Class::Accessor::Fast);
9 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
15
16 A3C::LDAP
17
18 =head1 DESCRIPTION
19
20 This object turn L<Net::LDAP> into something with looks like
21 L<Jifty::Collection>
22
23 =head1 METHODS
24
25 =head2 new
26
27 my $ldap = A3C::LDAP->new;
28
29 =cut
30
31 sub new {
32 my $class = shift;
33
34 my $args = { @_ };
35
36 my $ldap_config = Jifty->config->app('LDAP');
37 Jifty->log->debug( "config->app(LDAP) = ",dump( $ldap_config ) );
38
39 foreach my $f ( @config_fields ) {
40 if ( my $v = $ldap_config->{$f} ) {
41 $args->{$f} = $v;
42 }
43 }
44
45 my $ldap = Net::LDAP->new( $args->{server} ) or die "$@";
46
47 # an anonymous bind
48 #$ldap->bind;
49 $ldap->bind( $args->{dn}, password => $args->{password} );
50
51 Jifty->log->info("Connected to ", $args->{server}, " with DN ", $args->{dn});
52
53 $args->{ldap} = $ldap;
54
55 $class->SUPER::new( $args );
56 }
57
58 =head2 search
59
60 my $msg = A3C::LDAP->search(
61 base => 'dc=skole,dc=hr',
62 filter => '(objectClass=hrEduOrg)',
63 sizelimit => 10,
64 );
65
66 =cut
67
68 sub search {
69 my $self = shift;
70
71 my $search = $self->ldap->search( @_ );
72 if ( $search->code != 0 ) {
73 Jifty->log->error( $search->error, ' for ', dump( @_ ) );
74 }
75 return $self->current_search( $search );
76 }
77
78 =head2 next
79
80 Syntaxtic shugar to look more like L<Jifty::DBI::Collection>
81
82 my $entry = ldap->next;
83
84 =cut
85
86 sub next {
87 my $self = shift;
88
89 die "no current LDAP search" unless $self->current_search;
90
91 return $self->current_search->shift_entry;
92 }
93
94 =head2 count
95
96 my $search_results = $ldap->count;
97
98 =cut
99
100 sub count {
101 my $self = shift;
102 $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;

  ViewVC Help
Powered by ViewVC 1.1.26