Author: cziegeler
Date: Fri Jul 15 06:27:41 2011
New Revision: 1146974
URL: http://svn.apache.org/viewvc?rev=1146974&view=rev
Log:
SLING-2141 - Add a way to check the referrer for modification requests
Modified:
sling/trunk/contrib/extensions/security/src/main/java/org/apache/sling/security/impl/ReferrerFilter.java
sling/trunk/contrib/extensions/security/src/test/java/org/apache/sling/security/impl/ReferrerFilterTest.java
Modified:
sling/trunk/contrib/extensions/security/src/main/java/org/apache/sling/security/impl/ReferrerFilter.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/security/src/main/java/org/apache/sling/security/impl/ReferrerFilter.java?rev=1146974&r1=1146973&r2=1146974&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/security/src/main/java/org/apache/sling/security/impl/ReferrerFilter.java
(original)
+++
sling/trunk/contrib/extensions/security/src/main/java/org/apache/sling/security/impl/ReferrerFilter.java
Fri Jul 15 06:27:41 2011
@@ -44,16 +44,31 @@ public class ReferrerFilter implements F
/** Logger. */
private final Logger logger = LoggerFactory.getLogger(this.getClass());
+ /** Default value for allow empty. */
private static final boolean DEFAULT_ALLOW_EMPTY = true;
+ /** Allow empty property. */
@Property(boolValue=DEFAULT_ALLOW_EMPTY)
private static final String PROP_ALLOW_EMPTY = "allow.empty";
+ /** Default value for allow localhost. */
+ private static final boolean DEFAULT_ALLOW_LOCALHOST = true;
+
+ /** Allow localhost property. */
+ @Property(boolValue=DEFAULT_ALLOW_LOCALHOST)
+ private static final String PROP_ALLOW_LOCALHOST = "allow.localhost";
+
+ /** Allow empty property. */
@Property(unbounded=PropertyUnbounded.ARRAY)
private static final String PROP_HOSTS = "allow.hosts";
+ /** Do we allow empty referrer? */
private boolean allowEmpty;
+ /** Do we allow localhost referrer? */
+ private boolean allowLocalhost;
+
+ /** Allowed hosts */
private String[] allowHosts;
/**
@@ -62,6 +77,7 @@ public class ReferrerFilter implements F
protected void activate(final ComponentContext ctx) {
this.allowEmpty =
OsgiUtil.toBoolean(ctx.getProperties().get(PROP_ALLOW_EMPTY),
DEFAULT_ALLOW_EMPTY);
this.allowHosts =
OsgiUtil.toStringArray(ctx.getProperties().get(PROP_HOSTS));
+ this.allowLocalhost =
OsgiUtil.toBoolean(ctx.getProperties().get(PROP_ALLOW_LOCALHOST),
DEFAULT_ALLOW_LOCALHOST);
if ( this.allowHosts != null ) {
if ( this.allowHosts.length == 0 ) {
this.allowHosts = null;
@@ -109,8 +125,10 @@ public class ReferrerFilter implements F
// we consider this illegal
return null;
}
- final int endPos = referrer.indexOf('/', startPos);
- final String hostPart = (endPos == -1 ? referrer.substring(startPos) :
referrer.substring(startPos, endPos));
+ final int paramStart = referrer.indexOf('?');
+ final String hostAndPath = (paramStart == -1 ? referrer :
referrer.substring(0, paramStart));
+ final int endPos = hostAndPath.indexOf('/', startPos);
+ final String hostPart = (endPos == -1 ?
hostAndPath.substring(startPos) : hostAndPath.substring(startPos, endPos));
final int hostNameStart = hostPart.indexOf('@') + 1;
final int hostNameEnd = hostPart.lastIndexOf(':');
if (hostNameEnd < hostNameStart ) {
@@ -141,7 +159,15 @@ public class ReferrerFilter implements F
return false;
}
final boolean valid;
- if ( this.allowHosts == null ) {
+ boolean isValidLocalHost = false;
+ if ( this.allowLocalhost ) {
+ if ( "localhost".equals(host) || "127.0.0.1".equals(host) ) {
+ isValidLocalHost = true;
+ }
+ }
+ if ( isValidLocalHost ) {
+ valid = true;
+ } else if ( this.allowHosts == null ) {
valid = host.equals(request.getServerName());
} else {
boolean flag = false;
Modified:
sling/trunk/contrib/extensions/security/src/test/java/org/apache/sling/security/impl/ReferrerFilterTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/security/src/test/java/org/apache/sling/security/impl/ReferrerFilterTest.java?rev=1146974&r1=1146973&r2=1146974&view=diff
==============================================================================
---
sling/trunk/contrib/extensions/security/src/test/java/org/apache/sling/security/impl/ReferrerFilterTest.java
(original)
+++
sling/trunk/contrib/extensions/security/src/test/java/org/apache/sling/security/impl/ReferrerFilterTest.java
Fri Jul 15 06:27:41 2011
@@ -46,9 +46,16 @@ public class ReferrerFilterTest {
Assert.assertEquals("somehost",
filter.getHost("http://somehost/somewhere"));
Assert.assertEquals("somehost",
filter.getHost("http://somehost:4242/somewhere"));
Assert.assertEquals("somehost",
filter.getHost("http://admin@somehost/somewhere"));
+ Assert.assertEquals("somehost",
filter.getHost("http://admin@somehost/somewhere?invald=@gagga"));
Assert.assertEquals("somehost",
filter.getHost("http://admin@somehost:1/somewhere"));
Assert.assertEquals("somehost",
filter.getHost("http://admin:admin@somehost/somewhere"));
Assert.assertEquals("somehost",
filter.getHost("http://admin:admin@somehost:4343/somewhere"));
+ Assert.assertEquals("localhost", filter.getHost("http://localhost"));
+ Assert.assertEquals("127.0.0.1", filter.getHost("http://127.0.0.1"));
+ Assert.assertEquals("localhost",
filter.getHost("http://localhost:535"));
+ Assert.assertEquals("127.0.0.1",
filter.getHost("http://127.0.0.1:242"));
+ Assert.assertEquals("localhost",
filter.getHost("http://localhost:256235/etewteq.ff"));
+ Assert.assertEquals("127.0.0.1",
filter.getHost("http://127.0.0.1/wetew.qerq"));
Assert.assertEquals(null,
filter.getHost("http:/admin:admin@somehost:4343/somewhere"));
}
@@ -68,6 +75,8 @@ public class ReferrerFilterTest {
Assert.assertEquals(true,
filter.isValidRequest(getRequest("/relative/but/[illegal]")));
Assert.assertEquals(false,
filter.isValidRequest(getRequest("http://somehost")));
Assert.assertEquals(true,
filter.isValidRequest(getRequest("http://me")));
+ Assert.assertEquals(true,
filter.isValidRequest(getRequest("http://localhost")));
+ Assert.assertEquals(true,
filter.isValidRequest(getRequest("http://127.0.0.1")));
Assert.assertEquals(false,
filter.isValidRequest(getRequest("http://somehost/but/[illegal]")));
Assert.assertEquals(true,
filter.isValidRequest(getRequest("http://me/but/[illegal]")));
}