Re: ppolicy control and change password exop (again)
Graham Barr <[email protected]>
| Newsgroups | gmane.comp.lang.perl.modules.ldap |
|---|---|
| Message-ID | <[email protected]> |
On May 27, 2009, at 2:58 AM, Guillaume Rousse wrote:
> Chris Ridd a écrit :
>> which is "passwordTooShort". So... the server seems OK and it must
>> be the perl code that's going wrong somewhere. If you single-step
>> into result->control does it look like it is finding and returning
>> the right thing?
> Actually, it returns a list of controls, and the code enforce a
> scalar context...
>
> Changing the code to
> my ($response) = $result->control(LDAP_CONTROL_PASSWORDPOLICY);
> is enough to fix the issue. And the documentation is correct, I just
> misread it :(
>
> Having the method named controlS would have been less error-prone
> but I guess it's a bit late to change it.
Actually I htink there is a bug. As you only have one control in your
response, if you did
my $response = $result->control;
you would have got the control.
That is because when there are arguments to ->control, the code is
returning an array, not a list, which in a scalar context returns its
length.
Also, the current code only supports passing one OID, although the
docs suggest otherwise
Try this patch
diff --git a/lib/Net/LDAP/Message.pm b/lib/Net/LDAP/Message.pm
index 8e8436f..7df478d 100644
--- a/lib/Net/LDAP/Message.pm
+++ b/lib/Net/LDAP/Message.pm
@@ -210,12 +210,15 @@ sub control {
}
}
- return unless $self->{ctrl_hash};
+ my $ctrl_hash = $self->{ctrl_hash}
+ or return;
+
+ my @oid = @_ ? @_ : keys %$ctrl_hash;
+ my @control = map {@$_} grep $_, @{$ctrl_hash}{@oid}
+ or return;
- @_ ? exists $self->{ctrl_hash}{$_[0]}
- ? @{$self->{ctrl_hash}{$_[0]}}
- : ()
- : map { @$_ } values %{$self->{ctrl_hash}};
+ # return a list, so in a scalar context we do not just get array
length
+ return @control[0 .. $#control];
}
sub pdu { shift->{pdu} }
Graham.