From 21f2b8cfd9ec01f58b468c4c9a4d4d1f721d8bee Mon Sep 17 00:00:00 2001 From: Justin Luth Date: Tue, 10 Mar 2020 21:38:50 +0300 Subject: tdf#106843 docxexport: don't write double docProtect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit regression from LO 6.4 commit 2756ed9317e3474003c11ffe7d1e2f087c1412bf Change-Id: Iaf32974c7282d11bcd9572ed75cf1233ad3f0008 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90321 Tested-by: Jenkins Reviewed-by: Justin Luth Reviewed-by: Miklos Vajna (cherry picked from commit b2471b8ab62abaa7f0c2c8342b4fa61c18f013c6) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90953 Reviewed-by: Xisco FaulĂ­ --- sw/qa/extras/ooxmlexport/data/sectionprot2.odt | Bin 0 -> 8568 bytes sw/qa/extras/ooxmlexport/ooxmlexport5.cxx | 14 ++++++++++++ sw/source/filter/ww8/docxexport.cxx | 30 ++++++++++++------------- writerfilter/source/dmapper/SettingsTable.cxx | 3 +++ 4 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 sw/qa/extras/ooxmlexport/data/sectionprot2.odt diff --git a/sw/qa/extras/ooxmlexport/data/sectionprot2.odt b/sw/qa/extras/ooxmlexport/data/sectionprot2.odt new file mode 100644 index 000000000000..8f4a283f847a Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/sectionprot2.odt differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx index cb4b0ad2e3e7..87795d6ba6c6 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx @@ -1064,6 +1064,20 @@ DECLARE_OOXMLEXPORT_TEST(testSectionProtection, "sectionprot.odt") CPPUNIT_ASSERT_EQUAL_MESSAGE("Section1 is protected", false, getProperty(xSect, "IsProtected")); } +DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testSectionProtection2, "sectionprot2.odt") +{ + if (xmlDocPtr pXmlSettings = parseExport("word/settings.xml")) + { + assertXPath(pXmlSettings, "/w:settings/w:documentProtection", "enforcement", "true"); + assertXPath(pXmlSettings, "/w:settings/w:documentProtection", "edit", "forms"); + } + + uno::Reference xTextSectionsSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY); + uno::Reference xSect(xSections->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_EQUAL_MESSAGE("TextSection is protected", true, getProperty(xSect, "IsProtected")); +} + DECLARE_OOXMLEXPORT_TEST(tdf66398_permissions, "tdf66398_permissions.docx") { // check document permission settings for the whole document diff --git a/sw/source/filter/ww8/docxexport.cxx b/sw/source/filter/ww8/docxexport.cxx index d025d6b712ec..7fed578100d1 100644 --- a/sw/source/filter/ww8/docxexport.cxx +++ b/sw/source/filter/ww8/docxexport.cxx @@ -1142,12 +1142,13 @@ void DocxExport::WriteSettings() // we have document protection from input DOCX file // and in the case of change tracking protection, we didn't modify it - - sax_fastparser::XFastAttributeListRef xAttributeList(pAttributeList); - if (!bIsProtectionTrackChanges || bHasDummyRedlineProtectionKey) + hasProtectionProperties = !bIsProtectionTrackChanges || bHasDummyRedlineProtectionKey; + if ( hasProtectionProperties ) + { + sax_fastparser::XFastAttributeListRef xAttributeList(pAttributeList); pFS->singleElementNS(XML_w, XML_documentProtection, xAttributeList); + } - hasProtectionProperties = true; } } else if (rProp.Name == "HyphenationZone") @@ -1161,10 +1162,10 @@ void DocxExport::WriteSettings() } } - // Protect form - // Section-specific write protection if (! hasProtectionProperties) { + // Protect form - highest priority + // Section-specific write protection if (m_pDoc->getIDocumentSettingAccess().get(DocumentSettingId::PROTECT_FORM) || m_pSections->DocumentIsProtected()) { @@ -1174,16 +1175,15 @@ void DocxExport::WriteSettings() FSNS(XML_w, XML_edit), "forms", FSNS(XML_w, XML_enforcement), "true"); } - } - - // Protect Change Tracking - if ( bHasRedlineProtectionKey && !bHasDummyRedlineProtectionKey ) - { - // we have change tracking protection from Writer or from input ODT file + // Protect Change Tracking - next priority + else if ( bHasRedlineProtectionKey && !bHasDummyRedlineProtectionKey ) + { + // we have change tracking protection from Writer or from input ODT file - pFS->singleElementNS(XML_w, XML_documentProtection, - FSNS(XML_w, XML_edit), "trackedChanges", - FSNS(XML_w, XML_enforcement), "1"); + pFS->singleElementNS(XML_w, XML_documentProtection, + FSNS(XML_w, XML_edit), "trackedChanges", + FSNS(XML_w, XML_enforcement), "1"); + } } // finish settings.xml diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx index 7852547945e7..58399cf0a151 100644 --- a/writerfilter/source/dmapper/SettingsTable.cxx +++ b/writerfilter/source/dmapper/SettingsTable.cxx @@ -357,6 +357,9 @@ void SettingsTable::lcl_attribute(Id nName, Value & val) break; case NS_ooxml::LN_CT_DocProtect_edit: // 92037 m_pImpl->m_DocumentProtection.m_nEdit = nIntValue; + // multiple DocProtect_edits should not exist. If they do, last one wins + m_pImpl->m_bRedlineProtection = false; + m_pImpl->m_bProtectForm = false; switch (nIntValue) { case NS_ooxml::LN_Value_doc_ST_DocProtect_trackedChanges: -- cgit v1.2.3