View | Details | Raw Unified | Return to bug 21336
Collapse All | Expand All

(-)a/Koha/Patron.pm (-4 / +10 lines)
Lines 1119-1136 sub get_enrollable_clubs { Link Here
1119
1119
1120
my $is_locked = $patron->account_locked
1120
my $is_locked = $patron->account_locked
1121
1121
1122
Return true if the patron has reach the maximum number of login attempts (see pref FailedLoginAttempts).
1122
Return true if the patron has reached the maximum number of login attempts
1123
(see pref FailedLoginAttempts). If login_attempts is < 0, this is interpreted
1124
as an administrative lockout (independent of FailedLoginAttempts; see also
1125
Koha::Patron->lock).
1123
Otherwise return false.
1126
Otherwise return false.
1124
If the pref is not set (empty string, null or 0), the feature is considered as disabled.
1127
If the pref is not set (empty string, null or 0), the feature is considered as
1128
disabled.
1125
1129
1126
=cut
1130
=cut
1127
1131
1128
sub account_locked {
1132
sub account_locked {
1129
    my ($self) = @_;
1133
    my ($self) = @_;
1130
    my $FailedLoginAttempts = C4::Context->preference('FailedLoginAttempts');
1134
    my $FailedLoginAttempts = C4::Context->preference('FailedLoginAttempts');
1131
    return ( $FailedLoginAttempts
1135
    return 1 if $FailedLoginAttempts
1132
          and $self->login_attempts
1136
          and $self->login_attempts
1133
          and $self->login_attempts >= $FailedLoginAttempts )? 1 : 0;
1137
          and $self->login_attempts >= $FailedLoginAttempts;
1138
    return 1 if ($self->login_attempts || 0) < 0; # administrative lockout
1139
    return 0;
1134
}
1140
}
1135
1141
1136
=head3 can_see_patron_infos
1142
=head3 can_see_patron_infos
(-)a/t/db_dependent/Auth.t (-2 / +17 lines)
Lines 288-294 ok(C4::Auth::checkpw_hash('password', $hash1), 'password validates with first ha Link Here
288
ok(C4::Auth::checkpw_hash('password', $hash2), 'password validates with second hash');
288
ok(C4::Auth::checkpw_hash('password', $hash2), 'password validates with second hash');
289
289
290
subtest 'Check value of login_attempts in checkpw' => sub {
290
subtest 'Check value of login_attempts in checkpw' => sub {
291
    plan tests => 6;
291
    plan tests => 11;
292
292
293
    t::lib::Mocks::mock_preference('FailedLoginAttempts', 3);
293
    t::lib::Mocks::mock_preference('FailedLoginAttempts', 3);
294
294
Lines 314-319 subtest 'Check value of login_attempts in checkpw' => sub { Link Here
314
    is( @test, 0, 'checkpw failed again and returns nothing now' );
314
    is( @test, 0, 'checkpw failed again and returns nothing now' );
315
    $patron->discard_changes; # refresh
315
    $patron->discard_changes; # refresh
316
    is( $patron->login_attempts, 3, 'Login attempts not increased anymore' );
316
    is( $patron->login_attempts, 3, 'Login attempts not increased anymore' );
317
318
    # Administrative lockout cannot be undone?
319
    # Pass the right password now (or: add a nice mock).
320
    my $auth = Test::MockModule->new( 'C4::Auth' );
321
    $auth->mock( 'checkpw_hash', sub { return 1; } ); # not for production :)
322
    $patron->login_attempts(0)->store;
323
    @test = checkpw( $dbh, $patron->userid, '123', undef, 'opac', 1 );
324
    is( $test[0], 1, 'Build confidence in the mock' );
325
    $patron->login_attempts(-1)->store;
326
    is( $patron->account_locked, 1, 'Check administrative lockout' );
327
    @test = checkpw( $dbh, $patron->userid, '123', undef, 'opac', 1 );
328
    is( @test, 0, 'checkpw gave red' );
329
    $patron->discard_changes; # refresh
330
    is( $patron->login_attempts, -1, 'Still locked out' );
331
    t::lib::Mocks::mock_preference('FailedLoginAttempts', ''); # disable
332
    is( $patron->account_locked, 1, 'Check administrative lockout without pref' );
317
};
333
};
318
334
319
$schema->storage->txn_rollback;
335
$schema->storage->txn_rollback;
320
- 

Return to bug 21336