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

(-)a/t/db_dependent/Auth.t (-2 / +82 lines)
Lines 19-24 use C4::Members; Link Here
19
use Koha::AuthUtils qw/hash_password/;
19
use Koha::AuthUtils qw/hash_password/;
20
use Koha::Database;
20
use Koha::Database;
21
use Koha::Patrons;
21
use Koha::Patrons;
22
use Koha::Auth::TwoFactorAuth;
22
23
23
BEGIN {
24
BEGIN {
24
    use_ok('C4::Auth', qw( checkauth haspermission track_login_daily checkpw get_template_and_user checkpw_hash ));
25
    use_ok('C4::Auth', qw( checkauth haspermission track_login_daily checkpw get_template_and_user checkpw_hash ));
Lines 37-43 $schema->storage->txn_begin; Link Here
37
38
38
subtest 'checkauth() tests' => sub {
39
subtest 'checkauth() tests' => sub {
39
40
40
    plan tests => 4;
41
    plan tests => 5;
41
42
42
    my $patron = $builder->build_object({ class => 'Koha::Patrons', value => { flags => undef } });
43
    my $patron = $builder->build_object({ class => 'Koha::Patrons', value => { flags => undef } });
43
44
Lines 107-112 subtest 'checkauth() tests' => sub { Link Here
107
        is( $userid, undef, 'If librarian user is used and password with GET, they should not be logged in' );
108
        is( $userid, undef, 'If librarian user is used and password with GET, they should not be logged in' );
108
    };
109
    };
109
110
111
    subtest 'Two-factor authentication' => sub {
112
113
        my $patron = $builder->build_object(
114
            { class => 'Koha::Patrons', value => { flags => 1 } } );
115
        my $password = 'password';
116
        $patron->set_password( { password => $password } );
117
        $cgi = Test::MockObject->new();
118
119
        my $otp_token;
120
        our ( $logout, $sessionID, $verified );
121
        $cgi->mock(
122
            'param',
123
            sub {
124
                my ( $self, $param ) = @_;
125
                if    ( $param eq 'userid' )    { return $patron->userid; }
126
                elsif ( $param eq 'password' )  { return $password; }
127
                elsif ( $param eq 'otp_token' ) { return $otp_token; }
128
                elsif ( $param eq 'logout.x' )  { return $logout; }
129
                else                            { return; }
130
            }
131
        );
132
        $cgi->mock( 'request_method', sub { return 'POST' } );
133
        $cgi->mock( 'cookie', sub { return $sessionID } );
134
135
        my $two_factor_auth = Test::MockModule->new( 'Koha::Auth::TwoFactorAuth' );
136
        $two_factor_auth->mock( 'verify', sub {$verified} );
137
138
        my ( $userid, $cookie, $flags );
139
        ( $userid, $cookie, $sessionID, $flags ) = C4::Auth::checkauth( $cgi, 'authrequired', undef, 'intranet' );
140
141
        sub logout {
142
            my $cgi = shift;
143
            $logout = 1;
144
            undef $sessionID;
145
            C4::Auth::checkauth( $cgi, 'authrequired', undef, 'intranet' );
146
            $logout = 0;
147
        }
148
149
        t::lib::Mocks::mock_preference( 'TwoFactorAuthentication', 0 );
150
        $patron->auth_method('password')->store;
151
        ( $userid, $cookie, $sessionID, $flags ) = C4::Auth::checkauth( $cgi, 'authrequired', undef, 'intranet' );
152
        is( $userid, $patron->userid, 'Succesful login' );
153
        is( C4::Auth::get_session($sessionID)->param('waiting-for-2FA'), undef, 'Second auth not required' );
154
        logout($cgi);
155
156
        $patron->auth_method('two-factor')->store;
157
        ( $userid, $cookie, $sessionID, $flags ) = C4::Auth::checkauth( $cgi, 'authrequired', undef, 'intranet' );
158
        is( $userid, $patron->userid, 'Succesful login' );
159
        is( C4::Auth::get_session($sessionID)->param('waiting-for-2FA'), undef, 'Second auth not required' );
160
        logout($cgi);
161
162
        t::lib::Mocks::mock_preference( 'TwoFactorAuthentication', 1 );
163
        $patron->auth_method('password')->store;
164
        ( $userid, $cookie, $sessionID, $flags ) = C4::Auth::checkauth( $cgi, 'authrequired', undef, 'intranet' );
165
        is( $userid, $patron->userid, 'Succesful login' );
166
        is( C4::Auth::get_session($sessionID)->param('waiting-for-2FA'), undef, 'Second auth not required' );
167
        logout($cgi);
168
169
        $patron->auth_method('two-factor')->store;
170
        ( $userid, $cookie, $sessionID, $flags ) = C4::Auth::checkauth( $cgi, 'authrequired', undef, 'intranet' );
171
        is( $userid, $patron->userid, 'Succesful login' );
172
        my $session = C4::Auth::get_session($sessionID);
173
        is( C4::Auth::get_session($sessionID)->param('waiting-for-2FA'), 1, 'Second auth required' );
174
175
        # Wrong OTP token
176
        $otp_token = "wrong";
177
        $verified = 0;
178
        $patron->auth_method('two-factor')->store;
179
        ( $userid, $cookie, $sessionID, $flags ) = C4::Auth::checkauth( $cgi, 'authrequired', undef, 'intranet' );
180
        is( $userid, $patron->userid, 'Succesful login' );
181
        is( C4::Auth::get_session($sessionID)->param('waiting-for-2FA'), 1, 'Second auth still required after wrong OTP token' );
182
183
        $otp_token = "good";
184
        $verified = 1;
185
        ( $userid, $cookie, $sessionID, $flags ) = C4::Auth::checkauth( $cgi, 'authrequired', undef, 'intranet' );
186
        is( $userid, $patron->userid, 'Succesful login' );
187
        is( C4::Auth::get_session($sessionID)->param('waiting-for-2FA'), 0, 'Second auth no longer required if OTP token has been verified' );
188
189
    };
190
110
    C4::Context->_new_userenv; # For next tests
191
    C4::Context->_new_userenv; # For next tests
111
192
112
};
193
};
113
- 

Return to bug 28786