6 use Encode (qw(encode decode));
8 use LiCoM::Config (qw(get_config));
9 use LiCoM::Connection (qw($Ldap));
11 use Net::LDAP::Filter;
15 LiCoM::Group - High level group management.
27 $obj->{'name'} = decode ('utf-8', $entry->get_value ('cn', asref => 0));
28 $obj->{'description'} = decode ('utf-8', $entry->get_value ('description', asref => 0));
29 $obj->{'members'} = [map { m/cn=([^,]+)/i; decode ('utf-8', $1); } ($entry->get_value ('member', asref => 0))];
30 $obj->{'ldap'} = $entry;
32 return (bless ($obj, $pkg));
35 =head1 STATIC FUNCTIONS
37 =item LiCoM::Group-E<gt>B<load> (I<$cn>)
39 Loads and returns the group named I<$cn> or all groups with a member named
50 my $mesg = $Ldap->search
52 base => 'ou=Group,' . get_config ('base_dn'),
53 filter => "(&(objectClass=groupOfNames)(cn=$name))"
56 if ($mesg->is_error ())
58 warn ("Error while querying LDAP server: " . $mesg->error_text ());
62 for ($mesg->entries ())
65 $obj = new ($pkg, $entry);
76 my $dn = _cn_to_dn ($cn);
79 my $mesg = $Ldap->search
81 base => 'ou=Group,' . get_config ('base_dn'),
82 filter => "(&(objectClass=groupOfNames)(member=$dn))"
85 if ($mesg->is_error ())
87 warn ("Error while querying LDAP server: " . $mesg->error_text ());
91 for ($mesg->entries ())
94 push (@retval, new ($pkg, $entry));
101 =item LiCoM::Group-E<gt>B<create> (I<$name>, I<$description>, I<@member_cns>)
103 Creates and returns a new group. At least one member has to be given to meet
104 LDAP requirements. I<@members> is an array of CNs.
114 my $dn = _cn_to_dn ($name);
117 my $entry = Net::LDAP::Entry->new ();
119 $entry->add (objectClass => [map { encode ('UTF-8', $_) } (qw(top groupOfNames))]);
120 $entry->add (ou => encode ('UTF-8', $ou));
121 $entry->add (cn => encode ('UTF-8', $name));
122 $entry->add (member => [map { encode ('UTF-8', _cn_to_dn ($_)) } (@members)]);
123 $entry->add (description => encode ('UTF-8', $desc)) if ($desc);
124 $entry->dn (encode ('UTF-8', $dn));
126 $entry->changetype ('add');
127 my $mesg = $entry->update ($Ldap);
129 if ($mesg->is_error ())
131 warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
135 return (new ($pkg, $entry));
138 =item LiCoM::Group-E<gt>B<all> ()
140 Returns all group-objects found in the database.
149 my $mesg = $Ldap->search
151 base => 'ou=Group,' . get_config ('base_dn'),
152 filter => "(objectClass=groupOfNames)"
155 if ($mesg->is_error ())
157 warn ("Error while querying LDAP server: " . $mesg->error_text ());
161 for ($mesg->entries ())
164 my $group = new ($pkg, $entry);
166 push (@retval, $group);
176 =item I<$obj>-E<gt>B<delete> ()
185 my $entry = $obj->{'ldap'};
187 $entry->changetype ('delete');
189 $entry->update ($Ldap);
194 =item I<$obj>-E<gt>B<get_members> ()
196 Returns a list of all members.
203 return (@{$obj->{'members'}});
206 =item I<$obj>-E<gt>B<add_members> (I<@cn>)
208 Adds the given I<@cn>s to the group, if they aren't already in the group.
215 my $entry = $obj->{'ldap'};
222 if (!grep { $_ eq $n } (@{$obj->{'members'}}))
224 push (@{$obj->{'members'}}, $n);
228 _update_members ($obj);
231 =item I<$obj>-E<gt>B<del_members> (I<@cn>)
233 Deletes the given I<@cn>s from the group. Automatically deletes the group if no
234 members are left (to meet LDAP-standards, mostly..).
241 my $entry = $obj->{'ldap'};
247 @{$obj->{'members'}} = grep { $d ne $_ } (@{$obj->{'members'}});
250 if (@{$obj->{'members'}})
252 _update_members ($obj);
256 LiCoM::Group::delete ($obj);
260 =item I<$obj>-E<gt>B<name> ([I<$name>])
262 Sets the name if given. Returns the (new) name.
272 my $entry = $obj->{'ldap'};
273 $obj->{'name'} = shift;
276 $entry->changetype ('modify');
277 $entry->replace (cn => $obj->{'name'});
278 $entry->update ($Ldap);
279 $entry->dn (_cn_to_dn ($obj->{'name'}));
280 $entry->update ($Ldap);
283 return ($obj->{'name'});
286 =item I<$obj>-E<gt>B<description> ([I<$description>])
288 Sets the description if given. Returns the (new) description.
298 my $entry = $obj->{'ldap'};
299 $obj->{'description'} = shift;
301 $entry->changetype ('modify');
302 $entry->replace (description => [encode ('UTF-8', $obj->{'description'})]);
303 $entry->update ($Ldap);
306 return ($obj->{'description'});
312 my $base_dn = get_config ('base_dn') or die;
314 return ('cn=' . $cn . ',ou=Group,' . $base_dn);
320 my $entry = $obj->{'ldap'};
321 my @tmp = map { _cn_to_dn ($_); } (@{$obj->{'members'}});
323 $_ = encode ('UTF-8', $_) for (@tmp);
325 $entry->changetype ('modify');
326 $entry->replace (member => \@tmp);
327 $entry->update ($Ldap);
334 Florian octo Forster E<lt>octo at verplant.orgE<gt>