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;