Kaydet (Commit) bff8d843 authored tarafından Stephan Bergmann's avatar Stephan Bergmann Kaydeden (comit) Mike Kaganski

Properly construct vnd.sun.star.pkg URL

...in SwDBManager::LoadAndRegisterEmbeddedDataSource.  For example, when the
authority encodes a file URL whose path contains '%23' (because one of the
pathname segments encoded in the file URL contains a '#' character), the
original code would have left it as %23 in the vnd.sun.star.pkg URL, instead of
encoding it as %2523.  That lead to bad file URLs being recovered from the
vnd.sun.star.pkg URL in dbaccess.  (And 03f58aa3
"dbaccess: properly encode path to prevent stripping 'fragment' from it", which
this commit reverts, wrongly tried to address that on the consuming instead of
the producing side.)

Change-Id: I17d2dc9e6306d006361fbcb63d77e93a9e20bf31
Reviewed-on: https://gerrit.libreoffice.org/44569Reviewed-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
Tested-by: 's avatarMike Kaganski <mike.kaganski@collabora.com>
üst 34a7a9fd
......@@ -368,11 +368,7 @@ Reference< XInterface > ODatabaseContext::loadObjectFromURL(const OUString& _rNa
if (bEmbeddedDataSource)
{
// In this case the host contains the real path, and the path is the embedded stream name.
OUString sBaseURI =
INetURLObject::encode(aURL.GetHost(INetURLObject::DecodeMechanism::WithCharset),
INetURLObject::PART_FPATH, INetURLObject::EncodeMechanism::All)
+ INetURLObject::encode(aURL.GetURLPath(INetURLObject::DecodeMechanism::WithCharset),
INetURLObject::PART_FPATH, INetURLObject::EncodeMechanism::All);
OUString sBaseURI = aURL.GetHost(INetURLObject::DecodeMechanism::WithCharset) + aURL.GetURLPath(INetURLObject::DecodeMechanism::WithCharset);
aArgs.put("BaseURI", sBaseURI);
}
......
......@@ -311,10 +311,8 @@ bool ODBFilter::implImport( const Sequence< PropertyValue >& rDescriptor )
{
// In this case the host contains the real path, and the path is the embedded stream name.
INetURLObject aURL(sFileName);
sFileName = INetURLObject::encode(aURL.GetHost(INetURLObject::DecodeMechanism::WithCharset),
INetURLObject::PART_FPATH, INetURLObject::EncodeMechanism::All);
sStreamRelPath = INetURLObject::encode(aURL.GetURLPath(INetURLObject::DecodeMechanism::WithCharset),
INetURLObject::PART_FPATH, INetURLObject::EncodeMechanism::All);
sFileName = aURL.GetHost(INetURLObject::DecodeMechanism::WithCharset);
sStreamRelPath = aURL.GetURLPath(INetURLObject::DecodeMechanism::WithCharset);
if (sStreamRelPath.startsWith("/"))
sStreamRelPath = sStreamRelPath.copy(1);
}
......
......@@ -17,6 +17,9 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <sal/config.h>
#include <cassert>
#include <cstdarg>
#include <unotxdoc.hxx>
......@@ -26,6 +29,8 @@
#include <com/sun/star/sdb/XDocumentDataSource.hpp>
#include <com/sun/star/lang/DisposedException.hpp>
#include <com/sun/star/lang/XEventListener.hpp>
#include <com/sun/star/uri/UriReferenceFactory.hpp>
#include <com/sun/star/uri/VndSunStarPkgUrlReferenceFactory.hpp>
#include <com/sun/star/util/NumberFormatter.hpp>
#include <com/sun/star/sdb/DatabaseContext.hpp>
#include <com/sun/star/sdb/TextConnectionSettings.hpp>
......@@ -2858,9 +2863,17 @@ void SwDBManager::LoadAndRegisterEmbeddedDataSource(const SwDBData& rData, const
// Encode the stream name and the real path into a single URL.
const INetURLObject& rURLObject = rDocShell.GetMedium()->GetURLObject();
OUString aURL = "vnd.sun.star.pkg://";
aURL += INetURLObject::encode(rURLObject.GetMainURL(INetURLObject::DecodeMechanism::WithCharset), INetURLObject::PART_AUTHORITY, INetURLObject::EncodeMechanism::All);
aURL += "/" + INetURLObject::encode(m_sEmbeddedName, INetURLObject::PART_FPATH, INetURLObject::EncodeMechanism::All);
auto xContext(comphelper::getProcessComponentContext());
auto xUri = css::uri::UriReferenceFactory::create(xContext)
->parse(rURLObject.GetMainURL(INetURLObject::DecodeMechanism::NONE));
assert(xUri.is());
xUri = css::uri::VndSunStarPkgUrlReferenceFactory::create(xContext)
->createVndSunStarPkgUrlReference(xUri);
assert(xUri.is());
OUString const aURL = xUri->getUriReference() + "/"
+ INetURLObject::encode(
m_sEmbeddedName, INetURLObject::PART_FPATH,
INetURLObject::EncodeMechanism::All);
uno::Reference<uno::XInterface> xDataSource(xDatabaseContext->getByName(aURL), uno::UNO_QUERY);
xDatabaseContext->registerObject( sDataSource, xDataSource );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment