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 with a member named I<$cn>.
45 my $member_dn = _cn_to_dn ($name);
48 my $mesg = $Ldap->search
50 base => get_config ('base_dn'),
51 filter => "(&(objectClass=groupOfNames)(|(cn=$name)(member=$member_dn)))"
54 if ($mesg->is_error ())
56 warn ("Error while querying LDAP server: " . $mesg->error_text ());
60 for ($mesg->entries ())
63 push (@retval, new ($pkg, $entry));
69 =item LiCoM::Group-E<gt>B<create> (I<$name>, I<$description>, I<@members>)
71 Creates and returns a new group. At least one member has to be given to meet
82 my $dn = _cn_to_dn ($name);
84 my $entry = Net::LDAP::Entry->new ();
86 $entry->add (objectClass => [qw(top groupOfNames)]);
87 $entry->add (cn => $name);
88 $entry->add (member => [map { $_->get ('dn') } (@members)]);
89 $entry->add (description => $desc);
92 $entry->changetype ('add');
93 my $mesg = $entry->update ($Ldap);
95 if ($mesg->is_error ())
97 warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
101 return (new ($pkg, $entry));
104 =item LiCoM::Group-E<gt>B<all> ()
106 Returns all group-objects found in the database.
115 my $mesg = $Ldap->search
117 base => get_config ('base_dn'),
118 filter => "(objectClass=groupOfNames)"
121 if ($mesg->is_error ())
123 warn ("Error while querying LDAP server: " . $mesg->error_text ());
127 for ($mesg->entries ())
130 my $group = new ($pkg, $entry);
132 push (@retval, $group);
142 =item I<$obj>-E<gt>B<delete> ()
151 my $entry = $obj->{'ldap'};
153 $entry->changetype ('delete');
155 $entry->update ($Ldap);
160 =item I<$obj>-E<gt>B<get_members> ()
162 Returns a list of all members.
169 return (@{$obj->{'members'}});
172 =item I<$obj>-E<gt>B<add_members> (I<@cn>)
174 Adds the given I<@cn>s to the group, if they aren't already in the group.
181 my $entry = $obj->{'ldap'};
188 if (!grep { $_ eq $n } (@{$obj->{'members'}}))
190 push (@{$obj->{'members'}}, $n);
194 _update_members ($obj);
197 =item I<$obj>-E<gt>B<del_members> (I<@cn>)
199 Deletes the given I<@cn>s from the group. Automatically deletes the group if no
200 members are left (to meet LDAP-standards, mostly..).
207 my $entry = $obj->{'ldap'};
213 @{$obj->{'members'}} = grep { $d ne $_ } (@{$obj->{'members'}});
216 if (@{$obj->{'members'}})
218 _update_members ($obj);
222 LiCoM::Group::delete ($obj);
226 =item I<$obj>-E<gt>B<name> ([I<$name>])
228 Sets the name if given. Returns the (new) name.
238 my $entry = $obj->{'ldap'};
239 $obj->{'name'} = shift;
241 $entry->changetype ('modify');
242 $entry->replace (cn => $obj->{'name'});
243 $entry->update ($Ldap);
244 $entry->dn (_cn_to_dn ($obj->{'name'}));
245 $entry->update ($Ldap);
248 return ($obj->{'name'});
251 =item I<$obj>-E<gt>B<description> ([I<$description>])
253 Sets the description if given. Returns the (new) description.
263 my $entry = $obj->{'ldap'};
264 $obj->{'description'} = shift;
266 $entry->changetype ('modify');
267 $entry->replace (description => $obj->{'description'});
268 $entry->update ($Ldap);
271 return ($obj->{'description'});
277 my $base_dn = get_config ('base_dn') or die;
279 return ('cn=' . $cn . ',' . $base_dn);
285 my $entry = $obj->{'ldap'};
286 my @tmp = map { _cn_to_dn ($_); } (@{$obj->{'members'}});
288 $entry->changetype ('modify');
289 $entry->replace (member => \@tmp);
290 $entry->update ($Ldap);
297 Florian octo Forster E<lt>octo at verplant.orgE<gt>