6 use LiCoM::Config (qw(get_config));
7 use LiCoM::Connection (qw($Ldap));
10 use Net::LDAP::Filter;
14 Person - High level interface for address books using an LDAP-backend.
21 facsimileTelephoneNumber => 1,
26 homePostalAddress => 1,
35 officephone => 'telephoneNumber',
36 fax => 'facsimileTelephoneNumber',
39 firstname => 'givenName',
40 homephone => 'homePhone',
41 address => 'homePostalAddress',
44 cellphone => 'mobile',
45 password => 'userPassword'
56 $obj->{'dn'} = $entry->dn ();
57 $obj->{'ldap'} = $entry;
59 for (keys %ValidFields)
62 $obj->{$key} = $entry->get_value ($key, asref => $ValidFields{$key});
65 return (bless ($obj, $pkg));
68 =head1 STATIC FUNCTIONS
72 =item LiCoM::Person-E<gt>B<load> (I<$cn>)
74 Loads the given CN and returns the B<Person>-object.
83 my ($retval) = search ($pkg, [[cn => $cn]]);
87 warn ("CN '$cn' could not be found");
94 =item LiCoM::Person-E<gt>B<create> (B<lastname> =E<gt> I<$lastname>, B<firstname> =E<gt> I<$firstname>, ...)
96 Create a new I<Net::LDAP::Entry>-object and return it's corresponding
106 my $entry = Net::LDAP::Entry->new ();
109 $entry->add (objectClass => [qw(top organizationalUnit person organizationalPerson inetOrgPerson)]);
114 my $val = $hash{$key};
115 my $field = defined ($ExternalNames{$key}) ? $ExternalNames{$key} : $key;
117 if (!defined ($ValidFields{$field}))
119 warn ("Invalid field $field");
123 if ($ValidFields{$field})
125 if (ref ($val) eq 'ARRAY')
127 $entry->add ($field => [@$val]) if (@$val);
131 $entry->add ($field => [$val]) if ($val);
135 warn ("You cannot pass ref-type " . ref ($val));
141 if (ref ($val) eq 'ARRAY')
151 warn ("You cannot pass ref-type " . ref ($val));
154 $entry->add ($field => $val) if (defined ($val) and $val);
158 my $sn = $entry->get_value ('sn');
159 my $gn = $entry->get_value ('givenName');
161 if (!defined ($sn) or !defined ($gn))
163 warn ("sn or givenName not given");
167 $dn = "cn=$sn $gn," . get_config ('base_dn');
169 $entry->add (cn => "$sn $gn");
172 $entry->changetype ('add');
173 my $mesg = $entry->update ($Ldap);
175 if ($mesg->is_error ())
177 warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
181 return (new ($pkg, $entry));
184 =item LiCoM::Person-E<gt>B<search> (B<firstname> =E<gt> I<"Flor*">)
186 Search for the given patterns. Returns a list of I<Person>-objects.
191 [field => value], # OR
220 $field = $ExternalNames{$field} if (defined ($ExternalNames{$field}));
221 if (!defined ($ValidFields{$field}))
223 warn ("Not a valid field: $field");
227 $value =~ s/([\(\)\\])/\\$1/g;
229 push (@disjunc, "($field=$value)");
235 if (scalar (@disjunc) == 1)
241 $tmp = join ('', '(|', @disjunc, ')');
243 push (@konjunct, $tmp);
249 $filter = join ('', '(&(objectclass=inetOrgPerson)', @konjunct, ')');
253 $filter = '(objectclass=inetOrgPerson)';
256 $mesg = $Ldap->search
258 base => get_config ('base_dn'),
262 if ($mesg->is_error ())
264 warn ("Error while querying LDAP server: " . $mesg->error_text ());
268 for ($mesg->entries ())
271 my $obj = new ($pkg, $entry);
273 push (@retval, $obj);
279 =item LiCoM::Person-E<gt>B<get_user> (I<$dn>)
281 Returns the cn and, if defined, the user-id of this dn.
289 my ($search) = $dn =~ m/cn\s*=\s*([^,]+)/i;
291 die unless ($search);
296 my $mesg = $Ldap->search
298 base => get_config ('base_dn'),
299 filter => "(cn=$search)"
302 if ($mesg->is_error ())
304 warn ("Error while querying LDAP server: " . $mesg->error_text ());
308 for ($mesg->entries ())
311 my ($t_cn) = $e->get_value ('cn', asref => 0);
312 my ($t_id) = $e->get_value ('uid', asref => 0);
330 =item I<$obj>-E<gt>B<delete> ()
339 my $entry = $obj->{'ldap'};
341 $entry->changetype ('delete');
343 $entry->update ($Ldap);
348 =item I<$obj>-E<gt>B<lastname> ([I<$lastname>])
350 Get or set the lastname.
357 my $entry = $obj->{'ldap'};
358 my $sn = $obj->{'sn'};
359 my $gn = $obj->{'givenName'};
361 my $dn = "cn=$cn," . get_config ('base_dn');
365 print STDERR "This is _update_dn, trying to set dn=$dn";
367 $entry->changetype ('modify');
368 $entry->replace (sn => $sn, givenName => $gn, cn => $cn);
369 $entry->update ($Ldap);
371 $entry->update ($Ldap);
380 $obj->{'sn'} = shift;
384 return ($obj->{'sn'});
387 =item I<$obj>-E<gt>B<firstname> ([I<$firstname>])
389 Get or set the firstname.
399 $obj->{'givenName'} = shift;
403 return ($obj->{'givenName'});
406 =item I<$obj>-E<gt>B<name> ()
415 return ($obj->{'cn'});
418 =item I<$obj>-E<gt>B<address> ([I<@address>])
420 =item I<$obj>-E<gt>B<homephone> ([I<@homephone>])
422 =item I<$obj>-E<gt>B<cellphone> ([I<@cellphone>])
424 =item I<$obj>-E<gt>B<officephone> ([I<@officephone>])
426 =item I<$obj>-E<gt>B<fax> ([I<@fax>])
428 =item I<$obj>-E<gt>B<mail> ([I<@mail>])
430 =item I<$obj>-E<gt>B<uri> ([I<@uri>])
432 =item I<$obj>-E<gt>B<group> ([I<@groups>])
434 Get or set the attribute. This is the same as calling S<I<$obj>-E<gt>B<set>
435 (I<$field>, I<\@values>)> or S<I<$obj>-E<gt>B<get> (I<$field>)>.
443 my $field = $Person::AUTOLOAD;
445 return (undef) unless ($field);
449 return (set ($obj, $field, @values ? [@values] : undef))
452 =item I<$obj>-E<gt>B<get> (I<$field>)
454 Returs the value(s) of field I<$field>.
465 return (set ($obj, $field, undef));
469 return (scalar (set ($obj, $field, undef)));
473 =item I<$obj>-E<gt>B<set> (I<$field>, I<\@values>)
475 Sets the field I<$field> to the value(s) I<\@valued>. Pass an empty array-ref
484 my $value = @_ ? shift : undef;
485 my $entry = $obj->{'ldap'};
487 if (defined ($ExternalNames{$field}))
489 $field = $ExternalNames{$field};
491 if (!defined ($ValidFields{$field}))
496 if (defined ($value))
498 $entry->changetype ('modify');
500 if ($ValidFields{$field})
502 $entry->replace ($field, [@$value]);
503 $obj->{$field} = $value;
507 splice (@$value, 1) if (scalar (@$value) > 1);
508 $entry->replace ($field, $value);
509 $obj->{$field} = $value->[0];
512 $entry->update ($Ldap);
515 $obj->{$field} = [] unless (defined ($obj->{$field}));
517 if (wantarray () and $ValidFields{$field})
519 return (@{$obj->{$field}});
523 return ($obj->{$field});
531 Florian octo Forster E<lt>octo at verplant.orgE<gt>