diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2019-11-29 13:07:57 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2019-11-29 14:11:56 +0100 |
commit | 63634738dd03cc74806ce6843c16ff5e51a371a0 (patch) | |
tree | 67679b7c859ce769d907fd8543b765250d8aaa14 /comphelper | |
parent | 88b0cb4c31d0631ff8db1e4842dc1431ae6d0234 (diff) |
tdf#118639: store ODF encryption data for autorecovery
When saving autorecovery information, ODF is used. If the original
document is password-protected, its autorecovery is also generated
password-protected (since ef87ff6680f79362a431db6e7ef2f40cfc576219).
But when the stored encryption data for non-ODF document does not
contain "PackageSHA256UTF8EncryptionKey" value, following
ZipPackage::GetEncryptionKey fails, so the whole save fails.
So just generate and append ODF encryption keys where we still have
user password.
Change-Id: I776e28de784489521e4941d1075690f90c056014
Reviewed-on: https://gerrit.libreoffice.org/84052
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'comphelper')
-rw-r--r-- | comphelper/source/misc/docpasswordhelper.cxx | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/comphelper/source/misc/docpasswordhelper.cxx b/comphelper/source/misc/docpasswordhelper.cxx index 989863fefbc6..d57447580bce 100644 --- a/comphelper/source/misc/docpasswordhelper.cxx +++ b/comphelper/source/misc/docpasswordhelper.cxx @@ -420,6 +420,7 @@ OUString DocPasswordHelper::GetOoxHashAsBase64( bool* pbIsDefaultPassword ) { css::uno::Sequence< css::beans::NamedValue > aEncData; + OUString aPassword; DocPasswordVerifierResult eResult = DocPasswordVerifierResult::WrongPassword; // first, try provided default passwords @@ -433,8 +434,12 @@ OUString DocPasswordHelper::GetOoxHashAsBase64( if( !rPassword.isEmpty() ) { eResult = rVerifier.verifyPassword( rPassword, aEncData ); - if( pbIsDefaultPassword ) - *pbIsDefaultPassword = eResult == DocPasswordVerifierResult::OK; + if (eResult == DocPasswordVerifierResult::OK) + { + aPassword = rPassword; + if (pbIsDefaultPassword) + *pbIsDefaultPassword = true; + } if( eResult != DocPasswordVerifierResult::WrongPassword ) break; } @@ -456,7 +461,11 @@ OUString DocPasswordHelper::GetOoxHashAsBase64( if( eResult == DocPasswordVerifierResult::WrongPassword ) { if( !rMediaPassword.isEmpty() ) + { eResult = rVerifier.verifyPassword( rMediaPassword, aEncData ); + if (eResult == DocPasswordVerifierResult::OK) + aPassword = rMediaPassword; + } } // request a password (skip, if result is OK or ABORT) @@ -472,6 +481,8 @@ OUString DocPasswordHelper::GetOoxHashAsBase64( { if( !pRequest->getPassword().isEmpty() ) eResult = rVerifier.verifyPassword( pRequest->getPassword(), aEncData ); + if (eResult == DocPasswordVerifierResult::OK) + aPassword = pRequest->getPassword(); } else { @@ -484,6 +495,21 @@ OUString DocPasswordHelper::GetOoxHashAsBase64( { } + if (eResult == DocPasswordVerifierResult::OK && !aPassword.isEmpty()) + { + if (std::find_if(std::cbegin(aEncData), std::cend(aEncData), + [](const css::beans::NamedValue& val) { + return val.Name == PACKAGE_ENCRYPTIONDATA_SHA256UTF8; + }) + == std::cend(aEncData)) + { + // tdf#118639: We need ODF encryption data for autorecovery, where password + // will already be unavailable, so generate and append it here + aEncData = comphelper::concatSequences( + aEncData, OStorageHelper::CreatePackageEncryptionData(aPassword)); + } + } + return (eResult == DocPasswordVerifierResult::OK) ? aEncData : uno::Sequence< beans::NamedValue >(); } |