2008-10-05 20:42:50 +02:00
|
|
|
package Lemonldap::NG::Portal::_LDAP;
|
|
|
|
|
|
|
|
use Net::LDAP;
|
2008-12-04 14:53:05 +01:00
|
|
|
use base qw(Net::LDAP);
|
2008-10-05 20:42:50 +02:00
|
|
|
|
|
|
|
our $VERSION = '0.1';
|
|
|
|
|
|
|
|
sub new {
|
2008-10-07 22:15:48 +02:00
|
|
|
my $class = shift;
|
2008-10-05 20:42:50 +02:00
|
|
|
my $portal = shift;
|
2008-10-07 22:15:48 +02:00
|
|
|
my $self;
|
|
|
|
unless ($portal) {
|
2008-11-21 08:27:08 +01:00
|
|
|
$class->abort("$class : portal argument required !");
|
2008-10-05 20:42:50 +02:00
|
|
|
}
|
|
|
|
my $useTls = 0;
|
|
|
|
my $tlsParam;
|
2008-10-07 22:15:48 +02:00
|
|
|
foreach my $server ( split /[\s,]+/, $portal->{ldapServer} ) {
|
2008-10-05 20:42:50 +02:00
|
|
|
if ( $server =~ m{^ldap\+tls://([^/]+)/?\??(.*)$} ) {
|
|
|
|
$useTls = 1;
|
|
|
|
$server = $1;
|
|
|
|
$tlsParam = $2 || "";
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$useTls = 0;
|
|
|
|
}
|
|
|
|
last
|
2008-10-07 22:15:48 +02:00
|
|
|
if $self = Net::LDAP->new(
|
2008-10-05 20:42:50 +02:00
|
|
|
$server,
|
2008-10-07 22:15:48 +02:00
|
|
|
port => $portal->{ldapPort},
|
2008-10-05 20:42:50 +02:00
|
|
|
onerror => undef,
|
|
|
|
);
|
|
|
|
}
|
2008-10-07 22:15:48 +02:00
|
|
|
unless ($self) {
|
|
|
|
print STDERR "$@\n";
|
|
|
|
return 0;
|
|
|
|
}
|
2008-10-08 10:45:15 +02:00
|
|
|
bless $self, $class;
|
2008-10-05 20:42:50 +02:00
|
|
|
if ($useTls) {
|
|
|
|
my %h = split( /[&=]/, $tlsParam );
|
2008-10-07 22:15:48 +02:00
|
|
|
$h{cafile} = $portal->{caFile} if ( $portal->{caFile} );
|
|
|
|
$h{capath} = $portal->{caPath} if ( $portal->{caPath} );
|
2008-10-05 20:42:50 +02:00
|
|
|
my $mesg = $self->{ldap}->start_tls(%h);
|
2008-10-07 22:15:48 +02:00
|
|
|
if ( $mesg->code ) {
|
|
|
|
print STDERR __PACKAGE__ . " StartTLS failed\n";
|
|
|
|
return 0;
|
|
|
|
}
|
2008-10-05 20:42:50 +02:00
|
|
|
}
|
2008-10-07 22:15:48 +02:00
|
|
|
$self->{portal} = $portal;
|
|
|
|
return $self;
|
2008-10-05 20:42:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
# 6. LDAP bind with Lemonldap::NG account or anonymous unless defined
|
|
|
|
sub bind {
|
|
|
|
my $self = shift;
|
2008-10-07 22:15:48 +02:00
|
|
|
my $mesg;
|
|
|
|
my ( $dn, %args ) = @_;
|
|
|
|
$dn ||= $self->{portal}->{managerDn};
|
2008-10-08 11:40:24 +02:00
|
|
|
$args{password} ||= $self->{portal}->{managerPassword};
|
2008-11-05 22:26:37 +01:00
|
|
|
if ( $dn && $args{password} ) {
|
|
|
|
$mesg = $self->SUPER::bind( $dn, %args );
|
2008-11-21 18:51:52 +01:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
$mesg = $self->SUPER::bind();
|
2008-11-05 22:26:37 +01:00
|
|
|
}
|
|
|
|
return $mesg;
|
2008-10-05 20:42:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
1;
|