Repository.mk                                                        |   15 
 basctl/source/dlged/dlged.cxx                                        |    2 
 bridges/source/cpp_uno/gcc3_macosx_x86-64/callvirtualmethod.cxx      |    2 
 external/more_fonts/ExternalPackage_noto_kufi_arabic.mk              |    4 
 external/more_fonts/ExternalPackage_noto_naskh_arabic.mk             |    4 
 external/more_fonts/ExternalPackage_noto_sans.mk                     |    4 
 external/more_fonts/ExternalPackage_noto_sans_arabic.mk              |    4 
 external/more_fonts/ExternalPackage_noto_sans_armenian.mk            |    4 
 external/more_fonts/ExternalPackage_noto_sans_georgian.mk            |    4 
 external/more_fonts/ExternalPackage_noto_sans_hebrew.mk              |    4 
 external/more_fonts/ExternalPackage_noto_sans_lao.mk                 |    4 
 external/more_fonts/ExternalPackage_noto_sans_lisu.mk                |    4 
 external/more_fonts/ExternalPackage_noto_serif.mk                    |    4 
 external/more_fonts/ExternalPackage_noto_serif_armenian.mk           |    4 
 external/more_fonts/ExternalPackage_noto_serif_georgian.mk           |    4 
 external/more_fonts/ExternalPackage_noto_serif_hebrew.mk             |    4 
 external/more_fonts/ExternalPackage_noto_serif_lao.mk                |    4 
 oox/qa/unit/data/tdf134401_ExportAutoGrowToTextWordWrap.odp          |binary
 oox/qa/unit/export.cxx                                               |   17 
 oox/source/export/drawingml.cxx                                      |   16 
 package/source/manifest/ManifestDefines.hxx                          |    9 
 package/source/manifest/ManifestImport.cxx                           |   25 
 package/source/manifest/ManifestImport.hxx                           |    1 
 package/source/zippackage/ZipPackage.cxx                             |   12 
 sc/qa/uitest/autofilter2/tdf158314_EmptyError.py                     |   94 +
 sc/source/core/data/column3.cxx                                      |    4 
 sc/source/ui/view/gridwin.cxx                                        |    7 
 schema/libreoffice/OpenDocument-v1.3+libreoffice-manifest-schema.rng |   70 -
 svtools/source/brwbox/editbrowsebox.cxx                              |    2 
 svx/source/tbxctrls/tbunosearchcontrollers.cxx                       |   20 
 sw/qa/extras/layout/data/fld-in-tbl.docx                             |binary
 sw/qa/extras/layout/data/table-0-height-rows.fodt                    |  630 
++++++++++
 sw/qa/extras/layout/layout3.cxx                                      |   35 
 sw/source/core/crsr/crsrsh.cxx                                       |   11 
 sw/source/core/crsr/crstrvl.cxx                                      |    1 
 sw/source/core/layout/tabfrm.cxx                                     |  118 +
 sw/source/core/text/guess.cxx                                        |   14 
 sw/source/core/text/porfld.cxx                                       |    7 
 sw/source/uibase/utlui/content.cxx                                   |   20 
 test/source/xmltesttools.cxx                                         |    2 
 vcl/qt5/QtAccessibleEventListener.cxx                                |   10 
 writerfilter/source/rtftok/rtfsprm.cxx                               |   20 
 writerfilter/source/rtftok/rtfsprm.hxx                               |    2 
 writerfilter/source/rtftok/rtfvalue.cxx                              |    4 
 xmlsecurity/qa/unit/signing/data/encrypted_scriptsig_lo242.odt       |binary
 xmlsecurity/qa/unit/signing/data/encrypted_scriptsig_odf13.odt       |binary
 xmlsecurity/qa/unit/signing/signing2.cxx                             |  308 
++++
 xmlsecurity/source/helper/xmlsignaturehelper.cxx                     |   68 +
 48 files changed, 1513 insertions(+), 89 deletions(-)

