lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Register/LDAP.pm

112 lines
2.7 KiB
Perl
Raw Normal View History

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_OK
2020-11-04 16:48:43 +01:00
PE_LDAPERROR
PE_MALFORMEDUSER
2020-11-04 16:48:43 +01:00
PE_LDAPCONNECTFAILED
2017-01-15 09:10:16 +01:00
);
2020-11-04 16:48:43 +01:00
extends qw(
Lemonldap::NG::Portal::Lib::LDAP
Lemonldap::NG::Portal::Register::Base
);
2017-01-15 09:10:16 +01:00
2022-02-01 16:33:08 +01:00
our $VERSION = '2.0.14';
2017-01-15 09:10:16 +01:00
# 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
my $login = $self->applyLoginRule($req);
2020-11-04 16:48:43 +01:00
return PE_MALFORMEDUSER unless $login;
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;
}
$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
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="
. $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/],
uid => $req->data->{registerInfo}->{login},
2017-12-20 23:19:57 +01:00
cn => $cn,
sn => $sn,
givenName => $gn,
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();
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;