From 26c8c57ff5366087c23a88dd0b84a4a26b7b9c3b Mon Sep 17 00:00:00 2001 From: Johannes Baiter Date: Mon, 15 Jan 2024 10:14:35 +0100 Subject: [PATCH] Improve XML sanitization in advanced mode to fix broken entities. Previously we'd only check if a candidate entity was properly terminated by a semicolon, which missed some broken XML we have in legacy projects. The check is now much more thorough and mimicks much of the process the parser itself does when parsing entities. --- .../lucene/filters/SanitizingXmlFilter.java | 75 ++- .../github/dbmdz/solrocr/solr/HocrTest.java | 28 + .../resources/data/hocr_broken_entities.html | 483 ++++++++++++++++++ src/test/resources/solr/general/schema.xml | 3 +- 4 files changed, 586 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/data/hocr_broken_entities.html diff --git a/src/main/java/com/github/dbmdz/solrocr/lucene/filters/SanitizingXmlFilter.java b/src/main/java/com/github/dbmdz/solrocr/lucene/filters/SanitizingXmlFilter.java index 97baf091..b35ee2eb 100644 --- a/src/main/java/com/github/dbmdz/solrocr/lucene/filters/SanitizingXmlFilter.java +++ b/src/main/java/com/github/dbmdz/solrocr/lucene/filters/SanitizingXmlFilter.java @@ -1,5 +1,6 @@ package com.github.dbmdz.solrocr.lucene.filters; +import com.ctc.wstx.io.WstxInputData; import com.github.dbmdz.solrocr.util.SourceAwareReader; import com.google.common.collect.ImmutableSet; import java.io.IOException; @@ -99,8 +100,30 @@ public int read(char[] cbuf, int off, int len) throws IOException { break; } int entityEnd = multiIndexOf(cbuf, match + 1, '<', ';'); - if (entityEnd < 0 || entityEnd == match + 1 || cbuf[entityEnd] == '<') { - // Illegal entity declaration (doesn't end before next element opening), mask + + if (entityEnd < match + 1) { + // Not enough data to determine entity end, we may have to carry over + // FIXME: This code is largely identical to the carry-over case below, find a way to + // deduplicate + int carryOverSize = numRead - (match + 1); + if (carryOverSize == numRead) { + // Can't carry-over the whole buffer, since the read would return 0 + // We bail out of validation since there's no way we can force the caller to request + // a bigger read, and doing it ourselves and reading ahead would be too complicated + idx = (off + numRead); + continue outer; + } + // Reduce read size and carry over remainder, so the element is fully part of the next read + truncated = true; + this.carryOver = new char[carryOverSize]; + System.arraycopy(cbuf, match + 1, this.carryOver, 0, this.carryOver.length); + this.carryOverIdx = 0; + numRead -= this.carryOver.length; + break outer; + } + + if (!isLegalEntity(cbuf, match, entityEnd)) { + // Illegal entity, mask cbuf[match] = '_'; } idx = match + 1; @@ -290,6 +313,54 @@ private static int multiIndexOf(final char[] array, int startIndex, final char.. return -1; } + private static boolean isLegalEntity(char[] cbuf, int startIdx, int endIdx) { + if (cbuf[startIdx + 1] == '#') { + // Check if we have a valid hexadecimal/decimal entity + if (cbuf[startIdx + 2] == 'x') { + // Hexadecimal entity + for (int i = startIdx + 3; i < endIdx; i++) { + char c = cbuf[i]; + if (!Character.isDigit(c) && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) { + return false; + } + } + long value = Long.parseLong(new String(cbuf, startIdx + 3, endIdx - startIdx - 3), 16); + if (value > 0x10FFFF) { + // Not a legal unicode codepoint + return false; + } + } else { + // Numeric entity + for (int i = startIdx + 2; i < endIdx; i++) { + char c = cbuf[i]; + if (!Character.isDigit(c)) { + return false; + } + } + } + // Legal numeric/hexadecimal entity if it's terminated correctly + return cbuf[endIdx] == ';'; + } else if (!Character.isLetter(cbuf[startIdx + 1])) { + // Only numeric/hexadecimal entities can start with a non-letter character + return false; + } + + // If the entity candidate doesn't end on a semicolon, it was terminated by a tag, i.e. not a + // legal entity + if (cbuf[endIdx] != ';') { + return false; + } + + // Use the same logic Woodstox uses to validate entity names + for (int i = startIdx + 1; i < endIdx; i++) { + char c = cbuf[i]; + if (!WstxInputData.isNameChar(c, false, false)) { + return false; + } + } + return true; + } + @Override public Optional getSource() { if (this.input instanceof SourceAwareReader) { diff --git a/src/test/java/com/github/dbmdz/solrocr/solr/HocrTest.java b/src/test/java/com/github/dbmdz/solrocr/solr/HocrTest.java index 58c76ba4..aa60d75f 100644 --- a/src/test/java/com/github/dbmdz/solrocr/solr/HocrTest.java +++ b/src/test/java/com/github/dbmdz/solrocr/solr/HocrTest.java @@ -531,4 +531,32 @@ public void testIssue288() throws IOException { "ocr_text_stored"); assertQ(req, "count(.//lst[@name=\"87371\"]//arr[@name='snippets']/lst)=19"); } + + public void testBrokenEntities() throws IOException { + Path ocrPath = Paths.get("src/test/resources/data/hocr_broken_entities.html"); + assertU( + adoc( + "ocr_text_stored", + new String(Files.readAllBytes(ocrPath), StandardCharsets.UTF_8), + "id", + "87372")); + assertU(commit()); + SolrQueryRequest req = + xmlQ( + "q", + "Gerichtsvollzieher", + "hl.snippets", + "4096", + "hl.weightMatches", + "true", + "hl.ocr.contextSize", + "4", + "df", + "ocr_text_stored", + "hl.ocr.fl", + "ocr_text_stored"); + assertQ( + req, + "contains(.//lst[@name='87372']//arr[@name='snippets']/lst/str[@name='text']/text(), 'dt_HiFi-i?cBßflpedx1ttonI-iii;_;ikW')"); + } } diff --git a/src/test/resources/data/hocr_broken_entities.html b/src/test/resources/data/hocr_broken_entities.html new file mode 100644 index 00000000..d4e1fb34 --- /dev/null +++ b/src/test/resources/data/hocr_broken_entities.html @@ -0,0 +1,483 @@ + + + + + + +
+
+

+ +

+ +
+
+

+ +

+ +
+
+

+ +
+
+

+ +

+ +
+
+

+ +

+ +
+
+

+ +

+ +
+
+

u 4 -- _ l . _
*' ' r"alli-.eb eb eier' "l- nn von unbedingt r. 't l - i du arbeiten-.7 t W mfiprcaimlifs la“­
her Lan wirtß'ai t. namei-.tlieb aueh im eit-ba ill-'rei erfahreii."m"*m* MM mm* EMU" Wu*

+ +
+
+

' iiift'eii erfa n, lui-ht eine [einen ähigteiten entlpreehende Ele im ,
als Minimum-unter bei einer meat-ft Urin?:
Domänen ii.. einem 'reihe-gefilmt“ oder einem ...du e* une oder ..­
waxWW .Es wird dabei mehr-aiif dauernde. und angenehme Still­
i-iig. a e ar gefehen, Franko- tierten unter ,I W 731 befördert die
Annonce _ .dj ..Avon [-llim.105) t8e-738)2a

+ +

_>17 *- ' eiifiein ii. Vogler iii Mannheim.

+ +
+
+

Bekanntmachung..

+ +
+
+

BetreibendeetVriiiatieis Kae ar Beer dahin,- wurde' inte eine fiir den ebe­
MWthlmafisbefiher“ " p b

+ +
+
+

- :Johann Meierhof-r roii bier, l
gegenwärtig unbekannten Aufenthaltes. die oolifireetbaee Ausfertigung eines Erkenntnifles
_des k. Handelsgetiebts Münden l/Z. vom 8. d. Mis. ziigefiellt, woonrib Johann Mgier­
iwie-r vernethellt lit, an den ten er eine Weibleliumme von 9'i0 fi, die 6 pCt. Linien
hieraus felt 28. v. Mia. 5 fl. 4 . Brotettkonen und ,Speten zu be ablen und die _ reit­
ko , ni tragen. - Johann Maierhofer itt aufgefordeit, die naeh d cteni Uitheil lgen
Var ge in aupt- und Nebenfaehe .u bega len. widiigenialls zur Zwangsoo eituiig
iii-.h (denim ani 31. Tage nach ?eine gän- inmobiliartEÜlution gel-dritten wiirde. Zu­
gle ch wird dem en eit net„da fich aspe-r Bea u mitten feiner Forderung der
vom i. G-riehtse g Zuber-Dreht- am 26. vor. Its. an? Betreiben des Commiifionärs Carl
Sar- dabter unterm-initiierten_ *lefändiin
mist

+ +
+
+

2.7

+ +
+
+

anlchlteßt. ,­
Rtkund n in meinem Geigehiiftszinnuer ..ur :Empfgmnahnie bereit.
den ugiifi 1873.

+ +
+
+

taatsaiiwali am k. Bezirks-Gettehte Mitnheii l. d.I.*beuilaubt:
Hindi-iuger, ll. St.-2l.

+ +
+
+

,Zi-an .
Der l.

+ +
+
+

.

+ +
+
+

+ +

+ +
+
+

Johann iind Therefe Maget-heiter von hier,

+ +

' -, unbekannten Aufentl-alte?B oollfireeloere Ausfertigung eines Verläunuiiiqs­
andelsgciiehts Miin en l d. J. vom 1, l, Mitt. zugefiellt, durch welches

+ +

'i' en Eheleute unter to'idariieher Haftung fiir febiitd g erkannt find. die

+ +

' »- el b iii-14. April d. J5, erhaltenen 33() fi. animt den 6rCt. infen hieraus

+ +

- :urid den Rotten an den niit er Friedrich Kraft zu beta ai.

+ +

. i- ?echoC'jehen Eheleute find aufge oidert. die nach di- fein Erkeni tnifie iehiil­

+ +
+
+

+ +
+
+

8'

+ +
+
+

* in. , aiipt- ind Nebei fache z berichtigem widrig' s .ur V andung ge­
?Y .minde-x ugleieh wird den Maherhofer'when Eheleuten er ffnet, daß a. Friedrich
vom. tsuoiliieher Driich auf Betreiben des Commitfionärs Carl Garner

+ +
+
+

**7* ' ' INTER-XE. oorg*noniineiien *Pfändung für, die obigen Beträge mid-die
W l. "
den lieglen in meinem Gelebiiftszimmer zur Empfangnahme bei-eit.
ngufi 1873 >

+ +
+
+

io _ ,
dcn 8- .
I. beurlaubt

+ +
+
+

Der* 1. .Staatsanwalt
....l:
*-- tee ' .o

+ +
+
+

i

+ +
+
+

ein k. Bezirksgeiieh-*e München l. d.
Hindringer, ll. St-n.

+ +
+
+

** Gut, und billig
.Gelundheilsjäekehem Unterbeiiileleider,
Feilibinden e 80m4»
bei M. Dampf. Windenmaehernafie 1.
' Eine Kammerjimgfer

+ +
+
+

ung einer La­
*n[ - ü W l , ei
ge axl i ?Zwodiidlt bei-LiliaZunvYiifZinäZelsyiaWlcdi
a

+ +
+
+

nWFtraße 6 am Don- Simmering... ...er tele'. .in
ue “ag den 14. ds.

+ +
+
+

an dt&HiFi-i?cBßflpedx1ttonI-iii;_;ikW ..8.3825
e . i c en. 7
. umgs Uhr' 80.862 Ein junger _Mann Wiiit']'.“Oe
ß. “W- :xEraen-ier,
li. Gerichtsvollzieher. *31.092

+ +
+
+

tober eine Stelle als Verwalter. D. U
Wing-Verlauf.

+ +
+
+

81033727" ine [Munchen-1c* Reini-item,
Ein feines. alt* rentables Gelehäit mit

+ +
+
+

ie.

+ +
+
+

+ +

+ +
+
+

+ +
+
+

inhaltlich ia clititebe Gebetbüeher und Zehn­
,ge' otriemen, bliit ini Weg on von Mün'licn
naeh Starnberg am 11. . liegen. Der
Finder. welmer dielelbc am k.Babnbeti-iibö:
amte Miinchen oder Starnberg abgibt. er:
hält eine gute Belohnung. '

+ +
+
+

+ +
+
+

+ +

+ +
+
+

+ +
+
+

+ +

+ +
+
+

+ +
+
+

+ +
+
+

+ +
+
+

* ' winn. ifi um - z.» .----- »­
*ZZYLWZZYMZUY Einige 100 Eimer .
i n. r - - - . -
e.. ..W Branntwein
' werden abgegeben. Briefe unter Z 81020.
Z...ZÄZ".......9.....Z
-Für heumatismusx
T:- * wa g m ß . ,. 8* Gichtlcidende. Z
'keine ee- 4e edge. Gel-3::: Z Balfam Bilfinger. x
»li-MÜN- *Zlllzen MBJS. Fi) *30.237 * " ewig von den rößien med- -AuW
74'( of t 'gie NRW-„pain, ' [Z. en. adieal-Feilgmittel elbfi in den hart.
(FK-'g emgWzfk-YWM Jän-,Veit Zusage-en Er­
w oi_Ani'Fw f Wawrflmße l "o ,angewan in [en o pi ern zii
j", "cbm . l ni, Mini en, Leipzig und lparis.
t
t

+ +
+
+

Klinik iii erliii |)i*. v. Bilfinger,Z
* Alexandiinenfiraße 26.

+ +

haben in Miinchen bei* A otlZeker­

+ +

Otto Gierlinger, SehühenDra e2.

+ +

"* SZWSrlbiMürb intime-i

+ +

,- iii ing e n en» o er

+ +

" oi. i984­

+ +
+
+

.Augsburg bm. Nägeln St afie l) ..
"""'."""" ...un

