projects
/
licom.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
licom.cgi: Assume all parameters to be in UTF-8.
[licom.git]
/
lib
/
LiCoM
/
Person.pm
diff --git
a/lib/LiCoM/Person.pm
b/lib/LiCoM/Person.pm
index
0773f5b
..
efc37c2
100644
(file)
--- a/
lib/LiCoM/Person.pm
+++ b/
lib/LiCoM/Person.pm
@@
-3,6
+3,9
@@
package LiCoM::Person;
use strict;
use warnings;
use strict;
use warnings;
+use Carp (qw(cluck confess));
+use Encode (qw(encode decode is_utf8));
+
use LiCoM::Config (qw(get_config));
use LiCoM::Connection (qw($Ldap));
use LiCoM::Config (qw(get_config));
use LiCoM::Connection (qw($Ldap));
@@
-59,7
+62,16
@@
sub new
for (keys %ValidFields)
{
my $key = $_;
for (keys %ValidFields)
{
my $key = $_;
- $obj->{$key} = $entry->get_value ($key, asref => $ValidFields{$key});
+ my $val = $entry->get_value ($key, asref => $ValidFields{$key});
+
+ if (ref ($val))
+ {
+ $obj->{$key} = [map { decode ('UTF-8', $_) } (@$val)];
+ }
+ else
+ {
+ $obj->{$key} = decode ('UTF-8', $val);
+ }
}
return (bless ($obj, $pkg));
}
return (bless ($obj, $pkg));
@@
-84,8
+96,8
@@
sub load
if (!$retval)
{
if (!$retval)
{
-
warn
("CN '$cn' could not be found");
- return
(undef)
;
+
cluck
("CN '$cn' could not be found");
+ return;
}
return ($retval);
}
return ($retval);
@@
-125,11
+137,11
@@
sub create
{
if (ref ($val) eq 'ARRAY')
{
{
if (ref ($val) eq 'ARRAY')
{
- $entry->add ($field => [
@$val
]) if (@$val);
+ $entry->add ($field => [
map { encode ('UTF-8', $_) } (@$val)
]) if (@$val);
}
elsif (!ref ($val))
{
}
elsif (!ref ($val))
{
- $entry->add ($field => [
$val
]) if ($val);
+ $entry->add ($field => [
encode ('UTF-8', $val)
]) if ($val);
}
else
{
}
else
{
@@
-141,32
+153,33
@@
sub create
my $temp;
if (ref ($val) eq 'ARRAY')
{
my $temp;
if (ref ($val) eq 'ARRAY')
{
- $temp =
$val->[0]
;
+ $temp =
encode ('UTF-8', $val->[0])
;
}
elsif (!ref ($val))
{
}
elsif (!ref ($val))
{
- $temp =
$val
;
+ $temp =
encode ('UTF-8', $val)
;
}
else
{
warn ("You cannot pass ref-type " . ref ($val));
}
}
else
{
warn ("You cannot pass ref-type " . ref ($val));
}
- $entry->add ($field => $
val) if (defined ($val) and $val
);
+ $entry->add ($field => $
temp) if (defined ($temp) and $temp
);
}
}
}
}
+ # $sn and $gn are UTF-8
my $sn = $entry->get_value ('sn');
my $gn = $entry->get_value ('givenName');
if (!defined ($sn) or !defined ($gn))
{
warn ("sn or givenName not given");
my $sn = $entry->get_value ('sn');
my $gn = $entry->get_value ('givenName');
if (!defined ($sn) or !defined ($gn))
{
warn ("sn or givenName not given");
- return
(undef)
;
+ return;
}
}
- $
dn = "cn=$sn $gn," . get_config ('base_d
n');
-
($ou) = get_config ('base_dn') =~ m/\bou\s*=\s*([^,]+)/i
;
+ $
ou = encode ('UTF-8', 'Perso
n');
+
$dn = "cn=$sn $gn,ou=$ou," . encode ('UTF-8', get_config ('base_dn'))
;
$entry->add (cn => "$sn $gn", ou => $ou);
$entry->dn ($dn);
$entry->add (cn => "$sn $gn", ou => $ou);
$entry->dn ($dn);
@@
-176,8
+189,9
@@
sub create
if ($mesg->is_error ())
{
if ($mesg->is_error ())
{
- warn ("Error while creating entry '$dn' on LDAP server: " . $mesg->error_text ());
- return (undef);
+ my $tmp = decode ('UTF-8', $dn);
+ warn ("Error while creating entry '$tmp' on LDAP server: " . $mesg->error_text ());
+ return;
}
return (new ($pkg, $entry));
}
return (new ($pkg, $entry));
@@
-228,6
+242,8
@@
sub search
$value =~ s/([\(\)\\])/\\$1/g;
$value =~ s/([\(\)\\])/\\$1/g;
+ confess ("Value is not UTF-8 encoded: `$value'") if (!is_utf8 ($value));
+
push (@disjunc, "($field=$value)");
}
push (@disjunc, "($field=$value)");
}
@@
-257,8
+273,8
@@
sub search
$mesg = $Ldap->search
(
$mesg = $Ldap->search
(
- base => get_config ('base_dn'),
- filter =>
$filter
+ base =>
'ou=Person,' .
get_config ('base_dn'),
+ filter =>
encode ('UTF-8', $filter)
);
if ($mesg->is_error ())
);
if ($mesg->is_error ())
@@
-290,21
+306,21
@@
sub get_user
my $dn = shift;
my ($search) = $dn =~ m/cn\s*=\s*([^,]+)/i;
my $dn = shift;
my ($search) = $dn =~ m/cn\s*=\s*([^,]+)/i;
-
die
unless ($search);
+
return
unless ($search);
my $cn = '';
my $id = '';
my $mesg = $Ldap->search
(
my $cn = '';
my $id = '';
my $mesg = $Ldap->search
(
- base => get_config ('base_dn'),
+ base =>
'ou=Person,' .
get_config ('base_dn'),
filter => "(cn=$search)"
);
if ($mesg->is_error ())
{
filter => "(cn=$search)"
);
if ($mesg->is_error ())
{
-
warn
("Error while querying LDAP server: " . $mesg->error_text ());
- return
('')
;
+
cluck
("Error while querying LDAP server: " . $mesg->error_text ());
+ return;
}
for ($mesg->entries ())
}
for ($mesg->entries ())
@@
-355,22
+371,35
@@
Get or set the lastname.
sub _update_dn
{
sub _update_dn
{
+ confess ("Wrong number of arguments") if (@_ != 3);
my $obj = shift;
my $obj = shift;
+
+ my $obj_new;
+ my %hash_new;
+
+ my $sn = shift;
+ my $gn = shift;
+
my $entry = $obj->{'ldap'};
my $entry = $obj->{'ldap'};
- my $sn = $obj->{'sn'};
- my $gn = $obj->{'givenName'};
- my $cn = "$sn $gn";
- my $dn = "cn=$cn," . get_config ('base_dn');
- $obj->{'cn'} = $cn;
+ if (($sn eq $obj->{'sn'}) && ($gn eq $obj->{'givenName'}))
+ {
+ return;
+ }
- print STDERR "This is _update_dn, trying to set dn=$dn";
+ $hash_new{$_} = $obj->{$_} for (keys %ValidFields);
+ $hash_new{'sn'} = $sn;
+ $hash_new{'givenName'} = $gn;
+ delete ($hash_new{'cn'});
- $entry->changetype ('modify');
- $entry->replace (sn => $sn, givenName => $gn, cn => $cn);
- $entry->update ($Ldap);
- $entry->dn ($dn);
- $entry->update ($Ldap);
+ $obj_new = LiCoM::Person->create (%hash_new)
+ or confess ("Cannot duplicate LDAP entry");
+
+ $obj->delete ();
+
+ %$obj = %$obj_new;
+
+ return ($obj->{'dn'});
}
sub lastname
}
sub lastname
@@
-379,8
+408,7
@@
sub lastname
if (@_)
{
if (@_)
{
- $obj->{'sn'} = shift;
- _update_dn ($obj);
+ _update_dn ($obj, shift, $obj->{'givenName'});
}
return ($obj->{'sn'});
}
return ($obj->{'sn'});
@@
-398,8
+426,7
@@
sub firstname
if (@_)
{
if (@_)
{
- $obj->{'givenName'} = shift;
- _update_dn ($obj);
+ _update_dn ($obj, $obj->{'sn'}, shift);
}
return ($obj->{'givenName'});
}
return ($obj->{'givenName'});
@@
-431,8
+458,6
@@
sub name
=item I<$obj>-E<gt>B<uri> ([I<@uri>])
=item I<$obj>-E<gt>B<uri> ([I<@uri>])
-=item I<$obj>-E<gt>B<group> ([I<@groups>])
-
Get or set the attribute. This is the same as calling S<I<$obj>-E<gt>B<set>
(I<$field>, I<\@values>)> or S<I<$obj>-E<gt>B<get> (I<$field>)>.
Get or set the attribute. This is the same as calling S<I<$obj>-E<gt>B<set>
(I<$field>, I<\@values>)> or S<I<$obj>-E<gt>B<get> (I<$field>)>.
@@
-497,6
+522,8
@@
sub set
if (defined ($value))
{
if (defined ($value))
{
+ $_ = encode ('UTF-8', $_) for (@$value);
+
$entry->changetype ('modify');
if ($ValidFields{$field})
$entry->changetype ('modify');
if ($ValidFields{$field})