/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package fedora.server.security.servletfilters;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Bill Niebel
*/
public class FilterSetup
extends Base
implements Filter {
protected static Log log = LogFactory.getLog(FilterSetup.class);
protected static final String NOT_SET = "NOT SET";
protected String FILTER_NAME = NOT_SET;
protected boolean inited = false;
public static final String getFilterNameAbbrev(String filterName) {
LogFactory.getLog(FilterSetup.class).debug(">>>>>>>>>>>>>>>>>>"
+ filterName);
String rc = filterName;
if ("XmlUserfileFilter".equals(filterName)) {
rc = "X";
} else if ("PubcookieFilter".equals(filterName)) {
rc = "P";
} else if ("LdapFilter".equals(filterName)) {
rc = "L";
} else if ("LdapFilterForAttributes".equals(filterName)) {
rc = "A";
} else if ("LdapFilterForGroups".equals(filterName)) {
rc = "G";
}
return rc;
}
public void init(FilterConfig filterConfig) {
String method = "init() ";
if (log.isDebugEnabled()) {
log.debug(enter(method));
}
inited = false;
initErrors = false;
if (filterConfig != null) {
FILTER_NAME = filterConfig.getFilterName();
if (FILTER_NAME == null || "".equals(FILTER_NAME)) {
if (log.isErrorEnabled()) {
log.error(format(method, "FILTER_NAME not set"));
}
} else {
if (log.isDebugEnabled()) {
log.debug(format(method, null, "FILTER_NAME", FILTER_NAME));
}
Enumeration enumer = filterConfig.getInitParameterNames();
while (enumer.hasMoreElements()) {
String key = (String) enumer.nextElement();
String value = filterConfig.getInitParameter(key);
initThisSubclass(key, value);
}
inited = true;
}
}
if (log.isDebugEnabled()) {
log.debug(exit(method));
}
}
public void destroy() {
String method = "destroy()";
if (log.isDebugEnabled()) {
log.debug(enter(method));
}
if (log.isDebugEnabled()) {
log.debug(exit(method));
}
}
@Override
protected void initThisSubclass(String key, String value) {
log.debug("AF.iTS");
String method = "initThisSubclass() ";
if (log.isDebugEnabled()) {
log.debug(enter(method));
}
super.initThisSubclass(key, value);
if (log.isDebugEnabled()) {
log.debug(exit(method));
}
}
public ExtendedHttpServletRequest wrap(HttpServletRequest httpServletRequest)
throws Exception {
String method = "wrap() ";
if (log.isDebugEnabled()) {
log.debug(enter(method));
}
ExtendedHttpServletRequestWrapper wrap =
new ExtendedHttpServletRequestWrapper(httpServletRequest);
if (log.isDebugEnabled()) {
log.debug(exit(method));
}
return wrap;
}
public boolean doThisSubclass(ExtendedHttpServletRequest extendedHttpServletRequest,
HttpServletResponse response)
throws Throwable {
String method = "doThisSubclass() ";
if (log.isDebugEnabled()) {
log.debug(enter(method));
}
String test = null;
test = "init";
if (!inited || initErrors) {
if (log.isErrorEnabled()) {
log.error("inited==" + inited);
}
if (log.isErrorEnabled()) {
log.error("initErrors==" + initErrors);
}
String msg = fail(method, test);
if (log.isErrorEnabled()) {
log.error(msg);
}
throw new Exception(msg);
}
if (log.isDebugEnabled()) {
log.debug(pass(method, test));
}
test = "HttpServletRequest";
if (!(extendedHttpServletRequest instanceof HttpServletRequest)) {
String msg = fail(method, test);
if (log.isErrorEnabled()) {
log.error(msg);
}
throw new Exception(msg);
}
if (log.isDebugEnabled()) {
log.debug(pass(method, test));
}
if (log.isDebugEnabled()) {
log.debug(exit(method));
}
return false; // i.e., don't signal to terminate servlet filter chain
}
public void doFilter(ServletRequest servletRequest,
ServletResponse response,
FilterChain chain) throws ServletException {
String method = "doFilter() ";
if (log.isDebugEnabled()) {
log.debug(enter(method));
}
if (log.isDebugEnabled()) {
log.debug(format(method, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"));
}
if (log.isDebugEnabled()) {
log.debug(format(method, "FILTER_NAME", FILTER_NAME));
}
String test = null;
boolean terminateServletFilterChain = false;
ExtendedHttpServletRequest extendedHttpServletRequest = null;
try {
//only one filter should wrap
if (servletRequest instanceof ExtendedHttpServletRequest) {
log.debug(format(method, "using existing request..."));
extendedHttpServletRequest =
(ExtendedHttpServletRequest) servletRequest;
} else {
if (log.isDebugEnabled()) {
log.debug(format(method, "wrapping request..."));
}
extendedHttpServletRequest =
wrap((HttpServletRequest) servletRequest);
}
test = "HttpServletResponse";
if (!(response instanceof HttpServletResponse)) {
String msg = fail(method, test);
if (log.isErrorEnabled()) {
log.error(msg);
}
throw new Exception(msg);
}
if (log.isDebugEnabled()) {
log.debug(pass(method, test));
}
terminateServletFilterChain =
doThisSubclass(extendedHttpServletRequest,
(HttpServletResponse) response);
} catch (Throwable th) {
showThrowable(th, log, "can't process this filter()");
//current filter should not break the filter chain -- go ahead, regardless of internal failure
}
try {
if (log.isDebugEnabled()) {
log.debug(format(method, "before next doFilter()"));
log.debug(format(method, null, "extendedHttpServletRequest")
+ extendedHttpServletRequest);
log.debug(format(method,
"extendedHttpServletRequest",
extendedHttpServletRequest.getClass()
.getName()));
log.debug(format(method, null, "response" + response));
}
if (terminateServletFilterChain) {
log.debug(format(method, "terminating servlet filter chain"));
} else {
chain.doFilter(extendedHttpServletRequest, response);
}
if (log.isDebugEnabled()) {
log.debug("back from next doFilter()");
}
} catch (ServletException e) {
throw e;
} catch (Throwable th) {
showThrowable(th, log, "can't do next doFilter()");
} finally {
if (log.isDebugEnabled()) {
log.debug(exit(method));
}
}
}
}