Browse Source

Bug 20971: Prevent Storable::thaw to fail on LastCreatedItem

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>
21.05.x
Pasi Kallinen 6 years ago
committed by Jonathan Druart
parent
commit
9a7f778737
  1. 9
      cataloguing/additem.pl

9
cataloguing/additem.pl

@ -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 => ''
);

Loading…
Cancel
Save