NOTE: This patch introduces code which generates an anonymous session when a 
patron first browses to OPAC.
This anonymous session contains a minimal amount of information including the 
results of a query to discover
all public lists/shevles. When the user logs in, the anonymous session is 
cleared and a new session created
for that user.

kohabug 1875 - fix error when editing a patron record

C4::Auth::checkauth was not distinguishing between a
'userid' input from an OPAC or staff login form and
a 'userid' input from (e.g.,) the patron editor.
Consequently, adding or editing a patron record would
result in Koha trying to log in as the new patron.

To resolve this, added a hidden input to all login
forms, 'koha_login_context', to explicitly signal
when a login is occurring.  The value of this input
can be 'opac', 'intranet', or 'sco' - the value is
not used at present, but may be of use later.

C4::Auth - added debug flag to two warns

kohabug 1875 - create anonymous sessions only for OPAC

No need to create an anonymous session for the intranet.

set yuipath correct for login pages

When preparing the template parameters for a login form,
C4::Auth was overriding the value of yuipath set
by C4::Output::gettemplate(), thus causing 404 errors
if the 'yuipath' syspref was set to 'local'.

kohabug 1875 - avoid warns viewing lists anonymously

During an anonymous OPAC session, the $loggedinuser variable
is not set.  As the undefined value causes warns in
C4::VirtualShelves::Page::shelfpage, for the purpose of the
shelfpage call the loggedinuser is set to -1, which should
not correspond to any real borrower number.

This is admittedly a hack to avoid digging through all
of C4::VirtualShelves to deal with lists viewed anonymously.

kohabug 1875 Refactoring of &ModShelf to avoid overwriting list owner needlessly

kohabug 1875 Avoid warning if can't find owner of shelf

Since virtualshelves.owner is not a true FK of borrowersnumber.number,
set ownername to '' if can't find the patron
---
 C4/Auth.pm                                         |  296 +++++++++++--------
 C4/VirtualShelves.pm                               |   50 +++-
 C4/VirtualShelves/Page.pm                          |   47 ++--
 koha-tmpl/intranet-tmpl/prog/en/modules/auth.tmpl  |    1 +
 koha-tmpl/opac-tmpl/prog/en/modules/opac-auth.tmpl |    2 +-
 koha-tmpl/opac-tmpl/prog/en/modules/opac-main.tmpl |    1 +
 .../opac-tmpl/prog/en/modules/opac-shelves.tmpl    |    2 +-
 .../opac-tmpl/prog/en/modules/sco/sco-main.tmpl    |    1 +
 opac/opac-shelves.pl                               |    8 +-
 9 files changed, 250 insertions(+), 158 deletions(-)

diff --git a/C4/Auth.pm b/C4/Auth.pm
index 3556336..9311c88 100755
--- a/C4/Auth.pm
+++ b/C4/Auth.pm
@@ -221,6 +221,26 @@ sub get_template_and_user {
             }
         }
     }
