Lines 38-45
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $debug $ldap $cas $cas
Link Here
|
38 |
BEGIN { |
38 |
BEGIN { |
39 |
sub psgi_env { any { /^psgi\./ } keys %ENV } |
39 |
sub psgi_env { any { /^psgi\./ } keys %ENV } |
40 |
sub safe_exit { |
40 |
sub safe_exit { |
41 |
if ( psgi_env ) { die 'psgi:exit' } |
41 |
if ( psgi_env ) { die 'psgi:exit' } |
42 |
else { exit } |
42 |
else { exit } |
43 |
} |
43 |
} |
44 |
$VERSION = 3.07.00.049; # set version for version checking |
44 |
$VERSION = 3.07.00.049; # set version for version checking |
45 |
|
45 |
|
Lines 53-60
BEGIN {
Link Here
|
53 |
$caslogout = C4::Context->preference('casLogout'); |
53 |
$caslogout = C4::Context->preference('casLogout'); |
54 |
require C4::Auth_with_cas; # no import |
54 |
require C4::Auth_with_cas; # no import |
55 |
if ($ldap) { |
55 |
if ($ldap) { |
56 |
require C4::Auth_with_ldap; |
56 |
require C4::Auth_with_ldap; |
57 |
import C4::Auth_with_ldap qw(checkpw_ldap); |
57 |
import C4::Auth_with_ldap qw(checkpw_ldap); |
58 |
} |
58 |
} |
59 |
if ($cas) { |
59 |
if ($cas) { |
60 |
import C4::Auth_with_cas qw(check_api_auth_cas checkpw_cas login_cas logout_cas login_cas_url); |
60 |
import C4::Auth_with_cas qw(check_api_auth_cas checkpw_cas login_cas logout_cas login_cas_url); |
Lines 234-267
sub get_template_and_user {
Link Here
|
234 |
} |
234 |
} |
235 |
} |
235 |
} |
236 |
} |
236 |
} |
237 |
# Logged-in opac search history |
237 |
# Logged-in opac search history |
238 |
# If the requested template is an opac one and opac search history is enabled |
238 |
# If the requested template is an opac one and opac search history is enabled |
239 |
if ($in->{type} eq 'opac' && C4::Context->preference('EnableOpacSearchHistory')) { |
239 |
if ($in->{type} eq 'opac' && C4::Context->preference('EnableOpacSearchHistory')) { |
240 |
my $dbh = C4::Context->dbh; |
240 |
my $dbh = C4::Context->dbh; |
241 |
my $query = "SELECT COUNT(*) FROM search_history WHERE userid=?"; |
241 |
my $query = "SELECT COUNT(*) FROM search_history WHERE userid=?"; |
242 |
my $sth = $dbh->prepare($query); |
242 |
my $sth = $dbh->prepare($query); |
243 |
$sth->execute($borrowernumber); |
243 |
$sth->execute($borrowernumber); |
244 |
|
244 |
|
245 |
# If at least one search has already been performed |
245 |
# If at least one search has already been performed |
246 |
if ($sth->fetchrow_array > 0) { |
246 |
if ($sth->fetchrow_array > 0) { |
247 |
# We show the link in opac |
247 |
# We show the link in opac |
248 |
$template->param(ShowOpacRecentSearchLink => 1); |
248 |
$template->param(ShowOpacRecentSearchLink => 1); |
249 |
} |
249 |
} |
250 |
|
250 |
|
251 |
# And if there's a cookie with searches performed when the user was not logged in, |
251 |
# And if there's a cookie with searches performed when the user was not logged in, |
252 |
# we add them to the logged-in search history |
252 |
# we add them to the logged-in search history |
253 |
my $searchcookie = $in->{'query'}->cookie('KohaOpacRecentSearches'); |
253 |
my $searchcookie = $in->{'query'}->cookie('KohaOpacRecentSearches'); |
254 |
if ($searchcookie){ |
254 |
if ($searchcookie){ |
255 |
$searchcookie = uri_unescape($searchcookie); |
255 |
$searchcookie = uri_unescape($searchcookie); |
256 |
my @recentSearches = @{thaw($searchcookie) || []}; |
256 |
my @recentSearches = @{thaw($searchcookie) || []}; |
257 |
if (@recentSearches) { |
257 |
if (@recentSearches) { |
258 |
my $sth = $dbh->prepare($SEARCH_HISTORY_INSERT_SQL); |
258 |
my $sth = $dbh->prepare($SEARCH_HISTORY_INSERT_SQL); |
259 |
$sth->execute( $borrowernumber, |
259 |
$sth->execute( $borrowernumber, |
260 |
$in->{'query'}->cookie("CGISESSID"), |
260 |
$in->{'query'}->cookie("CGISESSID"), |
261 |
$_->{'query_desc'}, |
261 |
$_->{'query_desc'}, |
262 |
$_->{'query_cgi'}, |
262 |
$_->{'query_cgi'}, |
263 |
$_->{'total'}, |
263 |
$_->{'total'}, |
264 |
$_->{'time'}, |
264 |
$_->{'time'}, |
265 |
) foreach @recentSearches; |
265 |
) foreach @recentSearches; |
266 |
|
266 |
|
267 |
# And then, delete the cookie's content |
267 |
# And then, delete the cookie's content |
Lines 271-304
sub get_template_and_user {
Link Here
|
271 |
-HttpOnly => 1, |
271 |
-HttpOnly => 1, |
272 |
-expires => '' |
272 |
-expires => '' |
273 |
); |
273 |
); |
274 |
$cookie = [$cookie, $newsearchcookie]; |
274 |
$cookie = [$cookie, $newsearchcookie]; |
275 |
} |
275 |
} |
276 |
} |
276 |
} |
277 |
} |
277 |
} |
278 |
} |
278 |
} |
279 |
else { # if this is an anonymous session, setup to display public lists... |
279 |
else { # if this is an anonymous session, setup to display public lists... |
280 |
|
280 |
|
281 |
$template->param( sessionID => $sessionID ); |
281 |
$template->param( sessionID => $sessionID ); |
282 |
|
282 |
|
283 |
my ($total, $pubshelves) = C4::VirtualShelves::GetSomeShelfNames(undef, 'MASTHEAD'); |
283 |
my ($total, $pubshelves) = C4::VirtualShelves::GetSomeShelfNames(undef, 'MASTHEAD'); |
284 |
$template->param( |
284 |
$template->param( |
285 |
pubshelves => $total->{pubtotal}, |
285 |
pubshelves => $total->{pubtotal}, |
286 |
pubshelvesloop => $pubshelves, |
286 |
pubshelvesloop => $pubshelves, |
287 |
); |
287 |
); |
288 |
} |
288 |
} |
289 |
# Anonymous opac search history |
289 |
# Anonymous opac search history |
290 |
# If opac search history is enabled and at least one search has already been performed |
290 |
# If opac search history is enabled and at least one search has already been performed |
291 |
if (C4::Context->preference('EnableOpacSearchHistory')) { |
291 |
if (C4::Context->preference('EnableOpacSearchHistory')) { |
292 |
my $searchcookie = $in->{'query'}->cookie('KohaOpacRecentSearches'); |
292 |
my $searchcookie = $in->{'query'}->cookie('KohaOpacRecentSearches'); |
293 |
if ($searchcookie){ |
293 |
if ($searchcookie){ |
294 |
$searchcookie = uri_unescape($searchcookie); |
294 |
$searchcookie = uri_unescape($searchcookie); |
295 |
my @recentSearches = @{thaw($searchcookie) || []}; |
295 |
my @recentSearches = @{thaw($searchcookie) || []}; |
296 |
# We show the link in opac |
296 |
# We show the link in opac |
297 |
if (@recentSearches) { |
297 |
if (@recentSearches) { |
298 |
$template->param(ShowOpacRecentSearchLink => 1); |
298 |
$template->param(ShowOpacRecentSearchLink => 1); |
299 |
} |
299 |
} |
300 |
} |
300 |
} |
301 |
} |
301 |
} |
302 |
|
302 |
|
303 |
if(C4::Context->preference('dateformat')){ |
303 |
if(C4::Context->preference('dateformat')){ |
304 |
$template->param( dateformat => C4::Context->preference('dateformat') ); |
304 |
$template->param( dateformat => C4::Context->preference('dateformat') ); |
Lines 559-566
sub _version_check {
Link Here
|
559 |
my $version; |
559 |
my $version; |
560 |
# If Version syspref is unavailable, it means Koha is beeing installed, |
560 |
# If Version syspref is unavailable, it means Koha is beeing installed, |
561 |
# and so we must redirect to OPAC maintenance page or to the WebInstaller |
561 |
# and so we must redirect to OPAC maintenance page or to the WebInstaller |
562 |
# also, if OpacMaintenance is ON, OPAC should redirect to maintenance |
562 |
# also, if OpacMaintenance is ON, OPAC should redirect to maintenance |
563 |
if (C4::Context->preference('OpacMaintenance') && $type eq 'opac') { |
563 |
if (C4::Context->preference('OpacMaintenance') && $type eq 'opac') { |
564 |
warn "OPAC Install required, redirecting to maintenance"; |
564 |
warn "OPAC Install required, redirecting to maintenance"; |
565 |
print $query->redirect("/cgi-bin/koha/maintenance.pl"); |
565 |
print $query->redirect("/cgi-bin/koha/maintenance.pl"); |
566 |
safe_exit; |
566 |
safe_exit; |
Lines 615-621
sub _timeout_syspref {
Link Here
|
615 |
|
615 |
|
616 |
sub checkauth { |
616 |
sub checkauth { |
617 |
my $query = shift; |
617 |
my $query = shift; |
618 |
$debug and warn "Checking Auth"; |
618 |
$debug and warn "Checking Auth"; |
619 |
# $authnotrequired will be set for scripts which will run without authentication |
619 |
# $authnotrequired will be set for scripts which will run without authentication |
620 |
my $authnotrequired = shift; |
620 |
my $authnotrequired = shift; |
621 |
my $flagsrequired = shift; |
621 |
my $flagsrequired = shift; |
Lines 680-688
sub checkauth {
Link Here
|
680 |
$session->flush; |
680 |
$session->flush; |
681 |
$session->delete(); |
681 |
$session->delete(); |
682 |
C4::Context->_unset_userenv($sessionID); |
682 |
C4::Context->_unset_userenv($sessionID); |
683 |
$sessionID = undef; |
683 |
$sessionID = undef; |
684 |
$userid = undef; |
684 |
$userid = undef; |
685 |
} |
685 |
} |
686 |
elsif ($logout) { |
686 |
elsif ($logout) { |
687 |
# voluntary logout the user |
687 |
# voluntary logout the user |
688 |
$session->flush; |
688 |
$session->flush; |
Lines 692-700
sub checkauth {
Link Here
|
692 |
$sessionID = undef; |
692 |
$sessionID = undef; |
693 |
$userid = undef; |
693 |
$userid = undef; |
694 |
|
694 |
|
695 |
if ($cas and $caslogout) { |
695 |
if ($cas and $caslogout) { |
696 |
logout_cas($query); |
696 |
logout_cas($query); |
697 |
} |
697 |
} |
698 |
} |
698 |
} |
699 |
elsif ( $lasttime < time() - $timeout ) { |
699 |
elsif ( $lasttime < time() - $timeout ) { |
700 |
# timed logout |
700 |
# timed logout |
Lines 734-740
sub checkauth {
Link Here
|
734 |
} |
734 |
} |
735 |
} |
735 |
} |
736 |
unless ($userid || $sessionID) { |
736 |
unless ($userid || $sessionID) { |
737 |
|
737 |
|
738 |
#we initiate a session prior to checking for a username to allow for anonymous sessions... |
738 |
#we initiate a session prior to checking for a username to allow for anonymous sessions... |
739 |
my $session = get_session("") or die "Auth ERROR: Cannot get_session()"; |
739 |
my $session = get_session("") or die "Auth ERROR: Cannot get_session()"; |
740 |
my $sessionID = $session->id; |
740 |
my $sessionID = $session->id; |
Lines 744-757
sub checkauth {
Link Here
|
744 |
-value => $session->id, |
744 |
-value => $session->id, |
745 |
-HttpOnly => 1 |
745 |
-HttpOnly => 1 |
746 |
); |
746 |
); |
747 |
$userid = $query->param('userid'); |
747 |
$userid = $query->param('userid'); |
748 |
if ( ( $cas && $query->param('ticket') ) |
748 |
if ( ( $cas && $query->param('ticket') ) |
749 |
|| $userid |
749 |
|| $userid |
750 |
|| ( my $pki_field = C4::Context->preference('AllowPKIAuth') ) ne |
750 |
|| ( my $pki_field = C4::Context->preference('AllowPKIAuth') ) ne |
751 |
'None' || $persona ) |
751 |
'None' || $persona ) |
752 |
{ |
752 |
{ |
753 |
my $password = $query->param('password'); |
753 |
my $password = $query->param('password'); |
754 |
|
754 |
|
755 |
my ( $return, $cardnumber ); |
755 |
my ( $return, $cardnumber ); |
756 |
if ( $cas && $query->param('ticket') ) { |
756 |
if ( $cas && $query->param('ticket') ) { |
757 |
my $retuserid; |
757 |
my $retuserid; |
Lines 760-766
sub checkauth {
Link Here
|
760 |
$userid = $retuserid; |
760 |
$userid = $retuserid; |
761 |
$info{'invalidCasLogin'} = 1 unless ($return); |
761 |
$info{'invalidCasLogin'} = 1 unless ($return); |
762 |
} |
762 |
} |
763 |
|
763 |
|
764 |
elsif ($persona) { |
764 |
elsif ($persona) { |
765 |
my $value = $persona; |
765 |
my $value = $persona; |
766 |
|
766 |
|
Lines 810-836
sub checkauth {
Link Here
|
810 |
undef $value; |
810 |
undef $value; |
811 |
} |
811 |
} |
812 |
} |
812 |
} |
813 |
|
813 |
|
814 |
|
814 |
|
815 |
$return = $value ? 1 : 0; |
815 |
$return = $value ? 1 : 0; |
816 |
$userid = $value; |
816 |
$userid = $value; |
817 |
|
817 |
|
818 |
} |
818 |
} |
819 |
else { |
819 |
else { |
820 |
my $retuserid; |
820 |
my $retuserid; |
821 |
( $return, $cardnumber, $retuserid ) = |
821 |
( $return, $cardnumber, $retuserid ) = |
822 |
checkpw( $dbh, $userid, $password, $query ); |
822 |
checkpw( $dbh, $userid, $password, $query ); |
823 |
$userid = $retuserid if ( $retuserid ne '' ); |
823 |
$userid = $retuserid if ( $retuserid ne '' ); |
824 |
} |
824 |
} |
825 |
if ($return) { |
825 |
if ($return) { |
826 |
#_session_log(sprintf "%20s from %16s logged in at %30s.\n", $userid,$ENV{'REMOTE_ADDR'},(strftime '%c', localtime)); |
826 |
#_session_log(sprintf "%20s from %16s logged in at %30s.\n", $userid,$ENV{'REMOTE_ADDR'},(strftime '%c', localtime)); |
827 |
if ( $flags = haspermission( $userid, $flagsrequired ) ) { |
827 |
if ( $flags = haspermission( $userid, $flagsrequired ) ) { |
828 |
$loggedin = 1; |
828 |
$loggedin = 1; |
829 |
} |
829 |
} |
830 |
else { |
830 |
else { |
831 |
$info{'nopermission'} = 1; |
831 |
$info{'nopermission'} = 1; |
832 |
C4::Context->_unset_userenv($sessionID); |
832 |
C4::Context->_unset_userenv($sessionID); |
833 |
} |
833 |
} |
834 |
my ($borrowernumber, $firstname, $surname, $userflags, |
834 |
my ($borrowernumber, $firstname, $surname, $userflags, |
835 |
$branchcode, $branchname, $branchprinter, $emailaddress); |
835 |
$branchcode, $branchname, $branchprinter, $emailaddress); |
836 |
|
836 |
|
Lines 935-958
sub checkauth {
Link Here
|
935 |
); |
935 |
); |
936 |
|
936 |
|
937 |
} |
937 |
} |
938 |
else { |
938 |
else { |
939 |
if ($userid) { |
939 |
if ($userid) { |
940 |
$info{'invalid_username_or_password'} = 1; |
940 |
$info{'invalid_username_or_password'} = 1; |
941 |
C4::Context->_unset_userenv($sessionID); |
941 |
C4::Context->_unset_userenv($sessionID); |
942 |
} |
942 |
} |
943 |
} |
943 |
} |
944 |
} # END if ( $userid = $query->param('userid') ) |
944 |
} # END if ( $userid = $query->param('userid') ) |
945 |
elsif ($type eq "opac") { |
945 |
elsif ($type eq "opac") { |
946 |
# if we are here this is an anonymous session; add public lists to it and a few other items... |
946 |
# if we are here this is an anonymous session; add public lists to it and a few other items... |
947 |
# anonymous sessions are created only for the OPAC |
947 |
# anonymous sessions are created only for the OPAC |
948 |
$debug and warn "Initiating an anonymous session..."; |
948 |
$debug and warn "Initiating an anonymous session..."; |
949 |
|
949 |
|
950 |
# setting a couple of other session vars... |
950 |
# setting a couple of other session vars... |
951 |
$session->param('ip',$session->remote_addr()); |
951 |
$session->param('ip',$session->remote_addr()); |
952 |
$session->param('lasttime',time()); |
952 |
$session->param('lasttime',time()); |
953 |
$session->param('sessiontype','anon'); |
953 |
$session->param('sessiontype','anon'); |
954 |
} |
954 |
} |
955 |
} # END unless ($userid) |
955 |
} # END unless ($userid) |
956 |
my $insecure = C4::Context->boolean_preference('insecure'); |
956 |
my $insecure = C4::Context->boolean_preference('insecure'); |
957 |
|
957 |
|
958 |
# finished authentification, now respond |
958 |
# finished authentification, now respond |
Lines 1032-1055
sub checkauth {
Link Here
|
1032 |
|
1032 |
|
1033 |
if ($cas) { |
1033 |
if ($cas) { |
1034 |
|
1034 |
|
1035 |
# Is authentication against multiple CAS servers enabled? |
1035 |
# Is authentication against multiple CAS servers enabled? |
1036 |
if (C4::Auth_with_cas::multipleAuth && !$casparam) { |
1036 |
if (C4::Auth_with_cas::multipleAuth && !$casparam) { |
1037 |
my $casservers = C4::Auth_with_cas::getMultipleAuth(); |
1037 |
my $casservers = C4::Auth_with_cas::getMultipleAuth(); |
1038 |
my @tmplservers; |
1038 |
my @tmplservers; |
1039 |
foreach my $key (keys %$casservers) { |
1039 |
foreach my $key (keys %$casservers) { |
1040 |
push @tmplservers, {name => $key, value => login_cas_url($query, $key) . "?cas=$key" }; |
1040 |
push @tmplservers, {name => $key, value => login_cas_url($query, $key) . "?cas=$key" }; |
1041 |
} |
1041 |
} |
1042 |
#warn Data::Dumper::Dumper(\@tmplservers); |
1042 |
#warn Data::Dumper::Dumper(\@tmplservers); |
1043 |
$template->param( |
1043 |
$template->param( |
1044 |
casServersLoop => \@tmplservers |
1044 |
casServersLoop => \@tmplservers |
1045 |
); |
1045 |
); |
1046 |
} else { |
1046 |
} else { |
1047 |
$template->param( |
1047 |
$template->param( |
1048 |
casServerUrl => login_cas_url($query), |
1048 |
casServerUrl => login_cas_url($query), |
1049 |
); |
1049 |
); |
1050 |
} |
1050 |
} |
1051 |
|
1051 |
|
1052 |
$template->param( |
1052 |
$template->param( |
1053 |
invalidCasLogin => $info{'invalidCasLogin'} |
1053 |
invalidCasLogin => $info{'invalidCasLogin'} |
1054 |
); |
1054 |
); |
1055 |
} |
1055 |
} |
Lines 1194-1216
sub check_api_auth {
Link Here
|
1194 |
# new login |
1194 |
# new login |
1195 |
my $userid = $query->param('userid'); |
1195 |
my $userid = $query->param('userid'); |
1196 |
my $password = $query->param('password'); |
1196 |
my $password = $query->param('password'); |
1197 |
my ($return, $cardnumber); |
1197 |
my ($return, $cardnumber); |
1198 |
|
1198 |
|
1199 |
# Proxy CAS auth |
1199 |
# Proxy CAS auth |
1200 |
if ($cas && $query->param('PT')) { |
1200 |
if ($cas && $query->param('PT')) { |
1201 |
my $retuserid; |
1201 |
my $retuserid; |
1202 |
$debug and print STDERR "## check_api_auth - checking CAS\n"; |
1202 |
$debug and print STDERR "## check_api_auth - checking CAS\n"; |
1203 |
# In case of a CAS authentication, we use the ticket instead of the password |
1203 |
# In case of a CAS authentication, we use the ticket instead of the password |
1204 |
my $PT = $query->param('PT'); |
1204 |
my $PT = $query->param('PT'); |
1205 |
($return,$cardnumber,$userid) = check_api_auth_cas($dbh, $PT, $query); # EXTERNAL AUTH |
1205 |
($return,$cardnumber,$userid) = check_api_auth_cas($dbh, $PT, $query); # EXTERNAL AUTH |
1206 |
} else { |
1206 |
} else { |
1207 |
# User / password auth |
1207 |
# User / password auth |
1208 |
unless ($userid and $password) { |
1208 |
unless ($userid and $password) { |
1209 |
# caller did something wrong, fail the authenticateion |
1209 |
# caller did something wrong, fail the authenticateion |
1210 |
return ("failed", undef, undef); |
1210 |
return ("failed", undef, undef); |
1211 |
} |
1211 |
} |
1212 |
( $return, $cardnumber ) = checkpw( $dbh, $userid, $password, $query ); |
1212 |
( $return, $cardnumber ) = checkpw( $dbh, $userid, $password, $query ); |
1213 |
} |
1213 |
} |
1214 |
|
1214 |
|
1215 |
if ($return and haspermission( $userid, $flagsrequired)) { |
1215 |
if ($return and haspermission( $userid, $flagsrequired)) { |
1216 |
my $session = get_session(""); |
1216 |
my $session = get_session(""); |
Lines 1453-1459
sub get_session {
Link Here
|
1453 |
$session = new CGI::Session("driver:PostgreSQL;serializer:yaml;id:md5", $sessionID, {Handle=>$dbh}); |
1453 |
$session = new CGI::Session("driver:PostgreSQL;serializer:yaml;id:md5", $sessionID, {Handle=>$dbh}); |
1454 |
} |
1454 |
} |
1455 |
elsif ($storage_method eq 'memcached' && C4::Context->ismemcached){ |
1455 |
elsif ($storage_method eq 'memcached' && C4::Context->ismemcached){ |
1456 |
$session = new CGI::Session("driver:memcached;serializer:yaml;id:md5", $sessionID, { Memcached => C4::Context->memcached } ); |
1456 |
$session = new CGI::Session("driver:memcached;serializer:yaml;id:md5", $sessionID, { Memcached => C4::Context->memcached } ); |
1457 |
} |
1457 |
} |
1458 |
else { |
1458 |
else { |
1459 |
# catch all defaults to tmp should work on all systems |
1459 |
# catch all defaults to tmp should work on all systems |
Lines 1473-1483
sub checkpw {
Link Here
|
1473 |
|
1473 |
|
1474 |
if ($cas && $query && $query->param('ticket')) { |
1474 |
if ($cas && $query && $query->param('ticket')) { |
1475 |
$debug and print STDERR "## checkpw - checking CAS\n"; |
1475 |
$debug and print STDERR "## checkpw - checking CAS\n"; |
1476 |
# In case of a CAS authentication, we use the ticket instead of the password |
1476 |
# In case of a CAS authentication, we use the ticket instead of the password |
1477 |
my $ticket = $query->param('ticket'); |
1477 |
my $ticket = $query->param('ticket'); |
1478 |
my ($retval,$retcard,$retuserid) = checkpw_cas($dbh, $ticket, $query); # EXTERNAL AUTH |
1478 |
my ($retval,$retcard,$retuserid) = checkpw_cas($dbh, $ticket, $query); # EXTERNAL AUTH |
1479 |
($retval) and return ($retval,$retcard,$retuserid); |
1479 |
($retval) and return ($retval,$retcard,$retuserid); |
1480 |
return 0; |
1480 |
return 0; |
1481 |
} |
1481 |
} |
1482 |
|
1482 |
|
1483 |
# INTERNAL AUTH |
1483 |
# INTERNAL AUTH |