lemonldap-ng/modules/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/PasswordDBDBI.pm
2009-12-30 19:42:17 +00:00

139 lines
3.7 KiB
Perl
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

##@file
# DBI password backend file
##@class
# DBI password backend class
package Lemonldap::NG::Portal::PasswordDBDBI;
use strict;
use Lemonldap::NG::Portal::Simple;
use Lemonldap::NG::Portal::AuthDBI; #inherits
use base qw(Lemonldap::NG::Portal::_DBI );
#use Lemonldap::NG::Portal::_SMTP; #inherits
our $VERSION = '0.1';
## @apmethod int passwordDBInit()
# Load SMTP functions and call DBI authInit()
# @return Lemonldap::NG::Portal constant
sub passwordDBInit {
my $self = shift;
eval { use base qw(Lemonldap::NG::Portal::_SMTP) };
if ($@) {
$self->lmLog( "Unable to load SMTP functions ($@)", 'error' );
return PE_ERROR;
}
unless ( $self->{dbiPasswordMailCol} )
{
$self->lmLog( "Missing configuration parameters for DBI password reset",
'error' );
return PE_ERROR;
}
return $self->Lemonldap::NG::Portal::AuthDBI::authInit();
}
## @apmethod int modifyPassword()
# Modify the password
# @return Lemonldap::NG::Portal constant
sub modifyPassword {
my $self = shift;
# Exit if no password change requested
return PE_OK unless ( $self->{newpassword} );
# Verify confirmation password matching
return PE_PASSWORD_MISMATCH
unless ( $self->{newpassword} eq $self->{confirmpassword} );
# Connect
my $dbh =
$self->dbh( $self->{dbiAuthChain}, $self->{dbiAuthUser},
$self->{dbiAuthPassword} );
return PE_ERROR unless $dbh;
my $user = $self->{sessionInfo}->{_user};
# Check old passord
if ( $self->{oldpassword} ) {
# Password hash
my $password = $self->hash_password( $self->{oldpassword}, $self->{dbiAuthPasswordHash} );
my $result = $self->check_password( $user, $password );
unless ( $result ) {
return PE_BADOLDPASSWORD;
}
}
# Modify password
my $password = $self->hash_password( $self->{newpassword}, $self->{dbiAuthPasswordHash} );
my $result = $self->modify_password( $user, $password );
unless ( $result ) {
return PE_ERROR;
}
$self->lmLog( "Password changed for $user", 'debug' );
PE_PASSWORD_OK;
}
## @apmethod int resetPasswordByMail()
# Reset the password and send a mail.
# @return Lemonldap::NG::Portal constant
sub resetPasswordByMail {
my $self = shift;
# Exit method if no mail
return PE_OK unless ( $self->{mail} );
# Find mail in database
my $dbh =
$self->dbh( $self->{dbiAuthChain}, $self->{dbiAuthUser},
$self->{dbiAuthPassword} );
return PE_ERROR unless $dbh;
my $table = $self->{dbiAuthTable};
my $mail = $self->{mail};
my $mailCol = $self->{dbiPasswordMailCol};
$mail =~ s/'/''/g;
my $sth;
eval {
$sth = $dbh->prepare("SELECT * FROM $table WHERE $mailCol='$mail'");
$sth->execute();
};
if ($@) {
$self->lmLog( "DBI error: $@", 'error' );
return PE_ERROR;
}
unless ( $sth->fetchrow_hashref() ) {
$self->lmLog( "Mail $mail not found", 'notice' );
return PE_BADCREDENTIALS;
}
$self->lmLog( "Reset password request for " . $self->{mail}, 'debug' );
# Generate a complex password
my $password = $self->gen_password( $self->{randomPasswordRegexp} );
$self->lmLog( "Generated password: " . $password, 'debug' );
# Modify password
my $hpassword = $self->hash_password( $password, $self->{dbiAuthPasswordHash} );
my $result = $self->modify_password( $self->{mail}, $hpassword, $self->{dbiPasswordMailCol} );
return PE_ERROR unless $result;
# Send new password by mail
$result = $self->send_password( $password, $self->{mail} );
return PE_ERROR unless $result;
PE_PASSWORD_OK;
}
1;