From 5bbdfab903df7ec36866f25fd23e2d089c054997 Mon Sep 17 00:00:00 2001
From: Mirko Tietgen <mirko@abunchofthings.net>
Date: Thu, 4 Jul 2013 00:50:43 +0200
Subject: [PATCH] Bug 10195 Records hidden with OpacSuppression can still be accessed

Records hidden with OpacSuppression are filtered from the search results, but the opac-detail page is still visible if you know the biblio number. This patch hides the detail page for suppressed biblios by redirecting (controlled by the syspref OpacSuppressionRedirect) either to opac-blocked (default), explaining that the record is blocked (including optional explanatory text from the syspref OpacSuppressionMessage) or to Koha's 404 page, giving no hint that a biblio with that number exists in the system.
---
 installer/data/mysql/sysprefs.sql                  |    2 +
 installer/data/mysql/updatedatabase.pl             |    9 +++++
 .../en/modules/admin/preferences/cataloguing.pref  |   11 +++++-
 .../opac-tmpl/prog/en/modules/opac-blocked.tt      |   31 +++++++++++++++++
 opac/opac-blocked.pl                               |   36 ++++++++++++++++++++
 opac/opac-detail.pl                                |   30 ++++++++++++++++
 6 files changed, 118 insertions(+), 1 deletions(-)
 create mode 100644 koha-tmpl/opac-tmpl/prog/en/modules/opac-blocked.tt
 create mode 100755 opac/opac-blocked.pl

diff --git a/installer/data/mysql/sysprefs.sql b/installer/data/mysql/sysprefs.sql
index 0a3f20f..795e9ed 100644
--- a/installer/data/mysql/sysprefs.sql
+++ b/installer/data/mysql/sysprefs.sql
@@ -428,3 +428,5 @@ INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) V
 INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('OpacHoldNotes',0,'Show hold notes on OPAC','','YesNo');
 INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('CalculateFinesOnReturn','1','Switch to control if overdue fines are calculated on return or not', '', 'YesNo');
 INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('AcqWarnOnDuplicateInvoice','0','Warn librarians when they try to create a duplicate invoice', '', 'YesNo');
+INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacSuppressionRedirect','1','Redirect the opac detail page for suppressed records to an explanatory page (otherwise redirect to 404 error page)','','YesNo');
+INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacSuppressionMessage','','Display this message on the redirect page for suppressed biblios','70|10','Textarea');
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index 1f7b491..a464455 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -7044,6 +7044,15 @@ if ( CheckVersion($DBversion) ) {
     SetVersion($DBversion);
 }
 
+$DBversion = "xxx";
+if ( CheckVersion($DBversion) ) {
+    $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacSuppressionRedirect','1','Redirect the opac detail page for suppressed records to an explanatory page (otherwise redirect to 404 error page)','','YesNo')");
+    $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES ('OpacSuppressionMessage', '','Display this message on the redirect page for suppressed biblios','70|10','Textarea')");
+    print "Upgrade to $DBversion done (Bug 10195: Records hidden with OpacSuppression can still be accessed)\n";
+    SetVersion($DBversion);
+}
+
+
 =head1 FUNCTIONS
 
 =head2 TableExists($table)
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref
index 96f3603..79056ff 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/cataloguing.pref
@@ -156,10 +156,19 @@ Cataloging:
                   yes: Hide
                   no: "Don't hide"
             - items marked as suppressed from OPAC search results. Note that you must have the <code>Suppress</code> index set up in Zebra and at least one suppressed item, or your searches will be broken.
-            - Restrict the suppression to IP adresses outside of the IP range
+            - <br />Restrict the suppression to IP adresses outside of the IP range
             - pref: OpacSuppressionByIPRange
               class: short
             - (Leave blank if not used. Define a range like <code>192.168.</code>.)
