11 Person - High level interface for address books using an LDAP-backend.
23 facsimileTelephoneNumber => 1,
28 homePostalAddress => 1,
37 officephone => 'telephoneNumber',
38 fax => 'facsimileTelephoneNumber',
41 firstname => 'givenName',
42 homephone => 'homePhone',
43 address => 'homePostalAddress',
46 cellphone => 'mobile',
58 =item Person-E<gt>B<connect> (I<$server>, I<$bind_dn>, I<$password>, I<$base_dn>, [I<$port>])
60 Connects to the LDAP-Server given.
69 my $bind_dn = $opts{'bind_dn'};
70 my $base_dn = $opts{'base_dn'};
71 my $uri = $opts{'uri'};
72 my $passwd = $opts{'password'};
76 $Ldap = Net::LDAP->new ($uri);
78 $msg = $Ldap->bind ($bind_dn, password => $passwd);
79 if ($msg->is_error ())
81 warn ('LDAP bind failed: ' . $msg->error_text ());
85 $Config{'base_dn'} = $base_dn;
90 =item Person-E<gt>B<disconnect> ()
92 Disconnect from the LDAP-Server.
102 =item Person-E<gt>B<new> (I<$ldap_entry>)
104 Created a new I<Person>-object from the passed I<Net::LDAP::Entry>-object.
114 $obj->{'dn'} = $entry->dn ();
115 $obj->{'ldap'} = $entry;
117 for (keys %ValidFields)
120 $obj->{$key} = $entry->get_value ($key, asref => $ValidFields{$key});
123 return (bless ($obj, $pkg));
126 =item Person-E<gt>B<load> (I<$cn>)
128 Loads the given CN and returns the B<Person>-object.
137 my ($retval) = search ($pkg, [[cn => $cn]]);
141 warn ("CN '$cn' could not be found");
148 =item Person-E<gt>B<create> (B<lastname> =E<gt> I<$lastname>, B<firstname> =E<gt> I<$firstname>, ...)
150 Create a new I<Net::LDAP::Entry>-object and return it's corresponding
160 my $entry = Net::LDAP::Entry->new ();
164 $entry->add (objectClass => [qw(top organizationalUnit person organizationalPerson inetOrgPerson)]);
169 my $val = $hash{$key};
170 my $field = defined ($ExternalNames{$key}) ? $ExternalNames{$key} : $key;
172 if (!defined ($ValidFields{$field}))
174 warn ("Invalid field $field");
178 if ($ValidFields{$field})
180 if (ref ($val) eq 'ARRAY')
182 $entry->add ($field => [@$val]) if (@$val);
186 $entry->add ($field => [$val]) if ($val);
190 warn ("You cannot pass ref-type " . ref ($val));
196 if (ref ($val) eq 'ARRAY')
206 warn ("You cannot pass ref-type " . ref ($val));
209 $entry->add ($field => $val) if (defined ($val) and $val);
213 my $sn = $entry->get_value ('sn');
214 my $gn = $entry->get_value ('givenName');
216 if (!defined ($sn) or !defined ($gn))
218 warn ("sn or givenName not given");
222 $dn = "cn=$sn $gn," . $Config{'base_dn'};
223 ($ou) = $Config{'base_dn'} =~ m/\bou\s*=\s*([^,]+)/i;
225 $entry->add (cn => "$sn $gn", ou => $ou);
229 $entry->dump (*STDOUT);
232 $entry->changetype ('add');
233 my $mesg = $entry->update ($Ldap);
235 if ($mesg->is_error ())
237 warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
241 return (new ($pkg, $entry));
244 =item Person-E<gt>B<search> (B<firstname> =E<gt> I<"Flor*">)
246 Search for the given patterns. Returns a list of I<Person>-objects.
251 [field => value], # OR
280 $field = $ExternalNames{$field} if (defined ($ExternalNames{$field}));
281 if (!defined ($ValidFields{$field}))
283 warn ("Not a valid field: $field");
287 $value =~ s/([\(\)\\])/\\$1/g;
289 push (@disjunc, "($field=$value)");
294 push (@konjunct, join ('', '(|', @disjunc, ')'));
300 $filter = join ('', '(&(objectclass=inetOrgPerson)', @konjunct, ')');
304 $filter = '(objectclass=inetOrgPerson)';
307 #print STDERR "Debug: using filter: $filter";
309 $mesg = $Ldap->search
311 base => $Config{'base_dn'},
315 if ($mesg->is_error ())
317 warn ("Error while querying LDAP server: " . $mesg->error_text ());
321 for ($mesg->entries ())
324 my $obj = new ($pkg, $entry);
326 push (@retval, $obj);
332 =item I<$obj>-E<gt>B<delete> ()
341 my $entry = $obj->{'ldap'};
343 $entry->changetype ('delete');
345 $entry->update ($Ldap);
350 =item I<$obj>-E<gt>B<lastname> ([I<$lastname>])
352 Get or set the lastname.
359 my $entry = $obj->{'ldap'};
360 my $sn = $obj->{'sn'};
361 my $gn = $obj->{'givenName'};
363 my $dn = "cn=$cn," . $Config{'base_dn'};
367 print STDERR "This is _update_dn, trying to set dn=$dn";
369 $entry->changetype ('modify');
370 $entry->replace (sn => $sn, givenName => $gn, cn => $cn);
371 $entry->update ($Ldap);
373 $entry->update ($Ldap);
382 $obj->{'sn'} = shift;
386 return ($obj->{'sn'});
389 =item I<$obj>-E<gt>B<firstname> ([I<$firstname>])
391 Get or set the firstname.
401 $obj->{'givenName'} = shift;
405 return ($obj->{'givenName'});
408 =item I<$obj>-E<gt>B<name> ()
417 return ($obj->{'cn'});
420 =item I<$obj>-E<gt>B<address> ([I<@address>])
422 =item I<$obj>-E<gt>B<homephone> ([I<@homephone>])
424 =item I<$obj>-E<gt>B<cellphone> ([I<@cellphone>])
426 =item I<$obj>-E<gt>B<officephone> ([I<@officephone>])
428 =item I<$obj>-E<gt>B<fax> ([I<@fax>])
430 =item I<$obj>-E<gt>B<mail> ([I<@mail>])
432 =item I<$obj>-E<gt>B<uri> ([I<@uri>])
434 =item I<$obj>-E<gt>B<group> ([I<@groups>])
436 Get or set the attribute.
444 my $field = $Person::AUTOLOAD;
446 return (undef) unless ($field);
450 return (set ($obj, $field, @values ? [@values] : undef))
458 return (set ($obj, $field, undef));
465 my $value = @_ ? shift : undef;
466 my $entry = $obj->{'ldap'};
468 if (defined ($ExternalNames{$field}))
470 $field = $ExternalNames{$field};
472 if (!defined ($ValidFields{$field}))
477 if (defined ($value))
479 $entry->changetype ('modify');
481 if ($ValidFields{$field})
483 $entry->replace ($field, [@$value]);
484 $obj->{$field} = $value;
488 splice (@$value, 1) if (scalar (@$value) > 1);
489 $entry->replace ($field, $value);
490 $obj->{$field} = $value->[0];
493 $entry->update ($Ldap);
496 $obj->{$field} = [] unless (defined ($obj->{$field}));
498 if (wantarray () and $ValidFields{$field})
500 return (@{$obj->{$field}});
504 return ($obj->{$field});
512 my ($search) = $dn =~ m/cn\s*=\s*([^,]+)/i;
514 die unless ($search);
519 my $mesg = $Ldap->search
521 base => $Config{'base_dn'},
522 filter => "(cn=$search)"
525 if ($mesg->is_error ())
527 warn ("Error while querying LDAP server: " . $mesg->error_text ());
531 for ($mesg->entries ())
534 my ($t_cn) = $e->get_value ('cn', asref => 0);
535 my ($t_id) = $e->get_value ('uid', asref => 0);
550 my $entry = $obj->{'ldap'};
556 $entry->changetype ('modify');
557 $entry->replace (userPassword => $pwd);
558 $entry->update ($Ldap);
561 $pwd = $entry->get_value ('userPassword');
568 Florian octo Forster E<lt>octo at verplant.orgE<gt>