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

(-)a/Koha/Patron.pm (-4 / +10 lines)
Lines 1126-1143 sub get_enrollable_clubs { Link Here
1126
1126
1127
my $is_locked = $patron->account_locked
1127
my $is_locked = $patron->account_locked
1128
1128
1129
Return true if the patron has reach the maximum number of login attempts (see pref FailedLoginAttempts).
1129
Return true if the patron has reached the maximum number of login attempts
1130
(see pref FailedLoginAttempts). If login_attempts is < 0, this is interpreted
1131
as an administrative lockout (independent of FailedLoginAttempts; see also
1132
Koha::Patron->lock).
1130
Otherwise return false.
1133
Otherwise return false.
1131
If the pref is not set (empty string, null or 0), the feature is considered as disabled.
1134
If the pref is not set (empty string, null or 0), the feature is considered as
1135
disabled.
1132
1136
1133
=cut
1137
=cut
1134
1138
1135
sub account_locked {
1139
sub account_locked {
1136
    my ($self) = @_;
1140
    my ($self) = @_;
1137
    my $FailedLoginAttempts = C4::Context->preference('FailedLoginAttempts');
1141
    my $FailedLoginAttempts = C4::Context->preference('FailedLoginAttempts');
1138
    return ( $FailedLoginAttempts
1142
    return 1 if $FailedLoginAttempts
1139
          and $self->login_attempts
1143
          and $self->login_attempts
1140
          and $self->login_attempts >= $FailedLoginAttempts )? 1 : 0;
1144
          and $self->login_attempts >= $FailedLoginAttempts;
1145
    return 1 if ($self->login_attempts || 0) < 0; # administrative lockout
1146
    return 0;
1141
}
1147
}
1142
1148
1143
=head3 can_see_patron_infos
1149
=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