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