140 lines
3.3 KiB
Perl
140 lines
3.3 KiB
Perl
package Lemonldap::NG::Portal::UserDB::REST;
|
|
|
|
use strict;
|
|
use Mouse;
|
|
use JSON qw(from_json to_json);
|
|
use Lemonldap::NG::Portal::Main::Constants qw(
|
|
PE_OK
|
|
PE_ERROR
|
|
PE_USERNOTFOUND
|
|
PE_BADCREDENTIALS
|
|
);
|
|
|
|
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} ) {
|
|
$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 {
|
|
$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} || {};
|
|
|
|
return PE_OK;
|
|
}
|
|
|
|
sub findUser {
|
|
my ( $self, $req, %args ) = @_;
|
|
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;
|
|
|
|
my $res;
|
|
$searching = [
|
|
map {
|
|
{ $_->{key} => $_->{value} }
|
|
} @$searching
|
|
];
|
|
$excluding = [
|
|
map {
|
|
{ $_->{key} => $_->{value} }
|
|
} @$excluding
|
|
];
|
|
$res = eval {
|
|
$self->restCall(
|
|
$self->findUserDBUrl,
|
|
{
|
|
searchingAttributes => to_json($searching),
|
|
(
|
|
scalar @$excluding
|
|
? ( excludingAttributes => to_json($excluding) )
|
|
: ()
|
|
)
|
|
}
|
|
);
|
|
};
|
|
if ($@) {
|
|
$self->logger->error("UserDB REST error: $@");
|
|
return PE_ERROR;
|
|
}
|
|
unless ( $res->{result} ) {
|
|
$self->userLogger->info('FindUser: no user found from REST UserDB');
|
|
return PE_USERNOTFOUND;
|
|
}
|
|
|
|
my $results = $res->{users};
|
|
$self->logger->debug(
|
|
'REST UserDB number of result(s): ' . scalar @$results );
|
|
if ( scalar @$results ) {
|
|
my $rank = int( rand( scalar @$results ) );
|
|
$self->logger->debug("REST UserDB random rank: $rank");
|
|
$self->userLogger->info(
|
|
"FindUser: REST UserDB returns $results->[$rank]");
|
|
$req->data->{findUser} = $results->[$rank];
|
|
return PE_OK;
|
|
}
|
|
|
|
return PE_USERNOTFOUND;
|
|
}
|
|
|
|
sub setSessionInfo {
|
|
my ( $self, $req ) = @_;
|
|
$req->sessionInfo->{$_} = $req->data->{restUserDBInfo}->{$_}
|
|
foreach ( keys %{ $req->data->{restUserDBInfo} } );
|
|
|
|
return PE_OK;
|
|
}
|
|
|
|
sub setGroups {
|
|
return PE_OK;
|
|
}
|
|
|
|
1;
|