Author: agilliland
Date: Wed Jan 25 14:46:16 2006
New Revision: 372349
URL: http://svn.apache.org/viewcvs?rev=372349&view=rev
Log:
reimplementing our custom scheme enforcement. this should only be until we
figure out how to get Acegi scheme enforcement fully functioning. scheme
enforcement is still disabled by default.
Added:
incubator/roller/trunk/src/org/roller/presentation/filters/SchemeEnforcementFilter.java
Modified:
incubator/roller/trunk/metadata/xdoclet/filter-mappings.xml
incubator/roller/trunk/src/org/roller/presentation/RollerContext.java
incubator/roller/trunk/web/WEB-INF/classes/roller.properties
Modified: incubator/roller/trunk/metadata/xdoclet/filter-mappings.xml
URL:
http://svn.apache.org/viewcvs/incubator/roller/trunk/metadata/xdoclet/filter-mappings.xml?rev=372349&r1=372348&r2=372349&view=diff
==============================================================================
--- incubator/roller/trunk/metadata/xdoclet/filter-mappings.xml (original)
+++ incubator/roller/trunk/metadata/xdoclet/filter-mappings.xml Wed Jan 25
14:46:16 2006
@@ -26,6 +26,12 @@
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
+<!-- Scheme enforcement. Only here until we get Acegi scheme enforcement
working -->
+<filter-mapping>
+ <filter-name>SchemeEnforcementFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+</filter-mapping>
+
<!-- Acegi Security filters - controls secure access to different parts of
Roller -->
<filter-mapping>
<filter-name>securityFilter</filter-name>
Modified: incubator/roller/trunk/src/org/roller/presentation/RollerContext.java
URL:
http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/RollerContext.java?rev=372349&r1=372348&r2=372349&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/presentation/RollerContext.java
(original)
+++ incubator/roller/trunk/src/org/roller/presentation/RollerContext.java Wed
Jan 25 14:46:16 2006
@@ -306,7 +306,7 @@
(AuthenticationProcessingFilterEntryPoint)ctx.getBean("authenticationProcessingFilterEntryPoint");
entryPoint.setForceHttps(true);
}
-
+ /*
if (RollerConfig.getBooleanProperty("schemeenforcement.enabled")) {
ChannelProcessingFilter procfilter =
@@ -327,8 +327,9 @@
}
}
// all other action URLs are non-HTTPS
- defmap.addSecureUrl("/**/*.do*", insecureDef);
+ defmap.addSecureUrl("/**<!-- need to remove this when uncommenting
-->/*.do*", insecureDef);
}
+ */
}
Added:
incubator/roller/trunk/src/org/roller/presentation/filters/SchemeEnforcementFilter.java
URL:
http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/presentation/filters/SchemeEnforcementFilter.java?rev=372349&view=auto
==============================================================================
---
incubator/roller/trunk/src/org/roller/presentation/filters/SchemeEnforcementFilter.java
(added)
+++
incubator/roller/trunk/src/org/roller/presentation/filters/SchemeEnforcementFilter.java
Wed Jan 25 14:46:16 2006
@@ -0,0 +1,157 @@
+/*
+ * SchemeEnforcementFilter.java
+ *
+ * Created on September 16, 2005, 3:17 PM
+ */
+
+package org.roller.presentation.filters;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+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;
+import org.roller.config.RollerConfig;
+
+
+/**
+ * The SchemeEnforcementFilter is provided for Roller sites that enable secure
+ * logins and want to ensure that only login urls are used under https.
+ *
+ * @author Allen Gilliland
+ *
+ * @web.filter name="SchemeEnforcementFilter"
+ */
+public class SchemeEnforcementFilter implements Filter {
+
+ private static Log mLogger =
+ LogFactory.getLog(SchemeEnforcementFilter.class);
+
+ private FilterConfig filterConfig = null;
+
+ private boolean schemeEnforcementEnabled = false;
+ private boolean secureLoginEnabled = false;
+ private int httpPort = 80;
+ private int httpsPort = 443;
+ private String httpsHeaderName = null;
+ private String httpsHeaderValue = null;
+
+ private Set allowedUrls = new HashSet();
+
+
+ /**
+ * Process filter.
+ *
+ * We'll take the incoming request and first determine if this is a
+ * secure request. If the request is secure then we'll see if it matches
+ * one of the allowed secure urls, if not then we will redirect back out
+ * of https.
+ */
+ public void doFilter(ServletRequest request, ServletResponse response,
+ FilterChain chain)
+ throws IOException, ServletException {
+
+ if(this.schemeEnforcementEnabled && this.secureLoginEnabled) {
+
+ HttpServletRequest req = (HttpServletRequest) request;
+ HttpServletResponse res = (HttpServletResponse) response;
+
+ mLogger.debug("checking path = "+req.getServletPath());
+
+ if(!request.isSecure() &&
allowedUrls.contains(req.getServletPath())) {
+ // http insecure request that should be over https
+ String redirect = "https://"+req.getServerName();
+
+ if(this.httpsPort != 443)
+ redirect += ":"+this.httpsPort;
+
+ redirect += req.getRequestURI();
+
+ if(req.getQueryString() != null)
+ redirect += "?"+req.getQueryString();
+
+ mLogger.debug("Redirecting to "+redirect);
+ res.sendRedirect(redirect);
+ return;
+
+ } else if(request.isSecure() &&
!allowedUrls.contains(req.getServletPath())) {
+ // https secure request that should be over http
+ String redirect = "http://"+req.getServerName();
+
+ if(this.httpPort != 80)
+ redirect += ":"+this.httpPort;
+
+ redirect += req.getRequestURI();
+
+ if(req.getQueryString() != null)
+ redirect += "?"+req.getQueryString();
+
+ mLogger.debug("Redirecting to "+redirect);
+ res.sendRedirect(redirect);
+ return;
+ }
+ }
+
+ chain.doFilter(request, response);
+ }
+
+
+ public void destroy() {}
+
+
+ /**
+ * Filter init.
+ *
+ * We are just collecting init properties which we'll use for each request.
+ */
+ public void init(FilterConfig filterConfig) {
+ this.filterConfig = filterConfig;
+
+ // determine if we are doing scheme enforcement
+ this.schemeEnforcementEnabled =
+ RollerConfig.getBooleanProperty("schemeenforcement.enabled");
+ this.secureLoginEnabled =
+ RollerConfig.getBooleanProperty("securelogin.enabled");
+
+ if(this.schemeEnforcementEnabled && this.secureLoginEnabled) {
+ // gather some more properties
+ String http_port =
+ RollerConfig.getProperty("securelogin.http.port");
+ String https_port =
+ RollerConfig.getProperty("securelogin.https.port");
+
+ try {
+ this.httpPort = Integer.parseInt(http_port);
+ this.httpsPort = Integer.parseInt(https_port);
+ } catch(NumberFormatException nfe) {
+ // ignored ... guess we'll have to use the defaults
+ mLogger.warn("error with secure login ports", nfe);
+ }
+
+ // finally, construct our list of allowable https urls
+ String urls =
+ RollerConfig.getProperty("schemeenforcement.https.urls");
+ String[] urlsArray = urls.split(",");
+ for(int i=0; i < urlsArray.length; i++)
+ this.allowedUrls.add(urlsArray[i]);
+
+ // some logging for the curious
+ mLogger.info("Scheme enforcement = enabled");
+ if(mLogger.isDebugEnabled()) {
+ mLogger.debug("allowed urls are:");
+ for(Iterator it = this.allowedUrls.iterator(); it.hasNext();)
+ mLogger.debug(it.next());
+ }
+ }
+ }
+
+}
Modified: incubator/roller/trunk/web/WEB-INF/classes/roller.properties
URL:
http://svn.apache.org/viewcvs/incubator/roller/trunk/web/WEB-INF/classes/roller.properties?rev=372349&r1=372348&r2=372349&view=diff
==============================================================================
--- incubator/roller/trunk/web/WEB-INF/classes/roller.properties (original)
+++ incubator/roller/trunk/web/WEB-INF/classes/roller.properties Wed Jan 25
14:46:16 2006
@@ -118,7 +118,8 @@
# Scheme enforcement ensures that specific URLs are viewed only via HTTPS
schemeenforcement.enabled=false
# URL patterns that require HTTPS
-schemeenforcement.https.urls=/editor/yourProfile.do*,/admin/user.do*
+schemeenforcement.https.urls=/j_security_check,/login-redirect.jsp,/login.jsp,\
+/user.do,/editor/yourProfile.do,/admin/user.do
# Password security settings
passwds.encryption.enabled=false