+ +
+
+

77“ Bänifme Dogge

+ +
+
+

*e Race b iu verlaufene desgleiebeii'_
tei:Wetiern;eWherd. D. n.. 89,27?

+ +
+
+

w
e­

+ +
+
+

uhnfedern'
y * l ie.. find unterm An­
ni preis .u verlaufen. Lederergafie 17i3.

+ +
+
+

Y Iieuefle Nachrichten.

+ +
+
+

äbig, iii
iin :Wittmann und im kaufmänui'ihen 'de ungswrten bewandert. fowie iii­

+ +
+
+

Ein Buehhalt'er * l

+ +
+
+

gefeßten Alters-j der gewohnt ifi, felbftfiändig

+ +
+
+

eere
Offerte' unter M. 3&72 an die Unnöncen­
Expedition von' 80485
Linde-l' Mofie in Miinchen.
- - "k K k d­
CYWWZOWW-W x

+ +
+
+

F'
Blumeugefcliaft- ?Z
e) jfi wegen dringender Wreife' billig ab- Z

+ +

zugebe, O. ' D?)
* ** - „In vuÜu , '
eine Kalelehje mit Glas ß, und ein
[Vier Retleioagen. D, x :te 80.5.2“
80.433 Zn einer einfa en kinderlojen Be­
amtenfamilie auf dcm ande in einer kath.
Gegend (bei Salgburg in Bayern), wird fo­
gleieh oder längfiens bis Muhaeli, ein Dienfi­
mädGenrrot. Confeiiion getuaxt. ,Haupt­
erfordernefie find: Tilidiigkeit, Treue, Rein­
lielßteit. ein lolider gutmiithiger Charakter
MONAT-tei?! eier' ?mW-cite afiki ieinem
e. e reeder rr ai iiber
Erliedition* diefes_Blattrx.!nfiagen.
80.48h In Niederbayern. eine Stunde von
der Stadt Straubing und der Eilenbabn
entfernt, ifi ein mit Ausnahme der dazu ge­
hörigen Waldung, gan. arroiidicies

+ +
+
+

,- Oetonomiegut

+ +
+
+

vor. 312 Tagwerl enn großen Theile bor­
.ilglicher Beimaffenheit, famnii lebenden. und
todiein Inventar uiid diißjä rigen Erndte­
oorraiheii eingetretener Fat-ii tenderbältniftc
en. zu verkaufen. Beme'rtt wird. daß
lei?? diexein Gute aueh Branntweiiibremu­
t un Blerwlrtbtehaft ausg not_ wird.
Gift. iite nnter G. V. 3476 an die An:
noncen- jpeditioii von

+ +
+
+

Ried! f Yoffe inMüneben.

+ +

80,487 In der Nahe-"dee" Umwerfer" in

+ +

Oberbaheisn, ifi ein in fchr fehöiiir Lage
i'

+ +
+
+

befindiieb
Oekonomiegut

+ +
+
+

mit einem Xitiihenraume von ea. 165 Tag­
iverl doll living arrondirt, worunter einge

+ +

fahr 40 agweik Waloiing -- ineiftens Vu:

+ +

eben - iammt todtem und lebenden.
.Inventar iind diiyjährigen Enidteoorriithen.
zu verlaufen Die Gebäuliehleiten befinden
neh in [ehr gutem. uflaiide iind das ein
weten ifi vorzugswei e fur einen matiifeben
'tant-wi?? geeignet. Geil. Aorefien unter­
G. V. ' 76 an die Annonceii-Exped, von'

+ +
+
+

+ +
+
+

Agentur-Ge uch.

+ +
+
+

80.49() n thätiger zuoerliif iger *u ent in.
einer der indufiriell en_ Städte B_ pha-*
len', lueht ein.lei ungefahiges Haus iii
Butter und Eier (fowie ni Limburger- und
SchweiÖeilate)
unter , S. 31 1 an die Ann-Crow. von
Wolf Motte in MW“.

+ +
+
+

.Ein junger Mann.
der in' einem Eitengejebiifte [eine Lehre er;
folgreteh beftanden und aua) im* Spegerei­
ge-ihtiftc tuehtig elebult in, der italienijeh?:

+ +
+
+

Spraaie nnd,a en Comment-immun .
tig. leieht in einem Eitehafte letzterer Bean c
entipreehende 'Stelle als Detatlcift. Be Referenten. Geil. Lfieite unter 21. Z. 3th.
an die Annoncen-Cr ed. bon j 80,495
Radon ZRH e m KMU.

+ +
+
+

Ein Junger Mann
der [eine Lehrzeit in einer Bueh-. Kunfi,
tlltufikalicn- und Schreibmateriallei.-Hand­
iii erfianden tn allen Sparten vollkommen
tilWfiändiger Arbeiter und fähig einem dir­
ariigen Gelehiifteallein vorzunehen. in allen
Comptoirarteiten routintrt, fuiht [eine Stelle
zii _ verändern. Befie Referenzen Gil.
Ofieite unter A. Z, 5453 an die Annoncen­
Expecitton eon _ ZKM-i)

+ +

Rudolf Muffe in München

+ +
+
+

+ +
+
+

80,740 _KlFÄt-ora, Zahlt-*lots- serie-niit.
baute, e'ololia iii-ri lle-time uuel'llitn'ter ii.

+ +
+
+

+ +
+
+

"llnsolie alod einer elontoolie-.n Bernina mim*
eiorolnnu drinnen annuaoliliesoen nuil bittet
kkniioo-0fl'oi-teri unter 0. l". 579 an clio
dnronoaißßxpeniiticin 'on
Inlmltcinakogler WWU-M.
(b'. o.)

+ +
+
+

ru flotter-ii.

+ +
+
+

Neid. Moffe iii Mumbai., '

+ +
+
+

ii vertreten. Gefl. Offerte - *

+ +
+
+

eier Soli-6i- niiel 'inner eco. 'ei-leben niit, ,

+ +
+
+

+ +

+ +
+
+

2-' elegante Ripsgar-'
uituien.
2 Spiegel-Chiffon­
niert, _
4 Glas-Etagen.
?Herren-nDamen­
Sihreibtji'ihe.
4 Ehiffonunre.
t Vüeheikaften.
4Commoden (3 Fieber).
4 „' (4mm).
4 Auszug-"Tüche­
2. elegante Silber­
käftem .
6 große u. kleine Spiegel.
und noeh-mehrere Haus­
einrichtungs-Gegenfiände
fielieu we en Abreife
billig zmu erkanfe.
:allgemeineBetätigeruugoanllalt,
Fürftenfeldgrgaffe 8.
- Geldmisleihende

+ +
+
+

werden get. uni Ude. gebeten. Freiwillige
Prozente vorgiiglkieh. _ (Held in Commiffion
auf Contocurrent“ wird fiets angenommen.
Vermittlungen reell. prompt u. fir. Older.

+ +

W. Zimmermaiin.'Thal 49/2, 12-2u.5--7

+ +
+
+

Thaleraliilten

+ +
+
+

iehr zu empfehlen gegen

+ +
+
+

die Choleta.

+ +

welmer iii keinem Haushalte _fehlen
fell. weleher innerlich und äu'ferlich
fickt ene jeßigen Zeit in Wiek“.
bedeutend deieelhrthat- ift zn haben

+ +
+
+

bei g 80,835
I. "
Kaufingergaffe 2 . Ein­

+ +
+
+

+ +
+
+

*muyqitunfilpnimmet

+ +
+
+

+ +
+
+

+ +
+
+

- M ari ä en.
DWF-ile? zi 39x.

+ +
+
+

89732 Zur Beaehtiiug.

+ +

In derutahe der Bahn W toqleteh oder

+ +

am 1. Sept. eiii Zimmer u ..man 1. St.

+ +

an eine toltde Witwe oder klnderlofe Ehe­

+ +

leWzu-,Yrgevem D. U. *
Bekanntmachung.
Dienstag, den 19. l. Pete.

+ +

Morgens 10 Uhr
oerfteigire ieh im Braunauer Hofe, Yet-?täu­

+ +
+
+

ittaße ei, ,
zwei fehweie braune Heugfte,

+ +

'einen Venaenwageu­

+ +

eine vieifißi'ge Chaile.

+ +

Miinchen, den 13. Augiifi 1873.

+ +

* Hellmuth.

+ +

l. Geriebtsvollziebet.

+ +
+
+

Bekanntmachung.
Montag. deu 18. l. Mir.,
Nachmittags 2 Uhr
verfieigere ich im Held'teben Bureau, Färber­
graben 10/0. einen Säilaidivan. eine 'dom­

+ +
+
+

indiec eine Guitarre, Tibet arbendrueibilder.
Munchen. den 13 ug 'MC

+ +
+
+

+ +
+
+

+ +
+
+

Zum Spirituoleugefehi'ifte
Wi eine?mc'irllniiiitiiiiiäh ?F­
eenW. -* - -­
*e

+ +
+
+

+ +
+
+

Hellmuth,
t. Gerinitsvollzieber.

+ +
+
+

50.50 -ev Eine Gouvernante leieht
eine Stelle. Karlflr. 3211/3 Stiegen

+ +
+
+

+ +
+
+

iii*
l“olli-ll'

+ +
+
+ diff --git a/src/test/resources/solr/general/schema.xml b/src/test/resources/solr/general/schema.xml index 8ffa1632..5eb02f51 100644 --- a/src/test/resources/solr/general/schema.xml +++ b/src/test/resources/solr/general/schema.xml @@ -12,7 +12,7 @@ - + @@ -31,6 +31,7 @@