fixed invocation of CGI::Carp::set_message
[koha_gimpoz] / C4 / Auth.pm
index 08a8e24..ba7f7dd 100755 (executable)
@@ -31,12 +31,13 @@ use C4::Output;    # to get the template
 use C4::Members;
 use C4::Koha;
 use C4::Branch; # GetBranches
+use C4::VirtualShelves 3.02 qw(GetShelvesSummary);
 
 # use utf8;
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $debug $ldap);
 
 BEGIN {
-    $VERSION = 3.01;        # set version for version checking
+    $VERSION = 3.02;        # set version for version checking
     $debug = $ENV{DEBUG} || 0 ;
     @ISA   = qw(Exporter);
     @EXPORT    = qw(&checkauth &get_template_and_user);
@@ -145,6 +146,11 @@ sub get_template_and_user {
         # user info
         $template->param( loggedinusername => $user );
         $template->param( sessionID        => $sessionID );
+               my $shelves;
+               if ($shelves = C4::Context->get_shelves_userenv()) {
+               $template->param( barshelves     => scalar (@$shelves));
+               $template->param( barshelvesloop => $shelves);
+               }
 
         $borrowernumber = getborrowernumber($user);
         my ( $borr, $alternativeflags ) =
@@ -269,6 +275,7 @@ sub get_template_and_user {
                        canreservefromotherbranches => C4::Context->preference('canreservefromotherbranches'),
                        intranetreadinghistory => C4::Context->preference("intranetreadinghistory"),
                        noItemTypeImages => C4::Context->preference("noItemTypeImages"),
+            singleBranchMode => C4::Context->preference("singleBranchMode"),
         );
     }
     else {
@@ -280,6 +287,7 @@ sub get_template_and_user {
             KohaAdminEmailAddress  => "" . C4::Context->preference("KohaAdminEmailAddress"),
             AnonSuggestions =>  "" . C4::Context->preference("AnonSuggestions"),
             suggestion             => "" . C4::Context->preference("suggestion"),
+            OPACViewOthersSuggestions             => "" . C4::Context->preference("OPACViewOthersSuggestions"),
             virtualshelves         => "" . C4::Context->preference("virtualshelves"),
             OpacNav                => "" . C4::Context->preference("OpacNav"),
             opacheader             => "" . C4::Context->preference("opacheader"),
@@ -288,11 +296,16 @@ sub get_template_and_user {
             opaclargeimage         => "" . C4::Context->preference("opaclargeimage"),
             opaclayoutstylesheet   => "". C4::Context->preference("opaclayoutstylesheet"),
             opaccolorstylesheet    => "". C4::Context->preference("opaccolorstylesheet"),
+            OPACUserCSS    => "". C4::Context->preference("OPACUserCSS"),
             opaclanguagesdisplay   => "". C4::Context->preference("opaclanguagesdisplay"),
             opacuserlogin          => "" . C4::Context->preference("opacuserlogin"),
+                       OpacMainUserBlock =>  "" . C4::Context->preference("OpacMainUserBlock"),
+                       OPACURLOpenInNewWindow =>  "" . C4::Context->preference("OPACURLOpenInNewWindow"),
             opacbookbag            => "" . C4::Context->preference("opacbookbag"),
             TemplateEncoding       => "". C4::Context->preference("TemplateEncoding"),
             AmazonContent          => "" . C4::Context->preference("AmazonContent"),
+            OPACShelfBrowser       => "". C4::Context->preference("OPACShelfBrowser"),
+            OPACAmazonSimilarItems => "" . C4::Context->preference("OPACAmazonSimilarItems"),
             LibraryName            => "" . C4::Context->preference("LibraryName"),
             LibraryNameTitle       => "" . $LibraryNameTitle,
             LoginBranchcode        => (C4::Context->userenv?C4::Context->userenv->{"branch"}:"insecure"),
@@ -307,15 +320,23 @@ sub get_template_and_user {
             OpacAuthorities        => C4::Context->preference("OpacAuthorities"),
             OpacBrowser            => C4::Context->preference("OpacBrowser"),
             RequestOnOpac          => C4::Context->preference("RequestOnOpac"),
+                       OPACItemHolds          => C4::Context->preference("OPACItemHolds"),
             reviewson              => C4::Context->preference("reviewson"),
             hide_marc              => C4::Context->preference("hide_marc"),
             patronimages           => C4::Context->preference("patronimages"),
+            hidelostitems          => C4::Context->preference("hidelostitems"),
             mylibraryfirst   => C4::Context->preference("SearchMyLibraryFirst"),
             "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1,
             OPACFRBRizeEditions => C4::Context->preference("OPACFRBRizeEditions"),
             'item-level_itypes' => C4::Context->preference('item-level_itypes'),
+            'Version' => C4::Context->preference('Version'),
+                       yuipath => C4::Context->preference("yuipath"),
+            singleBranchMode => C4::Context->preference("singleBranchMode"),
+            XSLTResultsDisplay => C4::Context->preference("XSLTResultsDisplay"),
+            XSLTDetailsDisplay => C4::Context->preference("XSLTDetailsDisplay"),
         );
     }
+       $template->param(listloop=>[{shelfname=>"Freelist", shelfnumber=>110}]);
     return ( $template, $borrowernumber, $cookie, $flags);
 }
 
@@ -405,8 +426,7 @@ sub _version_check ($$) {
     $kohaversion =~ s/(.*\..*)\.(.*)\.(.*)/$1$2$3/;
     $debug and print STDERR "kohaversion : $kohaversion\n";
     if ($version < $kohaversion){
-        my $warning = "Database update needed, redirecting to %s. Database is $version and Koha is "
-            . C4::Context->config("kohaversion");
+        my $warning = "Database update needed, redirecting to %s. Database is $version and Koha is $kohaversion";
         if ($type ne 'opac'){
             warn sprintf($warning, 'Installer');
             print $query->redirect("/cgi-bin/koha/installer/install.pl?step=3");
@@ -427,7 +447,7 @@ sub _session_log {
 
 sub checkauth {
     my $query = shift;
-  # warn "Checking Auth";
+       $debug and warn "Checking Auth";
     # $authnotrequired will be set for scripts which will run without authentication
     my $authnotrequired = shift;
     my $flagsrequired   = shift;
@@ -446,7 +466,7 @@ sub checkauth {
     # state variables
     my $loggedin = 0;
     my %info;
-    my ( $userid, $cookie, $sessionID, $flags );
+    my ( $userid, $cookie, $sessionID, $flags, $shelves );
     my $logout = $query->param('logout.x');
     if ( $userid = $ENV{'REMOTE_USER'} ) {
         # Using Basic Authentication, no cookies required
@@ -469,6 +489,7 @@ sub checkauth {
                 $session->param('branchname'),   $session->param('flags'),
                 $session->param('emailaddress'), $session->param('branchprinter')
             );
+            C4::Context::set_shelves_userenv($session->param('shelves'));
             $debug and printf STDERR "AUTH_SESSION: (%s)\t%s %s - %s\n", map {$session->param($_)} qw(cardnumber firstname surname branch) ;
             $ip       = $session->param('ip');
             $lasttime = $session->param('lasttime');
@@ -484,48 +505,41 @@ sub checkauth {
             $sessionID = undef;
             $userid    = undef;
         }
-        if ($userid) {
-            if ( $lasttime < time() - $timeout ) {
-                # timed logout
-                $info{'timed_out'} = 1;
-                $session->delete();
-                C4::Context->_unset_userenv($sessionID);
-                _session_log(sprintf "%20s from %16s logged out at %30s (inactivity).\n", $userid,$ip,localtime);
-                $userid    = undef;
-                $sessionID = undef;
-            }
-            elsif ( $ip ne $ENV{'REMOTE_ADDR'} ) {
-                # Different ip than originally logged in from
-                $info{'oldip'}        = $ip;
-                $info{'newip'}        = $ENV{'REMOTE_ADDR'};
-                $info{'different_ip'} = 1;
-                $session->delete();
-                C4::Context->_unset_userenv($sessionID);
-                _session_log(sprintf "%20s from %16s logged out at %30s (ip changed to %16s).\n", $userid,$ip,localtime, $info{'newip'});
-                $sessionID = undef;
-                $userid    = undef;
-            }
-            else {
-                $cookie = $query->cookie( CGISESSID => $session->id );
-                $session->param('lasttime',time());
-                $flags = haspermission( $dbh, $userid, $flagsrequired );
-                if ($flags) {
-                    $loggedin = 1;
-                }
-                else {
-                    $info{'nopermission'} = 1;
-                }
-            }
-        }
+               elsif ( $lasttime < time() - $timeout ) {
+                       # timed logout
+                       $info{'timed_out'} = 1;
+                       $session->delete();
+                       C4::Context->_unset_userenv($sessionID);
+                       _session_log(sprintf "%20s from %16s logged out at %30s (inactivity).\n", $userid,$ip,localtime);
+                       $userid    = undef;
+                       $sessionID = undef;
+               }
+               elsif ( $ip ne $ENV{'REMOTE_ADDR'} ) {
+                       # Different ip than originally logged in from
+                       $info{'oldip'}        = $ip;
+                       $info{'newip'}        = $ENV{'REMOTE_ADDR'};
+                       $info{'different_ip'} = 1;
+                       $session->delete();
+                       C4::Context->_unset_userenv($sessionID);
+                       _session_log(sprintf "%20s from %16s logged out at %30s (ip changed to %16s).\n", $userid,$ip,localtime, $info{'newip'});
+                       $sessionID = undef;
+                       $userid    = undef;
+               }
+               else {
+                       $cookie = $query->cookie( CGISESSID => $session->id );
+                       $session->param('lasttime',time());
+                       $flags = haspermission( $dbh, $userid, $flagsrequired );
+                       if ($flags) {
+                               $loggedin = 1;
+                       } else {
+                               $info{'nopermission'} = 1;
+                       }
+               }
     }
     unless ($userid) {
-        my $session = get_session("");
-        my $sessionID;
-        if ($session) {
-            $sessionID = $session->id;
-        }
+        my $session = get_session("") or die "Auth ERROR: Cannot get_session()";
+        my $sessionID = $session->id;
         $userid    = $query->param('userid');
-        C4::Context->_new_userenv($sessionID);
         my $password = $query->param('password');
         C4::Context->_new_userenv($sessionID);
         my ( $return, $cardnumber ) = checkpw( $dbh, $userid, $password );
@@ -539,11 +553,11 @@ sub checkauth {
                 $info{'nopermission'} = 1;
                 C4::Context->_unset_userenv($sessionID);
             }
+
+                       my ($borrowernumber, $firstname, $surname, $userflags,
+                               $branchcode, $branchname, $branchprinter, $emailaddress);
+
             if ( $return == 1 ) {
-                my (
-                   $borrowernumber, $firstname, $surname, $userflags,
-                   $branchcode, $branchname, $branchprinter, $emailaddress
-                );
                 my $select = "
                 SELECT borrowernumber, firstname, surname, flags, borrowers.branchcode, 
                         branches.branchname    as branchname, 
@@ -554,29 +568,26 @@ sub checkauth {
                 ";
                 my $sth = $dbh->prepare("$select where userid=?");
                 $sth->execute($userid);
-                ($sth->rows) and (
-                    $borrowernumber, $firstname, $surname, $userflags,
-                    $branchcode, $branchname, $branchprinter, $emailaddress
-                ) = $sth->fetchrow;
-
-                $debug and print STDERR "AUTH_1: $cardnumber,$borrowernumber,$userid,$firstname,$surname,$userflags,$branchcode,$emailaddress\n";
-                unless ( $sth->rows ) {
-                    my $sth = $dbh->prepare("$select where cardnumber=?");
+                               unless ($sth->rows) {
+                       $debug and print STDERR "AUTH_1: no rows for userid='$userid'\n";
+                                       $sth = $dbh->prepare("$select where cardnumber=?");
                     $sth->execute($cardnumber);
-                    ($sth->rows) and (
-                        $borrowernumber, $firstname, $surname, $userflags,
-                        $branchcode, $branchname, $branchprinter, $emailaddress
-                    ) = $sth->fetchrow;
-
-                    $debug and print STDERR "AUTH_2: $cardnumber,$borrowernumber,$userid,$firstname,$surname,$userflags,$branchcode,$emailaddress\n";
-                    unless ( $sth->rows ) {
-                        $sth->execute($userid);
-                        ($sth->rows) and (
-                            $borrowernumber, $firstname, $surname, $userflags,
-                            $branchcode, $branchname, $branchprinter, $emailaddress
-                        ) = $sth->fetchrow;
-                    }
-                }
+                                       unless ($sth->rows) {
+                               $debug and print STDERR "AUTH_2a: no rows for cardnumber='$cardnumber'\n";
+                       $sth->execute($userid);
+                                               unless ($sth->rows) {
+                                       $debug and print STDERR "AUTH_2b: no rows for userid='$userid' AS cardnumber\n";
+                                               }
+                                       }
+                               }
+                if ($sth->rows) {
+                    ($borrowernumber, $firstname, $surname, $userflags,
+                       $branchcode, $branchname, $branchprinter, $emailaddress) = $sth->fetchrow;
+                                       $debug and print STDERR "AUTH_3 results: " .
+                                               "$cardnumber,$borrowernumber,$userid,$firstname,$surname,$userflags,$branchcode,$emailaddress\n";
+                               } else {
+                                       print STDERR "AUTH_3: no results for userid='$userid', cardnumber='$cardnumber'.\n";
+                               }
 
 # launch a sequence to check if we have a ip for the branch, i
 # if we have one we replace the branchcode of the userenv by the branch bound in the ip.
@@ -620,10 +631,11 @@ sub checkauth {
                 $session->param('emailaddress',$emailaddress);
                 $session->param('ip',$session->remote_addr());
                 $session->param('lasttime',time());
-                $debug and printf STDERR "AUTH_3: (%s)\t%s %s - %s\n", map {$session->param($_)} qw(cardnumber firstname surname branch) ;
+                $debug and printf STDERR "AUTH_4: (%s)\t%s %s - %s\n", map {$session->param($_)} qw(cardnumber firstname surname branch) ;
             }
             elsif ( $return == 2 ) {
                 #We suppose the user is the superlibrarian
+                               $borrowernumber = 0;
                 $session->param('number',0);
                 $session->param('id',C4::Context->config('user'));
                 $session->param('cardnumber',C4::Context->config('user'));
@@ -636,15 +648,16 @@ sub checkauth {
                 $session->param('ip',$session->remote_addr());
                 $session->param('lasttime',time());
             }
-            if ($session) {
-                C4::Context::set_userenv(
+            C4::Context::set_userenv(
                 $session->param('number'),       $session->param('id'),
                 $session->param('cardnumber'),   $session->param('firstname'),
                 $session->param('surname'),      $session->param('branch'),
                 $session->param('branchname'),   $session->param('flags'),
                 $session->param('emailaddress'), $session->param('branchprinter')
-                );
-            }
+            );
+                       $shelves = GetShelvesSummary($borrowernumber,2,10);
+                       $session->param('shelves', $shelves);
+                       C4::Context::set_shelves_userenv($shelves);
         }
         else {
             if ($userid) {
@@ -653,7 +666,7 @@ sub checkauth {
             }
 
         }
-    }
+    }  # END unless ($userid)
     my $insecure = C4::Context->boolean_preference('insecure');
 
     # finished authentification, now respond
@@ -682,7 +695,7 @@ sub checkauth {
     # get the branchloop, which we need for authentication
     my $branches = GetBranches();
     my @branch_loop;
-    for my $branch_hash (keys %$branches) {
+    for my $branch_hash (sort keys %$branches) {
                push @branch_loop, {branchcode => "$branch_hash", branchname => $branches->{$branch_hash}->{'branchname'}, };
     }
 
@@ -696,6 +709,7 @@ sub checkauth {
         virtualshelves       => C4::Context->preference("virtualshelves"),
         opaclargeimage       => C4::Context->preference("opaclargeimage"),
         LibraryName          => C4::Context->preference("LibraryName"),
+        opacuserlogin        => C4::Context->preference("opacuserlogin"),
         OpacNav              => C4::Context->preference("OpacNav"),
         opaccredits          => C4::Context->preference("opaccredits"),
         opacreadinghistory   => C4::Context->preference("opacreadinghistory"),
@@ -704,6 +718,11 @@ sub checkauth {
         opaccolorstylesheet  => C4::Context->preference("opaccolorstylesheet"),
         opaclanguagesdisplay => C4::Context->preference("opaclanguagesdisplay"),
         opacuserjs           => C4::Context->preference("opacuserjs"),
+        opacbookbag          => "" . C4::Context->preference("opacbookbag"),
+        OpacCloud            => C4::Context->preference("OpacCloud"),
+        OpacTopissue         => C4::Context->preference("OpacTopissue"),
+        OpacAuthorities      => C4::Context->preference("OpacAuthorities"),
+        OpacBrowser          => C4::Context->preference("OpacBrowser"),
         intranetcolorstylesheet =>
                                                                C4::Context->preference("intranetcolorstylesheet"),
         intranetstylesheet => C4::Context->preference("intranetstylesheet"),