Blob Blame History Raw
From 11ad93f4ba84f190c908e92a2c960f7a9fa800c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Wed, 2 Oct 2013 11:38:22 +0100
Subject: [PATCH] Resolves: rhbz#1013844 fdo#47482 encrypted OOo 1.0 docs
 cannot be reopened

Workaround for the encrypted OpenOffice.org 1.0 documents generated by
Libreoffice <= 3.6 with the new encryption format and using SHA256, but missing
a specified startkey of SHA256

Change-Id: Ib1acc4441b5adc6721cb3cde7a1191aa978e9a1b
---
 package/source/zippackage/ZipPackageStream.cxx |  34 +++++++++++++++++++++----
 sc/qa/unit/data/ods/passwordWrongSHA.ods       | Bin 0 -> 6560 bytes
 sc/qa/unit/subsequent_filters-test.cxx         |  10 ++++++++
 3 files changed, 39 insertions(+), 5 deletions(-)
 create mode 100644 sc/qa/unit/data/ods/passwordWrongSHA.ods

diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx
index 78e647e..bb96203 100644
--- a/package/source/zippackage/ZipPackageStream.cxx
+++ b/package/source/zippackage/ZipPackageStream.cxx
@@ -535,13 +535,37 @@ uno::Reference< io::XInputStream > SAL_CALL ZipPackageStream::getDataStream()
         {
             xResult = rZipPackage.getZipFile().getDataStream( aEntry, GetEncryptionData(), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
         }
-        catch( packages::WrongPasswordException& )
+        catch( const packages::WrongPasswordException& )
         {
-            // workaround for the encrypted documents generated with the old OOo1.x bug.
-            if ( rZipPackage.GetStartKeyGenID() == xml::crypto::DigestID::SHA1 && !m_bUseWinEncoding )
+            if ( rZipPackage.GetStartKeyGenID() == xml::crypto::DigestID::SHA1 )
             {
-                xResult = rZipPackage.getZipFile().getDataStream( aEntry, GetEncryptionData( true ), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
-                m_bUseWinEncoding = true;
+                try
+                {
+                    // rhbz#1013844 / fdo#47482 workaround for the encrypted
+                    // OpenOffice.org 1.0 documents generated by Libreoffice <=
+                    // 3.6 with the new encryption format and using SHA256, but
+                    // missing a specified startkey of SHA256
+
+                    // force SHA256 and see if that works
+                    m_nImportedStartKeyAlgorithm = xml::crypto::DigestID::SHA256;
+                    xResult = rZipPackage.getZipFile().getDataStream( aEntry, GetEncryptionData(), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
+                    return xResult;
+                }
+                catch (const packages::WrongPasswordException&)
+                {
+                    // if that didn't work, restore to SHA1 and trundle through the *other* earlier
+                    // bug fix
+                    m_nImportedStartKeyAlgorithm = xml::crypto::DigestID::SHA1;
+                }
+
+                // workaround for the encrypted documents generated with the old OOo1.x bug.
+                if ( !m_bUseWinEncoding )
+                {
+                    xResult = rZipPackage.getZipFile().getDataStream( aEntry, GetEncryptionData( true ), bIsEncrypted, rZipPackage.GetSharedMutexRef() );
+                    m_bUseWinEncoding = true;
+                }
+                else
+                    throw;
             }
             else
                 throw;