tdf#106843 docxexport: don't write double docProtect

regression from LO 6.4
commit 2756ed9317

Change-Id: Iaf32974c7282d11bcd9572ed75cf1233ad3f0008
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90321
Tested-by: Jenkins
Reviewed-by: Justin Luth <justin_luth@sil.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
This commit is contained in:
Justin Luth 2020-03-10 21:38:50 +03:00 committed by Miklos Vajna
parent d3e1ada454
commit b2471b8ab6
4 changed files with 32 additions and 15 deletions

Binary file not shown.

View file

@ -992,6 +992,20 @@ DECLARE_OOXMLEXPORT_TEST(testSectionProtection, "sectionprot.odt")
CPPUNIT_ASSERT_EQUAL_MESSAGE("Section1 is protected", false, getProperty<bool>(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<text::XTextSectionsSupplier> xTextSectionsSupplier(mxComponent, uno::UNO_QUERY);
uno::Reference<container::XIndexAccess> xSections(xTextSectionsSupplier->getTextSections(), uno::UNO_QUERY);
uno::Reference<beans::XPropertySet> xSect(xSections->getByIndex(0), uno::UNO_QUERY);
CPPUNIT_ASSERT_EQUAL_MESSAGE("TextSection is protected", true, getProperty<bool>(xSect, "IsProtected"));
}
DECLARE_OOXMLEXPORT_TEST(tdf66398_permissions, "tdf66398_permissions.docx")
{
// check document permission settings for the whole document

View file

@ -1230,12 +1230,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")
@ -1259,10 +1260,10 @@ void DocxExport::WriteSettings()
WriteDocVars(pFS);
// 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())
{
@ -1272,16 +1273,15 @@ void DocxExport::WriteSettings()
FSNS(XML_w, XML_edit), "forms",
FSNS(XML_w, XML_enforcement), "true");
}
}
// Protect Change Tracking - next priority
else if ( bHasRedlineProtectionKey && !bHasDummyRedlineProtectionKey )
{
// we have change tracking protection from Writer or from input ODT file
// Protect Change Tracking
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

View file

@ -365,6 +365,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: