6 use LiCoM::Config (qw(get_config));
7 use LiCoM::Connection (qw($Ldap));
13 LiCoM::Group - High level group management.
25 $obj->{'name'} = $entry->get_value ('cn', asref => 0);
26 $obj->{'description'} = $entry->get_value ('description', asref => 0);
27 $obj->{'members'} = [map { m/cn=([^,]+)/i; $1; } ($entry->get_value ('member', asref => 0))];
28 $obj->{'ldap'} = $entry;
30 return (bless ($obj, $pkg));
33 =head1 STATIC FUNCTIONS
35 =item LiCoM::Group-E<gt>B<load> (I<$cn>)
37 Loads and returns the group named I<$cn> or all groups with a member named
46 my $member_dn = _cn_to_dn ($name);
49 my $mesg = $Ldap->search
51 base => get_config ('base_dn'),
52 filter => "(&(objectClass=groupOfNames)(|(cn=$name)(member=$member_dn)))"
55 if ($mesg->is_error ())
57 warn ("Error while querying LDAP server: " . $mesg->error_text ());
61 for ($mesg->entries ())
64 push (@retval, new ($pkg, $entry));
70 =item LiCoM::Group-E<gt>B<create> (I<$name>, I<$description>, I<@members>)
72 Creates and returns a new group. At least one member has to be given to meet
73 LDAP requirements. I<@members> is an array of B<LiCoM::Person>-objects.
83 my $dn = _cn_to_dn ($name);
85 my $entry = Net::LDAP::Entry->new ();
87 $entry->add (objectClass => [qw(top groupOfNames)]);
88 $entry->add (cn => $name);
89 $entry->add (member => [map { $_->get ('dn') } (@members)]);
90 $entry->add (description => $desc);
93 $entry->changetype ('add');
94 my $mesg = $entry->update ($Ldap);
96 if ($mesg->is_error ())
98 warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
102 return (new ($pkg, $entry));
105 =item LiCoM::Group-E<gt>B<all> ()
107 Returns all group-objects found in the database.
116 my $mesg = $Ldap->search
118 base => get_config ('base_dn'),
119 filter => "(objectClass=groupOfNames)"
122 if ($mesg->is_error ())
124 warn ("Error while querying LDAP server: " . $mesg->error_text ());
128 for ($mesg->entries ())
131 my $group = new ($pkg, $entry);
133 push (@retval, $group);
143 =item I<$obj>-E<gt>B<delete> ()
152 my $entry = $obj->{'ldap'};
154 $entry->changetype ('delete');
156 $entry->update ($Ldap);
161 =item I<$obj>-E<gt>B<get_members> ()
163 Returns a list of all members.
170 return (@{$obj->{'members'}});
173 =item I<$obj>-E<gt>B<add_members> (I<@cn>)
175 Adds the given I<@cn>s to the group, if they aren't already in the group.
182 my $entry = $obj->{'ldap'};
189 if (!grep { $_ eq $n } (@{$obj->{'members'}}))
191 push (@{$obj->{'members'}}, $n);
195 _update_members ($obj);
198 =item I<$obj>-E<gt>B<del_members> (I<@cn>)
200 Deletes the given I<@cn>s from the group. Automatically deletes the group if no
201 members are left (to meet LDAP-standards, mostly..).
208 my $entry = $obj->{'ldap'};
214 @{$obj->{'members'}} = grep { $d ne $_ } (@{$obj->{'members'}});
217 if (@{$obj->{'members'}})
219 _update_members ($obj);
223 LiCoM::Group::delete ($obj);
227 =item I<$obj>-E<gt>B<name> ([I<$name>])
229 Sets the name if given. Returns the (new) name.
239 my $entry = $obj->{'ldap'};
240 $obj->{'name'} = shift;
242 $entry->changetype ('modify');
243 $entry->replace (cn => $obj->{'name'});
244 $entry->update ($Ldap);
245 $entry->dn (_cn_to_dn ($obj->{'name'}));
246 $entry->update ($Ldap);
249 return ($obj->{'name'});
252 =item I<$obj>-E<gt>B<description> ([I<$description>])
254 Sets the description if given. Returns the (new) description.
264 my $entry = $obj->{'ldap'};
265 $obj->{'description'} = shift;
267 $entry->changetype ('modify');
268 $entry->replace (description => $obj->{'description'});
269 $entry->update ($Ldap);
272 return ($obj->{'description'});
278 my $base_dn = get_config ('base_dn') or die;
280 return ('cn=' . $cn . ',' . $base_dn);
286 my $entry = $obj->{'ldap'};
287 my @tmp = map { _cn_to_dn ($_); } (@{$obj->{'members'}});
289 $entry->changetype ('modify');
290 $entry->replace (member => \@tmp);
291 $entry->update ($Ldap);
298 Florian octo Forster E<lt>octo at verplant.orgE<gt>