|
@@ -1,4 +1,4 @@
|
|
-/* Copyright 2004 Acegi Technology Pty Limited
|
|
|
|
|
|
+/* Copyright 2004, 2005 Acegi Technology Pty Limited
|
|
*
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* you may not use this file except in compliance with the License.
|
|
@@ -12,6 +12,7 @@
|
|
* See the License for the specific language governing permissions and
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
* limitations under the License.
|
|
*/
|
|
*/
|
|
|
|
+
|
|
package net.sf.acegisecurity.captcha;
|
|
package net.sf.acegisecurity.captcha;
|
|
|
|
|
|
import net.sf.acegisecurity.securechannel.ChannelEntryPoint;
|
|
import net.sf.acegisecurity.securechannel.ChannelEntryPoint;
|
|
@@ -19,234 +20,278 @@ import net.sf.acegisecurity.util.PortMapper;
|
|
import net.sf.acegisecurity.util.PortMapperImpl;
|
|
import net.sf.acegisecurity.util.PortMapperImpl;
|
|
import net.sf.acegisecurity.util.PortResolver;
|
|
import net.sf.acegisecurity.util.PortResolver;
|
|
import net.sf.acegisecurity.util.PortResolverImpl;
|
|
import net.sf.acegisecurity.util.PortResolverImpl;
|
|
|
|
+
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
|
+
|
|
import org.springframework.beans.factory.InitializingBean;
|
|
import org.springframework.beans.factory.InitializingBean;
|
|
|
|
+
|
|
import org.springframework.util.Assert;
|
|
import org.springframework.util.Assert;
|
|
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.io.UnsupportedEncodingException;
|
|
|
|
+
|
|
|
|
+import java.net.URLEncoder;
|
|
|
|
+
|
|
|
|
+import java.util.Enumeration;
|
|
|
|
+
|
|
import javax.servlet.ServletException;
|
|
import javax.servlet.ServletException;
|
|
import javax.servlet.ServletRequest;
|
|
import javax.servlet.ServletRequest;
|
|
import javax.servlet.ServletResponse;
|
|
import javax.servlet.ServletResponse;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
-import java.io.IOException;
|
|
|
|
-import java.io.UnsupportedEncodingException;
|
|
|
|
-import java.net.URLEncoder;
|
|
|
|
-import java.util.Enumeration;
|
|
|
|
|
|
+
|
|
|
|
|
|
/**
|
|
/**
|
|
- * The captcha entry point : redirect to the captcha test page. <br/>
|
|
|
|
- * <p/>
|
|
|
|
- * This entry point can force the use of SSL : see {@link #getForceHttps()}<br/>
|
|
|
|
- * <p/>
|
|
|
|
- * This entry point allows internal OR external redirect : see {@link #setOutsideWebApp(boolean)}<br/>/ Original request
|
|
|
|
- * can be added to the redirect path using a custom translation : see {@link #setIncludeOriginalRequest(boolean)} <br/>
|
|
|
|
- * Original request is translated using URLEncoding and the following translation mapping in the redirect url : <ul>
|
|
|
|
- * <li>original url => {@link #getOriginalRequestUrlParameterName()}</li> <li> If {@link
|
|
|
|
- * #isIncludeOriginalParameters()}</li> <li>original method => {@link #getOriginalRequestMethodParameterName()} </li>
|
|
|
|
- * <li>original parameters => {@link #getOriginalRequestParametersParameterName()} </li> <li>The orinial parameters
|
|
|
|
- * string is contructed using :</li> <ul> <li>a parameter separator {@link #getOriginalRequestParametersSeparator()}
|
|
|
|
- * </li> <li>a parameter name value pair separator for each parameter {@link #getOriginalRequestParametersNameValueSeparator()}
|
|
|
|
- * </li> </ul> </ul>
|
|
|
|
- * <p/>
|
|
|
|
- * <p/>
|
|
|
|
- * <p/>
|
|
|
|
- * <br/> Default values :<br/> forceHttps = false<br/> includesOriginalRequest = true<br/> includesOriginalParameters =
|
|
|
|
- * false<br/> isOutsideWebApp=false<br/> originalRequestUrlParameterName ="original_requestUrl" <br/>
|
|
|
|
- * originalRequestParametersParameterName = "original_request_parameters";<br/>
|
|
|
|
- * <p/>
|
|
|
|
- * originalRequestParametersNameValueSeparator = "@@"; <br/>
|
|
|
|
- * <p/>
|
|
|
|
- * originalRequestParametersSeparator = ";;"; <br/>
|
|
|
|
- * <p/>
|
|
|
|
- * originalRequestMethodParameterName = "original_request_method"; <br/>
|
|
|
|
- * <p/>
|
|
|
|
- * urlEncodingCharset = "UTF-8"; <br/>
|
|
|
|
|
|
+ * The captcha entry point : redirect to the captcha test page. <br>
|
|
|
|
+ *
|
|
|
|
+ * <p>
|
|
|
|
+ * This entry point can force the use of SSL : see {@link #getForceHttps()}<br>
|
|
|
|
+ * </p>
|
|
|
|
+ * This entry point allows internal OR external redirect : see {@link #setOutsideWebApp(boolean)}<br>
|
|
|
|
+ * / Original request can be added to the redirect path using a custom
|
|
|
|
+ * translation : see {@link #setIncludeOriginalRequest(boolean)}<br>
|
|
|
|
+ * Original request is translated using URLEncoding and the following
|
|
|
|
+ * translation mapping in the redirect url :
|
|
|
|
+ *
|
|
|
|
+ * <ul>
|
|
|
|
+ * <li>
|
|
|
|
+ * original url => {@link #getOriginalRequestUrlParameterName()}
|
|
|
|
+ * </li>
|
|
|
|
+ * <li>
|
|
|
|
+ * If {@link #isIncludeOriginalParameters()}
|
|
|
|
+ * </li>
|
|
|
|
+ * <li>
|
|
|
|
+ * original method => {@link #getOriginalRequestMethodParameterName()}
|
|
|
|
+ * </li>
|
|
|
|
+ * <li>
|
|
|
|
+ * original parameters => {@link #getOriginalRequestParametersParameterName()}
|
|
|
|
+ * </li>
|
|
|
|
+ * <li>
|
|
|
|
+ * The original parameters string is contructed using :
|
|
|
|
+ *
|
|
|
|
+ * <ul>
|
|
|
|
+ * <li>
|
|
|
|
+ * a parameter separator {@link #getOriginalRequestParametersSeparator()}
|
|
|
|
+ * </li>
|
|
|
|
+ * <li>
|
|
|
|
+ * a parameter name value pair separator for each parameter {@link
|
|
|
|
+ * #getOriginalRequestParametersNameValueSeparator()}
|
|
|
|
+ * </li>
|
|
|
|
+ * </ul>
|
|
|
|
+ *
|
|
|
|
+ * </li>
|
|
|
|
+ * </ul>
|
|
|
|
+ *
|
|
|
|
+ * <br><br>
|
|
|
|
+ * Default values :<br>
|
|
|
|
+ * forceHttps = false<br>
|
|
|
|
+ * includesOriginalRequest = true<br>
|
|
|
|
+ * includesOriginalParameters = false<br>
|
|
|
|
+ * isOutsideWebApp=false<br>
|
|
|
|
+ * originalRequestUrlParameterName =original_requestUrl <br>
|
|
|
|
+ * originalRequestParametersParameterName = original_request_parameters<br>
|
|
|
|
+ * originalRequestParametersNameValueSeparator = __ <br>
|
|
|
|
+ * originalRequestParametersSeparator = ;; <br>
|
|
|
|
+ * originalRequestMethodParameterName = original_request_method <br>
|
|
|
|
+ * urlEncodingCharset = UTF-8<br>
|
|
*
|
|
*
|
|
* @author marc antoine Garrigue
|
|
* @author marc antoine Garrigue
|
|
* @version $Id$
|
|
* @version $Id$
|
|
*/
|
|
*/
|
|
public class CaptchaEntryPoint implements ChannelEntryPoint, InitializingBean {
|
|
public class CaptchaEntryPoint implements ChannelEntryPoint, InitializingBean {
|
|
|
|
+ //~ Static fields/initializers =============================================
|
|
|
|
+
|
|
// ~ Static fields/initializers
|
|
// ~ Static fields/initializers
|
|
// =============================================
|
|
// =============================================
|
|
|
|
+ private static final Log logger = LogFactory.getLog(CaptchaEntryPoint.class);
|
|
|
|
|
|
- private static final Log logger = LogFactory
|
|
|
|
- .getLog(CaptchaEntryPoint.class);
|
|
|
|
|
|
+ //~ Instance fields ========================================================
|
|
|
|
|
|
// ~ Instance fields
|
|
// ~ Instance fields
|
|
// ========================================================
|
|
// ========================================================
|
|
-
|
|
|
|
private PortMapper portMapper = new PortMapperImpl();
|
|
private PortMapper portMapper = new PortMapperImpl();
|
|
-
|
|
|
|
private PortResolver portResolver = new PortResolverImpl();
|
|
private PortResolver portResolver = new PortResolverImpl();
|
|
-
|
|
|
|
private String captchaFormUrl;
|
|
private String captchaFormUrl;
|
|
-
|
|
|
|
- private boolean forceHttps = false;
|
|
|
|
-
|
|
|
|
- private String originalRequestUrlParameterName = "original_requestUrl";
|
|
|
|
-
|
|
|
|
|
|
+ private String originalRequestMethodParameterName = "original_request_method";
|
|
|
|
+ private String originalRequestParametersNameValueSeparator = "__";
|
|
private String originalRequestParametersParameterName = "original_request_parameters";
|
|
private String originalRequestParametersParameterName = "original_request_parameters";
|
|
-
|
|
|
|
- private String originalRequestParametersNameValueSeparator = "@@";
|
|
|
|
-
|
|
|
|
private String originalRequestParametersSeparator = ";;";
|
|
private String originalRequestParametersSeparator = ";;";
|
|
-
|
|
|
|
- private String originalRequestMethodParameterName = "original_request_method";
|
|
|
|
-
|
|
|
|
|
|
+ private String originalRequestUrlParameterName = "original_requestUrl";
|
|
private String urlEncodingCharset = "UTF-8";
|
|
private String urlEncodingCharset = "UTF-8";
|
|
-
|
|
|
|
- private boolean isOutsideWebApp = false;
|
|
|
|
-
|
|
|
|
- private boolean includeOriginalRequest = true;
|
|
|
|
-
|
|
|
|
|
|
+ private boolean forceHttps = false;
|
|
private boolean includeOriginalParameters = false;
|
|
private boolean includeOriginalParameters = false;
|
|
|
|
+ private boolean includeOriginalRequest = true;
|
|
|
|
+ private boolean isOutsideWebApp = false;
|
|
|
|
|
|
- // ~ Methods
|
|
|
|
- // ================================================================
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Set to true to force captcha form access to be via https. If this value is ture (the default is false), and the
|
|
|
|
- * incoming request for the protected resource which triggered the interceptor was not already <code>https</code>,
|
|
|
|
- * then
|
|
|
|
- */
|
|
|
|
- public void setForceHttps(boolean forceHttps) {
|
|
|
|
- this.forceHttps = forceHttps;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public boolean getForceHttps() {
|
|
|
|
- return forceHttps;
|
|
|
|
- }
|
|
|
|
|
|
+ //~ Methods ================================================================
|
|
|
|
|
|
/**
|
|
/**
|
|
- * The URL where the <code>CaptchaProcessingFilter</code> login page can be found. Should be relative to the web-app
|
|
|
|
- * context path, and include a leading <code>/</code>
|
|
|
|
|
|
+ * The URL where the <code>CaptchaProcessingFilter</code> login page can be
|
|
|
|
+ * found. Should be relative to the web-app context path, and include a
|
|
|
|
+ * leading <code>/</code>
|
|
|
|
+ *
|
|
|
|
+ * @param captchaFormUrl
|
|
*/
|
|
*/
|
|
public void setCaptchaFormUrl(String captchaFormUrl) {
|
|
public void setCaptchaFormUrl(String captchaFormUrl) {
|
|
this.captchaFormUrl = captchaFormUrl;
|
|
this.captchaFormUrl = captchaFormUrl;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
|
|
+ * DOCUMENT ME!
|
|
|
|
+ *
|
|
* @return the captcha test page to redirect to.
|
|
* @return the captcha test page to redirect to.
|
|
*/
|
|
*/
|
|
public String getCaptchaFormUrl() {
|
|
public String getCaptchaFormUrl() {
|
|
return captchaFormUrl;
|
|
return captchaFormUrl;
|
|
}
|
|
}
|
|
|
|
|
|
- public void setPortMapper(PortMapper portMapper) {
|
|
|
|
- this.portMapper = portMapper;
|
|
|
|
- }
|
|
|
|
|
|
+ // ~ Methods
|
|
|
|
+ // ================================================================
|
|
|
|
|
|
- public PortMapper getPortMapper() {
|
|
|
|
- return portMapper;
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Set to true to force captcha form access to be via https. If this value
|
|
|
|
+ * is ture (the default is false), and the incoming request for the
|
|
|
|
+ * protected resource which triggered the interceptor was not already
|
|
|
|
+ * <code>https</code>, then
|
|
|
|
+ *
|
|
|
|
+ * @param forceHttps
|
|
|
|
+ */
|
|
|
|
+ public void setForceHttps(boolean forceHttps) {
|
|
|
|
+ this.forceHttps = forceHttps;
|
|
}
|
|
}
|
|
|
|
|
|
- public void setPortResolver(PortResolver portResolver) {
|
|
|
|
- this.portResolver = portResolver;
|
|
|
|
|
|
+ public boolean getForceHttps() {
|
|
|
|
+ return forceHttps;
|
|
}
|
|
}
|
|
|
|
|
|
- public PortResolver getPortResolver() {
|
|
|
|
- return portResolver;
|
|
|
|
|
|
+ public void setIncludeOriginalParameters(boolean includeOriginalParameters) {
|
|
|
|
+ this.includeOriginalParameters = includeOriginalParameters;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
- public boolean isOutsideWebApp() {
|
|
|
|
- return isOutsideWebApp;
|
|
|
|
|
|
+ public boolean isIncludeOriginalParameters() {
|
|
|
|
+ return includeOriginalParameters;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * If set to true, the original request url will be appended to the
|
|
|
|
+ * redirect url using the {@link #getOriginalRequestUrlParameterName()}.
|
|
|
|
+ *
|
|
|
|
+ * @param includeOriginalRequest
|
|
|
|
+ */
|
|
|
|
+ public void setIncludeOriginalRequest(boolean includeOriginalRequest) {
|
|
|
|
+ this.includeOriginalRequest = includeOriginalRequest;
|
|
|
|
+ }
|
|
|
|
|
|
- public String getOriginalRequestUrlParameterName() {
|
|
|
|
- return originalRequestUrlParameterName;
|
|
|
|
|
|
+ public boolean isIncludeOriginalRequest() {
|
|
|
|
+ return includeOriginalRequest;
|
|
}
|
|
}
|
|
|
|
|
|
- public void setOriginalRequestUrlParameterName(String originalRequestUrlParameterName) {
|
|
|
|
- this.originalRequestUrlParameterName = originalRequestUrlParameterName;
|
|
|
|
|
|
+ public void setOriginalRequestMethodParameterName(
|
|
|
|
+ String originalRequestMethodParameterName) {
|
|
|
|
+ this.originalRequestMethodParameterName = originalRequestMethodParameterName;
|
|
}
|
|
}
|
|
|
|
|
|
- public String getOriginalRequestParametersParameterName() {
|
|
|
|
- return originalRequestParametersParameterName;
|
|
|
|
|
|
+ public String getOriginalRequestMethodParameterName() {
|
|
|
|
+ return originalRequestMethodParameterName;
|
|
}
|
|
}
|
|
|
|
|
|
- public void setOriginalRequestParametersParameterName(String originalRequestParametersParameterName) {
|
|
|
|
- this.originalRequestParametersParameterName = originalRequestParametersParameterName;
|
|
|
|
|
|
+ public void setOriginalRequestParametersNameValueSeparator(
|
|
|
|
+ String originalRequestParametersNameValueSeparator) {
|
|
|
|
+ this.originalRequestParametersNameValueSeparator = originalRequestParametersNameValueSeparator;
|
|
}
|
|
}
|
|
|
|
|
|
public String getOriginalRequestParametersNameValueSeparator() {
|
|
public String getOriginalRequestParametersNameValueSeparator() {
|
|
return originalRequestParametersNameValueSeparator;
|
|
return originalRequestParametersNameValueSeparator;
|
|
}
|
|
}
|
|
|
|
|
|
- public void setOriginalRequestParametersNameValueSeparator(String originalRequestParametersNameValueSeparator) {
|
|
|
|
- this.originalRequestParametersNameValueSeparator = originalRequestParametersNameValueSeparator;
|
|
|
|
|
|
+ public void setOriginalRequestParametersParameterName(
|
|
|
|
+ String originalRequestParametersParameterName) {
|
|
|
|
+ this.originalRequestParametersParameterName = originalRequestParametersParameterName;
|
|
}
|
|
}
|
|
|
|
|
|
- public String getOriginalRequestParametersSeparator() {
|
|
|
|
- return originalRequestParametersSeparator;
|
|
|
|
|
|
+ public String getOriginalRequestParametersParameterName() {
|
|
|
|
+ return originalRequestParametersParameterName;
|
|
}
|
|
}
|
|
|
|
|
|
- public void setOriginalRequestParametersSeparator(String originalRequestParametersSeparator) {
|
|
|
|
|
|
+ public void setOriginalRequestParametersSeparator(
|
|
|
|
+ String originalRequestParametersSeparator) {
|
|
this.originalRequestParametersSeparator = originalRequestParametersSeparator;
|
|
this.originalRequestParametersSeparator = originalRequestParametersSeparator;
|
|
}
|
|
}
|
|
|
|
|
|
- public String getOriginalRequestMethodParameterName() {
|
|
|
|
- return originalRequestMethodParameterName;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- public void setOriginalRequestMethodParameterName(String originalRequestMethodParameterName) {
|
|
|
|
- this.originalRequestMethodParameterName = originalRequestMethodParameterName;
|
|
|
|
|
|
+ public String getOriginalRequestParametersSeparator() {
|
|
|
|
+ return originalRequestParametersSeparator;
|
|
}
|
|
}
|
|
|
|
|
|
- public String getUrlEncodingCharset() {
|
|
|
|
- return urlEncodingCharset;
|
|
|
|
|
|
+ public void setOriginalRequestUrlParameterName(
|
|
|
|
+ String originalRequestUrlParameterName) {
|
|
|
|
+ this.originalRequestUrlParameterName = originalRequestUrlParameterName;
|
|
}
|
|
}
|
|
|
|
|
|
- public void setUrlEncodingCharset(String urlEncodingCharset) {
|
|
|
|
- this.urlEncodingCharset = urlEncodingCharset;
|
|
|
|
|
|
+ public String getOriginalRequestUrlParameterName() {
|
|
|
|
+ return originalRequestUrlParameterName;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * if set to true, the {@link #commence(ServletRequest, ServletResponse)} method uses the {@link
|
|
|
|
- * #getCaptchaFormUrl()} as a complete URL, else it as a 'inside WebApp' path.
|
|
|
|
|
|
+ * if set to true, the {@link #commence(ServletRequest, ServletResponse)}
|
|
|
|
+ * method uses the {@link #getCaptchaFormUrl()} as a complete URL, else it
|
|
|
|
+ * as a 'inside WebApp' path.
|
|
|
|
+ *
|
|
|
|
+ * @param isOutsideWebApp
|
|
*/
|
|
*/
|
|
public void setOutsideWebApp(boolean isOutsideWebApp) {
|
|
public void setOutsideWebApp(boolean isOutsideWebApp) {
|
|
this.isOutsideWebApp = isOutsideWebApp;
|
|
this.isOutsideWebApp = isOutsideWebApp;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public boolean isOutsideWebApp() {
|
|
|
|
+ return isOutsideWebApp;
|
|
|
|
+ }
|
|
|
|
|
|
- public boolean isIncludeOriginalRequest() {
|
|
|
|
- return includeOriginalRequest;
|
|
|
|
|
|
+ public void setPortMapper(PortMapper portMapper) {
|
|
|
|
+ this.portMapper = portMapper;
|
|
}
|
|
}
|
|
|
|
|
|
- /**
|
|
|
|
- * If set to true, the original request url will be appended to the redirect url using the {@link
|
|
|
|
- * #getOriginalRequestParameterName()}.
|
|
|
|
- */
|
|
|
|
- public void setIncludeOriginalRequest(boolean includeOriginalRequest) {
|
|
|
|
- this.includeOriginalRequest = includeOriginalRequest;
|
|
|
|
|
|
+ public PortMapper getPortMapper() {
|
|
|
|
+ return portMapper;
|
|
}
|
|
}
|
|
|
|
|
|
- public boolean isIncludeOriginalParameters() {
|
|
|
|
- return includeOriginalParameters;
|
|
|
|
|
|
+ public void setPortResolver(PortResolver portResolver) {
|
|
|
|
+ this.portResolver = portResolver;
|
|
}
|
|
}
|
|
|
|
|
|
- public void setIncludeOriginalParameters(boolean includeOriginalParameters) {
|
|
|
|
- this.includeOriginalParameters = includeOriginalParameters;
|
|
|
|
|
|
+ public PortResolver getPortResolver() {
|
|
|
|
+ return portResolver;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public void setUrlEncodingCharset(String urlEncodingCharset) {
|
|
|
|
+ this.urlEncodingCharset = urlEncodingCharset;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public String getUrlEncodingCharset() {
|
|
|
|
+ return urlEncodingCharset;
|
|
}
|
|
}
|
|
|
|
|
|
public void afterPropertiesSet() throws Exception {
|
|
public void afterPropertiesSet() throws Exception {
|
|
Assert.hasLength(captchaFormUrl, "captchaFormUrl must be specified");
|
|
Assert.hasLength(captchaFormUrl, "captchaFormUrl must be specified");
|
|
- Assert.hasLength(originalRequestMethodParameterName, "originalRequestMethodParameterName must be specified");
|
|
|
|
- Assert.hasLength(originalRequestParametersNameValueSeparator, "originalRequestParametersNameValueSeparator must be specified");
|
|
|
|
- Assert.hasLength(originalRequestParametersParameterName, "originalRequestParametersParameterName must be specified");
|
|
|
|
- Assert.hasLength(originalRequestParametersSeparator, "originalRequestParametersSeparator must be specified");
|
|
|
|
- Assert.hasLength(originalRequestUrlParameterName, "originalRequestUrlParameterName must be specified");
|
|
|
|
- Assert.hasLength(urlEncodingCharset, "urlEncodingCharset must be specified");
|
|
|
|
|
|
+ Assert.hasLength(originalRequestMethodParameterName,
|
|
|
|
+ "originalRequestMethodParameterName must be specified");
|
|
|
|
+ Assert.hasLength(originalRequestParametersNameValueSeparator,
|
|
|
|
+ "originalRequestParametersNameValueSeparator must be specified");
|
|
|
|
+ Assert.hasLength(originalRequestParametersParameterName,
|
|
|
|
+ "originalRequestParametersParameterName must be specified");
|
|
|
|
+ Assert.hasLength(originalRequestParametersSeparator,
|
|
|
|
+ "originalRequestParametersSeparator must be specified");
|
|
|
|
+ Assert.hasLength(originalRequestUrlParameterName,
|
|
|
|
+ "originalRequestUrlParameterName must be specified");
|
|
|
|
+ Assert.hasLength(urlEncodingCharset,
|
|
|
|
+ "urlEncodingCharset must be specified");
|
|
Assert.notNull(portMapper, "portMapper must be specified");
|
|
Assert.notNull(portMapper, "portMapper must be specified");
|
|
Assert.notNull(portResolver, "portResolver must be specified");
|
|
Assert.notNull(portResolver, "portResolver must be specified");
|
|
URLEncoder.encode(" fzaef é& à ", urlEncodingCharset);
|
|
URLEncoder.encode(" fzaef é& à ", urlEncodingCharset);
|
|
}
|
|
}
|
|
|
|
|
|
public void commence(ServletRequest request, ServletResponse response)
|
|
public void commence(ServletRequest request, ServletResponse response)
|
|
- throws IOException, ServletException {
|
|
|
|
|
|
+ throws IOException, ServletException {
|
|
StringBuffer redirectUrl = new StringBuffer();
|
|
StringBuffer redirectUrl = new StringBuffer();
|
|
HttpServletRequest req = (HttpServletRequest) request;
|
|
HttpServletRequest req = (HttpServletRequest) request;
|
|
|
|
|
|
@@ -259,70 +304,17 @@ public class CaptchaEntryPoint implements ChannelEntryPoint, InitializingBean {
|
|
if (includeOriginalRequest) {
|
|
if (includeOriginalRequest) {
|
|
includeOriginalRequest(redirectUrl, req);
|
|
includeOriginalRequest(redirectUrl, req);
|
|
}
|
|
}
|
|
|
|
+
|
|
// add post parameter? DONE!
|
|
// add post parameter? DONE!
|
|
if (logger.isDebugEnabled()) {
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("Redirecting to: " + redirectUrl);
|
|
logger.debug("Redirecting to: " + redirectUrl);
|
|
}
|
|
}
|
|
|
|
|
|
- ((HttpServletResponse) response)
|
|
|
|
- .sendRedirect(redirectUrl.toString());
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- private void includeOriginalRequest(StringBuffer redirectUrl,
|
|
|
|
- HttpServletRequest req) {
|
|
|
|
- // add original request to the url
|
|
|
|
- if (redirectUrl.indexOf("?") >= 0) {
|
|
|
|
- redirectUrl.append("&");
|
|
|
|
- } else {
|
|
|
|
- redirectUrl.append("?");
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- redirectUrl.append(originalRequestUrlParameterName);
|
|
|
|
- redirectUrl.append("=");
|
|
|
|
- try {
|
|
|
|
- redirectUrl.append(URLEncoder.encode(req.getRequestURL().toString(), urlEncodingCharset));
|
|
|
|
- } catch (UnsupportedEncodingException e) {
|
|
|
|
- logger.warn(e);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- //append method
|
|
|
|
- redirectUrl.append("&");
|
|
|
|
- redirectUrl.append(originalRequestMethodParameterName);
|
|
|
|
- redirectUrl.append("=");
|
|
|
|
- redirectUrl.append(req.getMethod());
|
|
|
|
- if (includeOriginalParameters) {
|
|
|
|
-
|
|
|
|
- // append query params
|
|
|
|
-
|
|
|
|
- redirectUrl.append("&");
|
|
|
|
- redirectUrl.append(originalRequestParametersParameterName);
|
|
|
|
- redirectUrl.append("=");
|
|
|
|
- StringBuffer qp = new StringBuffer();
|
|
|
|
- Enumeration parameters = req.getParameterNames();
|
|
|
|
- if (parameters != null && parameters.hasMoreElements()) {
|
|
|
|
- //qp.append("?");
|
|
|
|
- while (parameters.hasMoreElements()) {
|
|
|
|
- String name = parameters.nextElement().toString();
|
|
|
|
- String value = req.getParameter(name);
|
|
|
|
- qp.append(name);
|
|
|
|
- qp.append(originalRequestParametersNameValueSeparator);
|
|
|
|
- qp.append(value);
|
|
|
|
- if (parameters.hasMoreElements()) {
|
|
|
|
- qp.append(originalRequestParametersSeparator);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- try {
|
|
|
|
- redirectUrl.append(URLEncoder.encode(qp.toString(), urlEncodingCharset));
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- logger.warn(e);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ ((HttpServletResponse) response).sendRedirect(redirectUrl.toString());
|
|
}
|
|
}
|
|
|
|
|
|
private void buildInternalRedirect(StringBuffer redirectUrl,
|
|
private void buildInternalRedirect(StringBuffer redirectUrl,
|
|
- HttpServletRequest req) {
|
|
|
|
|
|
+ HttpServletRequest req) {
|
|
// construct it
|
|
// construct it
|
|
StringBuffer simpleRedirect = new StringBuffer();
|
|
StringBuffer simpleRedirect = new StringBuffer();
|
|
|
|
|
|
@@ -331,9 +323,11 @@ public class CaptchaEntryPoint implements ChannelEntryPoint, InitializingBean {
|
|
int serverPort = portResolver.getServerPort(req);
|
|
int serverPort = portResolver.getServerPort(req);
|
|
String contextPath = req.getContextPath();
|
|
String contextPath = req.getContextPath();
|
|
boolean includePort = true;
|
|
boolean includePort = true;
|
|
|
|
+
|
|
if ("http".equals(scheme.toLowerCase()) && (serverPort == 80)) {
|
|
if ("http".equals(scheme.toLowerCase()) && (serverPort == 80)) {
|
|
includePort = false;
|
|
includePort = false;
|
|
}
|
|
}
|
|
|
|
+
|
|
if ("https".equals(scheme.toLowerCase()) && (serverPort == 443)) {
|
|
if ("https".equals(scheme.toLowerCase()) && (serverPort == 443)) {
|
|
includePort = false;
|
|
includePort = false;
|
|
}
|
|
}
|
|
@@ -341,10 +335,12 @@ public class CaptchaEntryPoint implements ChannelEntryPoint, InitializingBean {
|
|
simpleRedirect.append(scheme);
|
|
simpleRedirect.append(scheme);
|
|
simpleRedirect.append("://");
|
|
simpleRedirect.append("://");
|
|
simpleRedirect.append(serverName);
|
|
simpleRedirect.append(serverName);
|
|
|
|
+
|
|
if (includePort) {
|
|
if (includePort) {
|
|
simpleRedirect.append(":");
|
|
simpleRedirect.append(":");
|
|
simpleRedirect.append(serverPort);
|
|
simpleRedirect.append(serverPort);
|
|
}
|
|
}
|
|
|
|
+
|
|
simpleRedirect.append(contextPath);
|
|
simpleRedirect.append(contextPath);
|
|
simpleRedirect.append(captchaFormUrl);
|
|
simpleRedirect.append(captchaFormUrl);
|
|
|
|
|
|
@@ -361,10 +357,12 @@ public class CaptchaEntryPoint implements ChannelEntryPoint, InitializingBean {
|
|
|
|
|
|
redirectUrl.append("https://");
|
|
redirectUrl.append("https://");
|
|
redirectUrl.append(serverName);
|
|
redirectUrl.append(serverName);
|
|
|
|
+
|
|
if (includePort) {
|
|
if (includePort) {
|
|
redirectUrl.append(":");
|
|
redirectUrl.append(":");
|
|
redirectUrl.append(httpsPort);
|
|
redirectUrl.append(httpsPort);
|
|
}
|
|
}
|
|
|
|
+
|
|
redirectUrl.append(contextPath);
|
|
redirectUrl.append(contextPath);
|
|
redirectUrl.append(captchaFormUrl);
|
|
redirectUrl.append(captchaFormUrl);
|
|
} else {
|
|
} else {
|
|
@@ -375,4 +373,61 @@ public class CaptchaEntryPoint implements ChannelEntryPoint, InitializingBean {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void includeOriginalRequest(StringBuffer redirectUrl,
|
|
|
|
+ HttpServletRequest req) {
|
|
|
|
+ // add original request to the url
|
|
|
|
+ if (redirectUrl.indexOf("?") >= 0) {
|
|
|
|
+ redirectUrl.append("&");
|
|
|
|
+ } else {
|
|
|
|
+ redirectUrl.append("?");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ redirectUrl.append(originalRequestUrlParameterName);
|
|
|
|
+ redirectUrl.append("=");
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ redirectUrl.append(URLEncoder.encode(req.getRequestURL().toString(),
|
|
|
|
+ urlEncodingCharset));
|
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
|
+ logger.warn(e);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //append method
|
|
|
|
+ redirectUrl.append("&");
|
|
|
|
+ redirectUrl.append(originalRequestMethodParameterName);
|
|
|
|
+ redirectUrl.append("=");
|
|
|
|
+ redirectUrl.append(req.getMethod());
|
|
|
|
+
|
|
|
|
+ if (includeOriginalParameters) {
|
|
|
|
+ // append query params
|
|
|
|
+ redirectUrl.append("&");
|
|
|
|
+ redirectUrl.append(originalRequestParametersParameterName);
|
|
|
|
+ redirectUrl.append("=");
|
|
|
|
+
|
|
|
|
+ StringBuffer qp = new StringBuffer();
|
|
|
|
+ Enumeration parameters = req.getParameterNames();
|
|
|
|
+
|
|
|
|
+ if ((parameters != null) && parameters.hasMoreElements()) {
|
|
|
|
+ //qp.append("?");
|
|
|
|
+ while (parameters.hasMoreElements()) {
|
|
|
|
+ String name = parameters.nextElement().toString();
|
|
|
|
+ String value = req.getParameter(name);
|
|
|
|
+ qp.append(name);
|
|
|
|
+ qp.append(originalRequestParametersNameValueSeparator);
|
|
|
|
+ qp.append(value);
|
|
|
|
+
|
|
|
|
+ if (parameters.hasMoreElements()) {
|
|
|
|
+ qp.append(originalRequestParametersSeparator);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ redirectUrl.append(URLEncoder.encode(qp.toString(),
|
|
|
|
+ urlEncodingCharset));
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ logger.warn(e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|