Bug 20971: Prevent Storable::thaw to fail on LastCreatedItem
authorPasi Kallinen <pasi.kallinen@joensuu.fi>
Thu, 21 Jun 2018 08:15:23 +0000 (11:15 +0300)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Tue, 19 Jan 2021 15:03:34 +0000 (16:03 +0100)
Sometimes additem.pl will complain about "Storable::thaw failed to
thaw LastCreatedItem-cookie.", see bug 14844. Now, actually fix the bug.

The bug is caused by trying to URI (un)escape MARC::Record, binary data.
We'll use a base64 url-safe version instead.

Test plan:
1: Set PrefillItem to 'The new item is prefilled...'
2: Set a SubfieldsToUseWhenPrefill, 'c' for example
3: Add a new item for biblio A with 'c' set.
4: Double check 'c' value is set for next new item A.
5: search and add a new item for biblio B
6: 'c' is not set
Apply patch
7: logout, login
8: repeat steps 3, 4, and 5 .
9: now 'c' is set.

Signed-off-by: Pasi Kallinen <pasi.kallinen@joensuu.fi>
Signed-off-by: James O'Keeffe <jamespfk@gmail.com>
Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>
JD amended patch: fix commit title and add test plan
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
cataloguing/additem.pl

index b8face6..b42d3d3 100755 (executable)
@@ -44,6 +44,7 @@ use C4::Members;
 
 use MARC::File::XML;
 use URI::Escape;
+use MIME::Base64 qw(decode_base64url encode_base64url);
 
 our $dbh = C4::Context->dbh;
 
@@ -467,7 +468,7 @@ my $cookieitemrecord;
 if ($prefillitem) {
     my $lastitemcookie = $input->cookie('LastCreatedItem');
     if ($lastitemcookie) {
-        $lastitemcookie = uri_unescape($lastitemcookie);
+        $lastitemcookie = decode_base64url($lastitemcookie);
         eval {
             if ( thaw($lastitemcookie) ) {
                 $cookieitemrecord = thaw($lastitemcookie);
@@ -476,7 +477,7 @@ if ($prefillitem) {
         };
         if ($@) {
             $lastitemcookie = 'undef' unless $lastitemcookie;
-            warn "Storable::thaw failed to thaw LastCreatedItem-cookie. Cookie value '$lastitemcookie'. Caught error follows: '$@'";
+            warn "Storable::thaw failed to thaw LastCreatedItem-cookie. Cookie value '".encode_base64url($lastitemcookie)."'. Caught error follows: '$@'";
         }
     }
 }
@@ -532,8 +533,8 @@ if ($op eq "additem") {
             if ($prefillitem && defined $record) {
                 my $itemcookie = $input->cookie(
                     -name => 'LastCreatedItem',
-                    # We uri_escape the whole freezed structure so we're sure we won't have any encoding problems
-                    -value   => uri_escape_utf8( freeze( $record ) ),
+                    # We encode_base64url the whole freezed structure so we're sure we won't have any encoding problems
+                    -value   => encode_base64url( freeze( $record ) ),
                     -HttpOnly => 1,
                     -expires => ''
                 );