From 138bc5813bcbaac8fb6c9286bb03358ae8b10c0a Mon Sep 17 00:00:00 2001 From: Martin Renvoize Date: Wed, 6 Dec 2023 11:49:43 +0000 Subject: [PATCH] Bug 35104: Throw exception on store of invalid marcxml This patch adds an exception Koha::Biblio::Metadata->store to prevent erroneous characters in marcxml being stored into the database. We also remove the cleanup of such characters from TransformHtmlToMarc as introduced by bug 34549. This should result in there being no way, outside of direct database manipulation, of getting forbidden characters into our marcxml store. We'll need to work through the codebase to catch the exception thrown to give the end user the oportunities to act on the error and fix the data at source. Signed-off-by: Baptiste Bayche Signed-off-by: Baptiste Wojtkowski --- C4/Biblio.pm | 2 -- Koha/Biblio/Metadata.pm | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 1f1f897e544..aaee18aebfb 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -88,7 +88,6 @@ use C4::Charset qw( nsb_clean SetMarcUnicodeFlag SetUTF8Flag - StripNonXmlChars ); use C4::Languages; use C4::Linker; @@ -2315,7 +2314,6 @@ sub TransformHtmlToMarc { # between 001 and 009 (included) } elsif ( $fval ne '' ) { - $fval = StripNonXmlChars($fval); #Strip out any non-XML characters like control characters $newfield = MARC::Field->new( $tag, $fval, ); } diff --git a/Koha/Biblio/Metadata.pm b/Koha/Biblio/Metadata.pm index 62639b7815b..926f5d85bc5 100644 --- a/Koha/Biblio/Metadata.pm +++ b/Koha/Biblio/Metadata.pm @@ -40,6 +40,42 @@ Koha::Metadata - Koha Metadata Object class =cut +=head3 store + +Metadata specific store method to catch errant characters prior +to committing to the database. + +=cut + +sub store { + my $self = shift; + + # Check marcxml will roundtrip + if ( $self->format eq 'marcxml' ) { + + my $marcxml = eval { + MARC::Record::new_from_xml( + $self->metadata, 'UTF-8', + $self->schema + ); + }; + my $marcxml_error = $@; + chomp $marcxml_error; + unless ($marcxml) { + warn $marcxml_error; + Koha::Exceptions::Metadata::Invalid->throw( + id => $self->id, + biblionumber => $self->biblionumber, + format => $self->format, + schema => $self->schema, + decoding_error => $marcxml_error, + ); + } + } + + return $self->SUPER::store; +} + =head3 record my $record = $metadata->record; -- 2.53.0