1. Project Clover database Tue Dec 20 2016 21:24:09 CET
  2. Package com.xpn.xwiki.plugin.webdav

File XWikiDavServlet.java

 

Coverage histogram

../../../../../img/srcFileCovDistChart8.png
54% of files have more coverage

Code metrics

12
47
12
1
220
146
19
0.4
3.92
12
1.58

Classes

Class Line # Actions
XWikiDavServlet 59 47 0% 19 16
0.774647977.5%
 

Contributing tests

No tests hitting this source file were found.

Source view

1    /*
2    * See the NOTICE file distributed with this work for additional
3    * information regarding copyright ownership.
4    *
5    * This is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU Lesser General Public License as
7    * published by the Free Software Foundation; either version 2.1 of
8    * the License, or (at your option) any later version.
9    *
10    * This software is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13    * Lesser General Public License for more details.
14    *
15    * You should have received a copy of the GNU Lesser General Public
16    * License along with this software; if not, write to the Free
17    * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18    * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19    */
20    package com.xpn.xwiki.plugin.webdav;
21   
22    import java.io.IOException;
23   
24    import javax.servlet.ServletException;
25    import javax.servlet.annotation.WebServlet;
26    import javax.servlet.http.HttpServletRequest;
27    import javax.servlet.http.HttpServletResponse;
28   
29    import org.apache.jackrabbit.webdav.DavException;
30    import org.apache.jackrabbit.webdav.DavLocatorFactory;
31    import org.apache.jackrabbit.webdav.DavMethods;
32    import org.apache.jackrabbit.webdav.DavResource;
33    import org.apache.jackrabbit.webdav.DavResourceFactory;
34    import org.apache.jackrabbit.webdav.DavServletResponse;
35    import org.apache.jackrabbit.webdav.DavSessionProvider;
36    import org.apache.jackrabbit.webdav.WebdavRequest;
37    import org.apache.jackrabbit.webdav.WebdavRequestImpl;
38    import org.apache.jackrabbit.webdav.WebdavResponse;
39    import org.apache.jackrabbit.webdav.WebdavResponseImpl;
40    import org.apache.jackrabbit.webdav.server.AbstractWebdavServlet;
41    import org.apache.jackrabbit.webdav.simple.LocatorFactoryImplEx;
42    import org.slf4j.Logger;
43    import org.slf4j.LoggerFactory;
44    import org.xwiki.container.Container;
45    import org.xwiki.context.Execution;
46   
47    import com.xpn.xwiki.plugin.webdav.resources.XWikiDavResource;
48    import com.xpn.xwiki.plugin.webdav.utils.XWikiDavContext;
49    import com.xpn.xwiki.plugin.webdav.utils.XWikiDavResourceFactory;
50    import com.xpn.xwiki.plugin.webdav.utils.XWikiDavSessionProvider;
51    import com.xpn.xwiki.web.Utils;
52   
53    /**
54    * The servlet responsible for handling WebDAV requests on /xwiki/webdav.
55    *
56    * @version $Id: b7b4e5911a73fd73d4f789e7404a2687d15c5063 $
57    */
58    @WebServlet(name = "webdav", displayName = "WebDAV", urlPatterns = { "/webdav/*" })
 
