use JSON rather than Storable for the OPAC search history cookie
authorGalen Charlton <gmc@esilibrary.com>
Thu, 25 Jul 2013 16:50:30 +0000 (16:50 +0000)
committerGalen Charlton <gmc@esilibrary.com>
Sun, 28 Jul 2013 01:52:06 +0000 (01:52 +0000)
To test:

Exercise the OPAC search history functionality, after
turning on the EnableOpacSearchHistory syspref:

- Clear the KohaOpacRecentSearches cookie
- As an anonymous user, conduct a variety of searches,
  including ones that include non-ASCII characters
- Check the search history and verified that all searches
  are listed
- Log into the OPAC
- Verify that current and past searches are listed in
  search history.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
Signed-off-by: Bernardo Gonzalez Kriegel <bgkriegel@gmail.com>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
C4/Auth.pm
opac/opac-search-history.pl
opac/opac-search.pl

index d6e088a..9d80ab6 100644 (file)
@@ -20,7 +20,7 @@ package C4::Auth;
 use strict;
 use warnings;
 use Digest::MD5 qw(md5_base64);
-use Storable qw(thaw freeze);
+use JSON qw/encode_json decode_json/;
 use URI::Escape;
 use CGI::Session;
 
@@ -254,7 +254,7 @@ sub get_template_and_user {
             my $searchcookie = $in->{'query'}->cookie('KohaOpacRecentSearches');
             if ($searchcookie){
                 $searchcookie = uri_unescape($searchcookie);
-                    my @recentSearches = @{thaw($searchcookie) || []};
+                    my @recentSearches = @{decode_json($searchcookie) || []};
                 if (@recentSearches) {
                     my $sth = $dbh->prepare($SEARCH_HISTORY_INSERT_SQL);
                     $sth->execute( $borrowernumber,
@@ -268,7 +268,7 @@ sub get_template_and_user {
                     # And then, delete the cookie's content
                     my $newsearchcookie = $in->{'query'}->cookie(
                                                 -name => 'KohaOpacRecentSearches',
-                                                -value => freeze([]),
+                                                -value => encode_json([]),
                                                 -HttpOnly => 1,
                                                 -expires => ''
                                              );
@@ -293,7 +293,7 @@ sub get_template_and_user {
         my $searchcookie = $in->{'query'}->cookie('KohaOpacRecentSearches');
         if ($searchcookie){
             $searchcookie = uri_unescape($searchcookie);
-                my @recentSearches = @{thaw($searchcookie) || []};
+                my @recentSearches = @{decode_json($searchcookie) || []};
          # We show the link in opac
             if (@recentSearches) {
                 $template->param(ShowOpacRecentSearchLink => 1);
index 1b76c55..5536139 100755 (executable)
@@ -22,7 +22,7 @@ use warnings;
 
 use C4::Auth qw(:DEFAULT get_session);
 use CGI;
-use Storable qw(freeze thaw);
+use JSON qw/decode_json encode_json/;
 use C4::Context;
 use C4::Output;
 use C4::Log;
@@ -53,7 +53,7 @@ if (!$loggedinuser) {
        # Deleting cookie's content 
        my $recentSearchesCookie = $cgi->cookie(
            -name => 'KohaOpacRecentSearches',
-           -value => freeze([]),
+           -value => encode_json([]),
            -expires => ''
            );
 
@@ -67,8 +67,8 @@ if (!$loggedinuser) {
 
        # Getting the cookie
        my $searchcookie = $cgi->cookie('KohaOpacRecentSearches');
-       if ($searchcookie && thaw(uri_unescape($searchcookie))) {
-           my @recentSearches = @{thaw(uri_unescape($searchcookie))};
+       if ($searchcookie && decode_json(uri_unescape($searchcookie))) {
+           my @recentSearches = @{decode_json(uri_unescape($searchcookie))};
            if (@recentSearches) {
 
                # As the dates are stored as unix timestamps, let's do some formatting
index 6349e3c..ced8ae4 100755 (executable)
@@ -54,7 +54,7 @@ use C4::Ratings;
 
 use POSIX qw(ceil floor strftime);
 use URI::Escape;
-use Storable qw(thaw freeze);
+use JSON qw/decode_json encode_json/;
 use Business::ISBN;
 
 my $DisplayMultiPlaceHold = C4::Context->preference("DisplayMultiPlaceHold");
@@ -625,8 +625,8 @@ for (my $i=0;$i<@servers;$i++) {
             my $searchcookie = $cgi->cookie('KohaOpacRecentSearches');
             if ($searchcookie){
                 $searchcookie = uri_unescape($searchcookie);
-                if (thaw($searchcookie)) {
-                    @recentSearches = @{thaw($searchcookie)};
+                if (decode_json($searchcookie)) {
+                    @recentSearches = @{decode_json($searchcookie)};
                 }
             }
 
@@ -641,8 +641,8 @@ for (my $i=0;$i<@servers;$i++) {
                 # To a cookie (the user is not logged in)
                 if (!$offset) {
                     push @recentSearches, {
-                                "query_desc" => $query_desc_history || "unknown",
-                                "query_cgi"  => $query_cgi_history  || "unknown",
+                                "query_desc" => Encode::decode_utf8($query_desc_history) || "unknown",
+                                "query_cgi"  => Encode::decode_utf8($query_cgi_history)  || "unknown",
                                 "time"       => time(),
                                 "total"      => $total
                               };
@@ -653,8 +653,8 @@ for (my $i=0;$i<@servers;$i++) {
                 # Pushing the cookie back
                 $newsearchcookie = $cgi->cookie(
                             -name => 'KohaOpacRecentSearches',
-                            # We uri_escape the whole freezed structure so we're sure we won't have any encoding problems
-                            -value => uri_escape( freeze(\@recentSearches) ),
+                            # We uri_escape the whole serialized structure so we're sure we won't have any encoding problems
+                            -value => uri_escape( encode_json(\@recentSearches) ),
                             -expires => ''
                 );
                 $cookie = [$cookie, $newsearchcookie];