LiCoM::Group: Encode all strings as UTF-8 when sending to the LDAP-server.
[licom.git] / lib / LiCoM / Group.pm
index e828115..8ebc7ac 100644 (file)
@@ -3,6 +3,8 @@ package LiCoM::Group;
 use strict;
 use warnings;
 
+use Encode (qw(encode decode));
+
 use LiCoM::Config (qw(get_config));
 use LiCoM::Connection (qw($Ldap));
 use Net::LDAP;
@@ -22,9 +24,9 @@ sub new
        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));
@@ -43,13 +45,41 @@ sub load
 {
        my $pkg = shift;
        my $name = shift;
-       my $member_dn = _cn_to_dn ($name);
+       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    => get_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 ())
@@ -67,10 +97,11 @@ sub load
        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. I<@members> is an array of B<LiCoM::Person>-objects.
+LDAP requirements. I<@members> is an array of CNs.
 
 =cut
 
@@ -81,14 +112,16 @@ sub create ($$$@)
        my $desc = shift;
        my @members = @_;
        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);
@@ -115,7 +148,7 @@ sub all
 
        my $mesg = $Ldap->search
        (
-               base    => get_config ('base_dn'),
+               base    => 'ou=Group,' . get_config ('base_dn'),
                filter  => "(objectClass=groupOfNames)"
        );
 
@@ -239,6 +272,7 @@ sub name
                my $entry = $obj->{'ldap'};
                $obj->{'name'} = shift;
 
+               # FIXME
                $entry->changetype ('modify');
                $entry->replace (cn => $obj->{'name'});
                $entry->update ($Ldap);
@@ -265,7 +299,7 @@ sub description
                $obj->{'description'} = shift;
 
                $entry->changetype ('modify');
-               $entry->replace (description => $obj->{'description'});
+               $entry->replace (description => [encode ('UTF-8', $obj->{'description'})]);
                $entry->update ($Ldap);
        }
 
@@ -277,7 +311,7 @@ sub _cn_to_dn
        my $cn = shift;
        my $base_dn = get_config ('base_dn') or die;
 
-       return ('cn=' . $cn . ',' . $base_dn);
+       return ('cn=' . $cn . ',ou=Group,' . $base_dn);
 }
 
 sub _update_members
@@ -286,6 +320,8 @@ sub _update_members
        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);