diff options
author | Noel Power <noel.power@suse.com> | 2013-08-01 10:04:42 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2013-08-03 10:27:51 +0000 |
commit | 863ecf687efaad3354c5c260458344b19c4c228c (patch) | |
tree | 6c258b8dc4d4a90dd8ced8391ee120049e4054d3 | |
parent | 1366aed01033f10639dcadb5511917391eba01a1 (diff) |
1st step fix for exporting SheetProtection fdo#64753 is to import correctly
(cherry picked from commit 016e18680e471d9f0cea8ee35f9716ae0f9baa11)
2nd step to export SheetProtection fdo#64753, actually export the data
(cherry picked from commit 8ce1124359783df750d176b8390b4eb0f54fb6ba)
unit test for fdo#64753 ( import/export of sheetprotection )
Change-Id: If420b386543c15c7b550a720b6e2db69bf372d7f
conflict fix for test
Change-Id: I3c996525b71509934c2d5ee274f9cd2dc1854f97
Reviewed-on: https://gerrit.libreoffice.org/5232
Reviewed-by: Eike Rathke <erack@redhat.com>
Tested-by: Eike Rathke <erack@redhat.com>
-rwxr-xr-x | sc/qa/unit/data/xlsx/ProtecteSheet1234Pass.xlsx | bin | 0 -> 7768 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_export-test.cxx | 31 | ||||
-rw-r--r-- | sc/source/filter/excel/excdoc.cxx | 5 | ||||
-rw-r--r-- | sc/source/filter/excel/excrecds.cxx | 44 | ||||
-rw-r--r-- | sc/source/filter/inc/excrecds.hxx | 8 | ||||
-rw-r--r-- | sc/source/filter/oox/worksheetsettings.cxx | 35 |
6 files changed, 117 insertions, 6 deletions
diff --git a/sc/qa/unit/data/xlsx/ProtecteSheet1234Pass.xlsx b/sc/qa/unit/data/xlsx/ProtecteSheet1234Pass.xlsx Binary files differnew file mode 100755 index 000000000000..509ebe2322f2 --- /dev/null +++ b/sc/qa/unit/data/xlsx/ProtecteSheet1234Pass.xlsx diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index fe7e9636c06c..673f415b5c88 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -34,6 +34,7 @@ #include "scitems.hxx" #include "document.hxx" #include "cellform.hxx" +#include "tabprotection.hxx" #define ODS_FORMAT_TYPE 50331943 #define XLS_FORMAT_TYPE 318767171 @@ -78,6 +79,7 @@ public: void testPasswordExport(); void testConditionalFormatExportXLSX(); void testMiscRowHeightExport(); + void testSheetProtectionXLSX(); void testNamedRangeBugfdo62729(); CPPUNIT_TEST_SUITE(ScExportTest); @@ -88,6 +90,7 @@ public: CPPUNIT_TEST(testConditionalFormatExportXLSX); CPPUNIT_TEST(testMiscRowHeightExport); CPPUNIT_TEST(testNamedRangeBugfdo62729); + CPPUNIT_TEST(testSheetProtectionXLSX); CPPUNIT_TEST_SUITE_END(); private: @@ -401,6 +404,34 @@ void ScExportTest::testNamedRangeBugfdo62729() xDocSh->DoClose(); } +void ScExportTest::testSheetProtectionXLSX() +{ + ScDocShellRef xShell = loadDocument("ProtecteSheet1234Pass.", XLSX); + CPPUNIT_ASSERT(xShell.Is()); + + ScDocShellRef xDocSh = saveAndReload(xShell, XLSX); + CPPUNIT_ASSERT(xDocSh.Is()); + + ScDocument* pDoc = xDocSh->GetDocument(); + CPPUNIT_ASSERT(pDoc); + const ScTableProtection* pTabProtect = pDoc->GetTabProtection(0); + CPPUNIT_ASSERT(pTabProtect); + if ( pTabProtect ) + { + Sequence<sal_Int8> aHash = pTabProtect->getPasswordHash(PASSHASH_XL); + // check has + if (aHash.getLength() >= 2) + { + CPPUNIT_ASSERT( (sal_uInt8)aHash[0] == 204 ); + CPPUNIT_ASSERT( (sal_uInt8)aHash[1] == 61 ); + } + // we could flesh out this check I guess + CPPUNIT_ASSERT ( pTabProtect->isOptionEnabled( ScTableProtection::OBJECTS ) ); + CPPUNIT_ASSERT ( pTabProtect->isOptionEnabled( ScTableProtection::SCENARIOS ) ); + } + xDocSh->DoClose(); +} + ScExportTest::ScExportTest() : m_aBaseString(RTL_CONSTASCII_USTRINGPARAM("/sc/qa/unit/data")) { diff --git a/sc/source/filter/excel/excdoc.cxx b/sc/source/filter/excel/excdoc.cxx index 2a45427b477f..559088453280 100644 --- a/sc/source/filter/excel/excdoc.cxx +++ b/sc/source/filter/excel/excdoc.cxx @@ -595,6 +595,11 @@ void ExcTable::FillAsXmlTable( SCTAB nCodeNameIdx ) // conditional formats Add( new XclExpCondFormatBuffer( GetRoot(), xExtLst ) ); + ScDocument& rDoc = GetDoc(); + const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnScTab); + if (pTabProtect && pTabProtect->isProtected()) + Add( new XclExpSheetProtection(true, mnScTab) ); + if( HasVbaStorage() ) if( nCodeNameIdx < GetExtDocOptions().GetCodeNameCount() ) Add( new XclCodename( GetExtDocOptions().GetCodeName( nCodeNameIdx ) ) ); diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx index 5a78b3a77d2f..035e4d1ed47a 100644 --- a/sc/source/filter/excel/excrecds.cxx +++ b/sc/source/filter/excel/excrecds.cxx @@ -79,6 +79,7 @@ #include "xecontent.hxx" #include "xcl97rec.hxx" +#include "tabprotection.hxx" using namespace ::oox; @@ -495,6 +496,49 @@ XclExpProtection::XclExpProtection(bool bValue) : { } +XclExpSheetProtection::XclExpSheetProtection(bool bValue, SCTAB nTab ) : + XclExpProtection( bValue), + mnTab(nTab) +{ +} + +void XclExpSheetProtection::SaveXml( XclExpXmlStream& rStrm ) +{ + ScDocument& rDoc = rStrm.GetRoot().GetDoc(); + const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnTab); + if ( pTabProtect ) + { + Sequence<sal_Int8> aHash = pTabProtect->getPasswordHash(PASSHASH_XL); + sal_uInt16 nHash(0x0000); + OString sHash; + if (aHash.getLength() >= 2) + { + nHash = ((aHash[0] << 8) & 0xFFFF); + nHash |= (aHash[1] & 0xFF); + sHash = OString::valueOf( nHash, 16 ); + } + sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream(); + rWorksheet->singleElement( XML_sheetProtection, + XML_sheet, XclXmlUtils::ToPsz( true ), + XML_password, sHash.getStr(), + XML_objects, pTabProtect->isOptionEnabled( ScTableProtection::OBJECTS ) ? XclXmlUtils::ToPsz( true ) : NULL, + XML_scenarios, pTabProtect->isOptionEnabled( ScTableProtection::SCENARIOS ) ? XclXmlUtils::ToPsz( true ) : NULL, + XML_formatCells, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_CELLS ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_formatColumns, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_formatRows, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_insertColumns, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_insertRows, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_insertHyperlinks, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_HYPERLINKS ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_deleteColumns, pTabProtect->isOptionEnabled( ScTableProtection::DELETE_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_deleteRows, pTabProtect->isOptionEnabled( ScTableProtection::DELETE_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_selectLockedCells, pTabProtect->isOptionEnabled( ScTableProtection::SELECT_LOCKED_CELLS ) ? XclXmlUtils::ToPsz( true ) : NULL, + XML_sort, pTabProtect->isOptionEnabled( ScTableProtection::SORT ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_autoFilter, pTabProtect->isOptionEnabled( ScTableProtection::AUTOFILTER ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_pivotTables, pTabProtect->isOptionEnabled( ScTableProtection::PIVOT_TABLES ) ? NULL : XclXmlUtils::ToPsz( true ), + XML_selectUnlockedCells, pTabProtect->isOptionEnabled( ScTableProtection::SELECT_UNLOCKED_CELLS ) ? XclXmlUtils::ToPsz( true ) : NULL, + FSEND ); + } +} // ============================================================================ XclExpPassHash::XclExpPassHash(const Sequence<sal_Int8>& aHash) : diff --git a/sc/source/filter/inc/excrecds.hxx b/sc/source/filter/inc/excrecds.hxx index 3948e3b4eab5..f52147d9b335 100644 --- a/sc/source/filter/inc/excrecds.hxx +++ b/sc/source/filter/inc/excrecds.hxx @@ -192,6 +192,14 @@ class XclExpProtection : public XclExpBoolRecord XclExpProtection(bool bValue); }; +class XclExpSheetProtection : public XclExpProtection +{ + SCTAB mnTab; + public: + XclExpSheetProtection(bool bValue, SCTAB nTab); + virtual void SaveXml( XclExpXmlStream& rStrm ); +}; + class XclExpPassHash : public XclExpRecord { public: diff --git a/sc/source/filter/oox/worksheetsettings.cxx b/sc/source/filter/oox/worksheetsettings.cxx index 933d986bca61..239d23129435 100644 --- a/sc/source/filter/oox/worksheetsettings.cxx +++ b/sc/source/filter/oox/worksheetsettings.cxx @@ -26,6 +26,8 @@ #include "biffinputstream.hxx" #include "pagesettings.hxx" #include "workbooksettings.hxx" +#include "tabprotection.hxx" +#include "document.hxx" namespace oox { namespace xls { @@ -232,13 +234,34 @@ void WorksheetSettings::importPhoneticPr( SequenceInputStream& rStrm ) void WorksheetSettings::finalizeImport() { // sheet protection - if( maSheetProt.mbSheet ) try - { - Reference< XProtectable > xProtectable( getSheet(), UNO_QUERY_THROW ); - xProtectable->protect( OUString() ); - } - catch( Exception& ) + if( maSheetProt.mbSheet ) { + ScTableProtection aProtect; + aProtect.setProtected(true); + if (maSheetProt.mnPasswordHash) + { + Sequence<sal_Int8> aPass(2); + aPass[0] = ( maSheetProt.mnPasswordHash>> 8) & 0xFF; + aPass[1] = maSheetProt.mnPasswordHash & 0xFF; + aProtect.setPasswordHash(aPass, PASSHASH_XL); + } + aProtect.setOption( ScTableProtection::OBJECTS, maSheetProt.mbObjects); + aProtect.setOption( ScTableProtection::SCENARIOS, maSheetProt.mbScenarios ); + aProtect.setOption( ScTableProtection::FORMAT_CELLS, maSheetProt.mbFormatCells ); + aProtect.setOption( ScTableProtection::FORMAT_COLUMNS, maSheetProt.mbFormatColumns ); + aProtect.setOption( ScTableProtection::FORMAT_ROWS, maSheetProt.mbFormatRows ); + aProtect.setOption( ScTableProtection::INSERT_COLUMNS, maSheetProt.mbInsertColumns ); + aProtect.setOption( ScTableProtection::INSERT_ROWS, maSheetProt.mbInsertRows ); + aProtect.setOption( ScTableProtection::INSERT_HYPERLINKS, maSheetProt.mbInsertHyperlinks ); + aProtect.setOption( ScTableProtection::DELETE_COLUMNS, maSheetProt.mbDeleteColumns ); + aProtect.setOption( ScTableProtection::DELETE_ROWS,maSheetProt.mbDeleteRows ); + aProtect.setOption( ScTableProtection::SELECT_LOCKED_CELLS, maSheetProt.mbSelectLocked ); + aProtect.setOption( ScTableProtection::SORT, maSheetProt.mbSort ); + aProtect.setOption( ScTableProtection::AUTOFILTER, maSheetProt.mbAutoFilter ); + aProtect.setOption( ScTableProtection::PIVOT_TABLES, maSheetProt.mbPivotTables ); + aProtect.setOption( ScTableProtection::SELECT_UNLOCKED_CELLS, maSheetProt.mbSelectUnlocked ); + + getScDocument().SetTabProtection( getSheetIndex(), &aProtect ); } // VBA code name |