You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by sh...@apache.org on 2016/09/06 10:05:59 UTC

svn commit: r1759401 - /ofbiz/trunk/specialpurpose/solr/src/main/java/org/apache/ofbiz/solr/webapp/OFBizSolrContextFilter.java

Author: shijh
Date: Tue Sep  6 10:05:59 2016
New Revision: 1759401

URL: http://svn.apache.org/viewvc?rev=1759401&view=rev
Log:
Clean OFBizSolrContextFilter.java to follow ContextFilter.java's changes.

Modified:
    ofbiz/trunk/specialpurpose/solr/src/main/java/org/apache/ofbiz/solr/webapp/OFBizSolrContextFilter.java

Modified: ofbiz/trunk/specialpurpose/solr/src/main/java/org/apache/ofbiz/solr/webapp/OFBizSolrContextFilter.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/solr/src/main/java/org/apache/ofbiz/solr/webapp/OFBizSolrContextFilter.java?rev=1759401&r1=1759400&r2=1759401&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/solr/src/main/java/org/apache/ofbiz/solr/webapp/OFBizSolrContextFilter.java (original)
+++ ofbiz/trunk/specialpurpose/solr/src/main/java/org/apache/ofbiz/solr/webapp/OFBizSolrContextFilter.java Tue Sep  6 10:05:59 2016
@@ -22,17 +22,11 @@ import static org.apache.ofbiz.base.util
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Enumeration;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.Set;
-
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
-import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
@@ -49,37 +43,27 @@ import org.apache.ofbiz.base.conversion.
 import org.apache.ofbiz.base.lang.JSON;
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.StringUtil;
-import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.base.util.UtilHttp;
 import org.apache.ofbiz.base.util.UtilMisc;
 import org.apache.ofbiz.base.util.UtilObject;
 import org.apache.ofbiz.base.util.UtilTimer;
 import org.apache.ofbiz.base.util.UtilValidate;
-import org.apache.ofbiz.entity.Delegator;
-import org.apache.ofbiz.entity.DelegatorFactory;
-import org.apache.ofbiz.entity.GenericEntityException;
 import org.apache.ofbiz.entity.GenericValue;
-import org.apache.ofbiz.entity.util.EntityQuery;
-import org.apache.ofbiz.entity.util.EntityUtil;
 import org.apache.ofbiz.security.Security;
-import org.apache.ofbiz.security.SecurityConfigurationException;
-import org.apache.ofbiz.security.SecurityFactory;
-import org.apache.ofbiz.service.LocalDispatcher;
-import org.apache.ofbiz.service.ServiceContainer;
+import org.apache.ofbiz.webapp.WebAppUtil;
+import org.apache.ofbiz.webapp.control.ContextFilter;
 import org.apache.ofbiz.webapp.control.LoginWorker;
