You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by jo...@apache.org on 2010/03/08 19:15:18 UTC
svn commit: r920428 - in /shindig/trunk/java/gadgets/src:
main/java/org/apache/shindig/gadgets/parse/caja/
main/java/org/apache/shindig/gadgets/parse/caja/old/
main/java/org/apache/shindig/gadgets/render/old/
test/java/org/apache/shindig/gadgets/parse/...
Author: johnh
Date: Mon Mar 8 18:15:17 2010
New Revision: 920428
URL: http://svn.apache.org/viewvc?rev=920428&view=rev
Log:
Complete moving all old-framework to "old" packages.
Added:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/old/
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizer.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/old/
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizerTest.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/BaseRewriterTestCase.java
Removed:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizer.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/CajaCssSanitizerTest.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/BaseRewriterTestCase.java
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriter.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriter.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriterTest.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriterTest.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java
Added: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizer.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizer.java?rev=920428&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizer.java (added)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizer.java Mon Mar 8 18:15:17 2010
@@ -0,0 +1,205 @@
+/*
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.shindig.gadgets.parse.caja.old;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
+
+import com.google.caja.lang.css.CssSchema;
+import com.google.caja.parser.AbstractParseTreeNode;
+import com.google.caja.parser.AncestorChain;
+import com.google.caja.parser.Visitor;
+import com.google.caja.parser.css.CssTree;
+import com.google.caja.reporting.SimpleMessageQueue;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Inject;
+
+import org.w3c.dom.Element;
+
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Sanitize a CSS tree using Caja. Strip properties and functions that represent
+ * ways to execute script. Specifically
+ *
+ * - Use Caja's CSS property whitelist
+ * - Use Caja's CSS function whitelist
+ * - Force @import through the proxy and require sanitization. If they cant be parsed, remove them
+ * - Force @url references to have the HTTP/HTTPS protocol
+ */
+public class CajaCssSanitizer {
+
+ private static final Logger logger = Logger.getLogger(CajaCssSanitizer.class.getName());
+
+ private static final Set<String> ALLOWED_URI_SCHEMES = ImmutableSet.of("http", "https");
+
+ private final CajaCssParser parser;
+
+ private final CssSchema schema;
+
+ @Inject
+ public CajaCssSanitizer(CajaCssParser parser) {
+ this.parser = parser;
+ schema = CssSchema.getDefaultCss21Schema(new SimpleMessageQueue());
+ }
+
+ /**
+ * Sanitize the CSS content of a style tag.
+ * @param content to sanitize
+ * @param linkContext url of containing content
+ * @param importRewriter to rewrite @imports to sanitizing proxy
+ * @param importRewriter to rewrite images to sanitizing proxy
+ */
+ public String sanitize(String content, Uri linkContext, LinkRewriter importRewriter,
+ LinkRewriter imageRewriter) {
+ try {
+ CssTree.StyleSheet stylesheet = parser.parseDom(content);
+ sanitize(stylesheet, linkContext, importRewriter, imageRewriter);
+ // Write the rewritten CSS back into the element
+ return parser.serialize(stylesheet);
+ } catch (GadgetException ge) {
+ // Failed to parse stylesheet so log and continue
+ logger.log(Level.INFO, "Failed to parse stylesheet", ge);
+ return "";
+ }
+ }
+
+ /**
+ * Sanitize the CSS content of a style tag.
+ * @param styleElem to sanitize
+ * @param linkContext url of containing content
+ * @param importRewriter to rewrite @imports to sanitizing proxy
+ * @param importRewriter to rewrite images to sanitizing proxy
+ */
+ public void sanitize(Element styleElem, Uri linkContext, LinkRewriter importRewriter,
+ LinkRewriter imageRewriter) {
+ String content = null;
+ try {
+ CssTree.StyleSheet stylesheet = parser.parseDom(styleElem.getTextContent());
+ sanitize(stylesheet, linkContext, importRewriter, imageRewriter);
+ // Write the rewritten CSS back into the element
+ content = parser.serialize(stylesheet);
+ } catch (GadgetException ge) {
+ // Failed to parse stylesheet so log and continue
+ logger.log(Level.INFO, "Failed to parse stylesheet", ge);
+ }
+ if (StringUtils.isEmpty(content)) {
+ // Remove the owning node
+ styleElem.getParentNode().removeChild(styleElem);
+ } else {
+ styleElem.setTextContent(content);
+ }
+ }
+
+ /**
+ * Sanitize the given CSS tree in-place by removing all non-whitelisted function calls
+ * @param css DOM root
+ * @param linkContext url of containing content
+ * @param importRewriter to rewrite links to sanitizing proxy
+ * @param imageRewriter to rewrite links to the sanitizing proxy
+ */
+ public void sanitize(CssTree css, final Uri linkContext, final LinkRewriter importRewriter,
+ final LinkRewriter imageRewriter) {
+ css.acceptPreOrder(new Visitor() {
+ public boolean visit(AncestorChain<?> ancestorChain) {
+ if (ancestorChain.node instanceof CssTree.Property) {
+ if (!schema.isPropertyAllowed(((CssTree.Property) ancestorChain.node).
+ getPropertyName())) {
+ // Remove offending property
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "Removing property "
+ + ((CssTree.Property) ancestorChain.node).getPropertyName());
+ }
+ clean(ancestorChain);
+ }
+ } else if (ancestorChain.node instanceof CssTree.FunctionCall) {
+ if (!schema.isFunctionAllowed(((CssTree.FunctionCall)ancestorChain.node).getName())) {
+ // Remove offending node
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "Removing function "
+ + ((CssTree.FunctionCall) ancestorChain.node).getName());
+ }
+ clean(ancestorChain);
+ }
+ } else if (ancestorChain.node instanceof CssTree.UriLiteral &&
+ !(ancestorChain.getParentNode() instanceof CssTree.Import)) {
+ String uri = ((CssTree.UriLiteral)ancestorChain.node).getValue();
+ if (isValidUri(uri)) {
+ // Assume the URI is for an image. Rewrite it using the image link rewriter
+ ((CssTree.UriLiteral)ancestorChain.node).setValue(
+ imageRewriter.rewrite(uri, linkContext));
+ } else {
+ // Remove offending node
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "Removing invalid URI " + uri);
+ }
+ clean(ancestorChain);
+ }
+ } else if (ancestorChain.node instanceof CssTree.Import) {
+ CssTree.Import importDecl = (CssTree.Import) ancestorChain.node;
+ String uri = importDecl.getUri().getValue();
+ if (isValidUri(uri)) {
+ importDecl.getUri().setValue(importRewriter.rewrite(uri, linkContext));
+ } else {
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "Removing invalid URI " + uri);
+ }
+ clean(ancestorChain);
+ }
+ }
+ return true;
+ }
+ }, null);
+ }
+
+ private boolean isValidUri(String uri) {
+ try {
+ String scheme = Uri.parse(uri).getScheme();
+ return StringUtils.isEmpty(scheme) ||
+ ALLOWED_URI_SCHEMES.contains(scheme.toLowerCase());
+ } catch (RuntimeException re) {
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, "Failed to parse URI in CSS " + uri, re);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * recurse up through chain to find a safe clean point
+ * @param chain chain of nodes
+ */
+ private static void clean(AncestorChain<?> chain) {
+ if (chain.node instanceof CssTree.Declaration ||
+ chain.node instanceof CssTree.Import) {
+ if (chain.getParentNode() instanceof CssTree.UserAgentHack) {
+ clean(chain.parent);
+ } else {
+ // Remove the entire subtree
+ ((AbstractParseTreeNode)chain.getParentNode()).removeChild(chain.node);
+ }
+ } else {
+ clean(chain.parent);
+ }
+ }
+}
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriter.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriter.java Mon Mar 8 18:15:17 2010
@@ -20,7 +20,7 @@
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.Gadget;
-import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
+import org.apache.shindig.gadgets.parse.caja.old.CajaCssSanitizer;
import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
import org.apache.shindig.gadgets.rewrite.MutableContent;
Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriter.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriter.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriter.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriter.java Mon Mar 8 18:15:17 2010
@@ -25,7 +25,7 @@
import org.apache.sanselan.common.byteSources.ByteSourceInputStream;
import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.http.HttpResponse;
-import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
+import org.apache.shindig.gadgets.parse.caja.old.CajaCssSanitizer;
import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
import org.apache.shindig.gadgets.rewrite.MutableContent;
import org.apache.shindig.gadgets.rewrite.RequestRewriter;
Added: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizerTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizerTest.java?rev=920428&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizerTest.java (added)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/parse/caja/old/CajaCssSanitizerTest.java Mon Mar 8 18:15:17 2010
@@ -0,0 +1,111 @@
+/*
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.shindig.gadgets.parse.caja.old;
+
+import org.apache.shindig.common.EasyMockTestCase;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
+import org.apache.shindig.gadgets.parse.caja.old.CajaCssSanitizer;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
+import org.apache.shindig.gadgets.servlet.ProxyBase;
+
+import com.google.caja.parser.css.CssTree;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ *
+ */
+public class CajaCssSanitizerTest extends EasyMockTestCase {
+
+ private CajaCssParser parser;
+ private CajaCssSanitizer sanitizer;
+ private final Uri DUMMY = Uri.parse("http://www.example.org/base");
+ private LinkRewriter importRewriter;
+ private LinkRewriter imageRewriter;
+
+ @Before
+ public void setUp() throws Exception {
+ parser = new CajaCssParser();
+ sanitizer = new CajaCssSanitizer(parser);
+ importRewriter = new LinkRewriter() {
+ public String rewrite(String link, Uri context) {
+ return link + '&' + ProxyBase.SANITIZE_CONTENT_PARAM + "=1&rewriteMime=text/css";
+ }
+ };
+ imageRewriter = new LinkRewriter() {
+ public String rewrite(String link, Uri context) {
+ return link + '&' + ProxyBase.SANITIZE_CONTENT_PARAM + "=1&rewriteMime=image/*";
+ }
+ };
+ }
+
+ @Test
+ public void testPreserveSafe() throws Exception {
+ String css = ".xyz { font: bold;} A { color: #7f7f7f}";
+ CssTree.StyleSheet styleSheet = parser.parseDom(css);
+ sanitizer.sanitize(styleSheet, DUMMY, importRewriter, imageRewriter);
+ assertStyleEquals(css, styleSheet);
+ }
+
+ @Test
+ public void testSanitizeFunctionCall() throws Exception {
+ String css = ".xyz { font : iamevil(bold); }";
+ CssTree.StyleSheet styleSheet = parser.parseDom(css);
+ sanitizer.sanitize(styleSheet, DUMMY, importRewriter, imageRewriter);
+ assertStyleEquals(".xyz {}", styleSheet);
+ }
+
+ @Test
+ public void testSanitizeUnsafeProperties() throws Exception {
+ String css = ".xyz { behavior: url('xyz.htc'); -moz-binding:url(\"http://ha.ckers.org/xssmoz.xml#xss\") }";
+ CssTree.StyleSheet styleSheet = parser.parseDom(css);
+ sanitizer.sanitize(styleSheet, DUMMY, importRewriter, imageRewriter);
+ assertStyleEquals(".xyz {}", styleSheet);
+ }
+
+ @Test
+ public void testSanitizeScriptUrls() throws Exception {
+ String css = ".xyz { background: url('javascript:doevill'); background : url(vbscript:moreevil); }";
+ CssTree.StyleSheet styleSheet = parser.parseDom(css);
+ sanitizer.sanitize(styleSheet, DUMMY, importRewriter, imageRewriter);
+ assertStyleEquals(".xyz {}", styleSheet);
+ }
+
+ @Test
+ public void testProxyUrls() throws Exception {
+ String css = ".xyz { background: url('http://www.example.org/img.gif');}";
+ CssTree.StyleSheet styleSheet = parser.parseDom(css);
+ sanitizer.sanitize(styleSheet, DUMMY, importRewriter, imageRewriter);
+ assertStyleEquals(
+ ".xyz { background: url('http://www.example.org/img.gif&sanitize=1&rewriteMime=image/*');}", styleSheet);
+ }
+
+ @Test
+ public void testUrlEscaping() throws Exception {
+ String css = ".xyz { background: url('http://www.example.org/img.gif');}";
+ CssTree.StyleSheet styleSheet = parser.parseDom(css);
+ sanitizer.sanitize(styleSheet, DUMMY, importRewriter, imageRewriter);
+ assertEquals(".xyz{background:url('http://www.example.org/img.gif%26sanitize%3D1%26rewriteMime%3Dimage/%2A');}",
+ parser.serialize(styleSheet).replaceAll("\\s", ""));
+ }
+
+ public void assertStyleEquals(String expected, CssTree.StyleSheet styleSheet) throws Exception {
+ assertEquals(parser.serialize(parser.parseDom(expected)), parser.serialize(styleSheet));
+ }
+}
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriterTest.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingGadgetRewriterTest.java Mon Mar 8 18:15:17 2010
@@ -22,13 +22,13 @@
import org.apache.shindig.gadgets.Gadget;
import org.apache.shindig.gadgets.GadgetContext;
import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
-import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
+import org.apache.shindig.gadgets.parse.caja.old.CajaCssSanitizer;
import org.apache.shindig.gadgets.render.old.DefaultSanitizingProxyingLinkRewriterFactory;
import org.apache.shindig.gadgets.render.old.SanitizingGadgetRewriter;
-import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.old.BaseRewriterTestCase;
import org.apache.shindig.gadgets.servlet.ProxyBase;
import org.apache.shindig.gadgets.spec.GadgetSpec;
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriterTest.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/render/old/SanitizingRequestRewriterTest.java Mon Mar 8 18:15:17 2010
@@ -27,13 +27,13 @@
import org.apache.shindig.gadgets.http.HttpResponse;
import org.apache.shindig.gadgets.http.HttpResponseBuilder;
import org.apache.shindig.gadgets.parse.caja.CajaCssParser;
-import org.apache.shindig.gadgets.parse.caja.CajaCssSanitizer;
+import org.apache.shindig.gadgets.parse.caja.old.CajaCssSanitizer;
import org.apache.shindig.gadgets.render.old.DefaultSanitizingProxyingLinkRewriterFactory;
import org.apache.shindig.gadgets.render.old.SanitizingRequestRewriter;
-import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
import org.apache.shindig.gadgets.rewrite.MutableContent;
import org.apache.shindig.gadgets.rewrite.RequestRewriter;
+import org.apache.shindig.gadgets.rewrite.old.BaseRewriterTestCase;
import org.junit.Test;
import java.util.Collections;
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCase.java Mon Mar 8 18:15:17 2010
@@ -17,6 +17,7 @@
*/
package org.apache.shindig.gadgets.rewrite;
+import org.apache.shindig.gadgets.rewrite.old.BaseRewriterTestCase;
import org.junit.Test;
import com.google.common.collect.Sets;
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/ContentRewriterFeatureTestCaseOS9.java Mon Mar 8 18:15:17 2010
@@ -23,6 +23,7 @@
import com.google.common.collect.Sets;
+import org.apache.shindig.gadgets.rewrite.old.BaseRewriterTestCase;
import org.junit.Test;
/**
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/DefaultContentRewriterRegistryTest.java Mon Mar 8 18:15:17 2010
@@ -24,6 +24,7 @@
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.rewrite.old.BaseRewriterTestCase;
import org.apache.shindig.gadgets.rewrite.old.CssRequestRewriter;
import org.apache.shindig.gadgets.rewrite.old.HTMLContentRewriter;
import org.easymock.EasyMock;
Added: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/BaseRewriterTestCase.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/BaseRewriterTestCase.java?rev=920428&view=auto
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/BaseRewriterTestCase.java (added)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/BaseRewriterTestCase.java Mon Mar 8 18:15:17 2010
@@ -0,0 +1,287 @@
+/*
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.shindig.gadgets.rewrite.old;
+
+import org.apache.shindig.common.PropertiesModule;
+import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.config.AbstractContainerConfig;
+import org.apache.shindig.config.ContainerConfig;
+import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.GadgetSpecFactory;
+import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
+import org.apache.shindig.gadgets.http.HttpResponseBuilder;
+import org.apache.shindig.gadgets.http.RequestPipeline;
+import org.apache.shindig.gadgets.parse.GadgetHtmlParser;
+import org.apache.shindig.gadgets.parse.ParseModule;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
+import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
+import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature.Config;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature.DefaultConfig;
+import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature.Factory;
+import org.apache.shindig.gadgets.rewrite.old.ContentRewriterUris;
+import org.apache.shindig.gadgets.rewrite.old.DefaultProxyingLinkRewriterFactory;
+import org.apache.shindig.gadgets.rewrite.old.LinkRewriter;
+import org.apache.shindig.gadgets.spec.GadgetSpec;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+import org.apache.commons.lang.StringUtils;
+import org.easymock.classextension.EasyMock;
+import org.easymock.classextension.IMocksControl;
+import org.junit.Before;
+
+import java.util.Set;
+
+/**
+ * Base class for testing content rewriting functionality
+ */
+public abstract class BaseRewriterTestCase {
+ public static final Uri SPEC_URL = Uri.parse("http://www.example.org/dir/g.xml");
+ public static final String DEFAULT_PROXY_BASE = "http://www.test.com/dir/proxy?url=";
+ public static final String DEFAULT_CONCAT_BASE = "http://www.test.com/dir/concat?";
+
+ public static final String MOCK_CONTAINER = "mock";
+ public static final String MOCK_PROXY_BASE =
+ replaceDefaultWithMockServer(DEFAULT_PROXY_BASE);
+ public static final String MOCK_CONCAT_BASE =
+ replaceDefaultWithMockServer(DEFAULT_CONCAT_BASE);
+ protected final String TAGS = "embed,img,script,link,style";
+
+ protected Set<String> tags;
+ protected ContentRewriterFeature.Config defaultRewriterFeature;
+ protected ContentRewriterFeature.Factory rewriterFeatureFactory;
+ protected LinkRewriter defaultLinkRewriter;
+ protected LinkRewriter defaultLinkRewriterNoCache;
+ protected LinkRewriter defaultLinkRewriterNoCacheAndDebug;
+ protected GadgetHtmlParser parser;
+ protected Injector injector;
+ protected HttpResponse fakeResponse;
+ protected ContentRewriterUris rewriterUris;
+ protected IMocksControl control;
+ protected ContentRewriterUris defaultContainerRewriterUris;
+
+ @Before
+ public void setUp() throws Exception {
+ rewriterFeatureFactory = new ContentRewriterFeature.Factory(null,
+ new ContentRewriterFeature.DefaultConfig(".*", "", "86400",
+ "embed,img,script,link,style", "false", "false"));
+ defaultRewriterFeature = rewriterFeatureFactory.getDefault();
+ tags = defaultRewriterFeature.getIncludedTags();
+ defaultContainerRewriterUris = new ContentRewriterUris(
+ new AbstractContainerConfig() {
+ @Override
+ public Object getProperty(String container, String name) {
+ return null;
+ }
+ }, DEFAULT_PROXY_BASE, DEFAULT_CONCAT_BASE);
+ defaultLinkRewriter = new DefaultProxyingLinkRewriterFactory(
+ defaultContainerRewriterUris).create(SPEC_URL, defaultRewriterFeature,
+ "default", false, false);
+ defaultLinkRewriterNoCache = new DefaultProxyingLinkRewriterFactory(
+ defaultContainerRewriterUris).create(SPEC_URL, defaultRewriterFeature,
+ "default", false, true);
+ defaultLinkRewriterNoCacheAndDebug = new DefaultProxyingLinkRewriterFactory(
+ defaultContainerRewriterUris).create(SPEC_URL, defaultRewriterFeature,
+ "default", true, true);
+ injector = Guice.createInjector(new ParseModule(), new PropertiesModule(), new TestModule());
+ parser = injector.getInstance(GadgetHtmlParser.class);
+ fakeResponse = new HttpResponseBuilder().setHeader("Content-Type", "unknown")
+ .setResponse(new byte[]{ (byte)0xFE, (byte)0xFF}).create();
+
+ ContainerConfig config = new AbstractContainerConfig() {
+ @Override
+ public Object getProperty(String container, String name) {
+ if (MOCK_CONTAINER.equals(container)) {
+ if (ContentRewriterUris.PROXY_BASE_CONFIG_PROPERTY.equals(name)) {
+ return MOCK_PROXY_BASE;
+ } else if (ContentRewriterUris.CONCAT_BASE_CONFIG_PROPERTY.equals(name)) {
+ return MOCK_CONCAT_BASE;
+ }
+ }
+
+ return null;
+ }
+ };
+
+ rewriterUris = new ContentRewriterUris(config, DEFAULT_PROXY_BASE,
+ DEFAULT_CONCAT_BASE);
+ control = EasyMock.createControl();
+ }
+
+ public static GadgetSpec createSpecWithRewrite(String include, String exclude, String expires,
+ Set<String> tags) throws GadgetException {
+ StringBuilder xml = new StringBuilder();
+ xml.append("<Module>");
+ xml.append("<ModulePrefs title=\"title\">");
+ xml.append("<Optional feature=\"content-rewrite\">\n");
+ if(expires != null)
+ xml.append(" <Param name=\"expires\">" + expires + "</Param>\n");
+ if(include != null)
+ xml.append(" <Param name=\"include-urls\">" + include + "</Param>\n");
+ if(exclude != null)
+ xml.append(" <Param name=\"exclude-urls\">" + exclude + "</Param>\n");
+ if(tags != null)
+ xml.append(" <Param name=\"include-tags\">" + StringUtils.join(tags, ",") + "</Param>\n");
+ xml.append("</Optional>");
+ xml.append("</ModulePrefs>");
+ xml.append("<Content type=\"html\">Hello!</Content>");
+ xml.append("</Module>");
+ return new GadgetSpec(SPEC_URL, xml.toString());
+ }
+
+ public static GadgetSpec createSpecWithRewriteOS9(String[] includes, String[] excludes, String expires,
+ Set<String> tags) throws GadgetException {
+ StringBuilder xml = new StringBuilder();
+ xml.append("<Module>");
+ xml.append("<ModulePrefs title=\"title\">");
+ xml.append("<Optional feature=\"content-rewrite\">\n");
+ if(expires != null)
+ xml.append(" <Param name=\"expires\">" + expires + "</Param>\n");
+ if(includes != null)
+ for (String include : includes) {
+ xml.append(" <Param name=\"include-url\">" + include + "</Param>\n");
+ }
+ if(excludes != null)
+ for (String exclude : excludes) {
+ xml.append(" <Param name=\"exclude-url\">" + exclude + "</Param>\n");
+ }
+ if(tags != null)
+ xml.append(" <Param name=\"include-tags\">" + StringUtils.join(tags, ",") + "</Param>\n");
+ xml.append("</Optional>");
+ xml.append("</ModulePrefs>");
+ xml.append("<Content type=\"html\">Hello!</Content>");
+ xml.append("</Module>");
+ return new GadgetSpec(SPEC_URL, xml.toString());
+ }
+
+ public static GadgetSpec createSpecWithoutRewrite() throws GadgetException {
+ String xml = "<Module>" +
+ "<ModulePrefs title=\"title\">" +
+ "</ModulePrefs>" +
+ "<Content type=\"html\">Hello!</Content>" +
+ "</Module>";
+ return new GadgetSpec(SPEC_URL, xml);
+ }
+
+ public static String replaceDefaultWithMockServer(String originalText) {
+ return originalText.replace("test.com", "mock.com");
+ }
+
+ protected ContentRewriterFeature.Factory mockContentRewriterFeatureFactory(
+ ContentRewriterFeature.Config feature) {
+ return new FakeRewriterFeatureFactory(feature);
+ }
+
+ String rewriteHelper(GadgetRewriter rewriter, String s)
+ throws Exception {
+ MutableContent mc = rewriteContent(rewriter, s, null);
+ String rewrittenContent = mc.getContent();
+
+ // Strip around the HTML tags for convenience
+ int htmlTagIndex = rewrittenContent.indexOf("<HTML>");
+ if (htmlTagIndex != -1) {
+ return rewrittenContent.substring(htmlTagIndex + 6,
+ rewrittenContent.lastIndexOf("</HTML>"));
+ }
+ return rewrittenContent;
+ }
+
+ protected MutableContent rewriteContent(GadgetRewriter rewriter, String s,
+ final String container) throws Exception {
+ return rewriteContent(rewriter, s, container, false, false);
+ }
+
+ protected MutableContent rewriteContent(GadgetRewriter rewriter, String s,
+ final String container, final boolean debug, final boolean ignoreCache)
+ throws Exception {
+ MutableContent mc = new MutableContent(parser, s);
+
+ GadgetSpec spec = new GadgetSpec(SPEC_URL,
+ "<Module><ModulePrefs title=''/><Content><![CDATA[" + s + "]]></Content></Module>");
+
+ GadgetContext context = new GadgetContext() {
+ @Override
+ public Uri getUrl() {
+ return SPEC_URL;
+ }
+
+ @Override
+ public String getContainer() {
+ return container;
+ }
+
+ @Override
+ public boolean getDebug() {
+ return debug;
+ }
+
+ @Override
+ public boolean getIgnoreCache() {
+ return ignoreCache;
+ }
+ };
+
+ Gadget gadget = new Gadget()
+ .setContext(context)
+ .setSpec(spec);
+ rewriter.rewrite(gadget, mc);
+ return mc;
+ }
+
+ private static class FakeRewriterFeatureFactory extends ContentRewriterFeature.Factory {
+ private final ContentRewriterFeature.Config feature;
+
+ public FakeRewriterFeatureFactory(ContentRewriterFeature.Config feature) {
+ super(null, new ContentRewriterFeature.DefaultConfig(".*", "", "HTTP", "", "false", "false"));
+ this.feature = feature;
+ }
+
+ @Override
+ public ContentRewriterFeature.Config get(GadgetSpec spec) {
+ return feature;
+ }
+
+ @Override
+ public ContentRewriterFeature.Config get(HttpRequest request) {
+ return feature;
+ }
+ }
+
+ private static class TestModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+ bind(RequestPipeline.class).toInstance(new RequestPipeline() {
+ public HttpResponse execute(HttpRequest request) { return null; }
+ public void normalizeProtocol(HttpRequest request) throws GadgetException {}
+ });
+
+ bind(GadgetSpecFactory.class).toInstance(new GadgetSpecFactory() {
+ public GadgetSpec getGadgetSpec(GadgetContext context) {
+ return null;
+ }
+ });
+ }
+ }
+}
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/CssRequestRewriterTest.java Mon Mar 8 18:15:17 2010
@@ -27,7 +27,6 @@
import org.apache.shindig.gadgets.http.HttpResponse;
import org.apache.shindig.gadgets.http.HttpResponseBuilder;
import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
-import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
import org.apache.shindig.gadgets.rewrite.MutableContent;
import org.apache.shindig.gadgets.rewrite.old.DefaultProxyingLinkRewriterFactory;
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/HTMLContentRewriterTest.java Mon Mar 8 18:15:17 2010
@@ -23,7 +23,6 @@
import org.apache.shindig.gadgets.http.HttpRequest;
import org.apache.shindig.gadgets.parse.caja.CajaCssLexerParser;
-import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
import org.apache.shindig.gadgets.rewrite.MutableContent;
import org.apache.shindig.gadgets.rewrite.XPathWrapper;
Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java?rev=920428&r1=920427&r2=920428&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/rewrite/old/ProxyingLinkRewriterTest.java Mon Mar 8 18:15:17 2010
@@ -19,7 +19,6 @@
import static org.junit.Assert.assertEquals;
-import org.apache.shindig.gadgets.rewrite.BaseRewriterTestCase;
import org.apache.shindig.gadgets.rewrite.ContentRewriterFeature;
import org.apache.shindig.gadgets.rewrite.old.DefaultProxyingLinkRewriterFactory;
import org.apache.shindig.gadgets.rewrite.old.ProxyingLinkRewriter;