The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
##@file
# LDAP register backend file

##@class
# LDAP register backend class
package Lemonldap::NG::Portal::RegisterDBLDAP;

use strict;
use Lemonldap::NG::Portal::Simple;

## @method int computeLogin
# Compute a login from register infos
# @result Lemonldap::NG::Portal constant
sub computeLogin {
    my ($self) = @_;

    # Get first letter of firstname and lastname
    my $login =
      substr( lc $self->{registerInfo}->{firstname}, 0, 1 )
      . lc $self->{registerInfo}->{lastname};

    my $finalLogin = $login;

    # The uid must be unique
    my $i = 0;
    while ( $self->isLoginUsed($finalLogin) ) {
        $i++;
        $finalLogin = $login . $i;
    }

    $self->{registerInfo}->{login} = $finalLogin;

    return PE_OK;
}

## @method int createUser
# Insert new user
# @result Lemonldap::NG::Portal constant
sub createUser {
    my ($self) = @_;

    my $mesg = $self->ldap->add(
        "uid=" . $self->{registerInfo}->{login} . "," . $self->{ldapBase},
        attrs => [
            objectClass => [qw/top person organizationalPerson inetOrgPerson/],
            uid         => $self->{registerInfo}->{login},
            cn          => ucfirst $self->{registerInfo}->{firstname} . " "
              . uc $self->{registerInfo}->{lastname},
            sn           => uc $self->{registerInfo}->{lastname},
            givenName    => ucfirst $self->{registerInfo}->{firstname},
            userPassword => $self->{registerInfo}->{password},
            mail         => $self->{registerInfo}->{mail},
        ]
    );

    if ( $mesg->is_error ) {
        $self->lmLog(
            "Can not create entry for " . $self->{registerInfo}->{login},
            'error' );
        $self->lmLog( "LDAP error " . $mesg->error, 'error' );

        $self->ldap->unbind();
        $self->{flags}->{ldapActive} = 0;

        return PE_LDAPERROR;
    }

    return PE_OK;
}

## @method bool isLoginUsed
# Search if login is already in use
# @result 0 if login is used, 1 else
sub isLoginUsed {
    my ( $self, $login ) = @_;

    my $mesg = $self->ldap->search(
        base   => $self->{ldapBase},
        filter => "(uid=$login)",
        scope  => "sub",
        attrs  => ['1.1'],
    );

    if ( $mesg->code() != 0 ) {
        $self->lmLog( "LDAP Search error for $login: " . $mesg->error, 'warn' );
        return 1;
    }

    if ( $mesg->count() > 0 ) {
        $self->lmLog( "Login $login already used in LDAP", 'debug' );
        return 1;
    }

    return 0;
}

## @apmethod int registerDBFinish()
# Unbind.
# @return Lemonldap::NG::Portal constant
sub registerDBFinish {
    my $self = shift;

    if ( ref( $self->{ldap} ) && $self->{flags}->{ldapActive} ) {
        $self->ldap->unbind();
        $self->{flags}->{ldapActive} = 0;
    }

    PE_OK;
}

1;