11 Person - High level interface for address books using an LDAP-backend.
23 facsimileTelephoneNumber => 1,
28 homePostalAddress => 1,
38 officephone => 'telephoneNumber',
39 fax => 'facsimileTelephoneNumber',
42 firstname => 'givenName',
43 homephone => 'homePhone',
44 address => 'homePostalAddress',
47 cellphone => 'mobile',
49 password => 'userPassword'
60 =item Person-E<gt>B<connect> (I<$server>, I<$bind_dn>, I<$password>, I<$base_dn>, [I<$port>])
62 Connects to the LDAP-Server given.
71 my $bind_dn = $opts{'bind_dn'};
72 my $base_dn = $opts{'base_dn'};
73 my $uri = $opts{'uri'};
74 my $passwd = $opts{'password'};
78 die unless ($bind_dn and $base_dn and $uri and defined ($passwd));
80 $Ldap = Net::LDAP->new ($uri);
82 $msg = $Ldap->bind ($bind_dn, password => $passwd);
83 if ($msg->is_error ())
85 warn ('LDAP bind failed: ' . $msg->error_text ());
89 $Config{'base_dn'} = $base_dn;
94 =item Person-E<gt>B<disconnect> ()
96 Disconnect from the LDAP-Server.
106 =item Person-E<gt>B<new> (I<$ldap_entry>)
108 Created a new I<Person>-object from the passed I<Net::LDAP::Entry>-object.
118 $obj->{'dn'} = $entry->dn ();
119 $obj->{'ldap'} = $entry;
121 for (keys %ValidFields)
124 $obj->{$key} = $entry->get_value ($key, asref => $ValidFields{$key});
127 return (bless ($obj, $pkg));
130 =item Person-E<gt>B<load> (I<$cn>)
132 Loads the given CN and returns the B<Person>-object.
141 my ($retval) = search ($pkg, [[cn => $cn]]);
145 warn ("CN '$cn' could not be found");
152 =item Person-E<gt>B<create> (B<lastname> =E<gt> I<$lastname>, B<firstname> =E<gt> I<$firstname>, ...)
154 Create a new I<Net::LDAP::Entry>-object and return it's corresponding
164 my $entry = Net::LDAP::Entry->new ();
168 $entry->add (objectClass => [qw(top organizationalUnit person organizationalPerson inetOrgPerson)]);
173 my $val = $hash{$key};
174 my $field = defined ($ExternalNames{$key}) ? $ExternalNames{$key} : $key;
176 if (!defined ($ValidFields{$field}))
178 warn ("Invalid field $field");
182 if ($ValidFields{$field})
184 if (ref ($val) eq 'ARRAY')
186 $entry->add ($field => [@$val]) if (@$val);
190 $entry->add ($field => [$val]) if ($val);
194 warn ("You cannot pass ref-type " . ref ($val));
200 if (ref ($val) eq 'ARRAY')
210 warn ("You cannot pass ref-type " . ref ($val));
213 $entry->add ($field => $val) if (defined ($val) and $val);
217 my $sn = $entry->get_value ('sn');
218 my $gn = $entry->get_value ('givenName');
220 if (!defined ($sn) or !defined ($gn))
222 warn ("sn or givenName not given");
226 $dn = "cn=$sn $gn," . $Config{'base_dn'};
227 ($ou) = $Config{'base_dn'} =~ m/\bou\s*=\s*([^,]+)/i;
229 $entry->add (cn => "$sn $gn", ou => $ou);
233 $entry->dump (*STDOUT);
236 $entry->changetype ('add');
237 my $mesg = $entry->update ($Ldap);
239 if ($mesg->is_error ())
241 warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
245 return (new ($pkg, $entry));
248 =item Person-E<gt>B<search> (B<firstname> =E<gt> I<"Flor*">)
250 Search for the given patterns. Returns a list of I<Person>-objects.
255 [field => value], # OR
284 $field = $ExternalNames{$field} if (defined ($ExternalNames{$field}));
285 if (!defined ($ValidFields{$field}))
287 warn ("Not a valid field: $field");
291 $value =~ s/([\(\)\\])/\\$1/g;
293 push (@disjunc, "($field=$value)");
299 if (scalar (@disjunc) == 1)
305 $tmp = join ('', '(|', @disjunc, ')');
307 push (@konjunct, $tmp);
313 $filter = join ('', '(&(objectclass=inetOrgPerson)', @konjunct, ')');
317 $filter = '(objectclass=inetOrgPerson)';
320 #print STDERR "Debug: using filter: $filter";
322 $mesg = $Ldap->search
324 base => $Config{'base_dn'},
328 if ($mesg->is_error ())
330 warn ("Error while querying LDAP server: " . $mesg->error_text ());
334 for ($mesg->entries ())
337 my $obj = new ($pkg, $entry);
339 push (@retval, $obj);
345 =item I<$obj>-E<gt>B<delete> ()
354 my $entry = $obj->{'ldap'};
356 $entry->changetype ('delete');
358 $entry->update ($Ldap);
363 =item I<$obj>-E<gt>B<lastname> ([I<$lastname>])
365 Get or set the lastname.
372 my $entry = $obj->{'ldap'};
373 my $sn = $obj->{'sn'};
374 my $gn = $obj->{'givenName'};
376 my $dn = "cn=$cn," . $Config{'base_dn'};
380 print STDERR "This is _update_dn, trying to set dn=$dn";
382 $entry->changetype ('modify');
383 $entry->replace (sn => $sn, givenName => $gn, cn => $cn);
384 $entry->update ($Ldap);
386 $entry->update ($Ldap);
395 $obj->{'sn'} = shift;
399 return ($obj->{'sn'});
402 =item I<$obj>-E<gt>B<firstname> ([I<$firstname>])
404 Get or set the firstname.
414 $obj->{'givenName'} = shift;
418 return ($obj->{'givenName'});
421 =item I<$obj>-E<gt>B<name> ()
430 return ($obj->{'cn'});
433 =item I<$obj>-E<gt>B<address> ([I<@address>])
435 =item I<$obj>-E<gt>B<homephone> ([I<@homephone>])
437 =item I<$obj>-E<gt>B<cellphone> ([I<@cellphone>])
439 =item I<$obj>-E<gt>B<officephone> ([I<@officephone>])
441 =item I<$obj>-E<gt>B<fax> ([I<@fax>])
443 =item I<$obj>-E<gt>B<mail> ([I<@mail>])
445 =item I<$obj>-E<gt>B<uri> ([I<@uri>])
447 =item I<$obj>-E<gt>B<group> ([I<@groups>])
449 Get or set the attribute. This is the same as calling S<I<$obj>-E<gt>B<set>
450 (I<$field>, I<\@values>)> or S<I<$obj>-E<gt>B<get> (I<$field>)>.
458 my $field = $Person::AUTOLOAD;
460 return (undef) unless ($field);
464 return (set ($obj, $field, @values ? [@values] : undef))
467 =item I<$obj>-E<gt>B<get> (I<$field>)
469 Returs the value(s) of field I<$field>.
480 return (set ($obj, $field, undef));
484 return (scalar (set ($obj, $field, undef)));
488 =item I<$obj>-E<gt>B<set> (I<$field>, I<\@values>)
490 Sets the field I<$field> to the value(s) I<\@valued>. Pass an empty array-ref
499 my $value = @_ ? shift : undef;
500 my $entry = $obj->{'ldap'};
502 if (defined ($ExternalNames{$field}))
504 $field = $ExternalNames{$field};
506 if (!defined ($ValidFields{$field}))
511 if (defined ($value))
513 $entry->changetype ('modify');
515 if ($ValidFields{$field})
517 $entry->replace ($field, [@$value]);
518 $obj->{$field} = $value;
522 splice (@$value, 1) if (scalar (@$value) > 1);
523 $entry->replace ($field, $value);
524 $obj->{$field} = $value->[0];
527 $entry->update ($Ldap);
530 $obj->{$field} = [] unless (defined ($obj->{$field}));
532 if (wantarray () and $ValidFields{$field})
534 return (@{$obj->{$field}});
538 return ($obj->{$field});
546 my ($search) = $dn =~ m/cn\s*=\s*([^,]+)/i;
548 die unless ($search);
553 my $mesg = $Ldap->search
555 base => $Config{'base_dn'},
556 filter => "(cn=$search)"
559 if ($mesg->is_error ())
561 warn ("Error while querying LDAP server: " . $mesg->error_text ());
565 for ($mesg->entries ())
568 my ($t_cn) = $e->get_value ('cn', asref => 0);
569 my ($t_id) = $e->get_value ('uid', asref => 0);
585 Florian octo Forster E<lt>octo at verplant.orgE<gt>