lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Password/Combination.pm
2022-02-16 17:43:29 +01:00

77 lines
2.0 KiB
Perl

package Lemonldap::NG::Portal::Password::Combination;
our $VERSION = '2.0.10';
use strict;
use Mouse;
use Lemonldap::NG::Portal::Main::Constants qw(PE_OK PE_ERROR PE_FIRSTACCESS);
extends qw(
Lemonldap::NG::Portal::Password::Base
);
with 'Lemonldap::NG::Portal::Lib::OverConf';
has 'mods' => ( is => 'rw', isa => 'HashRef', default => sub { {} } );
sub init {
my $self = shift;
# Check if expression exists
unless ( $self->conf->{combination} ) {
$self->error('No combination found');
return 0;
}
# Load all declared modules
my %mods;
foreach my $key ( keys %{ $self->conf->{combModules} } ) {
my $tmp;
my $mod = $self->conf->{combModules}->{$key};
unless ( $mod->{type} and defined $mod->{for} ) {
$self->error("Malformed combination module $key");
return 0;
}
# Only load modules used for UserDB
unless ( $mod->{for} == 1 ) {
$tmp =
$self->loadModule( "::Password::$mod->{type}", $mod->{over} );
unless ($tmp) {
$self->logger->notice("Unable to load Password::$mod->{type}");
next;
}
}
# Store modules as array
$self->mods->{$key} = $tmp;
}
return $self->SUPER::init;
}
sub delegate {
my ( $self, $req, $name, @args ) = @_;
# The user might want to override which password DB is used with a macro
# This is useful when using SASL delegation in OpenLDAP
my $userDB =
$req->sessionInfo->{_cmbPasswordDB} || $req->sessionInfo->{_userDB};
unless ( $self->mods->{$userDB} ) {
$self->logger->error("No Password module available for $userDB");
return PE_ERROR;
}
return $self->mods->{$userDB}->$name( $req, @args );
}
sub confirm {
my ( $self, $req, @args ) = @_;
return $self->delegate( $req, "confirm", @args );
}
sub modifyPassword {
my ( $self, $req, @args ) = @_;
return $self->delegate( $req, "modifyPassword", @args );
}
1;