package Lemonldap::NG::Portal::Plugins::FindUser; use strict; use Mouse; use Lemonldap::NG::Portal::Main::Constants qw( PE_OK PE_NOTOKEN PE_FIRSTACCESS PE_TOKENEXPIRED ); our $VERSION = '2.0.13'; extends qw( Lemonldap::NG::Portal::Main::Plugin Lemonldap::NG::Portal::Lib::_tokenRule ); # INITIALIZATION has ott => ( is => 'rw', lazy => 1, default => sub { my $ott = $_[0]->{p}->loadModule('Lemonldap::NG::Portal::Lib::OneTimeToken'); $ott->timeout( $_[0]->{conf}->{formTimeout} ); return $ott; } ); sub init { my ($self) = @_; ( my $imp = grep /::Plugins::Impersonation$/, $self->p->enabledPlugins ) ? $self->addUnauthRoute( finduser => 'provideUser', ['POST'] ) ->addAuthRoute( finduser => 'provideUser', ['POST'] ) # Allow findUser with reAuth : $self->logger->warn('FindUser plugin enabled without Impersonation'); $self->logger->warn('FindUser plugin enabled without searching attribute') unless keys %{ $self->conf->{findUserSearchingAttributes} }; return 1; } # RUNNING METHOD sub provideUser { my ( $self, $req ) = @_; my $error; # Check token if ( $self->ottRule->( $req, {} ) ) { if ( my $token = $req->param('token') ) { unless ( $self->ott->getToken($token) ) { $self->userLogger->warn( 'FindUser called with an expired/bad token'); $error = PE_TOKENEXPIRED; } } else { $self->userLogger->warn('FindUser called without token'); $error = PE_NOTOKEN; } } return $self->_sendResult( $req, $error ) if $error; $req->steps( ['findUser'] ); $req->data->{findUserChoice} = $self->conf->{authChoiceFindUser}; if ( $error = $self->p->process($req) ) { $self->logger->debug("Process returned error: $error"); return $self->_sendResult( $req, $error ); } return $self->_sendResult($req); } sub retreiveFindUserParams { my ( $self, $req ) = @_; my ( $searching, $excluding, @required ) = ( [], [], () ); $self->logger->debug("FindUser: reading parameters..."); @$searching = map { my ( $key, $value, $null ) = split '#', $_; my $param = $req->params($key) // ''; my @values = split $self->conf->{multiValuesSeparator}, $self->conf->{findUserSearchingAttributes}->{$_} || ''; my $select = scalar @values > 1 && not scalar @values % 2; my %values = @values if $select; my $defined = length $param; my $regex = '^(?:' . join( '|', keys %values ) . ')$'; my $checked = $select ? $param =~ /$regex/ : $param =~ /$self->{conf}->{findUserControl}/; push @required, $key unless $null; # For