+       else {  # if this is an anonymous session, setup to display public 
lists...
+
+        # load the template variables for stylesheets and JavaScript
+        $template->param( css_libs => $in->{'css_libs'} );
+        $template->param( css_module => $in->{'css_module'} );
+        $template->param( css_page => $in->{'css_page'} );
+        $template->param( css_widgets => $in->{'css_widgets'} );
+
+        $template->param( js_libs => $in->{'js_libs'} );
+        $template->param( js_module => $in->{'js_module'} );
+        $template->param( js_page => $in->{'js_page'} );
+        $template->param( js_widgets => $in->{'js_widgets'} );
+
+        $template->param( sessionID        => $sessionID );
+               my $shelves;
+               if ($shelves = C4::Context->get_shelves_userenv()) {
+               $template->param( barshelves     => scalar (@$shelves));
+               $template->param( barshelvesloop => $shelves);
+               }
+       }
 
     if ( $in->{'type'} eq "intranet" ) {
         $template->param(
@@ -473,6 +493,7 @@ sub checkauth {
     my %info;
     my ( $userid, $cookie, $sessionID, $flags, $shelves );
     my $logout = $query->param('logout.x');
+
     if ( $userid = $ENV{'REMOTE_USER'} ) {
         # Using Basic Authentication, no cookies required
         $cookie = $query->cookie(
@@ -485,7 +506,7 @@ sub checkauth {
     elsif ( $sessionID = $query->cookie("CGISESSID")) {     # assignment, not 
comparison 
         my $session = get_session($sessionID);
         C4::Context->_new_userenv($sessionID);
-        my ($ip, $lasttime);
+        my ($ip, $lasttime, $sessiontype);
         if ($session){
             C4::Context::set_userenv(
                 $session->param('number'),       $session->param('id'),
@@ -499,9 +520,20 @@ sub checkauth {
             $ip       = $session->param('ip');
             $lasttime = $session->param('lasttime');
             $userid   = $session->param('id');
+                       $sessiontype = $session->param('sessiontype');
         }
-    
-        if ($logout) {
+   
+               if ( ($query->param('koha_login_context')) && 
($query->param('userid') ne $session->param('id')) ) {
+                       #if a user enters an id ne to the id in the current 
session, we need to log them in...
+                       #first we need to clear the anonymous session...
+                       $debug and warn "query id = " . $query->param('userid') 
. " but session id = " . $session->param('id');
+            $session->flush;      
+            $session->delete();
+            C4::Context->_unset_userenv($sessionID);
+                       $sessionID = undef;
+                       $userid = undef;
+               }
+        elsif ($logout) {
             # voluntary logout the user
             $session->flush;      
             $session->delete();
@@ -533,144 +565,159 @@ sub checkauth {
                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 ( $sessiontype eq 'anon' ) {     #if this is an 
anonymous session, we want to update the session, but not behave as if they are 
logged in...
+                               $flags = haspermission( $dbh, $userid, 
$flagsrequired );
+                               if ($flags) {
+                                       $loggedin = 1;
+                               } else {
+                                       $info{'nopermission'} = 1;
+                               }
                        }
                }
     }
-    unless ($userid) {
-        my $session = get_session("") or die "Auth ERROR: Cannot 
get_session()";
+    unless ($userid || $sessionID) {
+        #we initiate a session prior to checking for a username to allow for 
anonymous sessions...
+               my $session = get_session("") or die "Auth ERROR: Cannot 
get_session()";
         my $sessionID = $session->id;
-        $userid    = $query->param('userid');
-        my $password = $query->param('password');
-        C4::Context->_new_userenv($sessionID);
-        my ( $return, $cardnumber ) = checkpw( $dbh, $userid, $password );
-        if ($return) {
-            _session_log(sprintf "%20s from %16s logged in  at %30s.\n", 
$userid,$ENV{'REMOTE_ADDR'},localtime);
-            $cookie = $query->cookie(CGISESSID => $sessionID);
-            if ( $flags = haspermission( $dbh, $userid, $flagsrequired ) ) {
-                               $loggedin = 1;
-            }
-            else {
-                $info{'nopermission'} = 1;
-                C4::Context->_unset_userenv($sessionID);
-            }
-
-                       my ($borrowernumber, $firstname, $surname, $userflags,
-                               $branchcode, $branchname, $branchprinter, 
$emailaddress);
-
-            if ( $return == 1 ) {
-                my $select = "
-                SELECT borrowernumber, firstname, surname, flags, 
borrowers.branchcode, 
-                        branches.branchname    as branchname, 
-                        branches.branchprinter as branchprinter, 
-                        email 
-                FROM borrowers 
-                LEFT JOIN branches on borrowers.branchcode=branches.branchcode
-                ";
-                my $sth = $dbh->prepare("$select where userid=?");
-                $sth->execute($userid);
-                               unless ($sth->rows) {
-                       $debug and print STDERR "AUTH_1: no rows for 
userid='$userid'\n";
-                                       $sth = $dbh->prepare("$select where 
cardnumber=?");
-                    $sth->execute($cardnumber);
+               C4::Context->_new_userenv($sessionID);
+        $cookie = $query->cookie(CGISESSID => $sessionID);
+               if ( $userid    = $query->param('userid') ) {
+               my $password = $query->param('password');
+               my ( $return, $cardnumber ) = checkpw( $dbh, $userid, $password 
);
+               if ($return) {
+               _session_log(sprintf "%20s from %16s logged in  at %30s.\n", 
$userid,$ENV{'REMOTE_ADDR'},localtime);
+               if ( $flags = haspermission( $dbh, $userid, $flagsrequired ) ) {
+                                       $loggedin = 1;
+               }
+                       else {
+                       $info{'nopermission'} = 1;
+                       C4::Context->_unset_userenv($sessionID);
+               }
+
+                               my ($borrowernumber, $firstname, $surname, 
$userflags,
+                                       $branchcode, $branchname, 
$branchprinter, $emailaddress);
+
+               if ( $return == 1 ) {
+                       my $select = "
+                       SELECT borrowernumber, firstname, surname, flags, 
borrowers.branchcode, 
+                           branches.branchname    as branchname, 
+                               branches.branchprinter as branchprinter, 
+                               email 
+                       FROM borrowers 
+                       LEFT JOIN branches on 
borrowers.branchcode=branches.branchcode
+                       ";
+                       my $sth = $dbh->prepare("$select where userid=?");
+                       $sth->execute($userid);
                                        unless ($sth->rows) {
-                               $debug and print STDERR "AUTH_2a: no rows for 
cardnumber='$cardnumber'\n";
-                       $sth->execute($userid);
+                               $debug and print STDERR "AUTH_1: no rows for 
userid='$userid'\n";
+                                               $sth = $dbh->prepare("$select 
where cardnumber=?");
+                               $sth->execute($cardnumber);
                                                unless ($sth->rows) {
-                                       $debug and print STDERR "AUTH_2b: no 
rows for userid='$userid' AS cardnumber\n";
+                                       $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";
-                               }
+                       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.
 
-                my $ip       = $ENV{'REMOTE_ADDR'};
-                # if they specify at login, use that
-                if ($query->param('branch')) {
-                    $branchcode  = $query->param('branch');
-                    $branchname = GetBranchName($branchcode);
-                }
-                my $branches = GetBranches();
-                if (C4::Context->boolean_preference('IndependantBranches') && 
C4::Context->boolean_preference('Autolocation')){
-                                   # we have to check they are coming from the 
right ip range
-                                       my $domain = 
$branches->{$branchcode}->{'branchip'};
-                                       if ($ip !~ /^$domain/){
-                                               $loggedin=0;
-                                               $info{'wrongip'} = 1;
+                                       my $ip       = $ENV{'REMOTE_ADDR'};
+                                       # if they specify at login, use that
+                                       if ($query->param('branch')) {
+                                               $branchcode  = 
$query->param('branch');
+                                               $branchname = 
GetBranchName($branchcode);
+                                       }
+                                       my $branches = GetBranches();
+                                       if 
(C4::Context->boolean_preference('IndependantBranches') && 
C4::Context->boolean_preference('Autolocation')){
+                                               # we have to check they are 
coming from the right ip range
+                                               my $domain = 
$branches->{$branchcode}->{'branchip'};
+                                               if ($ip !~ /^$domain/){
+                                                       $loggedin=0;
+                                                       $info{'wrongip'} = 1;
+                                               }
                                        }
-                               }
 
-                my @branchesloop;
-                foreach my $br ( keys %$branches ) {
-                    #     now we work with the treatment of ip
-                    my $domain = $branches->{$br}->{'branchip'};
-                    if ( $domain && $ip =~ /^$domain/ ) {
-                        $branchcode = $branches->{$br}->{'branchcode'};
+                                       my @branchesloop;
+                                       foreach my $br ( keys %$branches ) {
+                                               #     now we work with the 
treatment of ip
+                                               my $domain = 
$branches->{$br}->{'branchip'};
+                                               if ( $domain && $ip =~ 
/^$domain/ ) {
+                                                       $branchcode = 
$branches->{$br}->{'branchcode'};
 
-                        # new op dev : add the branchprinter and branchname in 
the cookie
-                        $branchprinter = $branches->{$br}->{'branchprinter'};
-                        $branchname    = $branches->{$br}->{'branchname'};
-                    }
-                }
-                $session->param('number',$borrowernumber);
-                $session->param('id',$userid);
-                $session->param('cardnumber',$cardnumber);
-                $session->param('firstname',$firstname);
-                $session->param('surname',$surname);
-                $session->param('branch',$branchcode);
-                $session->param('branchname',$branchname);
-                $session->param('flags',$userflags);
-                $session->param('emailaddress',$emailaddress);
-                $session->param('ip',$session->remote_addr());
-                $session->param('lasttime',time());
-                $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'));
-                $session->param('firstname',C4::Context->config('user'));
-                $session->param('surname',C4::Context->config('user'));
-                $session->param('branch','NO_LIBRARY_SET');
-                $session->param('branchname','NO_LIBRARY_SET');
-                $session->param('flags',1);
-                $session->param('emailaddress', 
C4::Context->preference('KohaAdminEmailAddress'));
-                $session->param('ip',$session->remote_addr());
-                $session->param('lasttime',time());
-            }
-            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);
+                                                       # new op dev : add the 
branchprinter and branchname in the cookie
+                                                       $branchprinter = 
$branches->{$br}->{'branchprinter'};
+                                                       $branchname    = 
$branches->{$br}->{'branchname'};
+                                               }
+                                       }
+                                       
$session->param('number',$borrowernumber);
+                                       $session->param('id',$userid);
+                                       
$session->param('cardnumber',$cardnumber);
+                                       $session->param('firstname',$firstname);
+                                       $session->param('surname',$surname);
+                                       $session->param('branch',$branchcode);
+                                       
$session->param('branchname',$branchname);
+                                       $session->param('flags',$userflags);
+                                       
$session->param('emailaddress',$emailaddress);
+                                       
$session->param('ip',$session->remote_addr());
+                                       $session->param('lasttime',time());
+                                       $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'));
+                                       
$session->param('firstname',C4::Context->config('user'));
+                                       
$session->param('surname',C4::Context->config('user'));
+                                       
$session->param('branch','NO_LIBRARY_SET');
+                                       
$session->param('branchname','NO_LIBRARY_SET');
+                                       $session->param('flags',1);
+                                       $session->param('emailaddress', 
C4::Context->preference('KohaAdminEmailAddress'));
+                                       
$session->param('ip',$session->remote_addr());
+                                       $session->param('lasttime',time());
+                               }
+                               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) {
+                       $info{'invalid_username_or_password'} = 1;
+                       C4::Context->_unset_userenv($sessionID);
+               }
+                       }
+        }      # END if ( $userid    = $query->param('userid') )
+               elsif ($type eq "opac") {       
+            # if we are here this is an anonymous session; add public lists to 
it and a few other items...
+            # anonymous sessions are created only for the OPAC
+                       $debug and warn "Initiating an anonymous session...";
+                       $shelves = GetShelvesSummary(0,2,10);
                        $session->param('shelves', $shelves);
                        C4::Context::set_shelves_userenv($shelves);
-        }
-        else {
-            if ($userid) {
-                $info{'invalid_username_or_password'} = 1;
-                C4::Context->_unset_userenv($sessionID);
-            }
-
-        }
+                       # setting a couple of other session vars...
+                       $session->param('ip',$session->remote_addr());
+                       $session->param('lasttime',time());
+                       $session->param('sessiontype','anon');
+               }
     }  # END unless ($userid)
     my $insecure = C4::Context->boolean_preference('insecure');
 
@@ -738,7 +785,6 @@ sub checkauth {
         TemplateEncoding   => C4::Context->preference("TemplateEncoding"),
         IndependantBranches=> C4::Context->preference("IndependantBranches"),
         AutoLocation       => C4::Context->preference("AutoLocation"),
-        yuipath            => C4::Context->preference("yuipath"),
                wrongip            => $info{'wrongip'}
     );
     
diff --git a/C4/VirtualShelves.pm b/C4/VirtualShelves.pm
index fc56284..85a511f 100644
--- a/C4/VirtualShelves.pm
+++ b/C4/VirtualShelves.pm
@@ -25,6 +25,8 @@ use strict;
 use Carp;
 use C4::Context;
 use C4::Circulation;
+use C4::Debug;
+
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
 
 BEGIN {
@@ -341,21 +343,51 @@ sub AddToShelfFromBiblio {
 
 =item ModShelf
 
-ModShelf($shelfnumber, $shelfname, $owner, $category )
+ModShelf($shelfnumber, $hashref)
+
+Where $hashref->{column} = param
 
-Modify the value into virtualshelves table with values given on input arg.
+Modify the value into virtualshelves table with values given 
+from hashref, which each key of the hashref should be
+the name of a column of virtualshelves.
 
 =cut
 
 sub ModShelf {
-    my ( $shelfnumber, $shelfname, $owner, $category, $sortfield ) = @_;
-    my $query = qq(
-        UPDATE virtualshelves
-        SET    shelfname=?,owner=?,category=?,sortfield=?
-        WHERE  shelfnumber=?
-    );
+    my $shelfnumber = shift;
+    my $shelf = shift;
+
+    if (exists $shelf->{shelfnumber}) {
+        carp "Should not use ModShelf to change shelfnumber";
+        return;
+    }
+    unless (defined $shelfnumber and $shelfnumber =~ /^\d+$/) {
+        carp "Invalid shelfnumber passed to ModShelf: $shelfnumber";
+        return;
+    }
+
+       my $query = "UPDATE virtualshelves SET ";
+    my @bind_params = ();
+    my @set_clauses = ();
+
+       foreach my $column (keys %$shelf) {
+        push @set_clauses, "$column = ?";
+        push @bind_params, $shelf->{$column};
+    }
+
+    if ($#set_clauses == -1) {
+        carp "No columns to update passed to ModShelf";
+        return;
+    }
+    $query .= join(", ", @set_clauses);
+
+    $query .= " WHERE shelfnumber = ? ";
+    push @bind_params, $shelfnumber;
+
+    $debug and warn "ModShelf query:\n $query\n",
+                       "ModShelf query args: ", join(',', @bind_params), "\n";
        my $sth = $dbh->prepare($query);
-    $sth->execute( $shelfname, $owner, $category, $sortfield, $shelfnumber );
+       $sth->execute( @bind_params );
 }
 
 =item ShelfPossibleAction
diff --git a/C4/VirtualShelves/Page.pm b/C4/VirtualShelves/Page.pm
index bd2255f..0789a69 100755
--- a/C4/VirtualShelves/Page.pm
+++ b/C4/VirtualShelves/Page.pm
@@ -119,19 +119,24 @@ SWITCH: {
                        last SWITCH;
                }
                if ( $op eq 'modifsave' ) {
-                       ModShelf(
-                               $shelfnumber, $query->param('shelfname'), 
$loggedinuser,
-                               $query->param('category'), 
$query->param('sortfield')
-                       );
+                       my $shelf = {
+                       'shelfname'             => $query->param('shelfname'),
+                               'category'              => 
$query->param('category'),
+                               'sortfield'             => 
$query->param('sortfield'),
+                       };
+                       $shelf->{'owner'} = $loggedinuser if $type eq 
'intranet';       #we only overwrite the list owner if &ModShelf was called 
from the staff client
+
+                       ModShelf( $shelfnumber, $shelf );
                        $shelflist = GetShelves( $loggedinuser, 2 );    # 
refresh after mods
                } elsif ( $op eq 'modif' ) {
-                       my ( $shelfnumber2, $shelfname, $owner, $category, 
$sortfield ) =GetShelf( $query->param('shelfnumber') );
+                       my ( $shelfnumber2, $shelfname, $owner, $category, 
$sortfield ) =GetShelf( $shelfnumber );
                        $template->param(
                                edit                => 1,
                                shelfnumber         => $shelfnumber2,
                                shelfname           => $shelfname,
                                owner               => $owner,
-                               "category$category" => 1,
+                               "category$category"     => 1,
+                               category                        => $category,
                                "sort_$sortfield"   => 1,
                        );
                }
@@ -139,12 +144,12 @@ SWITCH: {
        }
     if ($shelfnumber = $query->param('viewshelf') ) {
         #check that the user can view the shelf
-        if ( ShelfPossibleAction( $loggedinuser, $shelfnumber, 'view' ) ) {
-            my $items = GetShelfContents($shelfnumber);
-            for my $this_item (@$items) {
-                $this_item->{imageurl} = $imgdir."/".$itemtypes->{ 
$this_item->{itemtype}  }->{'imageurl'};
-                $this_item->{'description'} = $itemtypes->{ 
$this_item->{itemtype} }->{'description'};
-            }
+               if ( ShelfPossibleAction( $loggedinuser, $shelfnumber, 'view' ) 
) {
+                       my $items = GetShelfContents($shelfnumber);
+                       for my $this_item (@$items) {
+                               $this_item->{imageurl} = 
$imgdir."/".$itemtypes->{ $this_item->{itemtype}  }->{'imageurl'};
+                               $this_item->{'description'} = $itemtypes->{ 
$this_item->{itemtype} }->{'description'};
+                       }
                        $showadd = 1;
                        my $i = 0;
                        foreach (grep {$i++ % 2} @$items) {     # every other 
item
@@ -152,14 +157,14 @@ SWITCH: {
                        }
                        # my $manageshelf = &ShelfPossibleAction( 
$loggedinuser, $shelfnumber, 'manage' );
                        # ($manageshelf) and $showadd = 1;
-            $template->param(
-                shelfname   => $shelflist->{$shelfnumber}->{'shelfname'},
-                shelfnumber => $shelfnumber,
-                viewshelf   => $shelfnumber,
-                manageshelf => &ShelfPossibleAction( $loggedinuser, 
$shelfnumber, 'manage' ),
-                itemsloop => $items,
-            );
-        } else { push @paramsloop, {nopermission=>$shelfnumber}; }
+                       $template->param(
+                               shelfname   => 
$shelflist->{$shelfnumber}->{'shelfname'},
+                               shelfnumber => $shelfnumber,
+                               viewshelf   => $shelfnumber,
+                               manageshelf => &ShelfPossibleAction( 
$loggedinuser, $shelfnumber, 'manage' ),
+                               itemsloop => $items,
+                       );
+               } else { push @paramsloop, {nopermission=>$shelfnumber} };
         last SWITCH;
     }
     if ( $query->param('shelves') ) {
@@ -234,7 +239,7 @@ foreach my $element (sort { 
lc($shelflist->{$a}->{'shelfname'}) cmp lc($shelflis
                $shelflist->{$element}->{'mine'} = 1;
        } 
        my $member = GetMember($owner,'borrowernumber');
-       $shelflist->{$element}->{ownername} = $member->{firstname} . " " . 
$member->{surname};
+       $shelflist->{$element}->{ownername} = defined($member) ? 
$member->{firstname} . " " . $member->{surname} : '';
        $numberCanManage++ if $canmanage;       # possibly outmoded
        if ($shelflist->{$element}->{'category'} eq '1') {
                (scalar(@shelveslooppriv) % 2) and 
$shelflist->{$element}->{toggle} = 1;
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/auth.tmpl 
b/koha-tmpl/intranet-tmpl/prog/en/modules/auth.tmpl
index 3e56cab..b3d1f4c 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/auth.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/auth.tmpl
@@ -37,6 +37,7 @@
 
 <!-- login prompt time-->
 <form action="<!-- TMPL_VAR NAME="url" -->" method="post" name="loginform" 
id="loginform">
+    <input type="hidden" name="koha_login_context" value="intranet" />
 <!-- TMPL_LOOP NAME="INPUTS" -->
     <input type="hidden" name="<!-- TMPL_VAR NAME="name" -->" value="<!-- 
TMPL_VAR NAME="value" ESCAPE="html" -->" />
 <!-- /TMPL_LOOP -->
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-auth.tmpl 
b/koha-tmpl/opac-tmpl/prog/en/modules/opac-auth.tmpl
index 21d5afe..1262156 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-auth.tmpl
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-auth.tmpl
@@ -40,7 +40,7 @@
 <!-- /TMPL_IF -->
 
 <form action="<!-- TMPL_VAR NAME="url" -->" name="auth" id="auth" 
method="post">
-
+  <input type="hidden" name="koha_login_context" value="opac" />
 <fieldset class="brief"><!-- TMPL_LOOP NAME="INPUTS" -->
   <input type="hidden" name="<!-- TMPL_VAR NAME="name" -->" value="<!-- 
TMPL_VAR NAME="value" -->" />
 <!-- /TMPL_LOOP -->
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-main.tmpl 
b/koha-tmpl/opac-tmpl/prog/en/modules/opac-main.tmpl
index 023ac1d..a2313b2 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-main.tmpl
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-main.tmpl
@@ -96,6 +96,7 @@
     <div class="yui-u">
        <div id="login" class="container">
        <form action="/cgi-bin/koha/opac-user.pl" method="post" name="auth" 
id="auth">
+    <input type="hidden" name="koha_login_context" value="opac" />
        <fieldset class="brief">
                <legend>Log in to Your Account:</legend>
                <ol>
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-shelves.tmpl 
b/koha-tmpl/opac-tmpl/prog/en/modules/opac-shelves.tmpl
index ae9c34d..bd67918 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-shelves.tmpl
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-shelves.tmpl
@@ -169,7 +169,7 @@ $.tablesorter.addParser({
             </select></li>
             </ol>
             </fieldset>
-            <fieldset class="action"><input type="hidden" name="category" 
value="1" /><input type="submit" value="Save" class="submit" /> <a 
class="cancel" href="/cgi-bin/koha/opac-shelves.pl?shelfnumber=<!-- TMPL_VAR 
NAME="shelfnumber" -->">Cancel</a></fieldset>
+            <fieldset class="action"><input type="hidden" name="category" 
value="<!-- TMPL_VAR NAME="category" -->" /><input type="submit" value="Save" 
class="submit" /> <a class="cancel" 
href="/cgi-bin/koha/opac-shelves.pl?shelfnumber=<!-- TMPL_VAR 
NAME="shelfnumber" -->">Cancel</a></fieldset>
         </form>
     <!-- /TMPL_IF -->
 
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/sco/sco-main.tmpl 
b/koha-tmpl/opac-tmpl/prog/en/modules/sco/sco-main.tmpl
index 088d23a..a03fbc0 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/sco/sco-main.tmpl
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/sco/sco-main.tmpl
@@ -78,6 +78,7 @@ Sorry, This Self-Checkout Station has lost authentication.  
Please contact the a
        <!-- TMPL_UNLESS NAME="validuser" -->
        <div class="sco_entry" >
        <form id="mainform" action="/cgi-bin/koha/sco/sco-main.pl" 
name="myForm" method="post">
+      <input type="hidden" name="koha_login_context" value="sco" />
        <p class="checkout"><label for="userid">Please enter your 
cardnumber:</label> 
        <input type="text" id="userid" class="firstField" size="10" 
name="userid" onblur="ValidateCode();" />
        <!-- TMPL_LOOP NAME="INPUTS" --><input type="hidden" name="<!-- 
TMPL_VAR NAME="name" -->" value="<!-- TMPL_VAR NAME="value" -->"><!-- 
/TMPL_LOOP -->
diff --git a/opac/opac-shelves.pl b/opac/opac-shelves.pl
index b26f73a..61bf9e3 100755
--- a/opac/opac-shelves.pl
+++ b/opac/opac-shelves.pl
@@ -31,4 +31,10 @@ my ( $template, $loggedinuser, $cookie ) = 
get_template_and_user({
         type            => "opac",
         authnotrequired => 1,
     });
-shelfpage('opac', $query, $template, $loggedinuser, $cookie);
+
+# if $loggedinuser is not defined, set it to -1, which should
+# not correspond to any real borrowernumber.  
+# FIXME: this is a hack to temporarily avoid changing several
+#        routines in C4::VirtualShelves and C4::VirtualShelves::page
+#        to deal with lists accessed during an anonymous OPAC session
+shelfpage('opac', $query, $template, (defined($loggedinuser) ? $loggedinuser : 
-1), $cookie);
-- 
1.5.5.GIT

_______________________________________________
Koha-patches mailing list
[email protected]
http://lists.koha.org/mailman/listinfo/koha-patches

Reply via email to