2017-01-15 09:10:16 +01:00
|
|
|
package Lemonldap::NG::Portal::Register::LDAP;
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
use Mouse;
|
|
|
|
use Lemonldap::NG::Portal::Main::Constants qw(
|
|
|
|
PE_LDAPCONNECTFAILED
|
|
|
|
PE_LDAPERROR
|
|
|
|
PE_OK
|
2019-06-08 13:28:37 +02:00
|
|
|
PE_MALFORMEDUSER
|
2017-01-15 09:10:16 +01:00
|
|
|
);
|
|
|
|
|
2019-06-08 13:28:37 +02:00
|
|
|
extends 'Lemonldap::NG::Portal::Lib::LDAP',
|
|
|
|
'Lemonldap::NG::Portal::Register::Base';
|
2017-01-15 09:10:16 +01:00
|
|
|
|
|
|
|
our $VERSION = '2.0.0';
|
|
|
|
|
|
|
|
# RUNNING METHODS
|
|
|
|
|
|
|
|
# Compute a login from register infos
|
|
|
|
# @result Lemonldap::NG::Portal constant
|
|
|
|
sub computeLogin {
|
|
|
|
my ( $self, $req ) = @_;
|
|
|
|
return PE_LDAPCONNECTFAILED unless $self->ldap and $self->bind();
|
|
|
|
|
|
|
|
# Get first letter of firstname and lastname
|
2019-06-08 13:28:37 +02:00
|
|
|
my $login = $self->applyLoginRule($req);
|
|
|
|
|
|
|
|
unless ($login) {
|
|
|
|
return PE_MALFORMEDUSER;
|
|
|
|
}
|
2017-01-15 09:10:16 +01:00
|
|
|
|
|
|
|
my $finalLogin = $login;
|
|
|
|
|
|
|
|
# The uid must be unique
|
|
|
|
my $i = 0;
|
|
|
|
while ( $self->isLoginUsed($finalLogin) ) {
|
|
|
|
$i++;
|
|
|
|
$finalLogin = $login . $i;
|
|
|
|
}
|
|
|
|
|
2018-07-05 22:56:16 +02:00
|
|
|
$req->data->{registerInfo}->{login} = $finalLogin;
|
2017-01-15 09:10:16 +01:00
|
|
|
return PE_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
## @method int createUser
|
|
|
|
# Do nothing
|
|
|
|
# @result Lemonldap::NG::Portal constant
|
|
|
|
sub createUser {
|
|
|
|
my ( $self, $req ) = @_;
|
|
|
|
|
|
|
|
# LDAP connection has been verified by computeLogin
|
2018-07-05 22:56:16 +02:00
|
|
|
my $sn = uc $req->data->{registerInfo}->{lastname};
|
|
|
|
my $gn = ucfirst $req->data->{registerInfo}->{firstname};
|
2017-12-20 23:19:57 +01:00
|
|
|
my $cn = "$gn $sn";
|
|
|
|
utf8::decode($cn);
|
|
|
|
utf8::decode($sn);
|
|
|
|
utf8::decode($gn);
|
2017-01-15 09:10:16 +01:00
|
|
|
my $mesg = $self->ldap->add(
|
2017-01-16 10:12:07 +01:00
|
|
|
"uid="
|
2018-07-05 22:56:16 +02:00
|
|
|
. $req->data->{registerInfo}->{login} . ","
|
2017-01-16 10:12:07 +01:00
|
|
|
. $self->conf->{ldapBase},
|
2017-01-15 09:10:16 +01:00
|
|
|
attrs => [
|
2017-12-20 23:19:57 +01:00
|
|
|
objectClass => [qw/top person organizationalPerson inetOrgPerson/],
|
2018-07-05 22:56:16 +02:00
|
|
|
uid => $req->data->{registerInfo}->{login},
|
2017-12-20 23:19:57 +01:00
|
|
|
cn => $cn,
|
|
|
|
sn => $sn,
|
|
|
|
givenName => $gn,
|
2018-07-05 22:56:16 +02:00
|
|
|
userPassword => $req->data->{registerInfo}->{password},
|
|
|
|
mail => $req->data->{registerInfo}->{mail},
|
2017-01-15 09:10:16 +01:00
|
|
|
]
|
|
|
|
);
|
|
|
|
|
|
|
|
if ( $mesg->is_error ) {
|
2018-07-05 23:00:40 +02:00
|
|
|
$self->userLogger->error(
|
|
|
|
"Can not create entry for " . $req->data->{registerInfo}->{login} );
|
2019-09-30 17:19:57 +02:00
|
|
|
$self->logger->error(
|
|
|
|
"LDAP error " . $mesg->code . ": " . $mesg->error );
|
2017-01-15 09:10:16 +01:00
|
|
|
|
|
|
|
$self->ldap->unbind();
|
|
|
|
$self->{flags}->{ldapActive} = 0;
|
|
|
|
|
|
|
|
return PE_LDAPERROR;
|
|
|
|
}
|
|
|
|
return PE_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
# PRIVATE METHODS
|
|
|
|
|
|
|
|
# Search if login is already in use
|
|
|
|
sub isLoginUsed {
|
|
|
|
my ( $self, $login ) = @_;
|
|
|
|
|
|
|
|
my $mesg = $self->ldap->search(
|
|
|
|
base => $self->conf->{ldapBase},
|
|
|
|
filter => "(uid=$login)",
|
|
|
|
scope => "sub",
|
|
|
|
attrs => ['1.1'],
|
|
|
|
);
|
|
|
|
|
|
|
|
if ( $mesg->code() != 0 ) {
|
2017-02-15 07:41:50 +01:00
|
|
|
$self->logger->warn( "LDAP Search error for $login: " . $mesg->error );
|
2017-01-15 09:10:16 +01:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( $mesg->count() > 0 ) {
|
2017-02-15 07:41:50 +01:00
|
|
|
$self->logger->debug("Login $login already used in LDAP");
|
2017-01-15 09:10:16 +01:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|