FindUser DBI & Append unit test (#1976)

This commit is contained in:
Christophe Maudoux 2020-12-22 22:51:37 +01:00
parent 510a1dc1c2
commit 77c25b98cf
4 changed files with 247 additions and 21 deletions

View File

@ -29,28 +29,45 @@ sub provideUser {
return $req->error($error);
}
$req->mustRedirect(1);
return $self->sendJSONresponse(
$req,
{
user => ( $req->{findUser} ? $req->{findUser} : '' ),
result => 1
}
) if $req->wantJSON;
return $self->p->do( $req, [ sub { PE_FIRSTACCESS } ] );
}
sub retreiveFindUserParams {
my ( $self, $req ) = @_;
my ( $params, $excludedParams ) = ( [ {} ], [ {} ] );
my ( $self, $req ) = @_;
my ( $searching, $excluding ) = ( [], [] );
$self->logger->debug("FindUser: reading parameters...");
foreach ( sort keys %{ $self->conf->{findUserSearchingAttributes} } ) {
$self->logger->debug( "Pushing searching parameter: $_ => " . $req->params($_) );
push @$params, { key => $_, value => $req->params($_) };
if ( $req->params($_) ) {
$self->logger->debug(
"Pushing searching parameter: $_ => " . $req->params($_) );
push @$searching, { key => $_, value => $req->params($_) };
}
}
$self->logger->debug("FindUser: reading excluding parameters...");
foreach ( sort keys %{ $self->conf->{findUserExcludingAttributes} } ) {
$self->logger->debug( "Pushing excluded parameter: $_ => "
. $self->conf->{findUserExcludingAttributes}->{$_} );
push @$excludedParams,
{
key => $_,
value => $self->conf->{findUserExcludingAttributes}->{$_}
};
if ( scalar @$searching ) {
$self->logger->debug("FindUser: reading excluding parameters...");
foreach ( sort keys %{ $self->conf->{findUserExcludingAttributes} } ) {
if ( $req->params($_) ) {
$self->logger->debug( "Pushing excluded parameter: $_ => "
. $self->conf->{findUserExcludingAttributes}->{$_} );
push @$excluding,
{
key => $_,
value => $self->conf->{findUserExcludingAttributes}->{$_}
};
}
}
}
return ( $params, $excludedParams );
return ( $searching, $excluding );
}
1;

View File

@ -50,31 +50,32 @@ sub findUser {
my ( $self, $req, %args ) = @_;
my $plugin =
$self->p->loadedModules->{"Lemonldap::NG::Portal::Plugins::FindUser"};
my ( $searching, $excluding ) = $plugin->retreiveFindUserParams($req);
my ( $searching, $excluding, $result ) = $plugin->retreiveFindUserParams($req);
return PE_OK unless scalar @$searching;
my $table = $self->table;
my $pivot = $args{useMail} ? $self->mailField : $self->pivot;
my $request = 'SELECT $pivot FROM $table WHERE ';
my $request = "SELECT $pivot FROM $table WHERE ";
my @args;
my $sth;
foreach (@$searching) {
if ( $_->{value} ) {
$request .= '$' . $_->{key} . '=? AND ';
$request .= "$_->{key} = ? AND ";
push @args, $_->{value};
}
}
foreach (@$excluding) {
if ( $_->{value} ) {
$request .= '$' . $_->{key} . '!=? AND ';
$request .= "$_->{key} != ? AND ";
push @args, $_->{value};
}
}
$request =~ s/AND\s$//;
$self->logger->debug("DBI UserDB built condition: $request");
$self->logger->debug( "DBI UserDB built args: " . join '|', @args );
eval {
$sth = $self->dbh->prepare(eval "$request");
$sth = $self->dbh->prepare($request);
$sth->execute(@args);
};
eval { $self->p->_authentication->setSecurity($req) };
@ -85,12 +86,14 @@ sub findUser {
$self->logger->error("DBI error: $@") if ( $self->_dbh );
return PE_ERROR;
}
if ( my $results = $sth->fetchrow_arrayref() ) {
my $results = $sth->fetchall_arrayref();
if ( $results->[0]->[0] ) {
my $rank = rand( scalar @$results );
$self->logger->debug(
'DBI UserDB number of result(s): ' . scalar @$results );
$self->logger->debug("Demo UserDB random rank: $rank");
$req->{findUser} = $results->[$rank];
$self->userLogger->info("FindUser: DBI UserDB returns $results->[$rank]->[0]");
$req->{findUser} = $results->[$rank]->[0];
}
PE_OK;

View File

@ -102,6 +102,7 @@ sub findUser {
$self->logger->debug(
'Demo UserDB number of result(s): ' . scalar @results );
$self->logger->debug("Demo UserDB random rank: $rank");
$self->userLogger->info("FindUser: Demo UserDB returns $results[$rank]");
$req->{findUser} = $results[$rank];
eval { $self->p->_authentication->setSecurity($req) };

View File

@ -0,0 +1,205 @@
use Test::More;
use strict;
use JSON;
use IO::String;
require 't/test-lib.pm';
my $res;
my $maintests = 31;
my $userdb = tempdb();
SKIP: {
eval { require DBI; require DBD::SQLite; };
if ($@) {
skip 'DBD::SQLite not found', $maintests;
}
my $res;
my $json;
my $request;
my $dbh = DBI->connect("dbi:SQLite:dbname=$userdb");
$dbh->do(
'CREATE TABLE users (user text,password text,name text, type text, guy text)'
);
$dbh->do(
"INSERT INTO users VALUES ('dwho','dwho','Doctor who', 'serie', 'good')"
);
$dbh->do(
"INSERT INTO users VALUES ('rtyler','rtyler','Rose Tyler', 'serie', 'good')"
);
$dbh->do(
"INSERT INTO users VALUES ('davros','davros','Davros', 'serie', 'bad')"
);
$dbh->do(
"INSERT INTO users VALUES ('msmith','msmith','Mr Smith', 'serie', 'good')"
);
$dbh->do(
"INSERT INTO users VALUES ('spoke','spoke','Mr Spoke', 'movie', 'good')"
);
my $client = LLNG::Manager::Test->new( {
ini => {
logLevel => 'debug',
useSafeJail => 1,
authentication => 'DBI',
userDB => 'Same',
dbiAuthChain => "dbi:SQLite:dbname=$userdb",
dbiAuthUser => '',
dbiAuthPassword => '',
dbiAuthTable => 'users',
dbiAuthLoginCol => 'user',
dbiAuthPasswordCol => 'password',
dbiAuthPasswordHash => '',
dbiDynamicHashEnabled => 0,
passwordDB => 'DBI',
requireToken => 1,
findUser => 1,
impersonationRule => 1,
findUserSearchingAttributes =>
{ user => 'Login', guy => 'Kind' },
findUserExcludingAttributes => { type => 'movie' },
}
}
);
## Simple access
ok( $res = $client->_get( '/', accept => 'text/html' ), 'Get Portal', );
my ( $host, $url, $query ) =
expectForm( $res, '#', undef, 'user', 'password', 'spoofId', 'token' );
$request = 'user=dwho';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'text/html',
length => length($request)
),
'Post FindFuser request'
);
( $host, $url, $query ) =
expectForm( $res, '#', undef, 'user', 'password', 'spoofId', 'token' );
ok( $res->[2]->[0] =~ m%value="dwho"%, 'value="dwho"' )
or explain( $res->[2]->[0], 'value="dwho"' );
ok( $res->[2]->[0] =~ m%autocomplete="off"%, 'autocomplete="off"' )
or explain( $res->[2]->[0], 'autocomplete="off"' );
$request = 'user=dwho';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'application/json',
length => length($request)
),
'Post FindFuser request'
);
ok( $json = eval { from_json( $res->[2]->[0] ) }, 'Response is JSON' )
or print STDERR "$@\n" . Dumper($res);
ok( $json->{user} eq 'dwho', ' Good user' )
or explain( $json, 'user => dwho' );
$request = 'user=dwo';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'application/json',
length => length($request)
),
'Post FindFuser request no result'
);
ok( $json = eval { from_json( $res->[2]->[0] ) }, 'Response is JSON' )
or print STDERR "$@\n" . Dumper($res);
ok( $json->{user} eq '', ' No user' )
or explain( $json, "user => ''" );
$request = 'guy=bad';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'application/json',
length => length($request)
),
'Post FindFuser request one result'
);
ok( $json = eval { from_json( $res->[2]->[0] ) }, 'Response is JSON' )
or print STDERR "$@\n" . Dumper($res);
ok( $json->{user} eq 'davros', ' Good user' )
or explain( $json, "user => 'davros'" );
$request = 'guy=good&type=serie';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'application/json',
length => length($request)
),
'Post FindFuser request multi results'
);
ok( $json = eval { from_json( $res->[2]->[0] ) }, 'Response is JSON' )
or print STDERR "$@\n" . Dumper($res);
ok( $json->{user} =~ /^(dwho|rtyler|msmith)$/, " Good user ($1)" )
or explain( $json, "user => $1" );
$request = 'arg=good';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'application/json',
length => length($request)
),
'Post FindFuser request with bad arg'
);
ok( $json = eval { from_json( $res->[2]->[0] ) }, 'Response is JSON' )
or print STDERR "$@\n" . Dumper($res);
ok( $json->{result} == 1, ' Good result' )
or explain( $json, 'result => 1' );
ok( $json->{user} eq '', ' No user' )
or explain( $json, 'user => ?' );
$request = 'guy=good&user=msmith';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'application/json',
length => length($request)
),
'Post FindFuser request with two args'
);
ok( $json = eval { from_json( $res->[2]->[0] ) }, 'Response is JSON' )
or print STDERR "$@\n" . Dumper($res);
ok( $json->{user} eq 'msmith', ' Good user' )
or explain( $json, 'user => msmith' );
$request = 'guy=bad&user=msmith';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'application/json',
length => length($request)
),
'Post FindFuser request with wrong args'
);
ok( $json = eval { from_json( $res->[2]->[0] ) }, 'Response is JSON' )
or print STDERR "$@\n" . Dumper($res);
ok( $json->{result} == 1, ' Good result' )
or explain( $json, 'result => 1' );
ok( $json->{user} eq '', ' No user' )
or explain( $json, 'user => ?' );
$request = 'user=spoke&type=good';
ok(
$res = $client->_post(
'/finduser', IO::String->new($request),
accept => 'application/json',
length => length($request)
),
'Post FindFuser request with excluding result'
);
ok( $json = eval { from_json( $res->[2]->[0] ) }, 'Response is JSON' )
or print STDERR "$@\n" . Dumper($res);
ok( $json->{result} == 1, ' Good result' )
or explain( $json, 'result => 1' );
ok( $json->{user} eq '', ' No user' )
or explain( $json, 'user => ?' );
}
count($maintests);
done_testing( count() );