59    public class XWikiDavServlet extends AbstractWebdavServlet
60    {
61    /**
62    * Class version.
63    */
64    private static final long serialVersionUID = 7255582612577585483L;
65   
66    /**
67    * Logger instance.
68    */
69    private static final Logger logger = LoggerFactory.getLogger(XWikiDavServlet.class);
70   
71    /**
72    * WWW-Authenticate header string.
73    */
74    public static final String WWW_AUTHENTICATE_HEADER = "WWW-Authenticate";
75   
76    /**
77    * Locator factory. {@link DavLocatorFactory}
78    */
79    private transient DavLocatorFactory locatorFactory;
80   
81    /**
82    * Resource factory. {@link DavResourceFactory}
83    */
84    private transient DavResourceFactory resourceFactory;
85   
86    /**
87    * Session provider. {@link DavSessionProvider}
88    */
89    private transient DavSessionProvider sessionProvider;
90   
 
91  1 toggle @Override
92    public void init() throws ServletException
93    {
94  1 super.init();
95  1 setLocatorFactory(new LocatorFactoryImplEx(""));
96  1 setResourceFactory(new XWikiDavResourceFactory(getServletContext()));
97  1 setDavSessionProvider(new XWikiDavSessionProvider());
98    }
99   
 
100  77 toggle @Override
101    protected void service(HttpServletRequest request, HttpServletResponse response)
102    throws ServletException, IOException
103    {
104  77 XWikiDavContext context = null;
105  77 WebdavRequest webdavRequest = new WebdavRequestImpl(request, getLocatorFactory());
106  77 WebdavResponse webdavResponse = new WebdavResponseImpl(response, false);
107  77 int methodCode = DavMethods.getMethodCode(request.getMethod());
108  77 try {
109    // Attach session information for this request.
110  77 if (!getDavSessionProvider().attachSession(webdavRequest)) {
111  0 return;
112    }
113    // Create the WebDAV resource (uses the resource locator).
114  77 XWikiDavResource resource =
115    (XWikiDavResource) getResourceFactory().createResource(
116    webdavRequest.getRequestLocator(), webdavRequest, webdavResponse);
117   
118  65 context = resource.getContext();
119    // Make sure there is an authenticated user.
120  65 if ("XWiki.XWikiGuest".equals(context.getUser())) {
121  0 webdavResponse.setStatus(DavServletResponse.SC_UNAUTHORIZED);
122  0 webdavResponse.setHeader(WWW_AUTHENTICATE_HEADER, getAuthenticateHeaderValue());
123  0 return;
124    }
125    // Check for preconditions.
126  65 if (!isPreconditionValid(webdavRequest, resource)) {
127  0 webdavResponse.sendError(DavServletResponse.SC_PRECONDITION_FAILED);
128  0 return;
129    }
130    // Finally, execute the corresponding DAV method.
131  55 if (!execute(webdavRequest, webdavResponse, methodCode, resource)) {
132  0 super.service(request, response);
133    }
134    } catch (DavException e) {
135  22 if (e.getErrorCode() == HttpServletResponse.SC_UNAUTHORIZED) {
136  0 webdavResponse.setHeader(WWW_AUTHENTICATE_HEADER, getAuthenticateHeaderValue());
137  0 webdavResponse.sendError(e.getErrorCode(), e.getStatusPhrase());
138    } else {
139  22 logger.error("WebDAV Exception Occurred : ", e);
140  22 webdavResponse.sendError(e);
141    }
142    } finally {
143  77 cleaUp(webdavRequest, context);
144    }
145    }
146   
 
147  65 toggle @Override
148    protected boolean execute(WebdavRequest request, WebdavResponse response, int method,
149    DavResource resource) throws ServletException, IOException, DavException
150    {
151  65 logger.debug(String.format("Resource: [%s] Method: [%s]", resource.getDisplayName(), request.getMethod()));
152  65 return super.execute(request, response, method, resource);
153    }
154   
 
155  65 toggle @Override
156    protected boolean isPreconditionValid(WebdavRequest request, DavResource resource)
157    {
158  65 return !resource.exists() || request.matchesIfHeader(resource);
159    }
160   
 
161  0 toggle @Override
162    public String getAuthenticateHeaderValue()
163    {
164  0 return "Basic realm=\"XWiki Webdav Server\"";
165    }
166   
 
167  77 toggle @Override
168    public DavLocatorFactory getLocatorFactory()
169    {
170  77 return this.locatorFactory;
171    }
172   
 
173  1 toggle @Override
174    public void setLocatorFactory(DavLocatorFactory locatorFactory)
175    {
176  1 this.locatorFactory = locatorFactory;
177    }
178   
 
179  84 toggle @Override
180    public DavResourceFactory getResourceFactory()
181    {
182  84 return this.resourceFactory;
183    }
184   
 
185  1 toggle @Override
186    public void setResourceFactory(DavResourceFactory resourceFactory)
187    {
188  1 this.resourceFactory = resourceFactory;
189    }
190   
 
191  154 toggle @Override
192    public synchronized DavSessionProvider getDavSessionProvider()
193    {
194  154 return this.sessionProvider;
195    }
196   
 
197  1 toggle @Override
198    public synchronized void setDavSessionProvider(DavSessionProvider sessionProvider)
199    {
200  1 this.sessionProvider = sessionProvider;
201    }
202   
203    /**
204    * We must ensure we clean the ThreadLocal variables located in the Container and Execution
205    * components as otherwise we will have a potential memory leak.
206    */
 
207  77 toggle public void cleaUp(WebdavRequest request, XWikiDavContext context)
208    {
209  77 Container container = (Container) Utils.getComponent(Container.class);
210  77 Execution execution = (Execution) Utils.getComponent(Execution.class);
211  77 container.removeRequest();
212  77 container.removeResponse();
213  77 container.removeSession();
214  77 execution.removeContext();
215  77 getDavSessionProvider().releaseSession(request);
216  77 if (context != null) {
217  65 context.cleanUp();
218    }
219    }
220    }