office-gobmx/external/libcmis/libcmis-sharepoint-repository-root.patch
Mike Kaganski 1b482aec4e tdf#101385: don't try to get SharePoint folder outside of allowed range
for a given site.
This patch uses the fact that getFolderByServerRelativeUrl API returns
site's root folder if used with empty path ('').
Hopefully this isn't otherwise context-dependent, so that it doesn't
return other folders in some unknown circumstances.

More correct would be instead to use the site's root path directly,
like '/sites/mysite'. But I don't know a reliable way to filter the
API part from the base URI.

To make use of the corrected SharePoint repository root id, the patch
also redirects all cases where "/" object is queried, to session's
getRootFolder().

libcmis part of the patch will hopefully soon be merged upstream.

Change-Id: I0f3b9930748de3fe4763eb27721739f097b9892d
Reviewed-on: https://gerrit.libreoffice.org/27987
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: David Tardon <dtardon@redhat.com>
2016-08-10 07:35:32 +00:00

24 lines
1.3 KiB
Diff

diff --git a/src/libcmis/sharepoint-repository.cxx b/src/libcmis/sharepoint-repository.cxx
index 780624d..f992689 100644
--- a/src/libcmis/sharepoint-repository.cxx
+++ b/src/libcmis/sharepoint-repository.cxx
@@ -35,7 +35,18 @@ SharePointRepository::SharePointRepository( std::string baseUrl ) :
m_description = "SharePoint repository";
m_productName = "SharePoint";
m_productVersion = "2010/2013";
- m_rootId = baseUrl + "/getFolderByServerRelativeUrl('/')";
+ // getFolderByServerRelativeUrl() API expects path to be
+ // *server-relative*, i.e. they must include site path.
+ // Given the baseUrl like "https://sp2013/sites/mysite/_api/Web"
+ // for a site "mysite" on sharepoint server "sp2013",
+ // the site root is '/sites/mysite/', not '/'.
+ // Trying to get folder '/' results in "Value does not fall
+ // within expected range" error.
+ // Preferrable here is to extract the root path from baseUrl,
+ // stripping server and api parts. But it can be unreliable
+ // if api part (_api/Web) is different for some server.
+ // On the other side, just querying empty path '' gives the root folder.
+ m_rootId = baseUrl + "/getFolderByServerRelativeUrl('')";
m_capabilities[ ACL ] = "discover";
m_capabilities[ AllVersionsSearchable ] = "true";