use strict;
use warnings;
+use Encode (qw(encode decode));
+
+use LiCoM::Config (qw(get_config));
use LiCoM::Connection (qw($Ldap));
use Net::LDAP;
use Net::LDAP::Filter;
my $entry = shift;
my $obj = {};
- $obj->{'name'} = $entry->get_value ('cn', asref => 0);
- $obj->{'description'} = $entry->get_value ('description', asref => 0);
- $obj->{'members'} = [map { m/cn=([^,]+)/i; $1; } ($entry->get_value ('member', asref => 0))];
+ $obj->{'name'} = decode ('utf-8', $entry->get_value ('cn', asref => 0));
+ $obj->{'description'} = decode ('utf-8', $entry->get_value ('description', asref => 0));
+ $obj->{'members'} = [map { m/cn=([^,]+)/i; decode ('utf-8', $1); } ($entry->get_value ('member', asref => 0))];
$obj->{'ldap'} = $entry;
return (bless ($obj, $pkg));
=item LiCoM::Group-E<gt>B<load> (I<$cn>)
-Loads and returns the group named I<$cn> or with a member named I<$cn>.
+Loads and returns the group named I<$cn> or all groups with a member named
+I<$cn>.
=cut
{
my $pkg = shift;
my $name = shift;
- my $member_dn = 'cn=' . $name . ',' . $Config{'base_dn'};
+ my $obj;
+
+ my $mesg = $Ldap->search
+ (
+ base => 'ou=Group,' . get_config ('base_dn'),
+ filter => "(&(objectClass=groupOfNames)(cn=$name))"
+ );
+
+ if ($mesg->is_error ())
+ {
+ warn ("Error while querying LDAP server: " . $mesg->error_text ());
+ return (undef);
+ }
+
+ for ($mesg->entries ())
+ {
+ my $entry = $_;
+ $obj = new ($pkg, $entry);
+ last;
+ }
+
+ return ($obj);
+}
+
+sub load_by_member
+{
+ my $pkg = shift;
+ my $cn = shift;
+ my $dn = _cn_to_dn ($cn);
my @retval = ();
my $mesg = $Ldap->search
(
- base => $Config{'base_dn'},
- filter => "(&(objectClass=groupOfNames)(|(cn=$name)(member=$member_dn)))"
+ base => 'ou=Group,' . get_config ('base_dn'),
+ filter => "(&(objectClass=groupOfNames)(member=$dn))"
);
if ($mesg->is_error ())
return (@retval);
}
-=item LiCoM::Group-E<gt>B<create> (I<$name>, I<$description>, I<@members>)
+
+=item LiCoM::Group-E<gt>B<create> (I<$name>, I<$description>, I<@member_cns>)
Creates and returns a new group. At least one member has to be given to meet
-LDAP requirements.
+LDAP requirements. I<@members> is an array of CNs.
=cut
my $name = shift;
my $desc = shift;
my @members = @_;
- my $dn = "cn=$name," . $Config{'base_dn'};
+ my $dn = _cn_to_dn ($name);
+ my $ou = 'Group';
my $entry = Net::LDAP::Entry->new ();
- $entry->add (objectClass => [qw(top groupOfNames)]);
- $entry->add (cn => $name);
- $entry->add (member => [map { $_->get ('dn') } (@members)]);
- $entry->add (description => $desc);
- $entry->dn ($dn);
+ $entry->add (objectClass => [map { encode ('UTF-8', $_) } (qw(top groupOfNames))]);
+ $entry->add (ou => encode ('UTF-8', $ou));
+ $entry->add (cn => encode ('UTF-8', $name));
+ $entry->add (member => [map { encode ('UTF-8', _cn_to_dn ($_)) } (@members)]);
+ $entry->add (description => encode ('UTF-8', $desc)) if ($desc);
+ $entry->dn (encode ('UTF-8', $dn));
$entry->changetype ('add');
my $mesg = $entry->update ($Ldap);
my $mesg = $Ldap->search
(
- base => $Config{'base_dn'},
+ base => 'ou=Group,' . get_config ('base_dn'),
filter => "(objectClass=groupOfNames)"
);
}
}
-sub _update_members
-{
- my $obj = shift;
- my $entry = $obj->{'ldap'};
- my @tmp = map { 'cn=' . $_ . ',' . $Config{'base_dn'} } (@{$obj->{'members'}});
-
- $entry->changetype ('modify');
- $entry->replace (member => \@tmp);
- $entry->update ($Ldap);
-}
-
=item I<$obj>-E<gt>B<name> ([I<$name>])
Sets the name if given. Returns the (new) name.
my $entry = $obj->{'ldap'};
$obj->{'name'} = shift;
+ # FIXME
$entry->changetype ('modify');
$entry->replace (cn => $obj->{'name'});
$entry->update ($Ldap);
- $entry->dn ('cn=' . $obj->{'name'} . ',' . $Config{'base_dn'});
+ $entry->dn (_cn_to_dn ($obj->{'name'}));
$entry->update ($Ldap);
}
$obj->{'description'} = shift;
$entry->changetype ('modify');
- $entry->replace (description => $obj->{'description'});
+ $entry->replace (description => [encode ('UTF-8', $obj->{'description'})]);
$entry->update ($Ldap);
}
return ($obj->{'description'});
}
+sub _cn_to_dn
+{
+ my $cn = shift;
+ my $base_dn = get_config ('base_dn') or die;
+
+ return ('cn=' . $cn . ',ou=Group,' . $base_dn);
+}
+
+sub _update_members
+{
+ my $obj = shift;
+ my $entry = $obj->{'ldap'};
+ my @tmp = map { _cn_to_dn ($_); } (@{$obj->{'members'}});
+
+ $_ = encode ('UTF-8', $_) for (@tmp);
+
+ $entry->changetype ('modify');
+ $entry->replace (member => \@tmp);
+ $entry->update ($Ldap);
+}
=back