Bug 28230: Store C4::Message->{metadata} as Perl string always

When loading C4::Message->{metadata} we load it as perl string in all
other cases, see e.g. the subroutine find_last_message(). In this one
case we incorrectly populate the C4::Message->{metadata} as an UTF-8
octet instead of a Perl string. This causes a problem later on because
encode_utf8 later on in the line:

YAML::XS::Load(Encode::encode_utf8($self->{metadata}));

excepts a perl string and not a UTF-8 octet (please refer to the
functions perldoc). This breaks the encoding and causes an internal
server error:

To test the error is gone:
1. Create biblio with "AE" (bugzilla doesn't let me write the real
letter here, see it in the bugzilla comments) in title
2. Enable RenewalSendNotice
3. Enable "Item checkout and renewal" message preference for patron
4. Checkout an item from biblio "AE" to patron
5. Try to renew the patron's loan and notice the renewal fails
6. Apply patch and restart plack
7. Notice renewal works now and message h's the AE letter displayed correctly

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Joonas Kylmälä 2021-04-27 10:29:21 +03:00 committed by Jonathan Druart
parent 62444c1b9f
commit eb1961f682

View file

@ -166,7 +166,7 @@ sub enqueue {
my $body = join('', map { $format->($_) } @{$metadata->{body}}); my $body = join('', map { $format->($_) } @{$metadata->{body}});
$letter->{content} = $metadata->{header} . $body . $metadata->{footer}; $letter->{content} = $metadata->{header} . $body . $metadata->{footer};
$letter->{metadata} = Dump($metadata); $letter->{metadata} = Encode::decode_utf8(Dump($metadata));
C4::Letters::EnqueueLetter({ C4::Letters::EnqueueLetter({
letter => $letter, letter => $letter,
borrowernumber => $borrower->{borrowernumber}, borrowernumber => $borrower->{borrowernumber},
@ -279,7 +279,7 @@ sub metadata {
$data->{header} ||= ''; $data->{header} ||= '';
$data->{body} ||= []; $data->{body} ||= [];
$data->{footer} ||= ''; $data->{footer} ||= '';
$self->{metadata} = Dump($data); $self->{metadata} = Encode::decode_utf8(Dump($data));
$self->content($self->render_metadata); $self->content($self->render_metadata);
return $data; return $data;
} else { } else {