lemonldap-ng/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/UserDB/REST.pm

140 lines
3.3 KiB
Perl
Raw Normal View History

package Lemonldap::NG::Portal::UserDB::REST;
use strict;
use Mouse;
2021-01-02 18:44:00 +01:00
use JSON qw(from_json to_json);
use Lemonldap::NG::Portal::Main::Constants qw(
PE_OK
2021-01-03 19:00:20 +01:00
PE_ERROR
PE_USERNOTFOUND
PE_BADCREDENTIALS
);
2021-01-03 19:00:20 +01:00
extends qw(
Lemonldap::NG::Common::Module
Lemonldap::NG::Portal::Lib::REST
);
our $VERSION = '2.0.12';
# INITIALIZATION
has findUserDBUrl => (
is => 'ro',
lazy => 1,
default => sub {
$_[0]->conf->{restFindUserDBUrl} || $_[0]->conf->{restUserDBUrl};
}
);
sub init {
my $self = shift;
unless ( $self->conf->{restUserDBUrl} ) {
2021-03-17 14:22:19 +01:00
$self->logger->error('REST User data URL is not set');
return 0;
}
return 1;
}
# RUNNING METHODS
sub getUser {
my ( $self, $req, %args ) = @_;
my $res;
$res = eval {
2019-12-16 17:44:41 +01:00
$self->restCall(
$self->conf->{restUserDBUrl},
{
( $args{useMail} ? 'mail' : 'user' ) => $req->user,
'useMail' => ( $args{useMail} ? JSON::true : JSON::false ),
}
);
};
if ($@) {
$self->logger->error("UserDB REST error: $@");
eval { $self->p->_authentication->setSecurity($req) };
return PE_ERROR;
}
unless ( $res->{result} ) {
$self->userLogger->warn( 'User ' . $req->user . ' not found' );
eval { $self->p->_authentication->setSecurity($req) };
return PE_BADCREDENTIALS;
}
$req->data->{restUserDBInfo} = $res->{info} || {};
2021-01-03 19:00:20 +01:00
return PE_OK;
}
2020-12-22 15:17:23 +01:00
sub findUser {
my ( $self, $req, %args ) = @_;
2021-01-02 18:44:00 +01:00
my $plugin =
$self->p->loadedModules->{"Lemonldap::NG::Portal::Plugins::FindUser"};
my ( $searching, $excluding ) = $plugin->retreiveFindUserParams($req);
eval { $self->p->_authentication->setSecurity($req) };
return PE_OK unless scalar @$searching;
2020-12-22 15:17:23 +01:00
my $res;
2021-01-02 18:44:00 +01:00
$searching = [
map {
{ $_->{key} => $_->{value} }
} @$searching
];
$excluding = [
map {
{ $_->{key} => $_->{value} }
} @$excluding
];
$res = eval {
$self->restCall(
$self->findUserDBUrl,
2021-01-02 18:44:00 +01:00
{
searchingAttributes => to_json($searching),
(
scalar @$excluding
2021-01-02 18:58:40 +01:00
? ( excludingAttributes => to_json($excluding) )
2021-01-02 18:44:00 +01:00
: ()
)
}
);
};
if ($@) {
$self->logger->error("UserDB REST error: $@");
return PE_ERROR;
}
unless ( $res->{result} ) {
$self->userLogger->info('FindUser: no user found from REST UserDB');
2021-01-03 19:00:20 +01:00
return PE_USERNOTFOUND;
2021-01-02 18:44:00 +01:00
}
2021-01-02 22:50:56 +01:00
my $results = $res->{users};
2021-01-02 18:44:00 +01:00
$self->logger->debug(
'REST UserDB number of result(s): ' . scalar @$results );
if ( scalar @$results ) {
2021-01-02 22:50:56 +01:00
my $rank = int( rand( scalar @$results ) );
2021-01-02 18:44:00 +01:00
$self->logger->debug("REST UserDB random rank: $rank");
$self->userLogger->info(
"FindUser: REST UserDB returns $results->[$rank]");
$req->data->{findUser} = $results->[$rank];
2021-01-03 19:00:20 +01:00
return PE_OK;
2021-01-02 18:44:00 +01:00
}
2021-01-03 19:00:20 +01:00
return PE_USERNOTFOUND;
2020-12-22 15:17:23 +01:00
}
sub setSessionInfo {
my ( $self, $req ) = @_;
$req->sessionInfo->{$_} = $req->data->{restUserDBInfo}->{$_}
foreach ( keys %{ $req->data->{restUserDBInfo} } );
return PE_OK;
}
sub setGroups {
return PE_OK;
}
1;