/**
* Licensed 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.brixcms.rmiserver.web.dav;
import org.apache.jackrabbit.server.CredentialsProvider;
import org.apache.jackrabbit.server.SessionProvider;
import org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet;
import org.brixcms.rmiserver.Role;
import org.brixcms.rmiserver.UserService;
import org.brixcms.rmiserver.jackrabbit.AuthorizationException;
import org.brixcms.rmiserver.jackrabbit.Authorizer;
import org.springframework.beans.factory.BeanFactoryUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.jcr.Credentials;
import javax.jcr.LoginException;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
public class WebDavServlet extends SimpleWebdavServlet {
private static final long serialVersionUID = 1L;
private Repository repository;
private CredentialsProvider credentialsProvider;
private Authorizer authorizer;
public WebDavServlet() {
}
// FIXME look into this
// @Override
// public synchronized SessionProvider getSessionProvider()
// {
// final SessionProvider original = super.getSessionProvider();
//
// return new SessionProvider()
// {
// public Session getSession(HttpServletRequest request, Repository rep, String workspace)
// throws LoginException, ServletException, RepositoryException
// {
//
// final String key = Brix.NS_PREFIX + "jcr-session";
// Session s = (Session)request.getAttribute(key);
// if (s == null)
// {
// s = EventUtil.wrapSession(original.getSession(request, rep, workspace));
// request.setAttribute(key, s);
// }
// return s;
// }
//
// public void releaseSession(Session session)
// {
// original.releaseSession(EventUtil.unwrapSession(session));
// }
// };
// }
@Override
public Repository getRepository() {
return repository;
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
final ServletContext sc = config.getServletContext();
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(sc);
if (context == null) {
throw new IllegalStateException("Could not find application context");
}
repository = (Repository) BeanFactoryUtils.beanOfTypeIncludingAncestors(context,
Repository.class);
if (repository == null) {
throw new IllegalStateException(
"Could not find JackRabbit repository in spring context");
}
UserService users = (UserService) BeanFactoryUtils.beanOfTypeIncludingAncestors(context,
UserService.class);
if (repository == null) {
throw new IllegalStateException(
"Could not find UserService implementation in spring context");
}
authorizer = new Authorizer(users);
credentialsProvider = getCredentialsProvider();
}
@Override
public synchronized SessionProvider getSessionProvider() {
final SessionProvider provider = super.getSessionProvider();
return new SecureSessionProvider(provider);
}
/**
* Session provider decorator that authorizes the user
*
* @author ivaynberg
*/
private final class SecureSessionProvider implements SessionProvider {
private final SessionProvider delegate;
private SecureSessionProvider(SessionProvider delegate) {
this.delegate = delegate;
}
public Session getSession(HttpServletRequest request, Repository rep, String workspace)
throws LoginException, ServletException, RepositoryException {
Credentials creds = credentialsProvider.getCredentials(request);
try {
authorizer.authorize(creds, Role.WEBDAV);
} catch (AuthorizationException e) {
throw new LoginException(e.getMessage(), e);
}
return delegate.getSession(request, rep, workspace);
}
public void releaseSession(Session session) {
delegate.releaseSession(session);
}
}
}