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

(-)a/C4/Auth.pm (-1 / +1 lines)
Lines 2017-2023 sub checkpw { Link Here
2017
        if ($passwd_ok) {
2017
        if ($passwd_ok) {
2018
            $patron->update( { login_attempts => 0 } );
2018
            $patron->update( { login_attempts => 0 } );
2019
            if ( $patron->password_expired ) {
2019
            if ( $patron->password_expired ) {
2020
                @return = (-2);
2020
                @return = ( -2, $patron );
2021
            }
2021
            }
2022
        } elsif ( !$patron->account_locked ) {
2022
        } elsif ( !$patron->account_locked ) {
2023
            $patron->update( { login_attempts => $patron->login_attempts + 1 } );
2023
            $patron->update( { login_attempts => $patron->login_attempts + 1 } );
(-)a/t/db_dependent/Auth.t (-2 / +218 lines)
Lines 7-13 use CGI qw ( -utf8 ); Link Here
7
use Test::MockObject;
7
use Test::MockObject;
8
use Test::MockModule;
8
use Test::MockModule;
9
use List::MoreUtils qw/all any none/;
9
use List::MoreUtils qw/all any none/;
10
use Test::More tests => 18;
10
use Test::More tests => 19;
11
use Test::Warn;
11
use Test::Warn;
12
use t::lib::Mocks;
12
use t::lib::Mocks;
13
use t::lib::TestBuilder;
13
use t::lib::TestBuilder;
Lines 1086-1088 subtest 'get_cataloguing_page_permissions() tests' => sub { Link Here
1086
1086
1087
    $schema->storage->txn_rollback;
1087
    $schema->storage->txn_rollback;
1088
};
1088
};
1089
- 
1089
1090
subtest 'checkpw() return values tests' => sub {
1091
1092
    plan tests => 3;
1093
1094
    subtest 'Internal check tests' => sub {
1095
1096
        plan tests => 25;
1097
1098
        $schema->storage->txn_begin;
1099
1100
        my $account_locked;
1101
        my $password_expired;
1102
1103
        my $mock_patron = Test::MockModule->new('Koha::Patron');
1104
        $mock_patron->mock( 'account_locked',   sub { return $account_locked; } );
1105
        $mock_patron->mock( 'password_expired', sub { return $password_expired; } );
1106
1107
        # Only interested here in regular login
1108
        t::lib::Mocks::mock_config( 'useshibboleth', undef );
1109
        $C4::Auth::cas  = 0;
1110
        $C4::Auth::ldap = 0;
1111
1112
        my $patron   = $builder->build_object( { class => 'Koha::Patrons' } );
1113
        my $password = 'thePassword123';
1114
        $patron->set_password( { password => $password, skip_validation => 1 } );
1115
1116
        my $patron_to_delete  = $builder->build_object( { class => 'Koha::Patrons' } );
1117
        my $unused_userid     = $patron_to_delete->userid;
1118
        my $unused_cardnumber = $patron_to_delete->cardnumber;
1119
        $patron_to_delete->delete;
1120
1121
        $account_locked = 1;
1122
        my @return = checkpw( $patron->userid, $password, undef, );
1123
        is_deeply( \@return, [], 'If the account is locked, empty list is returned' );
1124
1125
        $account_locked = 0;
1126
1127
        my @matchpoints = qw(userid cardnumber);
1128
        foreach my $matchpoint (@matchpoints) {
1129
1130
            @return = checkpw( $patron->$matchpoint, $password, undef, );
1131
1132
            is( $return[0],        1,                   "Password validation successful returns 1 ($matchpoint)" );
1133
            is( $return[1],        $patron->cardnumber, '`cardnumber` returned' );
1134
            is( $return[2],        $patron->userid,     '`userid` returned' );
1135
            is( ref( $return[3] ), 'Koha::Patron',      'Koha::Patron object reference returned' );
1136
            is( $return[3]->id,    $patron->id,         'Correct patron returned' );
1137
        }
1138
1139
        @return = checkpw( $patron->userid, $password . 'hey', undef, );
1140
1141
        is( scalar @return,    2, "Two results on invalid password scenario" );
1142
        is( $return[0],        0, '0 returned on invalid password' );
1143
        is( ref( $return[1] ), 'Koha::Patron' );
1144
        is( $return[1]->id,    $patron->id, 'Patron matched correctly' );
1145
1146
        $password_expired = 1;
1147
        @return           = checkpw( $patron->userid, $password, undef, );
1148
1149
        is( scalar @return,    2,  "Two results on expired password scenario" );
1150
        is( $return[0],        -2, '-2 returned' );
1151
        is( ref( $return[1] ), 'Koha::Patron' );
1152
        is( $return[1]->id,    $patron->id, 'Patron matched correctly' );
1153
1154
        @return = checkpw( $unused_userid, $password, undef, );
1155
1156
        is( scalar @return, 2,     "Two results on non-existing userid scenario" );
1157
        is( $return[0],     0,     '0 returned' );
1158
        is( $return[1],     undef, 'Undef returned, representing no match' );
1159
1160
        @return = checkpw( $unused_cardnumber, $password, undef, );
1161
1162
        is( scalar @return, 2,     "Only one result on non-existing cardnumber scenario" );
1163
        is( $return[0],     0,     '0 returned' );
1164
        is( $return[1],     undef, 'Undef returned, representing no match' );
1165
1166
        $schema->storage->txn_rollback;
1167
    };
1168
1169
    subtest 'CAS check (mocked) tests' => sub {
1170
1171
        plan tests => 25;
1172
1173
        $schema->storage->txn_begin;
1174
1175
        my $account_locked;
1176
        my $password_expired;
1177
1178
        my $mock_patron = Test::MockModule->new('Koha::Patron');
1179
        $mock_patron->mock( 'account_locked',   sub { return $account_locked; } );
1180
        $mock_patron->mock( 'password_expired', sub { return $password_expired; } );
1181
1182
        # Only interested here in regular login
1183
        t::lib::Mocks::mock_config( 'useshibboleth', undef );
1184
        $C4::Auth::cas  = 1;
1185
        $C4::Auth::ldap = 0;
1186
1187
        my $patron   = $builder->build_object( { class => 'Koha::Patrons' } );
1188
        my $password = 'thePassword123';
1189
        $patron->set_password( { password => $password, skip_validation => 1 } );
1190
1191
        my $patron_to_delete  = $builder->build_object( { class => 'Koha::Patrons' } );
1192
        my $unused_userid     = $patron_to_delete->userid;
1193
        my $unused_cardnumber = $patron_to_delete->cardnumber;
1194
        $patron_to_delete->delete;
1195
1196
        my $ticket = '123456';
1197
        my $query  = CGI->new;
1198
        $query->param( -name => 'ticket', -value => $ticket );
1199
1200
        my @cas_return = ( 1, $patron->cardnumber, $patron->userid, $ticket, Koha::Patrons->find( $patron->id ) );
1201
1202
        my $cas_mock = Test::MockModule->new('C4::Auth');
1203
        $cas_mock->mock( 'checkpw_cas', sub { return @cas_return; } );
1204
1205
        $account_locked = 1;
1206
        my @return = checkpw( $patron->userid, $password, $query, );
1207
        is_deeply( \@return, [], 'If the account is locked, empty list is returned' );
1208
1209
        $account_locked = 0;
1210
1211
        my @matchpoints = qw(userid cardnumber);
1212
        foreach my $matchpoint (@matchpoints) {
1213
1214
            @return = checkpw( $patron->$matchpoint, $password, $query, );
1215
1216
            is( $return[0],        1,                   "Password validation successful returns 1 ($matchpoint)" );
1217
            is( $return[1],        $patron->cardnumber, '`cardnumber` returned' );
1218
            is( $return[2],        $patron->userid,     '`userid` returned' );
1219
            is( ref( $return[3] ), 'Koha::Patron',      'Koha::Patron object reference returned' );
1220
            is( $return[3]->id,    $patron->id,         'Correct patron returned' );
1221
        }
1222
1223
        @return = checkpw( $patron->userid, $password . 'hey', $query, );
1224
1225
        is( scalar @return,    2, "Two results on invalid password scenario" );
1226
        is( $return[0],        0, '0 returned on invalid password' );
1227
        is( ref( $return[1] ), 'Koha::Patron' );
1228
        is( $return[1]->id,    $patron->id, 'Patron matched correctly' );
1229
1230
        $password_expired = 1;
1231
        @return           = checkpw( $patron->userid, $password, $query, );
1232
1233
        is( scalar @return,    2,  "Two results on expired password scenario" );
1234
        is( $return[0],        -2, '-2 returned' );
1235
        is( ref( $return[1] ), 'Koha::Patron' );
1236
        is( $return[1]->id,    $patron->id, 'Patron matched correctly' );
1237
1238
        @return = checkpw( $unused_userid, $password, $query, );
1239
1240
        is( scalar @return, 2,     "Two results on non-existing userid scenario" );
1241
        is( $return[0],     0,     '0 returned' );
1242
        is( $return[1],     undef, 'Undef returned, representing no match' );
1243
1244
        @return = checkpw( $unused_cardnumber, $password, $query, );
1245
1246
        is( scalar @return, 2,     "Only one result on non-existing cardnumber scenario" );
1247
        is( $return[0],     0,     '0 returned' );
1248
        is( $return[1],     undef, 'Undef returned, representing no match' );
1249
1250
        $schema->storage->txn_rollback;
1251
    };
1252
1253
    subtest 'Shibboleth check (mocked) tests' => sub {
1254
1255
        plan tests => 6;
1256
1257
        $schema->storage->txn_begin;
1258
1259
        my $account_locked;
1260
        my $password_expired;
1261
1262
        my $mock_patron = Test::MockModule->new('Koha::Patron');
1263
        $mock_patron->mock( 'account_locked',   sub { return $account_locked; } );
1264
        $mock_patron->mock( 'password_expired', sub { return $password_expired; } );
1265
1266
        # Only interested here in regular login
1267
        t::lib::Mocks::mock_config( 'useshibboleth', 1 );
1268
        $C4::Auth::cas  = 0;
1269
        $C4::Auth::ldap = 0;
1270
1271
        my $patron   = $builder->build_object( { class => 'Koha::Patrons' } );
1272
        my $password = 'thePassword123';
1273
        $patron->set_password( { password => $password, skip_validation => 1 } );
1274
1275
        my $patron_to_delete  = $builder->build_object( { class => 'Koha::Patrons' } );
1276
        my $unused_userid     = $patron_to_delete->userid;
1277
        my $unused_cardnumber = $patron_to_delete->cardnumber;
1278
        $patron_to_delete->delete;
1279
1280
        my @shib_return = ( 1, $patron->cardnumber, $patron->userid, Koha::Patrons->find( $patron->id ) );
1281
1282
        my $auth_mock = Test::MockModule->new('C4::Auth');
1283
        $auth_mock->mock( 'shib_ok',        1 );
1284
        $auth_mock->mock( 'get_login_shib', 1 );
1285
1286
        my $shib_mock = Test::MockModule->new('C4::Auth_with_shibboleth');
1287
        $shib_mock->mock( 'checkpw_shib', sub { return @shib_return; } );
1288
1289
        $account_locked = 1;
1290
        my @return = checkpw( $patron->userid );
1291
        is_deeply( \@return, [], 'If the account is locked, empty list is returned' );
1292
1293
        $account_locked = 0;
1294
1295
        @return = checkpw();
1296
1297
        is( $return[0],        1,                   "Password validation successful returns 1" );
1298
        is( $return[1],        $patron->cardnumber, '`cardnumber` returned' );
1299
        is( $return[2],        $patron->userid,     '`userid` returned' );
1300
        is( ref( $return[3] ), 'Koha::Patron',      'Koha::Patron object reference returned' );
1301
        is( $return[3]->id,    $patron->id,         'Correct patron returned' );
1302
1303
        $schema->storage->txn_rollback;
1304
    };
1305
};

Return to bug 34893