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();
+ }
+
+}