-import org.apache.ofbiz.webapp.event.RequestBodyMapHandlerFactory;
 import org.apache.ofbiz.webapp.website.WebSiteWorker;
 
 /**
- * ContextFilter - Restricts access to raw files and configures servlet objects.
+ * OFBizSolrContextFilter - Restricts access to solr urls.
  */
 public class OFBizSolrContextFilter extends SolrDispatchFilter {
 
     public static final String module = OFBizSolrContextFilter.class.getName();
-    public static final String FORWARDED_FROM_SERVLET = "_FORWARDED_FROM_SERVLET_";
 
+    protected ContextFilter contextFilter = null;
     protected FilterConfig config = null;
-    protected boolean debug = false;
     
     /**
      * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
@@ -87,27 +71,8 @@ public class OFBizSolrContextFilter exte
     public void init(FilterConfig config) throws ServletException {
         super.init(config);
         this.config = config;
-
-        // puts all init-parameters in ServletContext attributes for easier parameterization without code changes
-        this.putAllInitParametersInAttributes();
-
-        // set debug
-        this.debug = "true".equalsIgnoreCase(config.getInitParameter("debug"));
-        if (!debug) {
-            debug = Debug.verboseOn();
-        }
-
-        // check the serverId
-        getServerId();
-        // initialize the delegator
-        getDelegator(config.getServletContext());
-        // initialize security
-        getSecurity();
-        // initialize the services dispatcher
-        getDispatcher(config.getServletContext());
-
-        // this will speed up the initial sessionId generation
-        new java.security.SecureRandom().nextLong();
+        contextFilter = new ContextFilter();
+        contextFilter.init(config);
     }
 
     /**
@@ -174,7 +139,7 @@ public class OFBizSolrContextFilter exte
 
         String servletPath = httpRequest.getServletPath();
         if (UtilValidate.isNotEmpty(servletPath) && servletPath.equals("/control")) {
-            doControlFilter(request, response, chain);
+        	contextFilter.doFilter(httpRequest, httpResponse, chain);
             // we're done checking; continue on
             chain.doFilter(request, response);
         } else {
@@ -192,7 +157,7 @@ public class OFBizSolrContextFilter exte
                     }
                 }
                 if (security == null) {
-                    security = getSecurity();
+                    security = WebAppUtil.getSecurity(httpRequest.getServletContext());
                     if (security != null) {
                         request.setAttribute("security", security);
                     }
@@ -351,293 +316,15 @@ public class OFBizSolrContextFilter exte
         }
     }
 
-    private void doControlFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
-        HttpServletRequest httpRequest = (HttpServletRequest) request;
-        HttpServletResponse httpResponse = (HttpServletResponse) response;
-        
-        // test to see if we have come through the control servlet already, if not do the processing
-        String requestPath = null;
-        String contextUri = null;
-        if (httpRequest.getAttribute(FORWARDED_FROM_SERVLET) == null) {
-            // Debug.logInfo("In ContextFilter.doFilter, FORWARDED_FROM_SERVLET is NOT set", module);
-            String allowedPath = config.getInitParameter("allowedPaths");
-            String redirectPath = config.getInitParameter("redirectPath");
-            String errorCode = config.getInitParameter("errorCode");
-
-            List<String> allowList = null;
-            if ((allowList = StringUtil.split(allowedPath, ":")) != null) {
-                allowList.add("/");  // No path is allowed.
-                allowList.add("");   // No path is allowed.
-            }
-
-            if (debug) Debug.logInfo("[Domain]: " + httpRequest.getServerName() + " [Request]: " + httpRequest.getRequestURI(), module);
-
-            requestPath = httpRequest.getServletPath();
-            if (requestPath == null) requestPath = "";
-            if (requestPath.lastIndexOf("/") > 0) {
-                if (requestPath.indexOf("/") == 0) {
-                    requestPath = "/" + requestPath.substring(1, requestPath.indexOf("/", 1));
-                } else {
-                    requestPath = requestPath.substring(1, requestPath.indexOf("/"));
-                }
-            }
-
-            String requestInfo = httpRequest.getServletPath();
-            if (requestInfo == null) requestInfo = "";
-            if (requestInfo.lastIndexOf("/") >= 0) {
-                requestInfo = requestInfo.substring(0, requestInfo.lastIndexOf("/")) + "/*";
-            }
-
-            StringBuilder contextUriBuffer = new StringBuilder();
-            if (httpRequest.getContextPath() != null) {
-                contextUriBuffer.append(httpRequest.getContextPath());
-            }
-            if (httpRequest.getServletPath() != null) {
-                contextUriBuffer.append(httpRequest.getServletPath());
-            }
-            if (httpRequest.getPathInfo() != null) {
-                contextUriBuffer.append(httpRequest.getPathInfo());
-            }
-            contextUri = contextUriBuffer.toString();
-
-            // Verbose Debugging
-            if (Debug.verboseOn()) {
-                if (allowList != null) {
-                    for (String allow: allowList) {
-                        Debug.logVerbose("[Allow]: " + allow, module);
-                    }
-                }
-                Debug.logVerbose("[Request path]: " + requestPath, module);
-                Debug.logVerbose("[Request info]: " + requestInfo, module);
-                Debug.logVerbose("[Servlet path]: " + httpRequest.getServletPath(), module);
-            }
-
-            // check to make sure the requested url is allowed
-            if (allowList != null &&
-                (!allowList.contains(requestPath) && !allowList.contains(requestInfo) && !allowList.contains(httpRequest.getServletPath()))
-                ) {
-                String filterMessage = "[Filtered request]: " + contextUri;
-                
-                if (redirectPath == null) {
-                    int error = 404;
-                    if (UtilValidate.isNotEmpty(errorCode)) {
-                        try {
-                            error = Integer.parseInt(errorCode);
-                        } catch (NumberFormatException nfe) {
-                            Debug.logWarning(nfe, "Error code specified would not parse to Integer : " + errorCode, module);
-                        }
-                    }
-                    filterMessage = filterMessage + " (" + error + ")";
-                    httpResponse.sendError(error, contextUri);
-                    request.setAttribute("filterRequestUriError", contextUri);
-                } else {
-                    filterMessage = filterMessage + " (" + redirectPath + ")";
-                    if (!redirectPath.toLowerCase().startsWith("http")) {
-                        redirectPath = httpRequest.getContextPath() + redirectPath;
-                    }
-                    httpResponse.sendRedirect(redirectPath);
-                }
-                Debug.logWarning(filterMessage, module);
-                return;
-            }
-        }
-
-        setCharacterEncoding(httpRequest);
-        setAttributesFromRequestBody(httpRequest);
-        // check if multi tenant is enabled
-        boolean useMultitenant = EntityUtil.isMultiTenantEnabled();
-        if (useMultitenant) {
-            // get tenant delegator by domain name
-            String serverName = httpRequest.getServerName();
-            try {
-                // if tenant was specified, replace delegator with the new per-tenant delegator and set tenantId to session attribute
-                Delegator delegator = getDelegator(config.getServletContext());
-
-                //Use base delegator for fetching data from entity of entityGroup org.apache.ofbiz.tenant
-                Delegator baseDelegator = DelegatorFactory.getDelegator(delegator.getDelegatorBaseName());
-                GenericValue tenantDomainName = EntityQuery.use(baseDelegator).from("TenantDomainName").where("domainName", serverName).queryOne();
-                String tenantId = null;
-                if(UtilValidate.isNotEmpty(tenantDomainName)) {
-                    tenantId = tenantDomainName.getString("tenantId");
-                }
-                
-                if(UtilValidate.isEmpty(tenantId)) {
-                    tenantId = (String) httpRequest.getAttribute("userTenantId");
-                }
-                if(UtilValidate.isEmpty(tenantId)) {
-                    tenantId = (String) httpRequest.getParameter("userTenantId");
-                }
-                if (UtilValidate.isNotEmpty(tenantId)) {
-                    // if the request path is a root mount then redirect to the initial path
-                    if (UtilValidate.isNotEmpty(requestPath) && requestPath.equals(contextUri)) {
-                        GenericValue tenant = EntityQuery.use(baseDelegator).from("Tenant").where("tenantId", tenantId).queryOne();
-                        String initialPath = tenant.getString("initialPath");
-                        if (UtilValidate.isNotEmpty(initialPath) && !"/".equals(initialPath)) {
-                            ((HttpServletResponse)response).sendRedirect(initialPath);
-                            return;
-                        }
-                    }
-
-                    // make that tenant active, setup a new delegator and a new dispatcher
-                    String tenantDelegatorName = delegator.getDelegatorBaseName() + "#" + tenantId;
-                    httpRequest.getSession().setAttribute("delegatorName", tenantDelegatorName);
-
-                    // after this line the delegator is replaced with the new per-tenant delegator
-                    delegator = DelegatorFactory.getDelegator(tenantDelegatorName);
-                    config.getServletContext().setAttribute("delegator", delegator);
-
-                    // clear web context objects
-                    config.getServletContext().setAttribute("security", null);
-                    config.getServletContext().setAttribute("dispatcher", null);
-
-                    // initialize security
-                    Security security = getSecurity();
-                    // initialize the services dispatcher
-                    LocalDispatcher dispatcher = getDispatcher(config.getServletContext());
-
-                    // set web context objects
-                    request.setAttribute("dispatcher", dispatcher);
-                    request.setAttribute("security", security);
-                    
-                    request.setAttribute("userTenantId", tenantId);
-                }
-
-                // NOTE DEJ20101130: do NOT always put the delegator name in the user's session because the user may 
-                // have logged in and specified a tenant, and even if no Tenant record with a matching domainName field 
-                // is found this will change the user's delegator back to the base one instead of the one for the 
-                // tenant specified on login 
-                // httpRequest.getSession().setAttribute("delegatorName", delegator.getDelegatorName());
-            } catch (GenericEntityException e) {
-                Debug.logWarning(e, "Unable to get Tenant", module);
-            }
-        }
-    }
-
     /**
      * @see javax.servlet.Filter#destroy()
      */
     public void destroy() {
         super.destroy();
-        getDispatcher(config.getServletContext()).deregister();
+        contextFilter.destroy();
         config = null;
     }
 
-    protected static LocalDispatcher getDispatcher(ServletContext servletContext) {
-        LocalDispatcher dispatcher = (LocalDispatcher) servletContext.getAttribute("dispatcher");
-        if (dispatcher == null) {
-            Delegator delegator = getDelegator(servletContext);
-            dispatcher = makeWebappDispatcher(servletContext, delegator);
-            servletContext.setAttribute("dispatcher", dispatcher);
-        }
-        return dispatcher;
-    }
-
-    public static void setCharacterEncoding(ServletRequest request) throws UnsupportedEncodingException {
-        String charset = request.getServletContext().getInitParameter("charset");
-        if (UtilValidate.isEmpty(charset)) charset = request.getCharacterEncoding();
-        if (UtilValidate.isEmpty(charset)) charset = "UTF-8";
-        if (Debug.verboseOn()) Debug.logVerbose("The character encoding of the request is: [" + request.getCharacterEncoding() + "]. The character encoding we will use for the request is: [" + charset + "]", module);
-
-        if (!"none".equals(charset)) {
-            request.setCharacterEncoding(charset);
-        }
-    }
-
-    public static void setAttributesFromRequestBody(ServletRequest request) {
-        // read the body (for JSON requests) and set the parameters as attributes:
-        Map<String, Object> requestBodyMap = null;
-        try {
-            requestBodyMap = RequestBodyMapHandlerFactory.extractMapFromRequestBody(request);
-        } catch (IOException ioe) {
-            Debug.logWarning(ioe, module);
-        }
-        if (requestBodyMap != null) {
-            Set<String> parameterNames = requestBodyMap.keySet();
-            for (String parameterName: parameterNames) {
-                request.setAttribute(parameterName, requestBodyMap.get(parameterName));
-            }
-        }
-    }
-
-    /** This method only sets up a dispatcher for the current webapp and passed in delegator, it does not save it to the ServletContext or anywhere else, just returns it */
-    public static LocalDispatcher makeWebappDispatcher(ServletContext servletContext, Delegator delegator) {
-        if (delegator == null) {
-            Debug.logError("[ContextFilter.init] ERROR: delegator not defined.", module);
-            return null;
-        }
-        // get the unique name of this dispatcher
-        String dispatcherName = servletContext.getInitParameter("localDispatcherName");
-
-        if (dispatcherName == null) {
-            Debug.logError("No localDispatcherName specified in the web.xml file", module);
-            dispatcherName = delegator.getDelegatorName();
-        }
-
-        LocalDispatcher dispatcher = ServiceContainer.getLocalDispatcher(dispatcherName, delegator);
-        if (dispatcher == null) {
-            Debug.logError("[ContextFilter.init] ERROR: dispatcher could not be initialized.", module);
-        }
-
-        return dispatcher;
-    }
-
-    protected static Delegator getDelegator(ServletContext servletContext) {
-        Delegator delegator = (Delegator) servletContext.getAttribute("delegator");
-        if (delegator == null) {
-            String delegatorName = servletContext.getInitParameter("entityDelegatorName");
-
-            if (UtilValidate.isEmpty(delegatorName)) {
-                delegatorName = "default";
-            }
-            if (Debug.verboseOn()) Debug.logVerbose("Setup Entity Engine Delegator with name " + delegatorName, module);
-            delegator = DelegatorFactory.getDelegator(delegatorName);
-            servletContext.setAttribute("delegator", delegator);
-            if (delegator == null) {
-                Debug.logError("[ContextFilter.init] ERROR: delegator factory returned null for delegatorName \"" + delegatorName + "\"", module);
-            }
-        }
-        return delegator;
-    }
-
-    protected Security getSecurity() {
-        Security security = (Security) config.getServletContext().getAttribute("security");
-        if (security == null) {
-            Delegator delegator = (Delegator) config.getServletContext().getAttribute("delegator");
-
-            if (delegator != null) {
-                try {
-                    security = SecurityFactory.getInstance(delegator);
-                } catch (SecurityConfigurationException e) {
-                    Debug.logError(e, "Unable to obtain an instance of the security object.", module);
-                }
-            }
-            config.getServletContext().setAttribute("security", security);
-            if (security == null) {
-                Debug.logError("An invalid (null) Security object has been set in the servlet context.", module);
-            }
-        }
-        return security;
-    }
-
-    protected void putAllInitParametersInAttributes() {
-        Enumeration<String> initParamEnum = UtilGenerics.cast(config.getServletContext().getInitParameterNames());
-        while (initParamEnum.hasMoreElements()) {
-            String initParamName = initParamEnum.nextElement();
-            String initParamValue = config.getServletContext().getInitParameter(initParamName);
-            if (Debug.verboseOn()) Debug.logVerbose("Adding web.xml context-param to application attribute with name [" + initParamName + "] and value [" + initParamValue + "]", module);
-            config.getServletContext().setAttribute(initParamName, initParamValue);
-        }
-    }
-
-    protected String getServerId() {
-        String serverId = (String) config.getServletContext().getAttribute("_serverId");
-        if (serverId == null) {
-            serverId = config.getServletContext().getInitParameter("ofbizServerName");
-            config.getServletContext().setAttribute("_serverId", serverId);
-        }
-        return serverId;
-    }
-
     /**
      * Override this to change CoreContainer initialization
      * @return a CoreContainer to hold this server's cores