@ISA = qw(Exporter);
@EXPORT = qw(&checkauth &get_template_and_user &haspermission &get_user_subpermissions);
@EXPORT_OK = qw(&check_api_auth &get_session &check_cookie_auth &checkpw &checkpw_internal &checkpw_hash
- &get_all_subpermissions &get_user_subpermissions
+ &get_all_subpermissions &get_user_subpermissions track_login_for_session
);
%EXPORT_TAGS = ( EditPermissions => [qw(get_all_subpermissions get_user_subpermissions)] );
$ldap = C4::Context->config('useldapserver') || 0;
my $casparam = $query->param('cas');
my $q_userid = $query->param('userid') // '';
+ my $session;
+
# Basic authentication is incompatible with the use of Shibboleth,
# as Shibboleth may return REMOTE_USER as a Shibboleth attribute,
# and it may not be the attribute we want to use to match the koha login.
}
elsif ( $sessionID = $query->cookie("CGISESSID") )
{ # assignment, not comparison
- my $session = get_session($sessionID);
+ $session = get_session($sessionID);
C4::Context->_new_userenv($sessionID);
my ( $ip, $lasttime, $sessiontype );
my $s_userid = '';
);
}
- if ( $userid ) {
- # track_login also depends on pref TrackLastPatronActivity
- my $patron = Koha::Patrons->find({ userid => $userid });
- $patron->track_login if $patron;
- }
+ track_login_for_session( $userid, $session );
return ( $userid, $cookie, $sessionID, $flags );
}
return 0;
}
+=head2 track_login_for_session
+
+ track_login_for_session( $userid, $session );
+
+C<$userid> the userid of the member
+C<$session> the CGI::Session object used to store the session's state.
+
+Wraps the call to $patron->track_login, the method used to update borrowers.lastseen.
+
+=cut
+
+sub track_login_for_session {
+ my ( $userid, $session ) = @_;
+
+ if ( $userid && $session && !$session->param('tracked_for_session') ) {
+ $session->param( 'tracked_for_session', 1 );
+ $session->flush();
+
+ # track_login also depends on pref TrackLastPatronActivity
+ my $patron = Koha::Patrons->find( { userid => $userid } );
+ $patron->track_login if $patron;
+ }
+}
+
END { } # module clean-up code here (global destructor)
1;
__END__
use Test::MockObject;
use Test::MockModule;
use List::MoreUtils qw/all any none/;
-use Test::More tests => 21;
+use Test::More tests => 22;
use Test::Warn;
use t::lib::Mocks;
use t::lib::TestBuilder;
};
+subtest 'track_login_for_session() tests' => sub {
+
+ plan tests => 5;
+
+ my $patron = $builder->build_object({ class => 'Koha::Patrons' });
+ my $userid = $patron->userid;
+
+ $patron->lastseen( undef );
+ $patron->store();
+
+ # Mock a CGI object with real userid param
+ my $cgi = Test::MockObject->new();
+ $cgi->mock( 'param', sub { return $patron; } );
+ $cgi->mock( 'cookie', sub { return; } );
+
+ my $session = new CGI::Session( undef, undef, { Directory => File::Spec->tmpdir } );
+
+ t::lib::Mocks::mock_preference( 'TrackLastPatronActivity', '1' );
+
+ C4::Auth::track_login_for_session( $userid );
+ $patron->_result()->discard_changes();
+ is( $patron->lastseen, undef, 'Patron last seen should be unchanged if no session is passed' );
+
+ C4::Auth::track_login_for_session( $userid, $session );
+ $patron->_result()->discard_changes();
+ isnt( $patron->lastseen, undef, 'Patron should have last seen set when TrackLastPatronActivity = 1' );
+
+ sleep(1); # We need to wait a tiny bit to make sure the timestamp will be different
+ my $last_seen = $patron->lastseen;
+ C4::Auth::track_login_for_session( $userid, $session );
+ $patron->_result()->discard_changes();
+ is( $patron->lastseen, $last_seen, 'Patron last seen should be unchanged if passed the same session' );
+
+ $session = new CGI::Session( undef, undef, { Directory => File::Spec->tmpdir } );
+ C4::Auth::track_login_for_session( $userid, $session );
+ $patron->_result()->discard_changes();
+ isnt( $patron->lastseen, $last_seen, 'Patron last seen should be changed if given a new session' );
+
+ t::lib::Mocks::mock_preference( 'TrackLastPatronActivity', '0' );
+ sleep(1);
+ $last_seen = $patron->lastseen;
+ C4::Auth::track_login_for_session( $userid, $session );
+ $patron->_result()->discard_changes();
+ is( $patron->lastseen, $last_seen, 'Patron should have last seen unchanged when TrackLastPatronActivity = 0' );
+
+};
+
my $hash1 = hash_password('password');
my $hash2 = hash_password('password');