/* * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.wso2.carbon.registry.webdav; import java.io.IOException; import javax.jcr.Repository; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.server.BasicCredentialsProvider; import org.apache.jackrabbit.webdav.DavException; import org.apache.jackrabbit.webdav.DavResource; import org.apache.jackrabbit.webdav.DavResourceFactory; import org.apache.jackrabbit.webdav.DavResourceLocator; import org.apache.jackrabbit.webdav.DavServletRequest; import org.apache.jackrabbit.webdav.DavServletResponse; import org.apache.jackrabbit.webdav.DavSession; import org.apache.jackrabbit.webdav.WebdavRequest; import org.apache.jackrabbit.webdav.WebdavResponse; import org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet; import org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet; import org.wso2.carbon.registry.core.CollectionImpl; import org.wso2.carbon.registry.core.Registry; import org.wso2.carbon.registry.core.exceptions.RegistryException; public class RegistryServlet extends SimpleWebdavServlet { public static final Log log = LogFactory.getLog(SimpleWebdavServlet.class); public static final String WEBDAV_CONTEXT = "WebDavContext"; private static ThreadLocal<RegistryWebDavContext> threadLocalData = new ThreadLocal<RegistryWebDavContext>(); // private Repository repository; private WebDavEnviorment enviorment = new WebDavEnviorment(); public void init() throws ServletException { super.init(); log.debug("Starting Registry WebDAV Servlet"); setResourceFactory(new DavResourceFactory() { public DavResource createResource(DavResourceLocator locator, DavServletRequest request, DavServletResponse response) throws DavException { return createResource(locator); } public DavResource createResource(DavResourceLocator locator, DavSession session) throws DavException { return createResource(locator); } private RegistryResource createResource(DavResourceLocator locator) throws DavException{ try { RegistryWebDavContext webDavContext = threadLocalData.get(); RegistryResource registryResource = new RegistryResource( webDavContext, locator); webDavContext.setRegistryResource(registryResource.getLocator().getResourcePath(), registryResource); return registryResource; } catch (DavException e) { e.printStackTrace(); throw e; } } }); enviorment.setResourceFactory(getResourceFactory()); enviorment.setLocatorFactory(getLocatorFactory()); setDavSessionProvider(new RegistrySessionProvider( new BasicCredentialsProvider(JCRWebdavServerServlet.INIT_PARAM_MISSING_AUTH_MAPPING),threadLocalData, enviorment)); //setLockManager(lockManager); // repository = new UserRegistry(threadLocalData); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { log.debug("doGet() Invoked by " + req.getRemoteUser()); findAndSetWebdavContext2ThreadLocal(req); super.doGet(req, resp); } catch (RegistryException e) { throw new ServletException(e); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { log.debug("doPost() Invoked by " + req.getRemoteUser()); findAndSetWebdavContext2ThreadLocal(req); super.doPost(req, resp); } catch (RegistryException e) { throw new ServletException(e); } } @Override protected void doMkCol(WebdavRequest request, WebdavResponse response, DavResource resource) throws IOException, DavException { // This piece of code was added as fix for the CARBON-9041 BUG, and proper code refactoring // needs to happen in the RegistryResource.java // TODO: This is a CARBON-9041 fix and remove with proper code refactoring. if (resource instanceof RegistryResource) { ((RegistryResource) resource).setUnderLineResource(new CollectionImpl()); } super.doMkCol(request, response, resource); } /** * This method retrieves the webdavContext from the session, and if not presents, do authenticate user, create new, * and sets the webdavContext to sessions. * @param req the http servlet request object. * @throws IOException the IO exception. * @throws RegistryException the Registry exception. */ private void findAndSetWebdavContext2ThreadLocal(HttpServletRequest req) throws IOException, RegistryException { RegistryWebDavContext webdavContext; HttpSession session = req.getSession(true); webdavContext = (RegistryWebDavContext) session .getAttribute(WEBDAV_CONTEXT); if (webdavContext == null) { String[] credentails = retriveUserNameAndPassword(req); Registry registry; if (credentails != null) { registry = WebdavServiceComponet.getRegistryInstance( credentails[0], credentails[1]); } else { registry = WebdavServiceComponet .getRegistryInstance(null, null); } if (registry == null) { throw new RegistryException( "No Registry can be found for the registry"); } else { webdavContext = new RegistryWebDavContext(registry, req.getContextPath()); session.setAttribute(WEBDAV_CONTEXT, webdavContext); } } threadLocalData.set(webdavContext); } private String[] retriveUserNameAndPassword(HttpServletRequest request) throws IOException { String auth = request.getHeader("Authorization"); // Do we allow that user? if (!auth.toUpperCase().startsWith("BASIC ")) return null; // we only do BASIC // Get encoded user and password, comes after "BASIC " String userpassEncoded = auth.substring(6); // Decode it, using any base 64 decoder sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder(); String userpassDecoded = new String(dec.decodeBuffer(userpassEncoded)); return userpassDecoded.split(":"); } @Override public Repository getRepository() { return null; } }