Search in sources :

Example 1 with CometFilter

use of org.apache.catalina.comet.CometFilter in project tomcat70 by apache.

the class ApplicationFilterChain method internalDoFilterEvent.

private void internalDoFilterEvent(CometEvent event) throws IOException, ServletException {
    // Call the next filter if there is one
    if (pos < n) {
        ApplicationFilterConfig filterConfig = filters[pos++];
        CometFilter filter = null;
        try {
            filter = (CometFilter) filterConfig.getFilter();
            if (Globals.IS_SECURITY_ENABLED) {
                final CometEvent ev = event;
                Principal principal = ev.getHttpServletRequest().getUserPrincipal();
                Object[] args = new Object[] { ev, this };
                SecurityUtil.doAsPrivilege("doFilterEvent", filter, cometClassType, args, principal);
            } else {
                filter.doFilterEvent(event, this);
            }
        /*support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
                        filter, event);*/
        } catch (IOException e) {
            /*
                if (filter != null)
                    support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
                            filter, event, e);
                            */
            throw e;
        } catch (ServletException e) {
            /*
                if (filter != null)
                    support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
                            filter, event, e);
                            */
            throw e;
        } catch (RuntimeException e) {
            /*
                if (filter != null)
                    support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
                            filter, event, e);
                            */
            throw e;
        } catch (Throwable e) {
            e = ExceptionUtils.unwrapInvocationTargetException(e);
            ExceptionUtils.handleThrowable(e);
            /*if (filter != null)
                    support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
                            filter, event, e);*/
            throw new ServletException(sm.getString("filterChain.filter"), e);
        }
        return;
    }
    // We fell off the end of the chain -- call the servlet instance
    try {
        /*
            support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT,
                    servlet, request, response);
                    */
        if (Globals.IS_SECURITY_ENABLED) {
            final CometEvent ev = event;
            Principal principal = ev.getHttpServletRequest().getUserPrincipal();
            Object[] args = new Object[] { ev };
            SecurityUtil.doAsPrivilege("event", servlet, classTypeUsedInEvent, args, principal);
        } else {
            ((CometProcessor) servlet).event(event);
        }
    /*
            support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
                    servlet, request, response);*/
    } catch (IOException e) {
        /*
            support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
                    servlet, request, response, e);
                    */
        throw e;
    } catch (ServletException e) {
        /*
            support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
                    servlet, request, response, e);
                    */
        throw e;
    } catch (RuntimeException e) {
        /*
            support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
                    servlet, request, response, e);
                    */
        throw e;
    } catch (Throwable e) {
        ExceptionUtils.handleThrowable(e);
        /*
            support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
                    servlet, request, response, e);
                    */
        throw new ServletException(sm.getString("filterChain.servlet"), e);
    }
}
Also used : ServletException(javax.servlet.ServletException) CometProcessor(org.apache.catalina.comet.CometProcessor) CometFilter(org.apache.catalina.comet.CometFilter) CometEvent(org.apache.catalina.comet.CometEvent) IOException(java.io.IOException) Principal(java.security.Principal)

Example 2 with CometFilter

use of org.apache.catalina.comet.CometFilter in project tomcat70 by apache.

the class ApplicationFilterFactory method createFilterChain.

/**
 * Construct and return a FilterChain implementation that will wrap the
 * execution of the specified servlet instance.  If we should not execute
 * a filter chain at all, return <code>null</code>.
 *
 * @param request The servlet request we are processing
 * @param servlet The servlet instance to be wrapped
 */