New commits:
commit aa39e19f6a8133bbb4bf5a6de72351223bad408d
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Thu Jan 18 14:29:06 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    tdf#139631 sw_redlinehide: fix IntelligentCut feature with redlines
    
    Unfortunately forgot to adapt SwCursorShell::GetChar() to use the
    SwTextFrame instead of the SwTextNode, so it returns non-visible
    (deleted) characters to SwWrtShell::IntelligentCut(), breaking one of
    our oldest AI features.
    
    (regression from sw_redlinehide)
    
    Change-Id: I0c19944159e7e3af323bfe626c0e496ad745ef35
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162253
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    (cherry picked from commit ab2b0bd10481e9d0bb5bfea09ab0b034bb246c52)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162271
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sw/source/core/crsr/crsrsh.cxx b/sw/source/core/crsr/crsrsh.cxx
index 04b263cda754..173414ed4db7 100644
--- a/sw/source/core/crsr/crsrsh.cxx
+++ b/sw/source/core/crsr/crsrsh.cxx
@@ -2936,6 +2936,7 @@ OUString SwCursorShell::GetSelText() const
 }
 
 /** get the nth character of the current SSelection
+    in the same paragraph as the start/end.
 
     @param bEnd    Start counting from the end? From start otherwise.
     @param nOffset position of the character
@@ -2951,8 +2952,14 @@ sal_Unicode SwCursorShell::GetChar( bool bEnd, 
tools::Long nOffset )
     if( !pTextNd )
         return 0;
 
-    const sal_Int32 nPos = pPos->GetContentIndex();
-    const OUString& rStr = pTextNd->GetText();
+    SwTextFrame const*const pFrame(static_cast<SwTextFrame 
const*>(pTextNd->getLayoutFrame(GetLayout())));
+    if (!pFrame)
+    {
+        return 0;
+    }
+
+    const sal_Int32 nPos(sal_Int32(pFrame->MapModelToViewPos(*pPos)));
+    const OUString& rStr(pFrame->GetText());
     sal_Unicode cCh = 0;
 
     if (((nPos+nOffset) >= 0 ) && (nPos+nOffset) < rStr.getLength())
commit b77535222eab180cdd2e181b88e2c458167e7eed
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Wed Jan 17 16:56:38 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    sw: layout: prevent bad page break in table with 0-height rows
    
    The bugdoc contains a table with most rows having a hidden-paragraph
    field in every paragraph, and no cell border or padding.
    
    The SwTabFrame is initially split across 6 pages, which should all be
    joined, as there are only 3 visible rows, but the last follow is never
    joined.
    
    This is because SwTabFrame::Join() of the next-to-last follow doesn't
    invalidate the SwTabFrame, because Grow(0) doesn't invalidate, and
    later formatting anything in the moved SwRowFrame doesn't invalidate
    either as it is all height 0.
    
    Try to fix this by guessing that the row will have height 0 (even if
    it's not formatted yet).
    
    Change-Id: Ic8246ac91c741f5a215f89dc159c44d7c7cf2ce1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162203
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    (cherry picked from commit ab7893544dc6be6dc192dffefd57cd5ddd421c35)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162223
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sw/qa/extras/layout/data/table-0-height-rows.fodt 
b/sw/qa/extras/layout/data/table-0-height-rows.fodt
new file mode 100644
index 000000000000..f32e2fbe996e
--- /dev/null
+++ b/sw/qa/extras/layout/data/table-0-height-rows.fodt
@@ -0,0 +1,630 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<office:document xmlns:officeooo="http://openoffice.org/2009/office"; 
xmlns:css3t="http://www.w3.org/TR/css3-text/"; 
xmlns:grddl="http://www.w3.org/2003/g/data-view#"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:dc="http://purl.org/dc/eleme
 nts/1.1/" xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 
xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
 xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:ooow="http://openoffice.org/2004/writer"; 
xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
 xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0
 " xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:xforms="http://www.w3.org/2002/xforms"; office:version="1.2" 
office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+  <style:font-face style:name="Times New Roman" svg:font-family="'Times New 
Roman'" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Times New Roman1" svg:font-family="'Times New 
Roman'" style:font-adornments="Standard" style:font-family-generic="roman" 
style:font-pitch="variable"/>
+  <style:font-face style:name="Arial" svg:font-family="Arial" 
style:font-adornments="Standard" style:font-family-generic="swiss" 
style:font-pitch="variable"/>
+  <style:font-face style:name="Arial Unicode MS" svg:font-family="'Arial 
Unicode MS'" style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="Tahoma" svg:font-family="Tahoma" 
style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#808080" 
draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" 
draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" 
draw:start-line-spacing-vertical="0.283cm" 
draw:end-line-spacing-horizontal="0.283cm" 
draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" 
style:line-break="strict" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties fo:color="#000000" style:font-name="Times New Roman" 
fo:font-size="12pt" fo:language="de" fo:country="DE" 
style:letter-kerning="true" style:font-name-asian="Arial Unicode MS" 
style:font-size-asian="12pt" style:language-asian="en" style:country-asian="US" 
style:font-name-complex="Tahoma" style:font-size-complex="12pt" 
style:language-complex="en" style:country-complex="US"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" 
style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" 
style:line-break="strict" style:tab-stop-distance="1.997cm" 
style:writing-mode="page"/>
+   <style:text-properties fo:color="#000000" style:font-name="Times New Roman" 
fo:font-size="12pt" fo:language="de" fo:country="DE" 
style:letter-kerning="true" style:font-name-asian="Arial Unicode MS" 
style:font-size-asian="12pt" style:language-asian="en" style:country-asian="US" 
style:font-name-complex="Tahoma" style:font-size-complex="12pt" 
style:language-complex="en" style:country-complex="US" fo:hyphenate="false" 
fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" 
loext:hyphenation-no-caps="false"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" 
style:class="text"/>
+  <style:style style:name="Schrift1" style:family="paragraph">
+   <style:paragraph-properties>
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:font-name="Arial" fo:font-family="Arial" 
style:font-style-name="Standard" style:font-family-generic="swiss" 
style:font-pitch="variable"/>
+  </style:style>
+  <style:style style:name="Schrift2" style:family="paragraph" 
style:master-page-name="">
+   <style:paragraph-properties style:page-number="auto"/>
+   <style:text-properties style:font-name="Times New Roman1" 
fo:font-family="'Times New Roman'" style:font-style-name="Standard" 
style:font-family-generic="roman" style:font-pitch="variable"/>
+  </style:style>
+  <style:style style:name="TextNormal" style:family="paragraph" 
style:parent-style-name="Schrift2" style:master-page-name="">
+   <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" 
loext:contextual-spacing="false" fo:line-height="150%" fo:orphans="2" 
fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:page-number="auto"/>
+   <style:text-properties fo:hyphenate="true" 
fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" 
loext:hyphenation-no-caps="false"/>
+  </style:style>
+  <style:style style:name="Vfg2" style:family="paragraph" 
style:parent-style-name="TextNormal" style:list-style-name="Numbering_20_1" 
style:master-page-name="">
+   <style:paragraph-properties fo:line-height="100%" style:page-number="auto" 
text:number-lines="true" text:line-number="2"/>
+  </style:style>
+  <style:style style:name="Header_20_and_20_Footer" style:display-name="Header 
and Footer" style:family="paragraph" style:parent-style-name="Standard" 
style:class="extra">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0">
+    <style:tab-stops>
+     <style:tab-stop style:position="9.5cm" style:type="center"/>
+     <style:tab-stop style:position="19.001cm" style:type="right"/>
+    </style:tab-stops>
+   </style:paragraph-properties>
+  </style:style>
+  <style:style style:name="Header" style:family="paragraph" 
style:parent-style-name="Header_20_and_20_Footer" style:class="extra">
+   <style:paragraph-properties text:number-lines="false" text:line-number="0">
+    <style:tab-stops>
+     <style:tab-stop style:position="8.5cm" style:type="center"/>
+     <style:tab-stop style:position="17.002cm" style:type="right"/>
+    </style:tab-stops>
+   </style:paragraph-properties>
+  </style:style>
+  <style:style style:name="Footnote_20_Symbol" style:display-name="Footnote 
Symbol" style:family="text"/>
+  <style:style style:name="Numbering_20_Symbols" style:display-name="Numbering 
Symbols" style:family="text"/>
+  <style:style style:name="Endnote_20_Symbol" style:display-name="Endnote 
Symbol" style:family="text"/>
+  <style:style style:name="Footnote_20_anchor" style:display-name="Footnote 
anchor" style:family="text">
+   <style:text-properties style:text-position="super 58%"/>
+  </style:style>
+  <style:style style:name="Endnote_20_anchor" style:display-name="Endnote 
anchor" style:family="text">
+   <style:text-properties style:text-position="super 58%"/>
+  </style:style>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" style:num-format="">
+    <style:list-level-properties/>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:list-style style:name="Numbering_20_1" style:display-name="Numbering 
1">
+   <text:list-level-style-number text:level="1" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="2" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="3" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="4" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="5" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="6" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="7" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="8" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="9" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+   <text:list-level-style-number text:level="10" 
text:style-name="Numbering_20_Symbols" style:num-suffix="." 
style:num-format="1">
+    <style:list-level-properties text:space-before="-0.499cm" 
text:min-label-width="0.499cm"/>
+   </text:list-level-style-number>
+  </text:list-style>
+  <text:notes-configuration text:note-class="footnote" 
text:citation-style-name="Footnote_20_Symbol" 
text:citation-body-style-name="Footnote_20_anchor" style:num-format="1" 
text:start-value="0" text:footnotes-position="page" 
text:start-numbering-at="page"/>
+  <text:notes-configuration text:note-class="endnote" 
text:citation-style-name="Endnote_20_Symbol" 
text:citation-body-style-name="Endnote_20_anchor" 
text:master-page-name="Endnote" style:num-format="1" text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" 
text:offset="0.499cm" style:num-format="1" text:number-position="left" 
text:increment="5"/>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="Tabelle4" style:family="table">
+   <style:table-properties style:width="17.002cm" fo:margin-left="0cm" 
fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0.499cm" 
table:align="margins" border-model="collapsing"/>
+  </style:style>
+  <style:style style:name="Tabelle4.A" style:family="table-column">
+   <style:table-column-properties style:column-width="12.702cm" 
style:rel-column-width="48961*"/>
+  </style:style>
+  <style:style style:name="Tabelle4.B" style:family="table-column">
+   <style:table-column-properties style:column-width="2.147cm" 
style:rel-column-width="8272*"/>
+  </style:style>
+  <style:style style:name="Tabelle4.C" style:family="table-column">
+   <style:table-column-properties style:column-width="2.154cm" 
style:rel-column-width="8302*"/>
+  </style:style>
+  <style:style style:name="Tabelle4.1" style:family="table-row">
+   <style:table-row-properties style:row-height="0.501cm"/>
+  </style:style>
+  <style:style style:name="Tabelle4.A1" style:family="table-cell">
+   <style:table-cell-properties fo:padding="0cm" fo:border="none"/>
+  </style:style>
+  <style:style style:name="Tabelle4.B1" style:family="table-cell">
+   <style:table-cell-properties style:vertical-align="middle" fo:padding="0cm" 
fo:border="none"/>
+  </style:style>
+  <style:style style:name="P1" style:family="paragraph" 
style:parent-style-name="Schrift1">
+   <style:paragraph-properties>
+    <style:tab-stops>
+     <style:tab-stop style:position="17cm" style:type="right"/>
+    </style:tab-stops>
+   </style:paragraph-properties>
+  </style:style>
+  <style:style style:name="P3" style:family="paragraph" 
style:parent-style-name="Standard" style:master-page-name="">
+   <style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" 
fo:margin-top="0cm" fo:margin-bottom="0.101cm" loext:contextual-spacing="false" 
fo:line-height="100%" fo:text-align="start" style:justify-single-word="false" 
fo:hyphenation-ladder-count="no-limit" fo:text-indent="0cm" 
style:auto-text-indent="false" style:page-number="auto">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:font-name="Times New Roman" 
fo:font-size="10pt" fo:font-weight="normal" style:font-size-asian="10pt" 
style:font-size-complex="10pt" fo:hyphenate="true" 
fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" 
loext:hyphenation-no-caps="false"/>
+  </style:style>
+  <style:style style:name="P4" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:line-height="100%"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P5" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:text-properties style:font-name="Times New Roman" 
fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P6" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="start" 
style:justify-single-word="false"/>
+   <style:text-properties style:font-name="Times New Roman" 
fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P7" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="center" 
style:justify-single-word="false"/>
+   <style:text-properties style:font-name="Times New Roman" 
fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P8" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="end" 
style:justify-single-word="false"/>
+   <style:text-properties style:font-name="Times New Roman" 
fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P9" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="center" 
style:justify-single-word="false"/>
+   <style:text-properties style:font-name="Times New Roman" 
fo:font-size="10pt" style:font-size-asian="10pt" style:font-size-complex="10pt" 
text:display="true"/>
+  </style:style>
+  <style:style style:name="P10" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="center" 
style:justify-single-word="false"/>
+   <style:text-properties style:font-name="Times New Roman" 
fo:font-size="10pt" fo:font-weight="normal" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P11" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="center" 
style:justify-single-word="false"/>
+   <style:text-properties style:text-position="0% 100%" style:font-name="Times 
New Roman" fo:font-size="10pt" fo:font-weight="bold" 
style:font-size-asian="10pt" style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P12" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="center" 
style:justify-single-word="false"/>
+   <style:text-properties style:text-position="0% 100%" style:font-name="Times 
New Roman" fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P13" style:family="paragraph" 
style:parent-style-name="TextNormal">
+   <style:paragraph-properties fo:line-height="100%"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P14" style:family="paragraph" 
style:parent-style-name="TextNormal">
+   <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.499cm" 
loext:contextual-spacing="false"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P15" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.101cm" 
loext:contextual-spacing="false" fo:line-height="100%"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P16" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:line-height="100%" fo:break-before="auto" 
fo:break-after="auto"/>
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="P17" style:family="paragraph" 
style:parent-style-name="TextNormal">
+   <style:paragraph-properties fo:margin-top="0.199cm" 
fo:margin-bottom="0.199cm" loext:contextual-spacing="false" 
fo:line-height="100%" fo:text-align="start" style:justify-single-word="false"/>
+   <style:text-properties fo:font-size="10pt" fo:font-weight="normal" 
style:font-size-asian="10pt" style:font-weight-asian="normal" 
style:font-size-complex="10pt" style:font-weight-complex="normal"/>
+  </style:style>
+  <style:style style:name="P20" style:family="paragraph" 
style:parent-style-name="Vfg2" style:list-style-name="">
+   <style:text-properties fo:font-size="10pt" style:font-size-asian="10pt" 
style:font-size-complex="10pt"/>
+  </style:style>
+  <style:style style:name="T1" style:family="text">
+   <style:text-properties fo:font-size="10pt"/>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="21.001cm" 
fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" 
fo:margin-top="1cm" fo:margin-bottom="1cm" fo:margin-left="2.499cm" 
fo:margin-right="1.499cm" style:writing-mode="lr-tb" 
style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" 
style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" 
style:layout-grid-mode="none" style:layout-grid-ruby-below="false" 
style:layout-grid-print="false" style:layout-grid-display="false" 
style:footnote-max-height="0cm">
+    <style:footnote-sep style:width="0.018cm" 
style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" 
style:line-style="solid" style:adjustment="left" style:rel-width="25%" 
style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style>
+    <style:header-footer-properties fo:min-height="0cm" 
fo:margin-bottom="0.499cm"/>
+   </style:header-style>
+   <style:footer-style>
+    <style:header-footer-properties svg:height="0.9cm" fo:margin-left="0cm" 
fo:margin-right="0cm" fo:margin-top="0.3cm"/>
+   </style:footer-style>
+  </style:page-layout>
+  <style:page-layout style:name="pm2">
+   <style:page-layout-properties fo:page-width="20.999cm" 
fo:page-height="29.699cm" style:num-format="1" 
style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" 
fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" 
style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" 
style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" 
style:layout-grid-mode="none" style:layout-grid-ruby-below="false" 
style:layout-grid-print="false" style:layout-grid-display="false" 
style:footnote-max-height="0cm">
+    <style:footnote-sep style:line-style="solid" style:adjustment="left" 
style:rel-width="25%" style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1">
+   <style:header>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+    <text:p text:style-name="Header"/>
+   </style:header>
+   <style:footer>
+    <text:p text:style-name="P1"><text:tab/><text:span 
text:style-name="T1"><text:page-continuation text:string-value="- " 
text:select-page="next"/></text:span><text:span 
text:style-name="T1"><text:page-number text:select-page="current" 
text:page-adjust="1"/></text:span><text:span 
text:style-name="T1"><text:page-continuation text:string-value=" -" 
text:select-page="next"/></text:span></text:p>
+   </style:footer>
+  </style:master-page>
+  <style:master-page style:name="Endnote" style:page-layout-name="pm2"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <office:forms form:automatic-focus="false" form:apply-design-mode="false"/>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" 
text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="P14"/>
+   <text:p text:style-name="P14"/>
+   <text:p text:style-name="P13"/>
+   <text:p text:style-name="P17"/>
+   <text:p text:style-name="P13"/>
+   <text:p text:style-name="P13"/>
+   <text:p text:style-name="P13"/>
+   <text:p text:style-name="P13"/>
+   <table:table table:name="Tabelle4" table:style-name="Tabelle4">
+    <table:table-column table:style-name="Tabelle4.A"/>
+    <table:table-column table:style-name="Tabelle4.B"/>
+    <table:table-column table:style-name="Tabelle4.C"/>
+    <table:table-header-rows>
+     <table:table-row table:style-name="Tabelle4.1">
+      <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+       <text:p text:style-name="P5">dfghdfgnhdfgnhdbhfghndhgbhdfbh</text:p>
+      </table:table-cell>
+      <table:table-cell table:style-name="Tabelle4.B1" 
office:value-type="string">
+       <text:p text:style-name="P11">von</text:p>
+      </table:table-cell>
+      <table:table-cell table:style-name="Tabelle4.B1" 
office:value-type="string">
+       <text:p text:style-name="P11">bis</text:p>
+      </table:table-cell>
+     </table:table-row>
+    </table:table-header-rows>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P12"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P12"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P3"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P10"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P10"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P3"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P10"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P10"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P8"><text:hidden-paragraph 
text:condition="ooow:1"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
table:number-columns-spanned="2" office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1"/></text:p>
+     </table:table-cell>
+     <table:covered-table-cell/>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P9"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P9"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P9"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P9"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P9"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P9"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P6"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"><text:hidden-paragraph 
text:condition="ooow:1" text:is-hidden="true"/></text:p>
+     </table:table-cell>
+    </table:table-row>
+    <table:table-row>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p 
text:style-name="P6">fgdhgfhdfbhfbhfbhfgbfdbhdfbhfgbnfdbhdfbg</text:p>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"/>
+     </table:table-cell>
+     <table:table-cell table:style-name="Tabelle4.A1" 
office:value-type="string">
+      <text:p text:style-name="P7"/>
+     </table:table-cell>
+    </table:table-row>
+   </table:table>
+   <text:p text:style-name="P15"/>
+   <text:p text:style-name="P15"/>
+   <text:p text:style-name="P15"/>
+   <text:p text:style-name="P4"/>
+   <text:p text:style-name="P4"/>
+   <text:p text:style-name="P4"/>
+   <text:p text:style-name="P20"/>
+   <text:p text:style-name="P16"/>
+   <text:p text:style-name="P4"/>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx
index 7112f8daae1a..35c5cf669175 100644
--- a/sw/qa/extras/layout/layout3.cxx
+++ b/sw/qa/extras/layout/layout3.cxx
@@ -1572,6 +1572,20 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf145826)
     assertXPath(pXmlDoc, "/root/page/body/section/column[2]/ftncont/ftn"_ostr, 
3);
 }
 
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTable0HeightRows)
+{
+    createSwDoc("table-0-height-rows.fodt");
+
+    xmlDocUniquePtr pXmlDoc = parseLayoutDump();
+    CPPUNIT_ASSERT(pXmlDoc);
+
+    // the problem was that the table was erroneously split across 2 or 3 pages
+    assertXPath(pXmlDoc, "/root/page[1]/body/tab"_ostr, 1);
+    assertXPath(pXmlDoc, "/root/page[1]/body/tab/row"_ostr, 28);
+    assertXPath(pXmlDoc, 
"/root/page[1]/body/tab/row/infos/bounds[@height='0']"_ostr, 25);
+    assertXPath(pXmlDoc, "/root/page"_ostr, 1);
+}
+
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf105481)
 {
     createSwDoc("tdf105481.odt");
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 12f27d749c04..033f692f47cc 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -1451,7 +1451,102 @@ namespace
 
         return true;
     }
-}
+
+    auto IsAllHiddenSection(SwSectionFrame const& rSection) -> bool
+    {
+        for (SwFrame const* pFrame = rSection.Lower(); pFrame; pFrame = 
pFrame->GetNext())
+        {
+            if (pFrame->IsColumnFrame())
+            {
+                return false; // adds some padding
+            }
+            else if (pFrame->IsSctFrame())
+            {
+                assert(false); // these aren't nested?
+                if (!IsAllHiddenSection(*static_cast<SwSectionFrame 
const*>(pFrame)))
+                {
+                    return false;
+                }
+            }
+            else if (pFrame->IsTabFrame())
+            {
+                return false; // presumably
+            }
+            else if (pFrame->IsTextFrame())
+            {
+                if (!static_cast<SwTextFrame const*>(pFrame)->IsHiddenNow())
+                {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    auto IsAllHiddenRow(SwRowFrame const& rRow, SwTabFrame const& rTab) -> 
bool;
+
+    auto IsAllHiddenCell(SwCellFrame const& rCell, SwRowFrame const& rRow, 
SwTabFrame const& rTab) -> bool
+    {
+        for (SwFrame const* pFrame = rCell.Lower(); pFrame; pFrame = 
pFrame->GetNext())
+        {
+            if (pFrame->IsRowFrame())
+            {
+                if (!IsAllHiddenRow(*static_cast<SwRowFrame const*>(pFrame), 
rTab))
+                {
+                    return false;
+                }
+            }
+            else if (pFrame->IsSctFrame())
+            {
+                if (!IsAllHiddenSection(*static_cast<SwSectionFrame 
const*>(pFrame)))
+                {
+                    return false;
+                }
+            }
+            else if (pFrame->IsTabFrame())
+            {
+                return false; // presumably
+            }
+            else if (pFrame->IsTextFrame())
+            {
+                if (!static_cast<SwTextFrame const*>(pFrame)->IsHiddenNow())
+                {
+                    return false;
+                }
+            }
+        }
+        if (rTab.IsCollapsingBorders() && !rCell.Lower()->IsRowFrame())
+        {
+            if (rRow.GetTopMarginForLowers() != 0
+                || rRow.GetBottomMarginForLowers() != 0)
+            {
+                return false;
+            }
+        }
+        else
+        {
+            SwBorderAttrAccess border(SwFrame::GetCache(), &rCell);
+            if (border.Get()->CalcTop() != 0 || border.Get()->CalcBottom() != 
0)
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    auto IsAllHiddenRow(SwRowFrame const& rRow, SwTabFrame const& rTab) -> bool
+    {
+        for (SwFrame const* pCell = rRow.Lower(); pCell; pCell = 
pCell->GetNext())
+        {
+            if (!IsAllHiddenCell(*static_cast<SwCellFrame const*>(pCell), 
rRow, rTab))
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+} // namespace
 
 void SwTabFrame::Join()
 {
@@ -1471,11 +1566,20 @@ void SwTabFrame::Join()
     SwFrame* pPrv = GetLastLower();
 
     SwTwips nHeight = 0;    //Total height of the inserted rows as return 
value.
+    bool isAllHidden(true);
 
     while ( pRow )
     {
         pNxt = pRow->GetNext();
         nHeight += aRectFnSet.GetHeight(pRow->getFrameArea());
+        if (nHeight != 0)
+        {
+            isAllHidden = false;
+        }
+        if (isAllHidden)
+        {
+            isAllHidden = IsAllHiddenRow(*static_cast<SwRowFrame *>(pRow), 
*this);
+        }
         pRow->RemoveFromLayout();
         pRow->InvalidateAll_();
         pRow->InsertBehind( this, pPrv );
@@ -1489,6 +1593,18 @@ void SwTabFrame::Join()
     SwFrame::DestroyFrame(pFoll);
 
     Grow( nHeight );
+
+    // In case the row does not have a height, Grow(nHeight) did nothing.
+    // If this is not invalidated, subsequent follows may never be joined.
+    // Try to guess if the height of the row will be 0.  If the document
+    // was just loaded, it will be 0 in any case, but probably it's not a good
+    // idea to join *all* follows for a newly loaded document, it would be
+    // easier not to split the table in the first place; presumably it is split
+    // because that improves performance.
+    if (isAllHidden)
+    {
+        InvalidateSize_();
+    }
 }
 
 static void SwInvalidatePositions( SwFrame *pFrame, tools::Long nBottom )
commit d3b4ea25f065d3c722c16735beb3556016aac0f2
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Wed Jan 10 20:37:50 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    tdf#105844 add test for ODF wholesome encryption with macro signature
    
    ... plus manifest schema extension.
    
    Change-Id: I73721db8620e97bd58556f9a71afcb0a33f6c7e8
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161898
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    (cherry picked from commit 4d6e9d5e155da1dde05233eb87691e2a454162f6)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161866
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git 
a/schema/libreoffice/OpenDocument-v1.3+libreoffice-manifest-schema.rng 
b/schema/libreoffice/OpenDocument-v1.3+libreoffice-manifest-schema.rng
index a2631facc7f5..77b87101b04a 100644
--- a/schema/libreoffice/OpenDocument-v1.3+libreoffice-manifest-schema.rng
+++ b/schema/libreoffice/OpenDocument-v1.3+libreoffice-manifest-schema.rng
@@ -14,7 +14,9 @@
 -->
 <!-- https://issues.oasis-open.org/browse/OFFICE-2153 -->
 
-<rng:grammar 
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" 
xmlns:rng="http://relaxng.org/ns/structure/1.0"; 
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes";>
+<rng:grammar 
xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"
+xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
+xmlns:rng="http://relaxng.org/ns/structure/1.0"; 
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes";>
   <rng:start>
     <rng:choice>
       <rng:ref name="manifest"/>
@@ -103,17 +105,19 @@
     </rng:element>
   </rng:define>
   <rng:define name="encryption-data-attlist">
-    <rng:interleave>
-      <rng:attribute name="manifest:checksum-type">
-        <rng:choice>
-          <rng:value>SHA1/1K</rng:value>
-          <rng:ref name="anyURI"/>
-        </rng:choice>
-      </rng:attribute>
-      <rng:attribute name="manifest:checksum">
-        <rng:ref name="base64Binary"/>
-      </rng:attribute>
-    </rng:interleave>
+    <rng:optional>
+      <rng:interleave>
+        <rng:attribute name="manifest:checksum-type">
+          <rng:choice>
+            <rng:value>SHA1/1K</rng:value>
+            <rng:ref name="anyURI"/>
+         </rng:choice>
+        </rng:attribute>
+        <rng:attribute name="manifest:checksum">
+          <rng:ref name="base64Binary"/>
+        </rng:attribute>
+      </rng:interleave>
+    </rng:optional>
   </rng:define>
   <rng:define name="file-entry">
     <rng:element name="manifest:file-entry">
@@ -165,18 +169,39 @@
         <rng:value>PGP</rng:value>
       </rng:attribute>
       <rng:interleave>
-        <rng:attribute name="manifest:key-derivation-name">
-          <rng:choice>
-            <rng:value>PBKDF2</rng:value>
-            <rng:ref name="anyURI"/>
-          </rng:choice>
-        </rng:attribute>
+        <rng:choice>
+          <rng:interleave>
+            <rng:attribute name="manifest:key-derivation-name">
+              <rng:choice>
+                <rng:value>PBKDF2</rng:value>
+                <rng:ref name="anyURI"/>
+              </rng:choice>
+            </rng:attribute>
+            <rng:attribute name="manifest:iteration-count">
+              <rng:ref name="nonNegativeInteger"/>
+            </rng:attribute>
+          </rng:interleave>
+          <rng:interleave>
+            <rng:attribute name="manifest:key-derivation-name">
+            <!--
+              
<rng:value>urn:oasis:names:tc:opendocument:xmlns:manifest:1.5#argon2id</rng:value>
+              -->
+              
<rng:value>urn:org:documentfoundation:names:experimental:office:manifest:argon2id</rng:value>
+            </rng:attribute>
+            <rng:attribute name="loext:argon2-iterations">
+              <rng:ref name="positiveInteger"/>
+            </rng:attribute>
+            <rng:attribute name="loext:argon2-memory">
+              <rng:ref name="positiveInteger"/>
+            </rng:attribute>
+            <rng:attribute name="loext:argon2-lanes">
+              <rng:ref name="positiveInteger"/>
+            </rng:attribute>
+          </rng:interleave>
+        </rng:choice>
         <rng:attribute name="manifest:salt">
           <rng:ref name="base64Binary"/>
         </rng:attribute>
-        <rng:attribute name="manifest:iteration-count">
-          <rng:ref name="nonNegativeInteger"/>
-        </rng:attribute>
         <rng:optional>
           <rng:attribute name="manifest:key-size">
             <rng:ref name="nonNegativeInteger"/>
@@ -214,6 +239,9 @@
   <rng:define name="nonNegativeInteger">
     <rng:data type="nonNegativeInteger"/>
   </rng:define>
+  <rng:define name="positiveInteger">
+    <rng:data type="positiveInteger"/>
+  </rng:define>
   <rng:define name="start-key-generation">
     <rng:element name="manifest:start-key-generation">
       <rng:ref name="start-key-generation-attlist"/>
diff --git a/test/source/xmltesttools.cxx b/test/source/xmltesttools.cxx
index 14f953557f5f..eff0247c8511 100644
--- a/test/source/xmltesttools.cxx
+++ b/test/source/xmltesttools.cxx
@@ -294,6 +294,8 @@ int XmlTestTools::getXPathPosition(const xmlDocUniquePtr& 
pXmlDoc, const OString
 
 void XmlTestTools::registerODFNamespaces(xmlXPathContextPtr& pXmlXpathCtx)
 {
+    xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("manifest"),
+                       
BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"));
     xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("office"),
                        
BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:office:1.0"));
     xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("style"),
diff --git a/xmlsecurity/qa/unit/signing/data/encrypted_scriptsig_lo242.odt 
b/xmlsecurity/qa/unit/signing/data/encrypted_scriptsig_lo242.odt
new file mode 100644
index 000000000000..1747448ac5ad
Binary files /dev/null and 
b/xmlsecurity/qa/unit/signing/data/encrypted_scriptsig_lo242.odt differ
diff --git a/xmlsecurity/qa/unit/signing/data/encrypted_scriptsig_odf13.odt 
b/xmlsecurity/qa/unit/signing/data/encrypted_scriptsig_odf13.odt
new file mode 100644
index 000000000000..fb2b978bc032
Binary files /dev/null and 
b/xmlsecurity/qa/unit/signing/data/encrypted_scriptsig_odf13.odt differ
diff --git a/xmlsecurity/qa/unit/signing/signing2.cxx 
b/xmlsecurity/qa/unit/signing/signing2.cxx
index aef3c7f08885..88b3ab99a705 100644
--- a/xmlsecurity/qa/unit/signing/signing2.cxx
+++ b/xmlsecurity/qa/unit/signing/signing2.cxx
@@ -9,14 +9,27 @@
 
 #include <sal/config.h>
 
+#include <config_crypto.h>
+
+#if USE_CRYPTO_NSS
+#include <secoid.h>
+#endif
+
 #include <test/unoapixml_test.hxx>
 
+#include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/embed/XStorage.hpp>
 #include <com/sun/star/frame/Desktop.hpp>
 #include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/text/XTextDocument.hpp>
 #include <com/sun/star/util/XCloseable.hpp>
 #include <com/sun/star/xml/crypto/SEInitializer.hpp>
 
+#include <officecfg/Office/Common.hxx>
+
+#include <sfx2/sfxbasemodel.hxx>
+#include <sfx2/objsh.hxx>
+#include <comphelper/documentconstants.hxx>
 #include <comphelper/propertysequence.hxx>
 #include <unotools/tempfile.hxx>
 #include <unotools/ucbstreamhelper.hxx>
@@ -30,8 +43,14 @@ using namespace css;
 /// Testsuite for the document signing feature.
 class SigningTest2 : public UnoApiXmlTest
 {
+protected:
+    uno::Reference<xml::crypto::XSEInitializer> mxSEInitializer;
+    uno::Reference<xml::crypto::XXMLSecurityContext> mxSecurityContext;
+
 public:
     SigningTest2();
+    virtual void setUp() override;
+    virtual void tearDown() override;
     void registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx) override;
 };
 
@@ -40,6 +59,31 @@ SigningTest2::SigningTest2()
 {
 }
 
+void SigningTest2::setUp()
+{
+    UnoApiXmlTest::setUp();
+
+    MacrosTest::setUpNssGpg(m_directories, "xmlsecurity_signing2");
+
+    // Initialize crypto after setting up the environment variables.
+    mxSEInitializer = xml::crypto::SEInitializer::create(mxComponentContext);
+    mxSecurityContext = mxSEInitializer->createSecurityContext(OUString());
+#if USE_CRYPTO_NSS
+#ifdef NSS_USE_ALG_IN_ANY_SIGNATURE
+    // policy may disallow using SHA1 for signatures but unit test documents
+    // have such existing signatures (call this after createSecurityContext!)
+    NSS_SetAlgorithmPolicy(SEC_OID_SHA1, NSS_USE_ALG_IN_ANY_SIGNATURE, 0);
+#endif
+#endif
+}
+
+void SigningTest2::tearDown()
+{
+    MacrosTest::tearDownNssGpg();
+
+    UnoApiXmlTest::tearDown();
+}
+
 /// Test if a macro signature from a ODF Database is preserved when saving
 CPPUNIT_TEST_FIXTURE(SigningTest2, testPreserveMacroSignatureODB)
 {
@@ -66,6 +110,263 @@ CPPUNIT_TEST_FIXTURE(SigningTest2, 
testPreserveMacroSignatureODB)
                 
"ID_00a7002f009000bc00ce00f7004400460080002f002e00e400e0003700df00e8");
 }
 
+CPPUNIT_TEST_FIXTURE(SigningTest2, testPasswordPreserveMacroSignatureODF13)
+{
+    // load ODF 1.3 encrypted document
+    load(createFileURL(u"encrypted_scriptsig_odf13.odt"), "password");
+    {
+        uno::Reference<text::XTextDocument> xTextDoc(mxComponent, 
uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(OUString("secret"), 
xTextDoc->getText()->getString());
+        // test macro signature
+        SfxBaseModel* 
pBaseModel(dynamic_cast<SfxBaseModel*>(mxComponent.get()));
+        CPPUNIT_ASSERT(pBaseModel);
+        SfxObjectShell* pObjectShell(pBaseModel->GetObjectShell());
+        uno::Reference<beans::XPropertySet> 
xPropSet(pObjectShell->GetStorage(),
+                                                     uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(ODFVER_013_TEXT,
+                             
xPropSet->getPropertyValue("Version").get<OUString>());
+        CPPUNIT_ASSERT_EQUAL(SignatureState::OK, 
pObjectShell->GetScriptingSignatureState());
+    }
+
+    saveAndReload("writer8", "password");
+    {
+        // test standard ODF 1.2/1.3/1.4 encryption
+        xmlDocUniquePtr pXmlDoc = parseExport("META-INF/manifest.xml");
+        assertXPath(pXmlDoc, "/manifest:manifest"_ostr, "version"_ostr, "1.3");
+        assertXPath(pXmlDoc, 
"/manifest:manifest/manifest:file-entry[@manifest:size != '0']"_ostr,
+                    8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data[@manifest:checksum-type
 and @manifest:checksum]"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:algorithm[@manifest:algorithm-name='http://www.w3.org/2001/04/xmlenc#aes256-cbc']"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:algorithm[string-length(@manifest:initialisation-vector)
 = 24]"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:start-key-generation[@manifest:start-key-generation-name='http://www.w3.org/2000/09/xmldsig#sha256'
 and @manifest:key-size='32']"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@manifest:key-derivation-name='PBKDF2'
 and @manifest:key-size='32']"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@manifest:iteration-count='100000']"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[string-length(@manifest:salt)
 = 24]"_ostr,
+            8);
+        // test reimport
+        uno::Reference<text::XTextDocument> xTextDoc(mxComponent, 
uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(OUString("secret"), 
xTextDoc->getText()->getString());
+        // test macro signature - this didn't actually work!
+        // using Zip Storage means the encrypted streams are signed, so
+        // after encrypting again the sigature didn't match and was dropped
+        //        assertDocument(CPPUNIT_SOURCELINE(), "writer8", 
SignatureState::NOSIGNATURES,
+        //                       SignatureState::OK, ODFVER_013_TEXT);
+    }
+
+    {
+        Resetter resetter([]() {
+            std::shared_ptr<comphelper::ConfigurationChanges> pBatch(
+                comphelper::ConfigurationChanges::create());
+            officecfg::Office::Common::Misc::ExperimentalMode::set(false, 
pBatch);
+            return pBatch->commit();
+        });
+        std::shared_ptr<comphelper::ConfigurationChanges> pBatch(
+            comphelper::ConfigurationChanges::create());
+        officecfg::Office::Common::Misc::ExperimentalMode::set(true, pBatch);
+        pBatch->commit();
+
+        // store it experimental - reload
+        saveAndReload("writer8", "password");
+
+        // test wholesome ODF extended encryption
+        xmlDocUniquePtr pXmlDoc = parseExport("META-INF/manifest.xml");
+        assertXPath(pXmlDoc, "/manifest:manifest"_ostr, "version"_ostr, "1.3");
+        assertXPath(pXmlDoc, "/manifest:manifest/manifest:file-entry"_ostr, 1);
+        assertXPath(pXmlDoc, "/manifest:manifest/manifest:file-entry"_ostr, 
"full-path"_ostr,
+                    "encrypted-package");
+        assertXPath(pXmlDoc, 
"/manifest:manifest/manifest:file-entry[@manifest:size != '0']"_ostr,
+                    1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data[@manifest:checksum-type
 or @manifest:checksum]"_ostr,
+            0);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:algorithm[@manifest:algorithm-name='http://www.w3.org/2009/xmlenc11#aes256-gcm']"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:algorithm[string-length(@manifest:initialisation-vector)
 = 16]"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:start-key-generation[@manifest:start-key-generation-name='http://www.w3.org/2001/04/xmlenc#sha256'
 and @manifest:key-size='32']"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@manifest:key-derivation-name='urn:org:documentfoundation:names:experimental:office:manifest:argon2id'
 and @manifest:key-size='32']"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@manifest:iteration-count]"_ostr,
+            0);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[string-length(@manifest:salt)
 = 24]"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@loext:argon2-iterations='3'
 and @loext:argon2-memory='65536' and @loext:argon2-lanes='4']"_ostr,
+            1);
+        // test reimport
+        uno::Reference<text::XTextDocument> xTextDoc(mxComponent, 
uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(OUString("secret"), 
xTextDoc->getText()->getString());
+    }
+}
+
+CPPUNIT_TEST_FIXTURE(SigningTest2, 
testPasswordPreserveMacroSignatureODFWholesomeLO242)
+{
+    // load wholesome ODF (extended) encrypted document
+    load(createFileURL(u"encrypted_scriptsig_lo242.odt"), "password");
+    {
+        uno::Reference<text::XTextDocument> xTextDoc(mxComponent, 
uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(OUString("secret"), 
xTextDoc->getText()->getString());
+        // test macro signature
+        SfxBaseModel* 
pBaseModel(dynamic_cast<SfxBaseModel*>(mxComponent.get()));
+        CPPUNIT_ASSERT(pBaseModel);
+        SfxObjectShell* pObjectShell(pBaseModel->GetObjectShell());
+        uno::Reference<beans::XPropertySet> 
xPropSet(pObjectShell->GetStorage(),
+                                                     uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(ODFVER_013_TEXT,
+                             
xPropSet->getPropertyValue("Version").get<OUString>());
+        CPPUNIT_ASSERT_EQUAL(SignatureState::OK, 
pObjectShell->GetScriptingSignatureState());
+    }
+
+    {
+        Resetter resetter([]() {
+            std::shared_ptr<comphelper::ConfigurationChanges> pBatch(
+                comphelper::ConfigurationChanges::create());
+            officecfg::Office::Common::Misc::ExperimentalMode::set(false, 
pBatch);
+            return pBatch->commit();
+        });
+        std::shared_ptr<comphelper::ConfigurationChanges> pBatch(
+            comphelper::ConfigurationChanges::create());
+        officecfg::Office::Common::Misc::ExperimentalMode::set(true, pBatch);
+        pBatch->commit();
+
+        // store it experimental - reload
+        saveAndReload("writer8", "password");
+
+        // test wholesome ODF extended encryption
+        xmlDocUniquePtr pXmlDoc = parseExport("META-INF/manifest.xml");
+        assertXPath(pXmlDoc, "/manifest:manifest"_ostr, "version"_ostr, "1.3");
+        assertXPath(pXmlDoc, "/manifest:manifest/manifest:file-entry"_ostr, 1);
+        assertXPath(pXmlDoc, "/manifest:manifest/manifest:file-entry"_ostr, 
"full-path"_ostr,
+                    "encrypted-package");
+        assertXPath(pXmlDoc, 
"/manifest:manifest/manifest:file-entry[@manifest:size != '0']"_ostr,
+                    1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data[@manifest:checksum-type
 or @manifest:checksum]"_ostr,
+            0);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:algorithm[@manifest:algorithm-name='http://www.w3.org/2009/xmlenc11#aes256-gcm']"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:algorithm[string-length(@manifest:initialisation-vector)
 = 16]"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:start-key-generation[@manifest:start-key-generation-name='http://www.w3.org/2001/04/xmlenc#sha256'
 and @manifest:key-size='32']"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@manifest:key-derivation-name='urn:org:documentfoundation:names:experimental:office:manifest:argon2id'
 and @manifest:key-size='32']"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@manifest:iteration-count]"_ostr,
+            0);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[string-length(@manifest:salt)
 = 24]"_ostr,
+            1);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@loext:argon2-iterations='3'
 and @loext:argon2-memory='65536' and @loext:argon2-lanes='4']"_ostr,
+            1);
+        // test reimport
+        uno::Reference<text::XTextDocument> xTextDoc(mxComponent, 
uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(OUString("secret"), 
xTextDoc->getText()->getString());
+        // test macro signature - this should work now
+        SfxBaseModel* 
pBaseModel(dynamic_cast<SfxBaseModel*>(mxComponent.get()));
+        CPPUNIT_ASSERT(pBaseModel);
+        SfxObjectShell* pObjectShell(pBaseModel->GetObjectShell());
+        uno::Reference<beans::XPropertySet> 
xPropSet(pObjectShell->GetStorage(),
+                                                     uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(ODFVER_013_TEXT,
+                             
xPropSet->getPropertyValue("Version").get<OUString>());
+        CPPUNIT_ASSERT_EQUAL(SignatureState::OK, 
pObjectShell->GetScriptingSignatureState());
+    }
+
+    saveAndReload("writer8", "password");
+    {
+        // test standard ODF 1.2/1.3/1.4 encryption
+        xmlDocUniquePtr pXmlDoc = parseExport("META-INF/manifest.xml");
+        assertXPath(pXmlDoc, "/manifest:manifest"_ostr, "version"_ostr, "1.3");
+        assertXPath(pXmlDoc, 
"/manifest:manifest/manifest:file-entry[@manifest:size != '0']"_ostr,
+                    8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data[@manifest:checksum-type
 and @manifest:checksum]"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:algorithm[@manifest:algorithm-name='http://www.w3.org/2001/04/xmlenc#aes256-cbc']"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:algorithm[string-length(@manifest:initialisation-vector)
 = 24]"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:start-key-generation[@manifest:start-key-generation-name='http://www.w3.org/2000/09/xmldsig#sha256'
 and @manifest:key-size='32']"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@manifest:key-derivation-name='PBKDF2'
 and @manifest:key-size='32']"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[@manifest:iteration-count='100000']"_ostr,
+            8);
+        assertXPath(
+            pXmlDoc,
+            
"/manifest:manifest/manifest:file-entry/manifest:encryption-data/manifest:key-derivation[string-length(@manifest:salt)
 = 24]"_ostr,
+            8);
+        // test reimport
+        uno::Reference<text::XTextDocument> xTextDoc(mxComponent, 
uno::UNO_QUERY_THROW);
+        CPPUNIT_ASSERT_EQUAL(OUString("secret"), 
xTextDoc->getText()->getString());
+        // test macro signature - this didn't actually work!
+        // using Zip Storage means the encrypted streams are signed, so
+        // after encrypting again the sigature didn't match and was dropped
+        //        assertDocument(CPPUNIT_SOURCELINE(), "writer8", 
SignatureState::NOSIGNATURES,
+        //                       SignatureState::OK, ODFVER_013_TEXT);
+    }
+}
+
 void SigningTest2::registerNamespaces(xmlXPathContextPtr& pXmlXpathCtx)
 {
     xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("odfds"),
@@ -73,6 +374,13 @@ void SigningTest2::registerNamespaces(xmlXPathContextPtr& 
pXmlXpathCtx)
     xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("dsig"),
                        BAD_CAST("http://www.w3.org/2000/09/xmldsig#";));
     xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("xd"), 
BAD_CAST("http://uri.etsi.org/01903/v1.3.2#";));
+
+    // manifest.xml
+    xmlXPathRegisterNs(pXmlXpathCtx, BAD_CAST("manifest"),
+                       
BAD_CAST("urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"));
+    xmlXPathRegisterNs(
+        pXmlXpathCtx, BAD_CAST("loext"),
+        
BAD_CAST("urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"));
 }
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit ef57f4d7d61e4da115f16388c57732ff8a9bd355
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Mon Jan 15 20:55:07 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    tdf#105844 xmlsecurity: fix test failure on WNT
    
    Commit 4d6e9d5e155da1dde05233eb87691e2a454162f6 added 2 tests that
    always fail on WNT, unfortunately Jenkins doesn't actually run the
    tests.
    
    There are 3 certificates involved:
    "Xmlsecurity RSA Test Root CA"
    "Xmlsecurity Intermediate Root CA"
    "Xmlsecurity RSA Test example Alice"
    
    In the signature XML, there are 3 elements that contain or reference
    certificates:
    
    1. X509Data - xmlsecurity produces only the signing certificate here
    2. xd:SigningCertificate (XAdES) - again only the signing certificate
    3. xd:EncapsulatedX509Certificate (XAdES) - xmlsecurity produces the
       full certificate chain here
    
    All of these elements *could* contain the full certificate chain, but in
    LO-produced XML signatures only 3. does.
    
    The problem is that the function CheckUnitTestStore() that looks up
    a certificate in a unit-test-specific CA store via
    $LIBO_TEST_CRYPTOAPI_PKCS7 can only handle a root certificate, it does
    not recursively retrieve and check a certificate chain.
    
    The SecurityEnvironment_MSCryptImpl::verifyCertificate() already has a
    parameter "seqCerts" to pass in the full certificate chain, but due to
    the way the data from the XML is processed, it gets passed only the
    content of the X509Data element(s), which, for LO-produced signatures,
    do not contain the full certificate chain.
    
    Instead of improving the unit-test-specific function, let's try to get
    all the certificates out of the XML signature, and then pass them to
    verifyCertificate().
    
    Of course this requires some consistency checks so that the verification
    can't be fooled by different certificates in different XML elements.
    
    Change-Id: I8ca541887ceac2dfb6af5d96a5565cfa58d7f682
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162170
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    (cherry picked from commit 3e9a700091872480dd085f0928d1d30b7d74cfd7)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162139
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/xmlsecurity/source/helper/xmlsignaturehelper.cxx 
b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
index 0b5825b125a1..3b13f79f33f1 100644
--- a/xmlsecurity/source/helper/xmlsignaturehelper.cxx
+++ b/xmlsecurity/source/helper/xmlsignaturehelper.cxx
@@ -22,6 +22,7 @@
 #include <documentsignaturehelper.hxx>
 #include <xsecctl.hxx>
 #include <biginteger.hxx>
+#include <certificate.hxx>
 
 #include <UriBindingHelper.hxx>
 
@@ -702,7 +703,72 @@ XMLSignatureHelper::CheckAndUpdateSignatureInformation(
     }
     if (CheckX509Data(xSecEnv, temp, certs, tempResult))
     {
-        datas.emplace_back(tempResult);
+        if (rInfo.maEncapsulatedX509Certificates.empty()) // optional, XAdES
+        {
+            datas.emplace_back(tempResult);
+        }
+        else
+        {
+            // check for consistency between X509Data and 
EncapsulatedX509Certificate
+            // (LO produces just the signing certificate in X509Data and
+            // the entire chain in EncapsulatedX509Certificate so in this case
+            // using EncapsulatedX509Certificate yields additional intermediate
+            // certificates that may help in verifying)
+            std::vector<SignatureInformation::X509CertInfo> 
encapsulatedCertInfos;
+            for (OUString const& it : rInfo.maEncapsulatedX509Certificates)
+            {
+                encapsulatedCertInfos.emplace_back();
+                encapsulatedCertInfos.back().X509Certificate = it;
+            }
+            std::vector<uno::Reference<security::XCertificate>> 
encapsulatedCerts;
+            SignatureInformation::X509Data encapsulatedResult;
+            if (CheckX509Data(xSecEnv, encapsulatedCertInfos, 
encapsulatedCerts, encapsulatedResult))
+            {
+                auto const 
pXCertificate(dynamic_cast<xmlsecurity::Certificate*>(certs.back().get()));
+                auto const 
pECertificate(dynamic_cast<xmlsecurity::Certificate*>(encapsulatedCerts.back().get()));
+                assert(pXCertificate && pECertificate); // was just created by 
CheckX509Data
+                if (pXCertificate->getSHA256Thumbprint() == 
pECertificate->getSHA256Thumbprint())
+                {
+                    // both are chains - take the longer one
+                    if (encapsulatedCerts.size() < certs.size())
+                    {
+                        datas.emplace_back(tempResult);
+                    }
+                    else
+                    {
+#if 0
+                        // extra info needed in testSigningMultipleTimes_ODT
+                        // ... but with it, it fails with BROKEN signature?
+                        // fails even on the first signature, because somehow
+                        // the xd:SigningCertificate element was signed
+                        // containing only one certificate, but in the final
+                        // file it contains all 3 certificates due to this 
here.
+                        for (size_t i = 0; i < encapsulatedResult.size(); ++i)
+                        {
+                            encapsulatedResult[i].X509IssuerName = 
encapsulatedCerts[i]->getIssuerName();
+                            encapsulatedResult[i].X509SerialNumber = 
xmlsecurity::bigIntegerToNumericString(encapsulatedCerts[i]->getSerialNumber());
+                            encapsulatedResult[i].X509Subject = 
encapsulatedCerts[i]->getSubjectName();
+                            auto const 
pCertificate(dynamic_cast<xmlsecurity::Certificate*>(encapsulatedCerts[i].get()));
+                            assert(pCertificate); // this was just created by 
CheckX509Data
+                            OUStringBuffer aBuffer;
+                            comphelper::Base64::encode(aBuffer, 
pCertificate->getSHA256Thumbprint());
+                            encapsulatedResult[i].CertDigest = 
aBuffer.makeStringAndClear();
+                        }
+                        datas.emplace_back(encapsulatedResult);
+#else
+                        // keep the X509Data stuff in datas but return the
+                        // longer EncapsulatedX509Certificate chain
+                        datas.emplace_back(tempResult);
+#endif
+                        certs = encapsulatedCerts; // overwrite this seems 
easier
+                    }
+                }
+                else
+                {
+                    SAL_WARN("xmlsecurity.comp", "X509Data and 
EncapsulatedX509Certificate contain different certificates");
+                }
+            }
+        }
     }
 
     // rInfo is a copy, update the original
commit 57384fc45af823c459716bc87b7cc23d708d5974
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Fri Jan 12 12:52:51 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    tdf#158783 sw: SwCursorShell::GotoTOXMark() must actually move cursor
    
    The problem was that the buttons in SwIndexMarkPane got the
    next/previous mark, but SwCursorShell::GotoTOXMark() may return the
    next/previous mark without actually moving the cursor.
    
    It happens that the current mark is outside a table and the next mark is
    inside a table, then UpdateCursor() doesn't accept the invalid cursor
    range and resets the point to its previous position.
    
    Change-Id: I5c0fb4a9bbcbdd479581172834b6eda76a5abbc1
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161970
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    (cherry picked from commit 3fefff7ce29a234694343105c50c7bc3259a9cb8)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161949
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx
index db11d4ea334a..81323787d7cc 100644
--- a/sw/source/core/crsr/crstrvl.cxx
+++ b/sw/source/core/crsr/crstrvl.cxx
@@ -600,6 +600,7 @@ const SwTOXMark& SwCursorShell::GotoTOXMark( const 
SwTOXMark& rStart,
     SwPosition& rPos = *GetCursor()->GetPoint();
     rPos.Assign(rNewMark.GetTextTOXMark()->GetTextNode(),
                  rNewMark.GetTextTOXMark()->GetStart() );
+    GetCursor()->DeleteMark(); // tdf#158783 prevent UpdateCursor resetting 
point
 
     if( !m_pCurrentCursor->IsSelOvr() )
         UpdateCursor( SwCursorShell::SCROLLWIN | SwCursorShell::CHKRANGE |
commit 9c05e1da25efe40643b121aca170b0d08ee1f259
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Wed Jan 10 20:28:41 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    tdf#105844 package: ODF wholesome encryption: use package version
    
    ... to init the Version property.
    
    The problem is that the outer storage loaded from a wholesome ODF
    encrypted document doesn't have a Version, because it doesn't (directly)
    contain a document and has no "/" file-entry.
    
    Extract the root element's package version attribute and use it.
    
    The Storage API doesn't distinguish much between the package version and
    the root document's (i.e. root folder's) version.
    
    Change-Id: I0fd5f999e9adee674d73fc542402512d0e204897
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161897
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    (cherry picked from commit f1117fbfcd931d4ea2fccfb56f154aa6186d384b)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161865
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/package/source/manifest/ManifestImport.cxx 
b/package/source/manifest/ManifestImport.cxx
index 0218ac07a5d2..77f795efdc59 100644
--- a/package/source/manifest/ManifestImport.cxx
+++ b/package/source/manifest/ManifestImport.cxx
@@ -327,6 +327,7 @@ void SAL_CALL ManifestImport::startElement( const OUString& 
aName, const uno::Re
 
     switch (nLevel) {
     case 1: {
+        m_PackageVersion = aConvertedAttribs[ATTRIBUTE_VERSION];
         if (aConvertedName != ELEMENT_MANIFEST) //manifest:manifest
             aStack.back().m_bValid = false;
         break;
@@ -451,6 +452,18 @@ void SAL_CALL ManifestImport::endElement( const OUString& 
aName )
         return;
 
     if ( aConvertedName == ELEMENT_FILE_ENTRY && aStack.back().m_bValid ) {
+        // required for wholesome encryption: if there is no document and hence
+        // no file-entry with a version attribute, send the package's version
+        // with the first file-entry.
+        // (note: the only case when a valid ODF document has no "/" entry with
+        // a version is when it is ODF 1.0/1.1 and then it doesn't have the
+        // package version either)
+        if (rManVector.empty() && !m_PackageVersion.isEmpty()
+            && !aSequence[PKG_MNFST_VERSION].Value.hasValue())
+        {
+            aSequence[PKG_MNFST_VERSION].Name = u"Version"_ustr;
+            aSequence[PKG_MNFST_VERSION].Value <<= m_PackageVersion;
+        }
         // the first entry gets KeyInfo element if any, for PGP encryption
         if (!bIgnoreEncryptData && !aKeys.empty() && rManVector.empty())
         {
diff --git a/package/source/manifest/ManifestImport.hxx 
b/package/source/manifest/ManifestImport.hxx
index fd86e02e4f5a..883f1de62387 100644
--- a/package/source/manifest/ManifestImport.hxx
+++ b/package/source/manifest/ManifestImport.hxx
@@ -61,6 +61,7 @@ class ManifestImport final : public cppu::WeakImplHelper < 
css::xml::sax::XDocum
     bool bPgpEncryption;
     sal_Int32 nDerivedKeySize;
     ::std::vector < css::uno::Sequence < css::beans::PropertyValue > > & 
rManVector;
+    OUString m_PackageVersion; // on root element
 
 
     OUString PushNameAndNamespaces( const OUString& aName,
diff --git a/package/source/zippackage/ZipPackage.cxx 
b/package/source/zippackage/ZipPackage.cxx
index 02f7cf71e8af..c4de219f80de 100644
--- a/package/source/zippackage/ZipPackage.cxx
+++ b/package/source/zippackage/ZipPackage.cxx
@@ -171,6 +171,7 @@ void ZipPackage::parseManifest()
         return;
 
     bool bManifestParsed = false;
+    ::std::optional<OUString> oFirstVersion;
     static constexpr OUString sMeta (u"META-INF"_ustr);
     if ( m_xRootFolder->hasByName( sMeta ) )
     {
@@ -216,7 +217,13 @@ void ZipPackage::parseManifest()
                             if ( rValue.Name == sPropFullPath )
                                 rValue.Value >>= sPath;
                             else if ( rValue.Name == sPropVersion )
+                            {
                                 rValue.Value >>= sVersion;
+                                if (!oFirstVersion)
+                                {
+                                    oFirstVersion.emplace(sVersion);
+                                }
+                            }
                             else if ( rValue.Name == sPropMediaType )
                                 rValue.Value >>= sMediaType;
                             else if ( rValue.Name == sPropSalt )
@@ -457,6 +464,11 @@ void ZipPackage::parseManifest()
             {
                 // accept only types that look similar to own mediatypes
                 m_xRootFolder->SetMediaType( aPackageMediatype );
+                // also set version explicitly
+                if (oFirstVersion && m_xRootFolder->GetVersion().isEmpty())
+                {
+                    m_xRootFolder->SetVersion(*oFirstVersion);
+                }
                 // if there is an encrypted inner package, there is no root
                 // document, because instead there is a package, and it is not
                 // an error
commit eefe8cd88076d268a4fab16f683902cb29914725
Author:     Michael Stahl <michael.st...@allotropia.de>
AuthorDate: Fri Jan 5 21:43:19 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    tdf#105844 package: ManifestImport: handle argon2 attributes in ...
    
    ... standard namespace too.
    
    Change-Id: I46804795da2009dfd8bb95b9286933728a132e5b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161785
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@allotropia.de>
    (cherry picked from commit bac43054e2997235ce98432bc9cb6c434120e4b2)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161764
    Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com>

diff --git a/package/source/manifest/ManifestDefines.hxx 
b/package/source/manifest/ManifestDefines.hxx
index dbe7b985b8c0..c2f5e2778a30 100644
--- a/package/source/manifest/ManifestDefines.hxx
+++ b/package/source/manifest/ManifestDefines.hxx
@@ -70,9 +70,12 @@ inline constexpr OUString ELEMENT_KEY_DERIVATION = 
u"manifest:key-derivation"_us
 inline constexpr OUString ATTRIBUTE_KEY_DERIVATION_NAME  = 
u"manifest:key-derivation-name"_ustr;
 inline constexpr OUString ATTRIBUTE_SALT  = u"manifest:salt"_ustr;
 inline constexpr OUString ATTRIBUTE_ITERATION_COUNT = 
u"manifest:iteration-count"_ustr;
-inline constexpr OUString ATTRIBUTE_ARGON2_T_LO= 
u"loext:argon2-iterations"_ustr;
-inline constexpr OUString ATTRIBUTE_ARGON2_M_LO= u"loext:argon2-memory"_ustr;
-inline constexpr OUString ATTRIBUTE_ARGON2_P_LO= u"loext:argon2-lanes"_ustr;
+inline constexpr OUString ATTRIBUTE_ARGON2_T = 
u"manifest:argon2-iterations"_ustr;
+inline constexpr OUString ATTRIBUTE_ARGON2_M = u"manifest:argon2-memory"_ustr;
+inline constexpr OUString ATTRIBUTE_ARGON2_P = u"manifest:argon2-lanes"_ustr;
+inline constexpr OUString ATTRIBUTE_ARGON2_T_LO = 
u"loext:argon2-iterations"_ustr;
+inline constexpr OUString ATTRIBUTE_ARGON2_M_LO = u"loext:argon2-memory"_ustr;
+inline constexpr OUString ATTRIBUTE_ARGON2_P_LO = u"loext:argon2-lanes"_ustr;
 
 /// OFFICE-3708: wrong URL cited in ODF 1.2 and used since OOo 3.4 beta
 inline constexpr OUString SHA256_URL_ODF12 = 
u"http://www.w3.org/2000/09/xmldsig#sha256"_ustr;
diff --git a/package/source/manifest/ManifestImport.cxx 
b/package/source/manifest/ManifestImport.cxx
index f6f4ce36f4a2..0218ac07a5d2 100644
--- a/package/source/manifest/ManifestImport.cxx
+++ b/package/source/manifest/ManifestImport.cxx
@@ -242,11 +242,17 @@ void ManifestImport::doKeyDerivation(StringHashMap 
&rConvertedAttribs)
         {
             aSequence[PKG_MNFST_KDF].Value <<= xml::crypto::KDFID::Argon2id;
 
-            aString = rConvertedAttribs[ATTRIBUTE_ARGON2_T_LO];
+            aString = rConvertedAttribs.find(ATTRIBUTE_ARGON2_T) != 
rConvertedAttribs.end()
+                ? rConvertedAttribs[ATTRIBUTE_ARGON2_T]
+                : rConvertedAttribs[ATTRIBUTE_ARGON2_T_LO];
             sal_Int32 const t(aString.toInt32());
-            aString = rConvertedAttribs[ATTRIBUTE_ARGON2_M_LO];
+            aString = rConvertedAttribs.find(ATTRIBUTE_ARGON2_M) != 
rConvertedAttribs.end()
+                ? rConvertedAttribs[ATTRIBUTE_ARGON2_M]
+                : rConvertedAttribs[ATTRIBUTE_ARGON2_M_LO];
             sal_Int32 const m(aString.toInt32());
-            aString = rConvertedAttribs[ATTRIBUTE_ARGON2_P_LO];
+            aString = rConvertedAttribs.find(ATTRIBUTE_ARGON2_P) != 
rConvertedAttribs.end()
+                ? rConvertedAttribs[ATTRIBUTE_ARGON2_P]
+                : rConvertedAttribs[ATTRIBUTE_ARGON2_P_LO];
             sal_Int32 const p(aString.toInt32());
             if (0 < t && 0 < m && 0 < p)
             {
commit 40fe6989be3a1e2b2b18664095413e32076c1a83
Author:     Rafael Lima <rafael.palma.l...@gmail.com>
AuthorDate: Wed Jan 17 20:33:43 2024 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    tdf#159247 Fix crash while adding control with default properties (Dialog 
Editor)
    
    Controls created using the Ctrl+toolbar (which adds a control with default 
properties) did not have a parent form, which causes the crash.
    
    Change-Id: Ic2f469e6656a93bbed25d86092384f81b21aaca5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162217
    Tested-by: Jenkins
    Reviewed-by: Patrick Luby <plub...@libreoffice.org>
    Reviewed-by: Rafael Lima <rafael.palma.l...@gmail.com>
    (cherry picked from commit c4e5b1b934fc3c59fb35ae6c02a0ddf8501a6d28)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162278
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/basctl/source/dlged/dlged.cxx b/basctl/source/dlged/dlged.cxx
index 2eb099718b5b..a91a6511bd50 100644
--- a/basctl/source/dlged/dlged.cxx
+++ b/basctl/source/dlged/dlged.cxx
@@ -620,6 +620,8 @@ void DlgEditor::CreateDefaultObject()
 
     // set default property values
     pDlgEdObj->SetDefaults();
+    // set the form to which the new object belongs
+    pDlgEdObj->SetDlgEdForm(pDlgEdForm.get());
 
     // insert object into drawing page
     SdrPageView* pPageView = pDlgEdView->GetSdrPageView();
commit 98caed65993243a39945c3763d2b99cacce671a7
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Fri Jan 19 11:07:58 2024 +0600
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Sat Jan 20 19:25:18 2024 +0100

    tdf#159271: do not try to put fields' spaces to hole portions
    
    Change-Id: Ic1b3f9602089cc773f9c3adc0be09a3be08d690f
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162269
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162293
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sw/qa/extras/layout/data/fld-in-tbl.docx 
b/sw/qa/extras/layout/data/fld-in-tbl.docx
new file mode 100644
index 000000000000..95d1b8adae38
Binary files /dev/null and b/sw/qa/extras/layout/data/fld-in-tbl.docx differ
diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx
index e0b29b43fc54..7112f8daae1a 100644
--- a/sw/qa/extras/layout/layout3.cxx
+++ b/sw/qa/extras/layout/layout3.cxx
@@ -2232,6 +2232,27 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, testTdf159050)
-e 
... etc. - the rest is truncated

Reply via email to