Author: radu
Date: Mon Feb 29 13:19:31 2016
New Revision: 1732892

URL: http://svn.apache.org/viewvc?rev=1732892&view=rev
Log:
SLING-5568 - Sightly filters don't remove their specific options from the 
expression during processing

* added tests for all expression filters

Added:
    
sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/
    
sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java
Modified:
    
sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/URIManipulationFilter.java

Modified: 
sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/URIManipulationFilter.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/URIManipulationFilter.java?rev=1732892&r1=1732891&r2=1732892&view=diff
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/URIManipulationFilter.java
 (original)
+++ 
sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/URIManipulationFilter.java
 Mon Feb 29 13:19:31 2016
@@ -55,22 +55,22 @@ public class URIManipulationFilter exten
 
     public static final String URI_MANIPULATION_FUNCTION = "uriManipulation";
 
-    private static final String SCHEME = "scheme";
-    private static final String DOMAIN = "domain";
-    private static final String PATH = "path";
-    private static final String APPEND_PATH = "appendPath";
-    private static final String PREPEND_PATH = "prependPath";
-    private static final String SELECTORS = "selectors";
-    private static final String ADD_SELECTORS = "addSelectors";
-    private static final String REMOVE_SELECTORS = "removeSelectors";
-    private static final String EXTENSION = "extension";
-    private static final String SUFFIX = "suffix";
-    private static final String PREPEND_SUFFIX = "prependSuffix";
-    private static final String APPEND_SUFFIX = "appendSuffix";
-    private static final String FRAGMENT = "fragment";
-    private static final String QUERY = "query";
-    private static final String ADD_QUERY = "addQuery";
-    private static final String REMOVE_QUERY = "removeQuery";
+    public static final String SCHEME = "scheme";
+    public static final String DOMAIN = "domain";
+    public static final String PATH = "path";
+    public static final String APPEND_PATH = "appendPath";
+    public static final String PREPEND_PATH = "prependPath";
+    public static final String SELECTORS = "selectors";
+    public static final String ADD_SELECTORS = "addSelectors";
+    public static final String REMOVE_SELECTORS = "removeSelectors";
+    public static final String EXTENSION = "extension";
+    public static final String SUFFIX = "suffix";
+    public static final String PREPEND_SUFFIX = "prependSuffix";
+    public static final String APPEND_SUFFIX = "appendSuffix";
+    public static final String FRAGMENT = "fragment";
+    public static final String QUERY = "query";
+    public static final String ADD_QUERY = "addQuery";
+    public static final String REMOVE_QUERY = "removeQuery";
 
     @Override
     public Expression apply(Expression expression, ExpressionContext 
expressionContext) {

Added: 
sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java?rev=1732892&view=auto
==============================================================================
--- 
sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java
 (added)
+++ 
sling/trunk/bundles/scripting/sightly/engine/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java
 Mon Feb 29 13:19:31 2016
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ 
******************************************************************************/
+package org.apache.sling.scripting.sightly.impl.frontend;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.sling.scripting.sightly.impl.compiler.expression.Expression;
+import 
org.apache.sling.scripting.sightly.impl.compiler.expression.ExpressionNode;
+import 
org.apache.sling.scripting.sightly.impl.compiler.expression.node.ArrayLiteral;
+import 
org.apache.sling.scripting.sightly.impl.compiler.expression.node.MapLiteral;
+import 
org.apache.sling.scripting.sightly.impl.compiler.expression.node.NullLiteral;
+import 
org.apache.sling.scripting.sightly.impl.compiler.expression.node.NumericConstant;
+import 
org.apache.sling.scripting.sightly.impl.compiler.expression.node.RuntimeCall;
+import 
org.apache.sling.scripting.sightly.impl.compiler.expression.node.StringConstant;
+import 
org.apache.sling.scripting.sightly.impl.compiler.frontend.ExpressionWrapper;
+import org.apache.sling.scripting.sightly.impl.compiler.frontend.Interpolation;
+import org.apache.sling.scripting.sightly.impl.filter.ExpressionContext;
+import org.apache.sling.scripting.sightly.impl.filter.Filter;
+import org.apache.sling.scripting.sightly.impl.filter.FormatFilter;
+import org.apache.sling.scripting.sightly.impl.filter.I18nFilter;
+import org.apache.sling.scripting.sightly.impl.filter.JoinFilter;
+import org.apache.sling.scripting.sightly.impl.filter.URIManipulationFilter;
+import org.apache.sling.scripting.sightly.impl.filter.XSSFilter;
+import org.apache.sling.scripting.sightly.impl.plugin.MarkupContext;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class ExpressionWrapperTest {
+
+    private static Collection<Filter> filters;
+
+    @BeforeClass
+    public static void setUp() {
+        filters = new ArrayList<Filter>(5);
+        filters.add(new I18nFilter());
+        filters.add(new FormatFilter());
+        filters.add(new JoinFilter());
+        filters.add(new URIManipulationFilter());
+        filters.add(new XSSFilter());
+    }
+
+    @Test
+    public void testI18nOptionsRemoval() {
+        Interpolation interpolation = new Interpolation();
+        Map<String, ExpressionNode> options = new HashMap<String, 
ExpressionNode>();
+        options.put(I18nFilter.HINT_OPTION, new StringConstant("hint"));
+        options.put(I18nFilter.LOCALE_OPTION, new StringConstant("de"));
+        options.put(I18nFilter.I18N_OPTION, NullLiteral.INSTANCE);
+        interpolation.addExpression(new Expression(new 
StringConstant("hello"), options));
+        ExpressionWrapper wrapper = new ExpressionWrapper(filters);
+        Expression result = wrapper.transform(interpolation, 
MarkupContext.TEXT, ExpressionContext.TEXT);
+        List<ExpressionNode> xssArguments = 
runEmptyOptionsAndXSSAssertions(result);
+        RuntimeCall i18n = (RuntimeCall) xssArguments.get(0);
+        assertEquals("Expected to I18n runtime function call.", 
I18nFilter.FUNCTION, i18n.getFunctionName());
+    }
+
+    @Test
+    public void testFormatOptionsRemoval() {
+        Interpolation interpolation = new Interpolation();
+        Map<String, ExpressionNode> options = new HashMap<String, 
ExpressionNode>();
+        List<ExpressionNode> formatArray = new ArrayList<ExpressionNode>();
+        formatArray.add(new StringConstant("John"));
+        formatArray.add(new StringConstant("Doe"));
+        options.put(FormatFilter.FORMAT_OPTION, new ArrayLiteral(formatArray));
+        interpolation.addExpression(new Expression(new StringConstant("Hello 
{0} {1}"), options));
+        ExpressionWrapper wrapper = new ExpressionWrapper(filters);
+        Expression result = wrapper.transform(interpolation, 
MarkupContext.TEXT, ExpressionContext.TEXT);
+        List<ExpressionNode> xssArguments = 
runEmptyOptionsAndXSSAssertions(result);
+        RuntimeCall format = (RuntimeCall) xssArguments.get(0);
+        assertEquals(FormatFilter.FORMAT_FUNCTION, format.getFunctionName());
+    }
+
+    @Test
+    public void testJoinOptionsRemoval() {
+        Interpolation interpolation = new Interpolation();
+        Map<String, ExpressionNode> options = new HashMap<String, 
ExpressionNode>();
+        options.put(JoinFilter.JOIN_OPTION, new StringConstant(";"));
+        List<ExpressionNode> array = new ArrayList<ExpressionNode>();
+        array.add(new NumericConstant(0));
+        array.add(new NumericConstant(1));
+        interpolation.addExpression(new Expression(new ArrayLiteral(array), 
options));
+        ExpressionWrapper wrapper = new ExpressionWrapper(filters);
+        Expression result = wrapper.transform(interpolation, 
MarkupContext.TEXT, ExpressionContext.TEXT);
+        List<ExpressionNode> xssArguments = 
runEmptyOptionsAndXSSAssertions(result);
+        RuntimeCall join = (RuntimeCall) xssArguments.get(0);
+        assertEquals(JoinFilter.JOIN_FUNCTION, join.getFunctionName());
+    }
+
+    @Test
+    public void testURIOptionsRemoval() {
+        Interpolation interpolation = new Interpolation();
+        Map<String, ExpressionNode> options = new HashMap<String, 
ExpressionNode>();
+        options.put(URIManipulationFilter.SCHEME, new StringConstant("https"));
+        options.put(URIManipulationFilter.DOMAIN, new 
StringConstant("www.example.org"));
+        options.put(URIManipulationFilter.PREPEND_PATH, new 
StringConstant("/before"));
+        options.put(URIManipulationFilter.PATH, new StringConstant("/path"));
+        options.put(URIManipulationFilter.APPEND_PATH, new 
StringConstant("/after"));
+        List<ExpressionNode> selectors = new ArrayList<ExpressionNode>();
+        selectors.add(new StringConstant("a"));
+        selectors.add(new StringConstant("b"));
+        options.put(URIManipulationFilter.SELECTORS, new 
ArrayLiteral(selectors));
+        options.put(URIManipulationFilter.EXTENSION, new 
StringConstant("html"));
+        options.put(URIManipulationFilter.PREPEND_SUFFIX, new 
StringConstant("/pre"));
+        options.put(URIManipulationFilter.APPEND_SUFFIX, new 
StringConstant("/after"));
+        options.put(URIManipulationFilter.FRAGMENT, new 
StringConstant("rewrite"));
+        Map<String, ExpressionNode> query = new HashMap<String, 
ExpressionNode>();
+        query.put("q", new StringConstant("sightly"));
+        query.put("array", new ArrayLiteral(new ArrayList<ExpressionNode>() {{
+            add(new NumericConstant(1));
+            add(new NumericConstant(2));
+            add(new NumericConstant(3));
+        }}));
+        options.put(URIManipulationFilter.QUERY, new MapLiteral(query));
+        options.put(URIManipulationFilter.REMOVE_QUERY, new 
StringConstant("array"));
+        interpolation.addExpression(
+                new Expression(new 
StringConstant("http://www.example.com/resource.selector.extension/suffix#fragment?param=value";),
+                        options));
+        ExpressionWrapper wrapper = new ExpressionWrapper(filters);
+        Expression result = wrapper.transform(interpolation, 
MarkupContext.TEXT, ExpressionContext.TEXT);
+        List<ExpressionNode> xssArguments = 
runEmptyOptionsAndXSSAssertions(result);
+        RuntimeCall join = (RuntimeCall) xssArguments.get(0);
+        assertEquals(URIManipulationFilter.URI_MANIPULATION_FUNCTION, 
join.getFunctionName());
+    }
+
+    private List<ExpressionNode> runEmptyOptionsAndXSSAssertions(Expression 
result) {
+        assertTrue("Expected empty options map for expression after 
processing.", result.getOptions().isEmpty());
+        RuntimeCall xss = (RuntimeCall) result.getRoot();
+        assertEquals("Expected XSS escaping applied to expression.", 
XSSFilter.FUNCTION_NAME, xss.getFunctionName());
+        return xss.getArguments();
+    }
+
+}


Reply via email to