+            - <br />Redirect the opac detail page for suppressed records to
+            - pref: OpacSuppressionRedirect
+              choices:
+                  yes: "an explanatory page ('This record is blocked')."
+                  no: "the 404 error page ('Not found')."
+            - <br />Display the following message on the redirect page for suppressed biblios
+            - pref: OpacSuppressionMessage
+              type: textarea
+              class: code
         -
             - pref: SeparateHoldings
               choices:
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-blocked.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-blocked.tt
new file mode 100644
index 0000000..0cdbeb7
--- /dev/null
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-blocked.tt
@@ -0,0 +1,31 @@
+[% INCLUDE 'doc-head-open.inc' %][% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog &rsaquo;  An error has occurred
+[% INCLUDE 'doc-head-close.inc' %]
+</head>
+<body id="error404">
+[% IF ( OpacNav ) %]<div id="doc3" class="yui-t1">[% ELSE %]<div id="doc3" class="yui-t7">[% END %]
+<div id="bd">
+[% INCLUDE 'masthead.inc' %]
+
+<div id="yui-main">
+<div class="yui-b">
+<div class="yui-g">
+            <div id="opac-blocked-message">
+                <h3>Blocked</h3>
+                <p>You are not authorized to view this record.</p>
+                [% IF ( OpacSuppressionMessage ) %]
+                    <div id="opacsuppressionmessage">
+                        <p>[% OpacSuppressionMessage %]</p>
+                    </div>
+                [% END %]
+            </div>
+</div>
+</div>
+</div>
+[% IF ( OpacNav ) %]
+<div class="yui-b">
+<div id="leftmenus" class="container">
+[% INCLUDE 'navigation.inc' %]
+</div>
+</div>[% END %]
+</div>
+[% INCLUDE 'opac-bottom.inc' %]
diff --git a/opac/opac-blocked.pl b/opac/opac-blocked.pl
new file mode 100755
index 0000000..46bbeaa
--- /dev/null
+++ b/opac/opac-blocked.pl
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+use strict;
+use warnings;
+use CGI;
+use C4::Auth;
+use C4::Output;
+use C4::Context;
+
+my $query = new CGI;
+my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
+    {
+        template_name   => "opac-blocked.tt",
+        query           => $query,
+        type            => "opac",
+        authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
+    }
+);
+
+output_with_http_headers $query, $cookie, $template->output, 'html';
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index 9d0851f..2c4f8bd 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -78,6 +78,36 @@ if ( ! $record ) {
     print $query->redirect("/cgi-bin/koha/errors/404.pl"); # escape early
     exit;
 }
+
+# redirect if opacsuppression is enabled and biblio is suppressed
+if (C4::Context->preference('OpacSuppression')) {
+    my $opacsuppressionfield = '942';
+    my $opacsuppressionfieldvalue = $record->field($opacsuppressionfield);
+    # redirect to opac-blocked info page or 404?
+    my $opacsuppressionredirect;
+    if ( C4::Context->preference("OpacSuppressionRedirect") ) {
+        $opacsuppressionredirect = "/cgi-bin/koha/opac-blocked.pl";
+    }
+    else {
+        $opacsuppressionredirect = "/cgi-bin/koha/errors/404.pl";
+    }
+    if ( $opacsuppressionfieldvalue->subfield("n") == 1) {
+        # if OPAC suppression by IP address
+        if (C4::Context->preference('OpacSuppressionByIPRange')) {
+            my $IPAddress = $ENV{'REMOTE_ADDR'};
+            my $IPRange = C4::Context->preference('OpacSuppressionByIPRange');
+            if ($IPAddress !~ /^$IPRange/)  {
+                print $query->redirect($opacsuppressionredirect);
+                exit;
+            }
+         }
+        else {
+            print $query->redirect($opacsuppressionredirect);
+            exit;
+        }
+    }
+}
+
 $template->param( biblionumber => $biblionumber );
 
 # get biblionumbers stored in the cart
-- 
1.7.2.5