/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.web.webdav;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FilenameUtils;
import org.apache.jackrabbit.webdav.DavLocatorFactory;
import org.apache.jackrabbit.webdav.DavResource;
import org.apache.jackrabbit.webdav.DavResourceFactory;
import org.apache.jackrabbit.webdav.DavSessionProvider;
import org.apache.jackrabbit.webdav.WebdavRequest;
import org.apache.jackrabbit.webdav.server.AbstractWebdavServlet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.enonic.cms.core.servlet.ServletRequestAccessor;
public final class SimpleDavServlet
extends AbstractWebdavServlet
{
private final static Logger LOG = LoggerFactory.getLogger( SimpleDavServlet.class );
private final static String AUTHENTICATE_HEADER_VALUE = "Basic Realm=\"Enonic Webdav Server\"";
private DavSessionProvider sessionProvider;
private DavLocatorFactory locatorFactory;
private DavResourceFactory resourceFactory;
private DavConfiguration configuration;
private File resourceRoot;
public void init( final ServletConfig config )
throws ServletException
{
final ServletContext servletContext = config.getServletContext();
this.configuration = getConfiguration( servletContext );
this.resourceRoot = configuration.getResourceRoot();
setLocatorFactory( new DavLocatorFactoryImpl() );
setDavSessionProvider( new DavSessionProviderImpl( configuration ) );
setResourceFactory( new DavResourceFactoryImpl( configuration ) );
super.init( config );
}
private DavConfiguration getConfiguration( final ServletContext context )
{
final WebApplicationContext appContext = WebApplicationContextUtils.getRequiredWebApplicationContext( context );
return appContext.getBean( DavConfiguration.class );
}
protected void service( final HttpServletRequest request, final HttpServletResponse response )
throws ServletException, IOException
{
ServletRequestAccessor.setRequest( request );
ensureResourceRootExists();
if ( isHidden( request ) )
{
response.setStatus( HttpServletResponse.SC_NOT_FOUND );
return;
}
super.service( request, response );
}
private boolean isHidden( final HttpServletRequest request )
{
final String uri = request.getRequestURI();
final String name = FilenameUtils.getName( uri );
return this.configuration.isHidden( name );
}
private void ensureResourceRootExists()
{
if ( !resourceRoot.exists() )
{
final boolean created = resourceRoot.mkdirs();
if ( !created )
{
LOG.error( "cannot create resource root at " + resourceRoot.getAbsolutePath() );
}
}
}
@Override
protected boolean isPreconditionValid( final WebdavRequest req, final DavResource resource )
{
return true;
}
@Override
public DavSessionProvider getDavSessionProvider()
{
return this.sessionProvider;
}
@Override
public void setDavSessionProvider( final DavSessionProvider sessionProvider )
{
this.sessionProvider = sessionProvider;
}
@Override
public DavLocatorFactory getLocatorFactory()
{
return this.locatorFactory;
}
@Override
public void setLocatorFactory( final DavLocatorFactory locatorFactory )
{
this.locatorFactory = locatorFactory;
}
@Override
public DavResourceFactory getResourceFactory()
{
return this.resourceFactory;
}
@Override
public void setResourceFactory( final DavResourceFactory resourceFactory )
{
this.resourceFactory = resourceFactory;
}
@Override
public String getAuthenticateHeaderValue()
{
return AUTHENTICATE_HEADER_VALUE;
}
}