public ApplicationFilterChain createFilterChain(ServletRequest request, Wrapper wrapper, Servlet servlet) {
    // get the dispatcher type
    DispatcherType dispatcher = null;
    if (request.getAttribute(Globals.DISPATCHER_TYPE_ATTR) != null) {
        dispatcher = (DispatcherType) request.getAttribute(Globals.DISPATCHER_TYPE_ATTR);
    }
    String requestPath = null;
    Object attribute = request.getAttribute(Globals.DISPATCHER_REQUEST_PATH_ATTR);
    if (attribute != null) {
        requestPath = attribute.toString();
    }
    // If there is no servlet to execute, return null
    if (servlet == null)
        return (null);
    boolean comet = false;
    // Create and initialize a filter chain object
    ApplicationFilterChain filterChain = null;
    if (request instanceof Request) {
        Request req = (Request) request;
        comet = req.isComet();
        if (Globals.IS_SECURITY_ENABLED) {
            // Security: Do not recycle
            filterChain = new ApplicationFilterChain();
            if (comet) {
                req.setFilterChain(filterChain);
            }
        } else {
            filterChain = (ApplicationFilterChain) req.getFilterChain();
            if (filterChain == null) {
                filterChain = new ApplicationFilterChain();
                req.setFilterChain(filterChain);
            }
        }
    } else {
        // Request dispatcher in use
        filterChain = new ApplicationFilterChain();
    }
    filterChain.setServlet(servlet);
    filterChain.setSupport(((StandardWrapper) wrapper).getInstanceSupport());
    // Acquire the filter mappings for this Context
    StandardContext context = (StandardContext) wrapper.getParent();
    FilterMap[] filterMaps = context.findFilterMaps();
    // If there are no filter mappings, we are done
    if ((filterMaps == null) || (filterMaps.length == 0))
        return (filterChain);
    // Acquire the information we will need to match filter mappings
    String servletName = wrapper.getName();
    // Add the relevant path-mapped filters to this filter chain
    for (int i = 0; i < filterMaps.length; i++) {
        if (!matchDispatcher(filterMaps[i], dispatcher)) {
            continue;
        }
        if (!matchFiltersURL(filterMaps[i], requestPath))
            continue;
        ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) context.findFilterConfig(filterMaps[i].getFilterName());
        if (filterConfig == null) {
            // FIXME - log configuration problem
            continue;
        }
        boolean isCometFilter = false;
        if (comet) {
            try {
                isCometFilter = filterConfig.getFilter() instanceof CometFilter;
            } catch (Exception e) {
                // Note: The try catch is there because getFilter has a lot of
                // declared exceptions. However, the filter is allocated much
                // earlier
                Throwable t = ExceptionUtils.unwrapInvocationTargetException(e);
                ExceptionUtils.handleThrowable(t);
            }
            if (isCometFilter) {
                filterChain.addFilter(filterConfig);
            }
        } else {
            filterChain.addFilter(filterConfig);
        }
    }
    // Add filters that match on servlet name second
    for (int i = 0; i < filterMaps.length; i++) {
        if (!matchDispatcher(filterMaps[i], dispatcher)) {
            continue;
        }
        if (!matchFiltersServlet(filterMaps[i], servletName))
            continue;
        ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) context.findFilterConfig(filterMaps[i].getFilterName());
        if (filterConfig == null) {
            // FIXME - log configuration problem
            continue;
        }
        boolean isCometFilter = false;
        if (comet) {
            try {
                isCometFilter = filterConfig.getFilter() instanceof CometFilter;
            } catch (Exception e) {
            // Note: The try catch is there because getFilter has a lot of
            // declared exceptions. However, the filter is allocated much
            // earlier
            }
            if (isCometFilter) {
                filterChain.addFilter(filterConfig);
            }
        } else {
            filterChain.addFilter(filterConfig);
        }
    }
    // Return the completed filter chain
    return (filterChain);
}
Also used : CometFilter(org.apache.catalina.comet.CometFilter) Request(org.apache.catalina.connector.Request) ServletRequest(javax.servlet.ServletRequest) FilterMap(org.apache.catalina.deploy.FilterMap) DispatcherType(javax.servlet.DispatcherType)

Example 3 with CometFilter

use of org.apache.catalina.comet.CometFilter in project tomcat70 by apache.

the class SecurityUtil method doAsPrivilege.

/**
 * Perform work as a particular <code>Subject</code>. Here the work
 * will be granted to a <code>null</code> subject.
 *
 * @param methodName the method to apply the security restriction
 * @param targetObject the <code>Filter</code> on which the method will
 * be called.
 * @param targetParameterTypes <code>Class</code> array used to instantiate a
 * <code>Method</code> object.
 * @param targetParameterValues <code>Object</code> array contains the
 * runtime parameters instance.
 * @param principal the <code>Principal</code> to which the security
 * privilege apply
 */
public static void doAsPrivilege(final String methodName, final Filter targetObject, final Class<?>[] targetParameterTypes, final Object[] targetParameterValues, Principal principal) throws java.lang.Exception {
    // CometFilter instances must not be cached as Filter or
    // NoSuchMethodException will be thrown.
    Class<? extends Filter> targetType = targetObject instanceof CometFilter ? CometFilter.class : Filter.class;
    Method method = null;
    Method[] methodsCache = classCache.get(Filter.class);
    if (methodsCache == null) {
        method = createMethodAndCacheIt(methodsCache, targetType, methodName, targetParameterTypes);
    } else {
        method = findMethod(methodsCache, methodName);
        if (method == null) {
            method = createMethodAndCacheIt(methodsCache, targetType, methodName, targetParameterTypes);
        }
    }
    execute(method, targetObject, targetParameterValues, principal);
}
Also used : CometFilter(org.apache.catalina.comet.CometFilter) Method(java.lang.reflect.Method)

Aggregations

CometFilter (org.apache.catalina.comet.CometFilter)3 IOException (java.io.IOException)1 Method (java.lang.reflect.Method)1 Principal (java.security.Principal)1 DispatcherType (javax.servlet.DispatcherType)1 ServletException (javax.servlet.ServletException)1 ServletRequest (javax.servlet.ServletRequest)1 CometEvent (org.apache.catalina.comet.CometEvent)1 CometProcessor (org.apache.catalina.comet.CometProcessor)1 Request (org.apache.catalina.connector.Request)1 FilterMap (org.apache.catalina.deploy.FilterMap)1