summaryrefslogtreecommitdiff
path: root/sfx2
diff options
context:
space:
mode:
Diffstat (limited to 'sfx2')
-rw-r--r--sfx2/source/doc/docfile.cxx80
1 files changed, 9 insertions, 71 deletions
diff --git a/sfx2/source/doc/docfile.cxx b/sfx2/source/doc/docfile.cxx
index 64e0523f8c60..81df58aa2e40 100644
--- a/sfx2/source/doc/docfile.cxx
+++ b/sfx2/source/doc/docfile.cxx
@@ -900,84 +900,22 @@ void SfxMedium::SetEncryptionDataToStorage_Impl()
namespace
{
-OUString tryMSOwnerFile(const INetURLObject& aLockfileURL)
+
+OUString tryMSOwnerFiles(const OUString& sDocURL)
{
+ svt::MSODocumentLockFile aMSOLockFile(sDocURL);
+ LockFileEntry aData;
try
{
- static osl::Mutex aMutex;
- osl::MutexGuard aGuard(aMutex);
- css::uno::Reference<css::ucb::XCommandEnvironment> xEnv;
- ucbhelper::Content aSourceContent(
- aLockfileURL.GetMainURL(INetURLObject::DecodeMechanism::NONE), xEnv,
- comphelper::getProcessComponentContext());
-
- // Excel creates Owner Files with FILE_FLAG_DELETE_ON_CLOSE, so we need to open it with
- // FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE share mode
- css::uno::Reference<css::io::XInputStream> xStream = aSourceContent.openStreamNoLock();
- if (!xStream)
- return OUString();
-
- const sal_Int32 nBufLen = 256;
- css::uno::Sequence<sal_Int8> aBuf(nBufLen);
- const sal_Int32 nRead = xStream->readBytes(aBuf, nBufLen);
- xStream->closeInput();
- if (nRead >= 162)
- {
- // Reverse engineering of MS Office Owner Files format (MS Office 2016 tested).
- // It starts with a single byte with name length, after which characters of username go
- // in current Windows 8-bit codepage.
- // For Word lockfiles, the name is followed by zero bytes up to position 54.
- // For PowerPoint lockfiles, the name is followed by a single zero byte, and then 0x20
- // bytes up to position 55.
- // For Excel lockfiles, the name is followed by 0x20 bytes up to position 55.
- // At those positions in each type of lockfile, a name length 2-byte word goes, followed
- // by UTF-16-LE-encoded copy of username. Spaces or some garbage follow up to the end of
- // the lockfile (total 162 bytes for Word, 165 bytes for Excel/PowerPoint).
- // Apparently MS Office does not allow username to be longer than 52 characters (trying
- // to enter more in its options dialog results in error messages stating this limit).
- const int nACPLen = aBuf[0];
- if (nACPLen > 0 && nACPLen <= 52) // skip wrong format
- {
- const sal_Int8* pBuf = aBuf.getConstArray() + 54;
- int nUTF16Len = *pBuf; // try Word position
- // If UTF-16 length is 0x20, then ACP length is also less than maximal, which means
- // that in Word lockfile case, at least two preceeding bytes would be zero. Both
- // Excel and PowerPoint lockfiles would have at least one of those bytes non-zero.
- if (nUTF16Len == 0x20 && (*(pBuf - 1) != 0 || *(pBuf - 2) != 0))
- nUTF16Len = *++pBuf; // use Excel/PowerPoint position
-
- if (nUTF16Len > 0 && nUTF16Len <= 52) // skip wrong format
- return OUString(reinterpret_cast<const sal_Unicode*>(pBuf + 2), nUTF16Len);
- }
- }
+ aData = aMSOLockFile.GetLockData();
}
- catch (...) {} // we don't ever need to care about any exceptions here
-
- return OUString();
-}
-
-OUString tryMSOwnerFiles(const OUString& sDocURL)
-{
- INetURLObject aURL(sDocURL);
- if (aURL.HasError())
- return OUString();
- const OUString sFileName = aURL.GetLastName(INetURLObject::DecodeMechanism::WithCharset);
- if (sFileName.isEmpty())
- return OUString();
- const OUString sFileExt = aURL.GetFileExtension();
- const sal_Int32 nFileNameLen
- = sFileName.getLength() - sFileExt.getLength() - (sFileExt.isEmpty() ? 0 : 1);
- // Word, Excel, PowerPoint all prepend the filename with "~$".
- aURL.SetName("~$" + sFileName, INetURLObject::EncodeMechanism::All);
- OUString sUserData = tryMSOwnerFile(aURL);
- // Additionally, Word strips first chars of the filename: 1 for length 7, 2 for length >=8.
- if (sUserData.isEmpty() && nFileNameLen > 6)
+ catch( const uno::Exception& )
{
- aURL.SetName("~$" + sFileName.copy((nFileNameLen == 7) ? 1 : 2),
- INetURLObject::EncodeMechanism::All);
- sUserData = tryMSOwnerFile(aURL);
+ return OUString();
}
+ OUString sUserData = aData[LockFileComponent::OOOUSERNAME];
+
if (!sUserData.isEmpty())
sUserData += " (MS Office)"; // Mention the used office suite