/*
* Copyright (c) 2008-2013 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.security.authentication;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.WebApplicationException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.svcs.errorhandling.resources.APIException;
import com.emc.storageos.svcs.errorhandling.resources.InternalException;
import com.emc.storageos.svcs.errorhandling.mappers.ServiceCodeExceptionMapper;
/**
* Abstract class for all other authentications we will need to support
*/
public abstract class AbstractAuthenticationFilter extends AbstractRequestWrapperFilter {
private static final Logger _log = LoggerFactory.getLogger(AbstractAuthenticationFilter.class);
/**
* Forward the request to resource handler, we are done authenticating it
*
* @param servletRequest
* @param servletResponse
* @param reqWrapper
* @throws IOException
* @throws ServletException
*/
protected void forwardToService(final ServletRequest servletRequest,
final ServletResponse servletResponse,
final AbstractRequestWrapper reqWrapper)
throws IOException, ServletException {
try {
HttpServletRequest req = (HttpServletRequest) servletRequest;
servletRequest.getRequestDispatcher(req.getRequestURI()).forward(reqWrapper, servletResponse);
} catch (WebApplicationException e) {
if (ServiceCodeExceptionMapper.isStackTracePrinted(e)) {
_log.warn("caught WebApplicationException", e);
} else {
_log.warn("caught WebApplicationException: {}", e.getMessage());
}
HttpServletResponse reponse = (HttpServletResponse) servletResponse;
reponse.sendError(toHTTPStatus(e), toServiceErrorXml(e));
}
}
@Override
public void doFilter(final ServletRequest servletRequest,
final ServletResponse servletResponse,
final FilterChain filterChain) throws IOException, ServletException {
final HttpServletResponse response = (HttpServletResponse) servletResponse;
final HttpServletRequest request = (HttpServletRequest) servletRequest;
AbstractRequestWrapper reqWrapper = null;
try {
reqWrapper = authenticate(servletRequest);
} catch (APIException e) {
_log.debug("unauthorized request: serviceUrl = " + request.getRequestURI(), e);
response.sendError(toHTTPStatus(e), toServiceErrorXml(e));
return;
} catch (final InternalException e) {
response.sendError(toHTTPStatus(e), toServiceErrorXml(e));
return;
}
if (reqWrapper != null) {
// we are done, forward it to resource service
forwardToService(servletRequest, servletResponse, reqWrapper);
} else {
// not mine, forward it on to the next filter
filterChain.doFilter(servletRequest, servletResponse);
}
}
}