Bug 27342: Remove dbh from C4::Auth

We must not pass $dbh but retrieve it when needed instead

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Jonathan Druart 2021-01-05 11:28:16 +01:00 committed by Tomas Cohen Arazi
parent 4c44dd5eb4
commit 1b92fd78fd
No known key found for this signature in database
GPG Key ID: 0A272EA1B2F3C15F
10 changed files with 54 additions and 63 deletions

View File

@ -404,7 +404,6 @@ sub get_template_and_user {
# we add them to the logged-in search history
my @recentSearches = C4::Search::History::get_from_session( { cgi => $in->{'query'} } );
if (@recentSearches) {
my $dbh = C4::Context->dbh;
my $query = q{
INSERT INTO search_history(userid, sessionid, query_desc, query_cgi, type, total, time )
VALUES (?, ?, ?, ?, ?, ?, ?)
@ -837,7 +836,6 @@ sub checkauth {
@allowed_scripts_for_private_opac;
}
my $dbh = C4::Context->dbh;
my $timeout = _timeout_syspref();
my $cookie_mgr = Koha::CookieManager->new;
@ -1045,7 +1043,7 @@ sub checkauth {
my $retuserid;
# Do not pass password here, else shib will not be checked in checkpw.
( $return, $cardnumber, $retuserid ) = checkpw( $dbh, $q_userid, undef, $query );
( $return, $cardnumber, $retuserid ) = checkpw( $q_userid, undef, $query );
$userid = $retuserid;
$shibSuccess = $return;
$info{'invalidShibLogin'} = 1 unless ($return);
@ -1056,7 +1054,7 @@ sub checkauth {
if ( $cas && $query->param('ticket') ) {
my $retuserid;
( $return, $cardnumber, $retuserid, $cas_ticket ) =
checkpw( $dbh, $userid, $password, $query, $type );
checkpw( $userid, $password, $query, $type );
$userid = $retuserid;
$info{'invalidCasLogin'} = 1 unless ($return);
}
@ -1125,7 +1123,7 @@ sub checkauth {
{
( $return, $cardnumber, $retuserid, $cas_ticket ) =
checkpw( $dbh, $q_userid, $password, $query, $type );
checkpw( $q_userid, $password, $query, $type );
$userid = $retuserid if ($retuserid);
$info{'invalid_username_or_password'} = 1 unless ($return);
}
@ -1170,6 +1168,7 @@ sub checkauth {
FROM borrowers
LEFT JOIN branches on borrowers.branchcode=branches.branchcode
";
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare("$select where userid=?");
$sth->execute($userid);
unless ( $sth->rows ) {
@ -1541,7 +1540,6 @@ sub check_api_auth {
my $query = shift;
my $flagsrequired = shift;
my $dbh = C4::Context->dbh;
my $timeout = _timeout_syspref();
unless ( C4::Context->preference('Version') ) {
@ -1594,7 +1592,7 @@ sub check_api_auth {
# In case of a CAS authentication, we use the ticket instead of the password
my $PT = $query->param('PT');
( $return, $cardnumber, $userid, $cas_ticket ) = check_api_auth_cas( $dbh, $PT, $query ); # EXTERNAL AUTH
( $return, $cardnumber, $userid, $cas_ticket ) = check_api_auth_cas( $PT, $query ); # EXTERNAL AUTH
} else {
# User / password auth
@ -1604,7 +1602,7 @@ sub check_api_auth {
return ( "failed", undef, undef );
}
my $newuserid;
( $return, $cardnumber, $newuserid, $cas_ticket ) = checkpw( $dbh, $userid, $password, $query );
( $return, $cardnumber, $newuserid, $cas_ticket ) = checkpw( $userid, $password, $query );
}
if ( $return and haspermission( $userid, $flagsrequired ) ) {
@ -1626,6 +1624,7 @@ sub check_api_auth {
$userflags, $branchcode, $branchname,
$emailaddress
);
my $dbh = C4::Context->dbh;
my $sth =
$dbh->prepare(
"select borrowernumber, firstname, surname, flags, borrowers.branchcode, branches.branchname as branchname, email from borrowers left join branches on borrowers.branchcode=branches.branchcode where userid=?"
@ -1891,7 +1890,7 @@ sub get_session {
# Currently it's only passed from C4::SIP::ILS::Patron::check_password, but
# not having a userenv defined could cause a crash.
sub checkpw {
my ( $dbh, $userid, $password, $query, $type, $no_set_userenv ) = @_;
my ( $userid, $password, $query, $type, $no_set_userenv ) = @_;
$type = 'opac' unless $type;
# Get shibboleth login attribute
@ -1926,7 +1925,7 @@ sub checkpw {
# In case of a CAS authentication, we use the ticket instead of the password
my $ticket = $query->param('ticket');
$query->delete('ticket'); # remove ticket to come back to original URL
my ( $retval, $retcard, $retuserid, $cas_ticket ) = checkpw_cas( $dbh, $ticket, $query, $type ); # EXTERNAL AUTH
my ( $retval, $retcard, $retuserid, $cas_ticket ) = checkpw_cas( $ticket, $query, $type ); # EXTERNAL AUTH
if ( $retval ) {
@return = ( $retval, $retcard, $retuserid, $cas_ticket );
} else {
@ -1958,7 +1957,7 @@ sub checkpw {
# INTERNAL AUTH
if ( $check_internal_as_fallback ) {
@return = checkpw_internal( $dbh, $userid, $password, $no_set_userenv);
@return = checkpw_internal( $userid, $password, $no_set_userenv);
$passwd_ok = 1 if $return[0] > 0; # 1 or 2
}
@ -1984,11 +1983,12 @@ sub checkpw {
}
sub checkpw_internal {
my ( $dbh, $userid, $password, $no_set_userenv ) = @_;
my ( $userid, $password, $no_set_userenv ) = @_;
$password = Encode::encode( 'UTF-8', $password )
if Encode::is_utf8($password);
my $dbh = C4::Context->dbh;
my $sth =
$dbh->prepare(
"select password,cardnumber,borrowernumber,userid,firstname,surname,borrowers.branchcode,branches.branchname,flags from borrowers join branches on borrowers.branchcode=branches.branchcode where userid=?"

View File

@ -99,7 +99,7 @@ sub login_cas_url {
# Checks for password correctness
# In our case : is there a ticket, is it valid and does it match one of our users ?
sub checkpw_cas {
my ($dbh, $ticket, $query, $type) = @_;
my ($ticket, $query, $type) = @_;
my $retnumber;
my ( $cas, $uri ) = _get_cas_and_service($query, undef, $type);
@ -117,6 +117,7 @@ sub checkpw_cas {
# we should store the CAS ticekt too, we need this for single logout https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol-Specification.html#233-single-logout
# Does it match one of our users ?
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare("select cardnumber from borrowers where userid=?");
$sth->execute($userid);
if ( $sth->rows ) {
@ -147,7 +148,7 @@ sub checkpw_cas {
# Proxy CAS auth
sub check_api_auth_cas {
my ($dbh, $PT, $query, $type) = @_;
my ($PT, $query, $type) = @_;
my $retnumber;
my ( $cas, $uri ) = _get_cas_and_service($query, undef, $type);
@ -164,6 +165,7 @@ sub check_api_auth_cas {
# we should store the CAS ticket too, we need this for single logout https://apereo.github.io/cas/4.2.x/protocol/CAS-Protocol-Specification.html#233-single-logout
# Does it match one of our users ?
my $dbh = C4::Context->dbh;
my $sth = $dbh->prepare("select cardnumber from borrowers where userid=?");
$sth->execute($userid);
if ( $sth->rows ) {

View File

@ -109,7 +109,7 @@ sub search_method {
}
sub checkpw_ldap {
my ($dbh, $userid, $password) = @_;
my ($userid, $password) = @_;
my @hosts = split(',', $prefhost);
my $db = Net::LDAP->new(\@hosts);
unless ( $db ) {
@ -355,7 +355,7 @@ sub _do_changepassword {
#warn "changing local password for borrowernumber=$borrowerid to '$digest'\n";
Koha::Patrons->find($borrowerid)->set_password({ password => $password, skip_validation => 1 });
my ($ok, $cardnum) = checkpw_internal(C4::Context->dbh, $userid, $password);
my ($ok, $cardnum) = checkpw_internal($userid, $password);
return $cardnum if $ok;
warn "Password mismatch after update to borrowernumber=$borrowerid";

View File

@ -274,9 +274,8 @@ sub check_password {
# If the record has a NULL password, accept '' as match
return $pwd eq q{} unless $self->{password};
my $dbh = C4::Context->dbh;
my $ret = 0;
($ret) = checkpw( $dbh, $self->{userid}, $pwd, undef, undef, 1 ); # dbh, userid, query, type, no_set_userenv
($ret) = checkpw( $self->{userid}, $pwd, undef, undef, 1 ); # userid, query, type, no_set_userenv
return $ret;
}

View File

@ -505,8 +505,7 @@ sub _basic_auth {
my $decoded_credentials = decode_base64( $credentials );
my ( $user_id, $password ) = split( /:/, $decoded_credentials, 2 );
my $dbh = C4::Context->dbh;
unless ( checkpw_internal($dbh, $user_id, $password ) ) {
unless ( checkpw_internal($user_id, $password ) ) {
Koha::Exceptions::Authorization::Unauthorized->throw( error => 'Invalid password' );
}

View File

@ -119,8 +119,7 @@ sub set_public {
}
return try {
my $dbh = C4::Context->dbh;
unless ( checkpw_internal($dbh, $user->userid, $old_password ) ) {
unless ( checkpw_internal($user->userid, $old_password ) ) {
return $c->render(
status => 400,
openapi => { error => "Invalid password" }

View File

@ -118,8 +118,7 @@ my $issuer = Koha::Patrons->find( $issuerid )->unblessed;
my $patronid = $jwt ? Koha::Token->new->decode_jwt({ token => $jwt }) : undef;
unless ( $patronid ) {
if ( C4::Context->preference('SelfCheckoutByLogin') ) {
my $dbh = C4::Context->dbh;
( undef, $patronid ) = checkpw( $dbh, $patronlogin, $patronpw );
( undef, $patronid ) = checkpw( $patronlogin, $patronpw );
}
else { # People should not do that unless they know what they are doing!
# SelfCheckAllowByIPRanges MUST be configured

View File

@ -28,7 +28,6 @@ BEGIN {
my $schema = Koha::Database->schema;
my $builder = t::lib::TestBuilder->new;
my $dbh = C4::Context->dbh;
# FIXME: SessionStorage defaults to mysql, but it seems to break transaction
# handling
@ -258,14 +257,14 @@ subtest 'no_set_userenv parameter tests' => sub {
t::lib::Mocks::mock_preference( 'RequireStrongPassword', 0 );
$patron->set_password({ password => $password });
ok( checkpw( $dbh, $patron->userid, $password, undef, undef, 1 ), 'checkpw returns true' );
ok( checkpw( $patron->userid, $password, undef, undef, 1 ), 'checkpw returns true' );
is( C4::Context->userenv, undef, 'Userenv should be undef as required' );
C4::Context->_new_userenv('DUMMY SESSION');
C4::Context->set_userenv(0,0,0,'firstname','surname', $library->branchcode, 'Library 1', 0, '', '');
is( C4::Context->userenv->{branch}, $library->branchcode, 'Userenv gives correct branch' );
ok( checkpw( $dbh, $patron->userid, $password, undef, undef, 1 ), 'checkpw returns true' );
ok( checkpw( $patron->userid, $password, undef, undef, 1 ), 'checkpw returns true' );
is( C4::Context->userenv->{branch}, $library->branchcode, 'Userenv branch is preserved if no_set_userenv is true' );
ok( checkpw( $dbh, $patron->userid, $password, undef, undef, 0 ), 'checkpw still returns true' );
ok( checkpw( $patron->userid, $password, undef, undef, 0 ), 'checkpw still returns true' );
isnt( C4::Context->userenv->{branch}, $library->branchcode, 'Userenv branch is overwritten if no_set_userenv is false' );
};
@ -280,15 +279,15 @@ subtest 'checkpw lockout tests' => sub {
t::lib::Mocks::mock_preference( 'FailedLoginAttempts', 1 );
$patron->set_password({ password => $password });
my ( $checkpw, undef, undef ) = checkpw( $dbh, $patron->cardnumber, $password, undef, undef, 1 );
my ( $checkpw, undef, undef ) = checkpw( $patron->cardnumber, $password, undef, undef, 1 );
ok( $checkpw, 'checkpw returns true with right password when logging in via cardnumber' );
( $checkpw, undef, undef ) = checkpw( $dbh, $patron->userid, "wrong_password", undef, undef, 1 );
( $checkpw, undef, undef ) = checkpw( $patron->userid, "wrong_password", undef, undef, 1 );
is( $checkpw, 0, 'checkpw returns false when given wrong password' );
$patron = $patron->get_from_storage;
is( $patron->account_locked, 1, "Account is locked from failed login");
( $checkpw, undef, undef ) = checkpw( $dbh, $patron->userid, $password, undef, undef, 1 );
( $checkpw, undef, undef ) = checkpw( $patron->userid, $password, undef, undef, 1 );
is( $checkpw, undef, 'checkpw returns undef with right password when account locked' );
( $checkpw, undef, undef ) = checkpw( $dbh, $patron->cardnumber, $password, undef, undef, 1 );
( $checkpw, undef, undef ) = checkpw( $patron->cardnumber, $password, undef, undef, 1 );
is( $checkpw, undef, 'checkpw returns undefwith right password when logging in via cardnumber if account locked' );
};
@ -488,7 +487,7 @@ subtest 'Check value of login_attempts in checkpw' => sub {
$patron->password('123')->store; # yes, deliberately not hashed
is( $patron->account_locked, 0, 'Patron not locked' );
my @test = checkpw( $dbh, $patron->userid, '123', undef, 'opac', 1 );
my @test = checkpw( $patron->userid, '123', undef, 'opac', 1 );
# Note: 123 will not be hashed to 123 !
is( $test[0], 0, 'checkpw should have failed' );
$patron->discard_changes; # refresh
@ -496,7 +495,7 @@ subtest 'Check value of login_attempts in checkpw' => sub {
is( $patron->account_locked, 1, 'Check locked status' );
# And another try to go over the limit: different return value!
@test = checkpw( $dbh, $patron->userid, '123', undef, 'opac', 1 );
@test = checkpw( $patron->userid, '123', undef, 'opac', 1 );
is( @test, 0, 'checkpw failed again and returns nothing now' );
$patron->discard_changes; # refresh
is( $patron->login_attempts, 3, 'Login attempts not increased anymore' );
@ -506,11 +505,11 @@ subtest 'Check value of login_attempts in checkpw' => sub {
my $auth = Test::MockModule->new( 'C4::Auth' );
$auth->mock( 'checkpw_hash', sub { return 1; } ); # not for production :)
$patron->login_attempts(0)->store;
@test = checkpw( $dbh, $patron->userid, '123', undef, 'opac', 1 );
@test = checkpw( $patron->userid, '123', undef, 'opac', 1 );
is( $test[0], 1, 'Build confidence in the mock' );
$patron->login_attempts(-1)->store;
is( $patron->account_locked, 1, 'Check administrative lockout' );
@test = checkpw( $dbh, $patron->userid, '123', undef, 'opac', 1 );
@test = checkpw( $patron->userid, '123', undef, 'opac', 1 );
is( @test, 0, 'checkpw gave red' );
$patron->discard_changes; # refresh
is( $patron->login_attempts, -1, 'Still locked out' );

View File

@ -28,8 +28,6 @@ use C4::Context;
use Koha::Patrons;
my $dbh = '';
# Start transaction
my $schema = Koha::Database->new->schema;
$schema->storage->txn_begin();
@ -131,12 +129,11 @@ subtest 'checkpw_ldap tests' => sub {
plan tests => 4;
my $dbh = C4::Context->dbh;
## Connection fail tests
$desired_connection_result = 'error';
warning_is {
$ret =
C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola', password => 'hey' );
C4::Auth_with_ldap::checkpw_ldap( 'hola', password => 'hey' );
}
'LDAP connexion failed',
'checkpw_ldap prints correct warning if LDAP conexion fails';
@ -158,7 +155,7 @@ subtest 'checkpw_ldap tests' => sub {
reload_ldap_module();
warning_like {
$ret = C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola',
$ret = C4::Auth_with_ldap::checkpw_ldap( 'hola',
password => 'hey' );
}
qr/Anonymous LDAP bind failed: LDAP error #1: error_name/,
@ -171,7 +168,7 @@ subtest 'checkpw_ldap tests' => sub {
reload_ldap_module();
warning_like {
$ret = C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola',
$ret = C4::Auth_with_ldap::checkpw_ldap( 'hola',
password => 'hey' );
}
qr/LDAP bind failed as kohauser hola: LDAP error #1: error_name/,
@ -204,7 +201,7 @@ subtest 'checkpw_ldap tests' => sub {
}
);
C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola', password => 'hey' );
C4::Auth_with_ldap::checkpw_ldap( 'hola', password => 'hey' );
ok(
Koha::Patrons->find($borrower->{borrowernumber})->extended_attributes->count,
'Extended attributes are not deleted'
@ -219,7 +216,7 @@ subtest 'checkpw_ldap tests' => sub {
$patron->delete;
reload_ldap_module();
is(
C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola', password => 'hey' ),
C4::Auth_with_ldap::checkpw_ldap( 'hola', password => 'hey' ),
0,
'checkpw_ldap returns 0 if user lookup returns 0'
);
@ -228,7 +225,7 @@ subtest 'checkpw_ldap tests' => sub {
reload_ldap_module();
warning_like {
$ret = C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola',
$ret = C4::Auth_with_ldap::checkpw_ldap( 'hola',
password => 'hey' );
}
qr/LDAP bind failed as kohauser hola: LDAP error #1: error_name/,
@ -246,7 +243,7 @@ subtest 'checkpw_ldap tests' => sub {
reload_ldap_module();
warning_like {
$ret = C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola',
$ret = C4::Auth_with_ldap::checkpw_ldap( 'hola',
password => 'hey' );
}
qr/LDAP bind failed as kohauser hola: LDAP error #1: error_name/,
@ -271,7 +268,7 @@ subtest 'checkpw_ldap tests' => sub {
reload_ldap_module();
warning_like {
$ret = C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola',
$ret = C4::Auth_with_ldap::checkpw_ldap( 'hola',
password => 'hey' );
}
qr/LDAP bind failed as ldapuser cn=Manager,dc=metavore,dc=com: LDAP error #1: error_name/,
@ -286,7 +283,7 @@ qr/LDAP bind failed as ldapuser cn=Manager,dc=metavore,dc=com: LDAP error #1: er
reload_ldap_module();
warning_like {
$ret = C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola',
$ret = C4::Auth_with_ldap::checkpw_ldap( 'hola',
password => 'hey' );
}
qr/LDAP Auth rejected : invalid password for user 'hola'./,
@ -300,7 +297,7 @@ qr/LDAP Auth rejected : invalid password for user 'hola'./,
reload_ldap_module();
warning_like {
$ret = C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola',
$ret = C4::Auth_with_ldap::checkpw_ldap( 'hola',
password => 'hey' );
}
qr/LDAP bind failed as ldapuser cn=Manager,dc=metavore,dc=com: LDAP error #1: error_name/,
@ -313,7 +310,7 @@ qr/LDAP bind failed as ldapuser cn=Manager,dc=metavore,dc=com: LDAP error #1: er
reload_ldap_module();
warning_like {
$ret = C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola',
$ret = C4::Auth_with_ldap::checkpw_ldap( 'hola',
password => 'hey' );
}
qr/LDAP Auth rejected : invalid password for user 'hola'./,

View File

@ -30,7 +30,6 @@ use t::lib::TestBuilder;
# Make sure we can rollback.
our $schema = Koha::Database->new->schema;
$schema->storage->txn_begin;
our $dbh = C4::Context->dbh;
subtest 'Existing tests' => sub {
plan tests => 3;
@ -47,17 +46,15 @@ subtest 'Existing tests' => sub {
ok($success, "logaction seemed to work");
# We want numbers to be the same between runs.
$dbh->do("DELETE FROM action_logs;");
Koha::ActionLogs->search->delete;
t::lib::Mocks::mock_preference('CronjobLog',0);
cronlogaction();
my $cronJobCount = $dbh->selectrow_array("SELECT COUNT(*) FROM action_logs WHERE module='CRONJOBS';",{});
is($cronJobCount,0,"Cronjob not logged as expected.");
is(Koha::ActionLogs->search({ module => 'CRONJOBS' })->count,0,"Cronjob not logged as expected.");
t::lib::Mocks::mock_preference('CronjobLog',1);
cronlogaction();
$cronJobCount = $dbh->selectrow_array("SELECT COUNT(*) FROM action_logs WHERE module='CRONJOBS';",{});
is($cronJobCount,1,"Cronjob logged as expected.");
is(Koha::ActionLogs->search({ module => 'CRONJOBS' })->count,0,"Cronjob logged as expected.");
};
subtest 'logaction(): interface is correctly logged' => sub {
@ -65,28 +62,28 @@ subtest 'logaction(): interface is correctly logged' => sub {
plan tests => 4;
# No interface passed, using C4::Context->interface
$dbh->do("DELETE FROM action_logs;");
Koha::ActionLogs->search->delete;
C4::Context->interface( 'commandline' );
logaction( "MEMBERS", "MODIFY", 1, "test operation");
my $log = Koha::ActionLogs->search->next;
is( $log->interface, 'commandline', 'Interface correctly deduced (commandline)');
# No interface passed, using C4::Context->interface
$dbh->do("DELETE FROM action_logs;");
Koha::ActionLogs->search->delete;
C4::Context->interface( 'opac' );
logaction( "MEMBERS", "MODIFY", 1, "test operation");
$log = Koha::ActionLogs->search->next;
is( $log->interface, 'opac', 'Interface correctly deduced (opac)');
# Explicit interfaces
$dbh->do("DELETE FROM action_logs;");
Koha::ActionLogs->search->delete;
C4::Context->interface( 'intranet' );
logaction( "MEMBERS", "MODIFY", 1, 'test info', 'intranet');
$log = Koha::ActionLogs->search->next;
is( $log->interface, 'intranet', 'Passed interface is respected (intranet)');
# Explicit interfaces
$dbh->do("DELETE FROM action_logs;");
Koha::ActionLogs->search->delete;
C4::Context->interface( 'sip' );
logaction( "MEMBERS", "MODIFY", 1, 'test info', 'sip');
$log = Koha::ActionLogs->search->next;
@ -114,7 +111,7 @@ subtest 'GDPR logging' => sub {
t::lib::Mocks::mock_preference('AuthFailureLog', 1);
my $strong_password = 'N0tStr0ngAnyM0reN0w:)';
$patron->set_password({ password => $strong_password });
my @ret = checkpw( $dbh, $patron->userid, 'WrongPassword', undef, undef, 1);
my @ret = checkpw( $patron->userid, 'WrongPassword', undef, undef, 1);
is( $ret[0], 0, 'Authentication failed' );
# Look for auth failure but NOT on patron id, pass userid in info parameter
$logs = Koha::ActionLogs->search(
@ -126,7 +123,7 @@ subtest 'GDPR logging' => sub {
);
is( $logs->count, 1, 'We should find one auth failure with this userid' );
t::lib::Mocks::mock_preference('AuthFailureLog', 0);
@ret = checkpw( $dbh, $patron->userid, 'WrongPassword', undef, undef, 1);
@ret = checkpw( $patron->userid, 'WrongPassword', undef, undef, 1);
$logs = Koha::ActionLogs->search(
{
module => 'AUTH',
@ -136,7 +133,7 @@ subtest 'GDPR logging' => sub {
);
is( $logs->count, 1, 'Still only one failure with this userid' );
t::lib::Mocks::mock_preference('AuthSuccessLog', 1);
@ret = checkpw( $dbh, $patron->userid, $strong_password, undef, undef, 1);
@ret = checkpw( $patron->userid, $strong_password, undef, undef, 1);
is( $ret[0], 1, 'Authentication succeeded' );
# Now we can look for patron id
$logs = Koha::ActionLogs->search(