sc/qa/unit/data/xls/enhanced-protection.xls |binary sc/qa/unit/filters-test.cxx | 20 ++++++++++++++++++++ sc/source/core/data/tabprotection.cxx | 27 +++++++++++++++++++++++++++ 3 files changed, 47 insertions(+)
New commits: commit e27cc864be4d18d5bf307c58ebf1c1aa4ef90078 Author: Eike Rathke <er...@redhat.com> Date: Tue Mar 25 20:41:52 2014 +0100 added unit test for .xls BIFF enhanced protection Change-Id: I8f218f8f8ce12525b4c9995567d2864baa610c0b diff --git a/sc/qa/unit/data/xls/enhanced-protection.xls b/sc/qa/unit/data/xls/enhanced-protection.xls new file mode 100644 index 0000000..00cc6e6 Binary files /dev/null and b/sc/qa/unit/data/xls/enhanced-protection.xls differ diff --git a/sc/qa/unit/filters-test.cxx b/sc/qa/unit/filters-test.cxx index 4de62d1..9d049f7 100644 --- a/sc/qa/unit/filters-test.cxx +++ b/sc/qa/unit/filters-test.cxx @@ -31,6 +31,7 @@ #include "drwlayer.hxx" #include "userdat.hxx" #include "formulacell.hxx" +#include "tabprotection.hxx" #include <svx/svdpage.hxx> @@ -69,6 +70,7 @@ public: void testSharedFormulaXLS(); void testSharedFormulaXLSX(); void testLegacyCellAnchoredRotatedShape(); + void testEnhancedProtectionXLS(); CPPUNIT_TEST_SUITE(ScFiltersTest); CPPUNIT_TEST(testCVEs); @@ -82,6 +84,7 @@ public: CPPUNIT_TEST(testSharedFormulaXLS); CPPUNIT_TEST(testSharedFormulaXLSX); CPPUNIT_TEST(testLegacyCellAnchoredRotatedShape); + CPPUNIT_TEST(testEnhancedProtectionXLS); CPPUNIT_TEST_SUITE_END(); @@ -491,6 +494,23 @@ void ScFiltersTest::testLegacyCellAnchoredRotatedShape() } } +void ScFiltersTest::testEnhancedProtectionXLS() +{ + ScDocShellRef xDocSh = loadDoc("enhanced-protection.", XLS); + CPPUNIT_ASSERT(xDocSh.Is()); + ScDocument* pDoc = xDocSh->GetDocument(); + + const ScTableProtection* pProt = pDoc->GetTabProtection(0); + + CPPUNIT_ASSERT( !pProt->isBlockEditable( ScRange( 0, 0, 0, 0, 0, 0))); // locked + CPPUNIT_ASSERT( pProt->isBlockEditable( ScRange( 0, 1, 0, 0, 1, 0))); // editable without password + CPPUNIT_ASSERT( pProt->isBlockEditable( ScRange( 0, 2, 0, 0, 2, 0))); // editable without password + CPPUNIT_ASSERT( !pProt->isBlockEditable( ScRange( 0, 3, 0, 0, 3, 0))); // editable with password "foo" + CPPUNIT_ASSERT( pProt->isBlockEditable( ScRange( 0, 1, 0, 0, 2, 0))); // union of two different editables + CPPUNIT_ASSERT( !pProt->isBlockEditable( ScRange( 0, 0, 0, 0, 1, 0))); // union of locked and editable + CPPUNIT_ASSERT( !pProt->isBlockEditable( ScRange( 0, 2, 0, 0, 3, 0))); // union of editable and password editable +} + ScFiltersTest::ScFiltersTest() : ScBootstrapFixture( "/sc/qa/unit/data" ) { commit 98c6b4149e46eec6aaee5b64f2fa40678589dd4b Author: Eike Rathke <er...@redhat.com> Date: Tue Mar 25 20:39:10 2014 +0100 union of a to be edited range may be distributed over two different records Change-Id: I1d0047e04394a79134b3333eef35ba0cfe6a8ca1 diff --git a/sc/source/core/data/tabprotection.cxx b/sc/source/core/data/tabprotection.cxx index 161cf65..a8aa278 100644 --- a/sc/source/core/data/tabprotection.cxx +++ b/sc/source/core/data/tabprotection.cxx @@ -434,6 +434,33 @@ bool ScTableProtectionImpl::isBlockEditable( const ScRange& rRange ) const } } + // Ranges may even be distributed over different protection records, for + // example if they are assigned different names, and can have different + // passwords. Combine the ones that can be edited. + /* TODO: once we handle passwords, remember a successful unlock at + * ScEnhancedProtection so we can use that here. */ + ScRangeList aRangeList; + for (::std::vector<ScEnhancedProtection>::const_iterator it(maEnhancedProtection.begin()), + itEnd(maEnhancedProtection.end()); it != itEnd; ++it) + { + if ((*it).maSecurityDescriptor.empty() && (*it).maRangeList.Is()) + { + // Ranges are editable if no password is assigned. + if (!(*it).mnPasswordVerifier) + { + const ScRangeList& rRanges = *(*it).maRangeList; + size_t nRanges = rRanges.size(); + for (size_t i=0; i < nRanges; ++i) + { + aRangeList.Append( *rRanges[i]); + } + } + } + } + ScRangeList aResultList( aRangeList.GetIntersectedRange( rRange)); + if (aResultList.size() == 1 && *aResultList[0] == rRange) + return true; + return false; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits