Kaydet (Commit) 65abd11d authored tarafından Vasily Melenchuk's avatar Vasily Melenchuk Kaydeden (comit) Katarina Behrens

Support for webdav:// and webdavs:// schemes from command line

We have currently support for WebDAV schemes as vnd.sun.star.webdav://
but it is not user and tools friendly.

Some related refactoring in ucb to reuse existing code instead of
manual parsing of URLs.

Change-Id: Ib14411796d6cf11afd80d5132abe67d4e46a42e1
Reviewed-on: https://gerrit.libreoffice.org/48585Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarKatarina Behrens <Katarina.Behrens@cib.de>
üst ae5f89fd
......@@ -54,6 +54,9 @@ enum class INetProtocol
File,
Mailto,
VndSunStarWebdav,
VndSunStarWebdavs,
Webdav,
Webdavs,
PrivSoffice,
VndSunStarHelp,
Https,
......@@ -943,6 +946,7 @@ public:
static bool IsCaseSensitive() { return true; }
void changeScheme(INetProtocol eTargetScheme);
private:
// General Structure:
......@@ -1145,9 +1149,6 @@ private:
TOOLS_DLLPRIVATE static bool scanIPv6reference(
sal_Unicode const *& rBegin, sal_Unicode const * pEnd);
private:
void changeScheme(INetProtocol eTargetScheme);
};
// static
......
......@@ -67,6 +67,17 @@
<value/>
</prop>
</node>
<node oor:name="Provider4a" oor:op="replace" install:module="webdav">
<prop oor:name="ServiceName">
<value>com.sun.star.ucb.WebDAVContentProvider</value>
</prop>
<prop oor:name="URLTemplate">
<value>webdav</value>
</prop>
<prop oor:name="Arguments">
<value/>
</prop>
</node>
<node oor:name="Provider5" oor:op="replace">
<prop oor:name="ServiceName">
<value>com.sun.star.help.XMLHelp</value>
......@@ -157,6 +168,18 @@
<value/>
</prop>
</node>
<node oor:name="Provider12b" oor:op="replace"
install:module="webdav">
<prop oor:name="ServiceName">
<value>com.sun.star.ucb.WebDAVContentProvider</value>
</prop>
<prop oor:name="URLTemplate">
<value>webdavs</value>
</prop>
<prop oor:name="Arguments">
<value/>
</prop>
</node>
<node oor:name="Provider14" oor:op="replace">
<prop oor:name="ServiceName">
<value>com.sun.star.ucb.ExtensionContentProvider</value>
......
......@@ -331,6 +331,15 @@ INetURLObject::getSchemeInfo(INetProtocol eTheScheme)
SchemeInfo{
"vnd.sun.star.webdav", "vnd.sun.star.webdav://", true, false,
false, false, true, true, true, true},
SchemeInfo{
"vnd.sun.star.webdavs", "vnd.sun.star.webdavs://", true, false,
false, false, true, true, true, true},
SchemeInfo{
"webdav", "webdav://", true, false, false, false, true, true,
true, true},
SchemeInfo{
"webdavs", "webdavs://", true, false, false, false, true, true,
true, true},
SchemeInfo{
"private", "private:", false, false, false, false, false, false,
false, true},
......@@ -1468,7 +1477,11 @@ bool INetURLObject::setAbsURIRef(OUString const & rTheAbsURIRef,
void INetURLObject::changeScheme(INetProtocol eTargetScheme) {
OUString aTmpStr=m_aAbsURIRef.makeStringAndClear();
int oldSchemeLen=strlen(getSchemeInfo().m_pScheme);
int oldSchemeLen = 0;
if (m_eScheme == INetProtocol::Generic)
oldSchemeLen = m_aScheme.getLength();
else
oldSchemeLen = strlen(getSchemeInfo().m_pScheme);
m_eScheme=eTargetScheme;
int newSchemeLen=strlen(getSchemeInfo().m_pScheme);
m_aAbsURIRef.appendAscii(getSchemeInfo().m_pScheme);
......@@ -2167,8 +2180,15 @@ INetURLObject::PrefixInfo const * INetURLObject::getPrefix(sal_Unicode const *&
{ "vnd.sun.star.tdoc:", nullptr, INetProtocol::VndSunStarTdoc,
PrefixInfo::OFFICIAL },
{ "vnd.sun.star.webdav:", nullptr, INetProtocol::VndSunStarWebdav,
PrefixInfo::OFFICIAL } };
/* This list needs to be sorted, or you'll introduce serious bugs */
PrefixInfo::OFFICIAL },
{ "vnd.sun.star.webdavs:", nullptr, INetProtocol::VndSunStarWebdavs,
PrefixInfo::OFFICIAL },
{ "webdav:", nullptr, INetProtocol::Webdav,
PrefixInfo::OFFICIAL },
{ "webdavs:", nullptr, INetProtocol::Webdavs,
PrefixInfo::OFFICIAL }
};
/* This list needs to be sorted, or you'll introduce serious bugs */
PrefixInfo const * pFirst = aMap + 1;
PrefixInfo const * pLast = aMap + sizeof aMap / sizeof (PrefixInfo) - 1;
......@@ -2916,6 +2936,9 @@ bool INetURLObject::parsePath(INetProtocol eScheme,
case INetProtocol::Http:
case INetProtocol::VndSunStarWebdav:
case INetProtocol::VndSunStarWebdavs:
case INetProtocol::Webdav:
case INetProtocol::Webdavs:
case INetProtocol::Https:
case INetProtocol::Smb:
case INetProtocol::Cmis:
......@@ -3879,7 +3902,9 @@ bool INetURLObject::isAnyKnownWebDAVScheme() const {
return ( isSchemeEqualTo( INetProtocol::Http ) ||
isSchemeEqualTo( INetProtocol::Https ) ||
isSchemeEqualTo( INetProtocol::VndSunStarWebdav ) ||
isSchemeEqualTo( "vnd.sun.star.webdavs" ) );
isSchemeEqualTo( INetProtocol::VndSunStarWebdavs ) ||
isSchemeEqualTo( INetProtocol::Webdav ) ||
isSchemeEqualTo( INetProtocol::Webdavs ));
}
// static
......
......@@ -21,6 +21,7 @@ $(eval $(call gb_CppunitTest_use_libraries,ucb_webdav_local_neon, \
salhelper \
test \
ucbhelper \
tl \
))
$(eval $(call gb_CppunitTest_use_library_objects,ucb_webdav_local_neon, \
......
......@@ -24,6 +24,7 @@ $(eval $(call gb_CppunitTest_use_libraries,ucb_webdav_neon_opts, \
salhelper \
test \
ucbhelper \
tl \
))
$(eval $(call gb_CppunitTest_use_library_objects,ucb_webdav_neon_opts, \
......
......@@ -24,6 +24,7 @@ $(eval $(call gb_CppunitTest_use_libraries,ucb_webdav_propfindcache, \
salhelper \
test \
ucbhelper \
tl \
))
$(eval $(call gb_CppunitTest_use_library_objects,ucb_webdav_propfindcache, \
......
......@@ -24,6 +24,7 @@ $(eval $(call gb_CppunitTest_use_libraries,ucb_webdav_res_access, \
salhelper \
test \
ucbhelper \
tl \
))
$(eval $(call gb_CppunitTest_use_library_objects,ucb_webdav_res_access, \
......
......@@ -26,6 +26,7 @@ $(eval $(call gb_Library_use_libraries,ucpdav1,\
sal \
salhelper \
ucbhelper \
tl \
))
ifeq ($(WITH_WEBDAV),neon)
......
......@@ -2778,25 +2778,29 @@ void Content::transfer(
// Check source's and target's URL scheme
OUString aScheme = sourceURI.GetScheme().toAsciiLowerCase();
if ( aScheme == WEBDAV_URL_SCHEME )
if ( aScheme == VNDSUNSTARWEBDAV_URL_SCHEME)
{
sourceURI.SetScheme(
HTTP_URL_SCHEME );
sourceURI.SetScheme( HTTP_URL_SCHEME );
}
else if ( aScheme == WEBDAVS_URL_SCHEME )
else if ( aScheme == VNDSUNSTARWEBDAVS_URL_SCHEME)
{
sourceURI.SetScheme(
HTTPS_URL_SCHEME );
sourceURI.SetScheme( HTTPS_URL_SCHEME );
}
else if ( aScheme == DAV_URL_SCHEME )
{
sourceURI.SetScheme(
HTTP_URL_SCHEME );
sourceURI.SetScheme( HTTP_URL_SCHEME );
}
else if ( aScheme == DAVS_URL_SCHEME )
{
sourceURI.SetScheme(
HTTPS_URL_SCHEME );
sourceURI.SetScheme( HTTPS_URL_SCHEME );
}
else if ( aScheme == WEBDAV_URL_SCHEME )
{
sourceURI.SetScheme( HTTP_URL_SCHEME );
}
else if ( aScheme == WEBDAVS_URL_SCHEME )
{
sourceURI.SetScheme( HTTPS_URL_SCHEME );
}
else
{
......@@ -2813,18 +2817,18 @@ void Content::transfer(
}
aScheme = targetURI.GetScheme().toAsciiLowerCase();
if ( aScheme == WEBDAV_URL_SCHEME )
targetURI.SetScheme(
HTTP_URL_SCHEME );
else if ( aScheme == WEBDAVS_URL_SCHEME )
targetURI.SetScheme(
HTTPS_URL_SCHEME );
if ( aScheme == VNDSUNSTARWEBDAV_URL_SCHEME)
targetURI.SetScheme( HTTP_URL_SCHEME );
else if ( aScheme == VNDSUNSTARWEBDAVS_URL_SCHEME)
targetURI.SetScheme( HTTPS_URL_SCHEME );
else if ( aScheme == DAV_URL_SCHEME )
targetURI.SetScheme(
HTTP_URL_SCHEME );
targetURI.SetScheme( HTTP_URL_SCHEME );
else if ( aScheme == DAVS_URL_SCHEME )
targetURI.SetScheme(
HTTPS_URL_SCHEME );
targetURI.SetScheme( HTTPS_URL_SCHEME );
else if ( aScheme == WEBDAV_URL_SCHEME )
targetURI.SetScheme( HTTP_URL_SCHEME );
else if ( aScheme == WEBDAVS_URL_SCHEME )
targetURI.SetScheme( HTTPS_URL_SCHEME );
// @@@ This implementation of 'transfer' only works
// if the source and target are located at same host.
......
......@@ -35,6 +35,7 @@
#include "webdavcontent.hxx"
#include <osl/mutex.hxx>
#include <tools/urlobj.hxx>
using namespace com::sun::star;
using namespace webdav_ucp;
......@@ -127,76 +128,34 @@ ContentProvider::queryContent(
ucb::XContentIdentifier >& Identifier )
{
// Check URL scheme...
INetURLObject aURL( Identifier->getContentIdentifier() );
const OUString aScheme
= Identifier->getContentProviderScheme().toAsciiLowerCase();
if ( aScheme != HTTP_URL_SCHEME && aScheme != HTTPS_URL_SCHEME
&& aScheme != WEBDAV_URL_SCHEME && aScheme != WEBDAVS_URL_SCHEME
&& aScheme != DAV_URL_SCHEME && aScheme != DAVS_URL_SCHEME && aScheme != FTP_URL_SCHEME )
if ( aURL.isSchemeEqualTo( INetProtocol::NotValid ) )
throw ucb::IllegalIdentifierException();
// Normalize URL and create new Id, if nessacary.
OUString aURL = Identifier->getContentIdentifier();
// At least: <scheme> + "://"
if ( aURL.getLength() < ( aScheme.getLength() + 3 ) )
throw ucb::IllegalIdentifierException();
if ( !aURL.match("://", aScheme.getLength()) )
if ( !aURL.isAnyKnownWebDAVScheme() )
throw ucb::IllegalIdentifierException();
uno::Reference< ucb::XContentIdentifier > xCanonicId;
bool bNewId = false;
if ( aScheme == WEBDAV_URL_SCHEME )
{
aURL = aURL.replaceAt( 0,
WEBDAV_URL_SCHEME_LENGTH,
HTTP_URL_SCHEME );
bNewId = true;
}
else if ( aScheme == WEBDAVS_URL_SCHEME )
{
aURL = aURL.replaceAt( 0,
WEBDAVS_URL_SCHEME_LENGTH,
HTTPS_URL_SCHEME );
bNewId = true;
}
else if ( aScheme == DAV_URL_SCHEME )
if (aURL.isSchemeEqualTo( INetProtocol::VndSunStarWebdav ) ||
aURL.isSchemeEqualTo(DAV_URL_SCHEME) ||
aURL.isSchemeEqualTo( INetProtocol::Webdav ) )
{
aURL = aURL.replaceAt( 0,
DAV_URL_SCHEME_LENGTH,
HTTP_URL_SCHEME );
bNewId = true;
aURL.changeScheme( INetProtocol::Http );
xCanonicId = new ::ucbhelper::ContentIdentifier( aURL.getExternalURL() );
}
else if ( aScheme == DAVS_URL_SCHEME )
else if ( aURL.isSchemeEqualTo( INetProtocol::VndSunStarWebdavs ) ||
aURL.isSchemeEqualTo( DAVS_URL_SCHEME ) ||
aURL.isSchemeEqualTo( INetProtocol::Webdavs ))
{
aURL = aURL.replaceAt( 0,
DAVS_URL_SCHEME_LENGTH,
HTTPS_URL_SCHEME );
bNewId = true;
aURL.changeScheme( INetProtocol::Https );
xCanonicId = new ::ucbhelper::ContentIdentifier( aURL.getExternalURL() );
}
sal_Int32 nPos = aURL.lastIndexOf( '/' );
if ( nPos != aURL.getLength() - 1 )
{
// Find second slash in URL.
nPos = aURL.indexOf( '/', aURL.indexOf( '/' ) + 1 );
if ( nPos == -1 )
throw ucb::IllegalIdentifierException();
nPos = aURL.indexOf( '/', nPos + 1 );
if ( nPos == -1 )
{
aURL += "/";
bNewId = true;
}
}
if ( bNewId )
xCanonicId = new ::ucbhelper::ContentIdentifier( aURL );
else
{
xCanonicId = Identifier;
}
osl::MutexGuard aGuard( m_aMutex );
......
......@@ -47,28 +47,21 @@ namespace webdav_ucp {
// URL scheme. This is the scheme the provider will be able to create
// contents for. The UCB will select the provider ( i.e. in order to create
// contents ) according to this scheme.
#define WEBDAV_URL_SCHEME "vnd.sun.star.webdav"
#define WEBDAV_URL_SCHEME_LENGTH 19
#define WEBDAVS_URL_SCHEME "vnd.sun.star.webdavs"
#define WEBDAVS_URL_SCHEME_LENGTH 20
#define HTTP_URL_SCHEME "http"
#define HTTPS_URL_SCHEME "https"
#define DAV_URL_SCHEME "dav"
#define DAV_URL_SCHEME_LENGTH 3
#define DAVS_URL_SCHEME "davs"
#define DAVS_URL_SCHEME_LENGTH 4
#define VNDSUNSTARWEBDAV_URL_SCHEME "vnd.sun.star.webdav"
#define VNDSUNSTARWEBDAVS_URL_SCHEME "vnd.sun.star.webdavs"
#define HTTP_URL_SCHEME "http"
#define HTTPS_URL_SCHEME "https"
#define DAV_URL_SCHEME "dav"
#define DAVS_URL_SCHEME "davs"
#define WEBDAV_URL_SCHEME "webdav"
#define WEBDAVS_URL_SCHEME "webdavs"
#define FTP_URL_SCHEME "ftp"
#define HTTP_CONTENT_TYPE "application/" HTTP_URL_SCHEME "-content"
#define WEBDAV_CONTENT_TYPE HTTP_CONTENT_TYPE
#define WEBDAV_COLLECTION_TYPE "application/" WEBDAV_URL_SCHEME "-collection"
#define WEBDAV_COLLECTION_TYPE "application/" VNDSUNSTARWEBDAV_URL_SCHEME "-collection"
class ContentProvider : public ::ucbhelper::ContentProviderImplHelper
......
......@@ -2568,11 +2568,11 @@ void Content::transfer(
// Check source's and target's URL scheme
OUString aScheme = sourceURI.GetScheme().toAsciiLowerCase();
if ( aScheme == WEBDAV_URL_SCHEME )
if ( aScheme == VNDSUNSTARWEBDAV_URL_SCHEME)
{
sourceURI.SetScheme( HTTP_URL_SCHEME );
}
else if ( aScheme == WEBDAVS_URL_SCHEME )
else if ( aScheme == VNDSUNSTARWEBDAVS_URL_SCHEME)
{
sourceURI.SetScheme( HTTPS_URL_SCHEME );
}
......@@ -2584,6 +2584,14 @@ void Content::transfer(
{
sourceURI.SetScheme( HTTPS_URL_SCHEME );
}
else if (aScheme == WEBDAV_URL_SCHEME)
{
sourceURI.SetScheme(HTTP_URL_SCHEME);
}
else if (aScheme == WEBDAVS_URL_SCHEME)
{
sourceURI.SetScheme(HTTPS_URL_SCHEME);
}
else
{
if ( aScheme != HTTP_URL_SCHEME && aScheme != HTTPS_URL_SCHEME )
......@@ -2599,14 +2607,18 @@ void Content::transfer(
}
aScheme = targetURI.GetScheme().toAsciiLowerCase();
if ( aScheme == WEBDAV_URL_SCHEME )
if ( aScheme == VNDSUNSTARWEBDAV_URL_SCHEME)
targetURI.SetScheme( HTTP_URL_SCHEME );
else if ( aScheme == WEBDAVS_URL_SCHEME )
else if ( aScheme == VNDSUNSTARWEBDAVS_URL_SCHEME)
targetURI.SetScheme( HTTPS_URL_SCHEME );
else if ( aScheme == DAV_URL_SCHEME )
targetURI.SetScheme( HTTP_URL_SCHEME );
else if ( aScheme == DAVS_URL_SCHEME )
targetURI.SetScheme( HTTPS_URL_SCHEME );
else if (aScheme == WEBDAV_URL_SCHEME)
targetURI.SetScheme(HTTP_URL_SCHEME);
else if (aScheme == WEBDAVS_URL_SCHEME)
targetURI.SetScheme(HTTPS_URL_SCHEME);
// @@@ This implementation of 'transfer' only works
// if the source and target are located at same host.
......
......@@ -28,6 +28,8 @@
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/ucb/IllegalIdentifierException.hpp>
#include <tools/urlobj.hxx>
using namespace com::sun::star;
using namespace http_dav_ucp;
......@@ -116,76 +118,34 @@ ContentProvider::queryContent(
ucb::XContentIdentifier >& Identifier )
{
// Check URL scheme...
INetURLObject aURL(Identifier->getContentIdentifier());
const OUString aScheme
= Identifier->getContentProviderScheme().toAsciiLowerCase();
if ( aScheme != HTTP_URL_SCHEME && aScheme != HTTPS_URL_SCHEME &&
aScheme != WEBDAV_URL_SCHEME && aScheme != WEBDAVS_URL_SCHEME &&
aScheme != DAV_URL_SCHEME && aScheme != DAVS_URL_SCHEME )
throw ucb::IllegalIdentifierException();
// Normalize URL and create new Id, if nessacary.
OUString aURL = Identifier->getContentIdentifier();
// At least: <scheme> + "://"
if ( aURL.getLength() < ( aScheme.getLength() + 3 ) )
if (aURL.isSchemeEqualTo(INetProtocol::NotValid))
throw ucb::IllegalIdentifierException();
if ( !aURL.match("://", aScheme.getLength()) )
if (!aURL.isAnyKnownWebDAVScheme())
throw ucb::IllegalIdentifierException();
uno::Reference< ucb::XContentIdentifier > xCanonicId;
bool bNewId = false;
if ( aScheme == WEBDAV_URL_SCHEME )
{
aURL = aURL.replaceAt( 0,
WEBDAV_URL_SCHEME_LENGTH,
HTTP_URL_SCHEME );
bNewId = true;
}
else if ( aScheme == WEBDAVS_URL_SCHEME )
{
aURL = aURL.replaceAt( 0,
WEBDAVS_URL_SCHEME_LENGTH,
HTTPS_URL_SCHEME );
bNewId = true;
}
else if ( aScheme == DAV_URL_SCHEME )
{
aURL = aURL.replaceAt( 0,
DAV_URL_SCHEME_LENGTH,
HTTP_URL_SCHEME );
bNewId = true;
}
else if ( aScheme == DAVS_URL_SCHEME )
if (aURL.isSchemeEqualTo(INetProtocol::VndSunStarWebdav) ||
aURL.isSchemeEqualTo(DAV_URL_SCHEME) ||
aURL.isSchemeEqualTo(INetProtocol::Webdav))
{
aURL = aURL.replaceAt( 0,
DAVS_URL_SCHEME_LENGTH,
HTTPS_URL_SCHEME );
bNewId = true;
aURL.changeScheme(INetProtocol::Http);
xCanonicId = new ::ucbhelper::ContentIdentifier( aURL.getExternalURL() );
}
sal_Int32 nPos = aURL.lastIndexOf( '/' );
if ( nPos != aURL.getLength() - 1 )
else if (aURL.isSchemeEqualTo(INetProtocol::VndSunStarWebdavs) ||
aURL.isSchemeEqualTo(DAVS_URL_SCHEME) ||
aURL.isSchemeEqualTo(INetProtocol::Webdavs))
{
// Find second slash in URL.
nPos = aURL.indexOf( '/', aURL.indexOf( '/' ) + 1 );
if ( nPos == -1 )
throw ucb::IllegalIdentifierException();
nPos = aURL.indexOf( '/', nPos + 1 );
if ( nPos == -1 )
{
aURL += "/";
bNewId = true;
}
aURL.changeScheme(INetProtocol::Https);
xCanonicId = new ::ucbhelper::ContentIdentifier( aURL.getExternalURL() );
}
if ( bNewId )
xCanonicId = new ::ucbhelper::ContentIdentifier( aURL );
else
{
xCanonicId = Identifier;
}
osl::MutexGuard aGuard( m_aMutex );
......
......@@ -41,26 +41,19 @@ namespace http_dav_ucp {
// URL scheme. This is the scheme the provider will be able to create
// contents for. The UCB will select the provider ( i.e. in order to create
// contents ) according to this scheme.
#define WEBDAV_URL_SCHEME "vnd.sun.star.webdav"
#define WEBDAV_URL_SCHEME_LENGTH 19
#define WEBDAVS_URL_SCHEME "vnd.sun.star.webdavs"
#define WEBDAVS_URL_SCHEME_LENGTH 20
#define HTTP_URL_SCHEME "http"
#define HTTPS_URL_SCHEME "https"
#define DAV_URL_SCHEME "dav"
#define DAV_URL_SCHEME_LENGTH 3
#define DAVS_URL_SCHEME "davs"
#define DAVS_URL_SCHEME_LENGTH 4
#define VNDSUNSTARWEBDAV_URL_SCHEME "vnd.sun.star.webdav"
#define VNDSUNSTARWEBDAVS_URL_SCHEME "vnd.sun.star.webdavs"
#define HTTP_URL_SCHEME "http"
#define HTTPS_URL_SCHEME "https"
#define DAV_URL_SCHEME "dav"
#define DAVS_URL_SCHEME "davs"
#define WEBDAV_URL_SCHEME "webdav"
#define WEBDAVS_URL_SCHEME "webdavs"
#define HTTP_CONTENT_TYPE "application/" HTTP_URL_SCHEME "-content"
#define WEBDAV_CONTENT_TYPE HTTP_CONTENT_TYPE
#define WEBDAV_COLLECTION_TYPE "application/" WEBDAV_URL_SCHEME "-collection"
#define WEBDAV_COLLECTION_TYPE "application/" VNDSUNSTARWEBDAV_URL_SCHEME "-collection"
class ContentProvider : public ::ucbhelper::ContentProviderImplHelper
......
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