6 use LiCoM::Connection (qw($Ldap));
12 LiCoM::Group - High level group management.
24 $obj->{'name'} = $entry->get_value ('cn', asref => 0);
25 $obj->{'description'} = $entry->get_value ('description', asref => 0);
26 $obj->{'members'} = [map { m/cn=([^,]+)/i; $1; } ($entry->get_value ('member', asref => 0))];
27 $obj->{'ldap'} = $entry;
29 return (bless ($obj, $pkg));
32 =head1 STATIC FUNCTIONS
34 =item LiCoM::Group-E<gt>B<load> (I<$cn>)
36 Loads and returns the group named I<$cn> or with a member named I<$cn>.
44 my $member_dn = 'cn=' . $name . ',' . $Config{'base_dn'};
47 my $mesg = $Ldap->search
49 base => $Config{'base_dn'},
50 filter => "(&(objectClass=groupOfNames)(|(cn=$name)(member=$member_dn)))"
53 if ($mesg->is_error ())
55 warn ("Error while querying LDAP server: " . $mesg->error_text ());
59 for ($mesg->entries ())
62 push (@retval, new ($pkg, $entry));
68 =item LiCoM::Group-E<gt>B<create> (I<$name>, I<$description>, I<@members>)
70 Creates and returns a new group. At least one member has to be given to meet
81 my $dn = "cn=$name," . $Config{'base_dn'};
83 my $entry = Net::LDAP::Entry->new ();
85 $entry->add (objectClass => [qw(top groupOfNames)]);
86 $entry->add (cn => $name);
87 $entry->add (member => [map { $_->get ('dn') } (@members)]);
88 $entry->add (description => $desc);
91 $entry->changetype ('add');
92 my $mesg = $entry->update ($Ldap);
94 if ($mesg->is_error ())
96 warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
100 return (new ($pkg, $entry));
103 =item LiCoM::Group-E<gt>B<all> ()
105 Returns all group-objects found in the database.
114 my $mesg = $Ldap->search
116 base => $Config{'base_dn'},
117 filter => "(objectClass=groupOfNames)"
120 if ($mesg->is_error ())
122 warn ("Error while querying LDAP server: " . $mesg->error_text ());
126 for ($mesg->entries ())
129 my $group = new ($pkg, $entry);
131 push (@retval, $group);
141 =item I<$obj>-E<gt>B<delete> ()
150 my $entry = $obj->{'ldap'};
152 $entry->changetype ('delete');
154 $entry->update ($Ldap);
159 =item I<$obj>-E<gt>B<get_members> ()
161 Returns a list of all members.
168 return (@{$obj->{'members'}});
171 =item I<$obj>-E<gt>B<add_members> (I<@cn>)
173 Adds the given I<@cn>s to the group, if they aren't already in the group.
180 my $entry = $obj->{'ldap'};
187 if (!grep { $_ eq $n } (@{$obj->{'members'}}))
189 push (@{$obj->{'members'}}, $n);
193 _update_members ($obj);
196 =item I<$obj>-E<gt>B<del_members> (I<@cn>)
198 Deletes the given I<@cn>s from the group. Automatically deletes the group if no
199 members are left (to meet LDAP-standards, mostly..).
206 my $entry = $obj->{'ldap'};
212 @{$obj->{'members'}} = grep { $d ne $_ } (@{$obj->{'members'}});
215 if (@{$obj->{'members'}})
217 _update_members ($obj);
221 LiCoM::Group::delete ($obj);
228 my $entry = $obj->{'ldap'};
229 my @tmp = map { 'cn=' . $_ . ',' . $Config{'base_dn'} } (@{$obj->{'members'}});
231 $entry->changetype ('modify');
232 $entry->replace (member => \@tmp);
233 $entry->update ($Ldap);
236 =item I<$obj>-E<gt>B<name> ([I<$name>])
238 Sets the name if given. Returns the (new) name.
248 my $entry = $obj->{'ldap'};
249 $obj->{'name'} = shift;
251 $entry->changetype ('modify');
252 $entry->replace (cn => $obj->{'name'});
253 $entry->update ($Ldap);
254 $entry->dn ('cn=' . $obj->{'name'} . ',' . $Config{'base_dn'});
255 $entry->update ($Ldap);
258 return ($obj->{'name'});
261 =item I<$obj>-E<gt>B<description> ([I<$description>])
263 Sets the description if given. Returns the (new) description.
273 my $entry = $obj->{'ldap'};
274 $obj->{'description'} = shift;
276 $entry->changetype ('modify');
277 $entry->replace (description => $obj->{'description'});
278 $entry->update ($Ldap);
281 return ($obj->{'description'});
289 Florian octo Forster E<lt>octo at verplant.orgE<gt>