You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Woonsan Ko (JIRA)" <ji...@apache.org> on 2019/07/03 22:13:00 UTC

[jira] [Comment Edited] (JCR-4458) When JcrRemotingServlet deployed on non-root context, AclResource Webdav request fails

    [ https://issues.apache.org/jira/browse/JCR-4458?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16878190#comment-16878190 ] 

Woonsan Ko edited comment on JCR-4458 at 7/3/19 10:12 PM:
----------------------------------------------------------

If you want, you can reproduce the problem easily with the two tools [1,2] to reproduce the problem.

h2. A problem case

- Start Jackrabbit server with a servlet context path ("/cms") using [1]:
{noformat}
$ export SERVER_SERVLET_CONTEXT_PATH=/cms
$ java \
>     -Drepository.home=target/jackrabbit-repository \
>     -Drepository.config=conf/simple-repository.xml \
>     -Dloader.path=lib/ \
>     -jar target/jackrabbit-boot-0.0.1-SNAPSHOT.jar

...
{noformat}
- Start JCR Shell [2] as a JCR/WebDAV client, list nodes in the root and try to import an XML:
{noformat}
$ java -jar target/jcrshell-2.0.4-SNAPSHOT.jar \
>.    --server="http://localhost:8080/cms/server" \
>.    --user="admin:admin"
...
exit or quit leaves program.
help lists commands.
jcr-shell:> ls

done.
-------------------------------------------------------------------------------------------------------------------------------
Name        Type        
-------------------------------------------------------------------------------------------------------------------------------
jcr:system  rep:system  
rep:policy  rep:ACL     
-------------------------------------------------------------------------------------------------------------------------------
Command completed in 981 msecs.

admin:/> nodeimport hello.xml
UnsupportedRepositoryOperationException while executing nodeimport: Missing implementation

admin:/>

{noformat}
- It fails with an {{UnsupportedRepositoryOperationException}}. The server [1] prints the following stack traces:
{noformat}
2019-07-03 17:59:52.794 ERROR 9604 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[jcrRemotingServlet]     : Servlet.service() for servlet [jcrRemotingServlet] in context with path [/cms] threw exception

java.lang.IllegalArgumentException: Unexpected format of resource path: /cms/server/default/jcr:root (workspace: /cms)
	at org.apache.jackrabbit.webdav.jcr.DavLocatorFactoryImpl.getRepositoryPath(DavLocatorFactoryImpl.java:65) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.AbstractLocatorFactory$DavResourceLocatorImpl.getRepositoryPath(AbstractLocatorFactory.java:366) ~[jackrabbit-webdav-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.jcr.version.report.JcrPrivilegeReport.addResponses(JcrPrivilegeReport.java:130) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.jcr.version.report.JcrPrivilegeReport.init(JcrPrivilegeReport.java:114) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.version.report.ReportType.createReport(ReportType.java:72) ~[jackrabbit-webdav-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.jcr.AbstractResource.getReport(AbstractResource.java:513) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.jcr.WorkspaceResourceImpl.getReport(WorkspaceResourceImpl.java:88) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.server.AbstractWebdavServlet.doReport(AbstractWebdavServlet.java:1117) ~[jackrabbit-webdav-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.server.AbstractWebdavServlet.execute(AbstractWebdavServlet.java:416) ~[jackrabbit-webdav-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.server.AbstractWebdavServlet.service(AbstractWebdavServlet.java:305) ~[jackrabbit-webdav-2.18.2.jar!/:na]
...
{noformat}

-----
[1] Jackrabbit-boot, https://github.com/woonsan/jackrabbit-boot
     (A simple, minimalistic Jackrabbit 2 standalone application example using Spring-boot like Jackrabbit Standalone.)
[2] https://bloomreach-forge.github.io/jcr-shell/
     (An open source shell project to access remote JCR using JCR over WebDAV protocol.)


was (Author: woon_san):
If you want, you can reproduce the problem easily with the two tools [1,2] to reproduce the problem.

h2. A problem case

- Start Jackrabbit server with a servlet context path ("/cms") using [1]:
{noformat}
$ export SERVER_SERVLET_CONTEXT_PATH=/cms
$ java \
>     -Drepository.home=target/jackrabbit-repository \
>     -Drepository.config=conf/simple-repository.xml \
>     -Dloader.path=lib/ \
>     -jar target/jackrabbit-boot-0.0.1-SNAPSHOT.jar

...
{noformat}
- Start JCR Shell [2] as a JCR/WebDAV client, list nodes in the root and try to import an XML:
{noformat}
$ java -jar target/jcrshell-2.0.4-SNAPSHOT.jar \
>.    --server="http://localhost:8080/cms/server" \
>.    --user="admin:admin"
...
exit or quit leaves program.
help lists commands.
jcr-shell:> ls

done.
-------------------------------------------------------------------------------------------------------------------------------
Name        Type        
-------------------------------------------------------------------------------------------------------------------------------
jcr:system  rep:system  
rep:policy  rep:ACL     
-------------------------------------------------------------------------------------------------------------------------------
Command completed in 981 msecs.

admin:/> nodeimport hello.xml
UnsupportedRepositoryOperationException while executing nodeimport: Missing implementation

admin:/>

{noformat}
- It fails with an {{UnsupportedRepositoryOperationException}}. The server [1] prints the following stack traces:
{noformat}
{noformat}
2019-07-03 17:59:52.794 ERROR 9604 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[.[jcrRemotingServlet]     : Servlet.service() for servlet [jcrRemotingServlet] in context with path [/cms] threw exception

java.lang.IllegalArgumentException: Unexpected format of resource path: /cms/server/default/jcr:root (workspace: /cms)
	at org.apache.jackrabbit.webdav.jcr.DavLocatorFactoryImpl.getRepositoryPath(DavLocatorFactoryImpl.java:65) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.AbstractLocatorFactory$DavResourceLocatorImpl.getRepositoryPath(AbstractLocatorFactory.java:366) ~[jackrabbit-webdav-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.jcr.version.report.JcrPrivilegeReport.addResponses(JcrPrivilegeReport.java:130) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.jcr.version.report.JcrPrivilegeReport.init(JcrPrivilegeReport.java:114) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.version.report.ReportType.createReport(ReportType.java:72) ~[jackrabbit-webdav-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.jcr.AbstractResource.getReport(AbstractResource.java:513) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.jcr.WorkspaceResourceImpl.getReport(WorkspaceResourceImpl.java:88) ~[jackrabbit-jcr-server-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.server.AbstractWebdavServlet.doReport(AbstractWebdavServlet.java:1117) ~[jackrabbit-webdav-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.server.AbstractWebdavServlet.execute(AbstractWebdavServlet.java:416) ~[jackrabbit-webdav-2.18.2.jar!/:na]
	at org.apache.jackrabbit.webdav.server.AbstractWebdavServlet.service(AbstractWebdavServlet.java:305) ~[jackrabbit-webdav-2.18.2.jar!/:na]
...
{noformat}

-----
[1] Jackrabbit-boot, https://github.com/woonsan/jackrabbit-boot
     (A simple, minimalistic Jackrabbit 2 standalone application example using Spring-boot like Jackrabbit Standalone.)
[2] https://bloomreach-forge.github.io/jcr-shell/
     (An open source shell project to access remote JCR using JCR over WebDAV protocol.)

> When JcrRemotingServlet deployed on non-root context, AclResource Webdav request fails
> --------------------------------------------------------------------------------------
>
>                 Key: JCR-4458
>                 URL: https://issues.apache.org/jira/browse/JCR-4458
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>    Affects Versions: 2.18.2
>            Reporter: Woonsan Ko
>            Priority: Major
>
> If {{org.apache.jackrabbit.server.remoting.davex.JcrRemotingServlet}} is configured in a non-root web application, the contextPath of which is "/cms" for example with the servletPath, "/server", then {{javax.jcr.Session#importXML(...)}} fails from a JCR client based on JCR/WebDAV. In other words, {{#importXML(...)}} fails from a JCR {{Session}} using a repository which can be created like the following for JCR over WebDAV:
> {code}
>     String repositoryAddress = "http://localhost:8080/cms/server";
>     Jcr2davRepositoryFactory factory = new Jcr2davRepositoryFactory();
>     Map<String, String> params = new HashMap<String, String>();
>     params.put(JcrUtils.REPOSITORY_URI, repositoryAddress);
>     Repository repository = factory.getRepository(params);
>     // ...
> {code}
> It seems like that {{Session#importXML(...)}} call invokes an AclResource Webdav request first on the specific resource path, but {{org.apache.jackrabbit.webdav.jcr.version.report.JcrPrivilegeReport#init(DavResource, ReportInfo)}} does not remove the contextPath, "/cms" for example, when determining the resoucrePath.
> Unlike the {{JcrPrivilegeReport}}, {{org.apache.jackrabbit.webdav.WebdavRequestImpl#getHrefLocator(String, boolean)}} seems to remove the contextPath properly.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)