Author: jasvir
Date: Tue Feb  1 01:14:38 2011
New Revision: 1065878

URL: http://svn.apache.org/viewvc?rev=1065878&view=rev
Log:
Change url policy to:
* proxy dynamically created urls
* proxy urls that load media eg imgs 

Modified:
    shindig/trunk/features/src/main/javascript/features/caja/feature.xml
    shindig/trunk/features/src/main/javascript/features/caja/taming.js
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java

Modified: shindig/trunk/features/src/main/javascript/features/caja/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/caja/feature.xml?rev=1065878&r1=1065877&r2=1065878&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/caja/feature.xml 
(original)
+++ shindig/trunk/features/src/main/javascript/features/caja/feature.xml Tue 
Feb  1 01:14:38 2011
@@ -20,6 +20,7 @@ The javascript referenced here should be
 -->
 <feature>
   <name>caja</name>
+  <dependency>core.io</dependency>
   <gadget>
     <script src="res://com/google/caja/plugin/domita-minified.js"/>
     <script src="caja.js"/>

Modified: shindig/trunk/features/src/main/javascript/features/caja/taming.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/features/src/main/javascript/features/caja/taming.js?rev=1065878&r1=1065877&r2=1065878&view=diff
==============================================================================
--- shindig/trunk/features/src/main/javascript/features/caja/taming.js 
(original)
+++ shindig/trunk/features/src/main/javascript/features/caja/taming.js Tue Feb  
1 01:14:38 2011
@@ -26,16 +26,13 @@ var caja___ = (function() {
   var uriCallback = {
     rewrite: function rewrite(uri, mimeTypes) {
       uri = String(uri);
-      // By default, only allow references to anchors.
+      // Allow references to anchors within the gadget
       if (/^#/.test(uri)) {
         return '#' + encodeURIComponent(decodeURIComponent(uri.substring(1)));
-        // and files on the same host
-      } else if (/^\/(?:[^\/][^?#]*)?$/.test(uri)) {
-        return encodeURI(decodeURI(uri));
+      } else {
+        // Proxy all other dynamically constructed urls
+        return gadgets.io.getProxyUrl(uri);
       }
-      // This callback can be replaced with one that passes the URL through
-      // a proxy that checks the mimetype.
-      return null;
     }
   };
 

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java?rev=1065878&r1=1065877&r2=1065878&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/CajaContentRewriter.java
 Tue Feb  1 01:14:38 2011
@@ -58,6 +58,7 @@ import com.google.caja.reporting.SimpleM
 import com.google.caja.reporting.SnippetProducer;
 import com.google.caja.service.ServiceMessageType;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.inject.Inject;
 
@@ -77,6 +78,8 @@ import org.apache.shindig.gadgets.parse.
 import org.apache.shindig.gadgets.parse.HtmlSerializer;
 import org.apache.shindig.gadgets.rewrite.GadgetRewriter;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
+import org.apache.shindig.gadgets.uri.ProxyUriManager;
+import org.apache.shindig.gadgets.uri.UriStatus;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -103,10 +106,11 @@ public class CajaContentRewriter impleme
   private final Cache<String, Element> cajoledCache;
   private final RequestPipeline requestPipeline;
   private final HtmlSerializer htmlSerializer;
+  private final ProxyUriManager proxyUriManager;
 
   @Inject
   public CajaContentRewriter(CacheProvider cacheProvider, RequestPipeline 
requestPipeline,
-      HtmlSerializer htmlSerializer) {
+      HtmlSerializer htmlSerializer, ProxyUriManager proxyUriManager) {
     if (null == cacheProvider) {
       this.cajoledCache = null;
     } else {
@@ -118,6 +122,7 @@ public class CajaContentRewriter impleme
     }
     this.requestPipeline = requestPipeline;
     this.htmlSerializer = htmlSerializer;
+    this.proxyUriManager = proxyUriManager;
   }
   
   public class CajoledResult {
@@ -338,14 +343,25 @@ public class CajaContentRewriter impleme
     };
   }
   
-  private UriPolicy makePolicy(final Uri gadgetUri) {
+  protected UriPolicy makePolicy(final Uri gadgetUri) {
     return new UriPolicy() {
       public String rewriteUri(ExternalReference ref, UriEffect effect,
           LoaderType loader, Map<String, ?> hints) {
-        URI uri = ref.getUri();
-        if (uri.getScheme().equalsIgnoreCase("https") ||
-            uri.getScheme().equalsIgnoreCase("http")) {
-          return gadgetUri.resolve(Uri.fromJavaUri(uri)).toString();
+        try {
+          switch(effect) {
+            case SAME_DOCUMENT:
+                ProxyUriManager.ProxyUri proxyUri =
+                    new ProxyUriManager.ProxyUri(
+                        UriStatus.VALID_UNVERSIONED, 
Uri.fromJavaUri(ref.getUri()), null);
+                return proxyUriManager.make(ImmutableList.of(proxyUri), 
null).get(0).toString();
+            case NEW_DOCUMENT:
+            case NOT_LOADED:
+                return ref.getUri().toString();
+            default:
+                return null;
+          }
+        } catch (RuntimeException e) {
+          // if there are unexpected errors, fail safe - drop the uri
         }
         return null;
       }

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java?rev=1065878&r1=1065877&r2=1065878&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/CajaContentRewriterTest.java
 Tue Feb  1 01:14:38 2011
@@ -37,7 +37,11 @@ import org.apache.shindig.gadgets.parse.
 import org.apache.shindig.gadgets.parse.nekohtml.NekoSimplifiedHtmlParser;
 import org.apache.shindig.gadgets.rewrite.MutableContent;
 import org.apache.shindig.gadgets.rewrite.RewriterTestBase;
+import org.apache.shindig.gadgets.uri.ProxyUriManager;
+import org.apache.shindig.gadgets.uri.ProxyUriManager.ProxyUri;
+import org.easymock.Capture;
 import org.easymock.EasyMock;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.DOMImplementation;
@@ -51,7 +55,8 @@ import static org.junit.Assert.assertTru
 public class CajaContentRewriterTest extends RewriterTestBase {
   private List<GadgetHtmlParser> parsers;
   private CajaContentRewriter rewriter;
-
+  private ProxyUriManager proxyUriManager;
+  
   @Before
   public void setUp() throws Exception {
     super.setUp();
@@ -67,7 +72,8 @@ public class CajaContentRewriterTest ext
     CacheProvider lru = new LruCacheProvider(3);
     RequestPipeline pipeline = EasyMock.createNiceMock(RequestPipeline.class);
     DefaultHtmlSerializer defaultSerializer = new DefaultHtmlSerializer();
-    rewriter = new CajaContentRewriter(lru, pipeline, defaultSerializer) {
+    proxyUriManager = EasyMock.createNiceMock(ProxyUriManager.class);
+    rewriter = new CajaContentRewriter(lru, pipeline, defaultSerializer, 
proxyUriManager) {
       @Override
       protected PluginCompiler makePluginCompiler(PluginMeta m, MessageQueue 
q) {
         BuildInfo bi = EasyMock.createNiceMock(BuildInfo.class);
@@ -134,10 +140,41 @@ public class CajaContentRewriterTest ext
     testMarkup(markup, expected, messages);
   }
 
+  @Test
+  public void testUrlRewrite() throws Exception {
+    String uri = "http://www.example.com/";;
+    String unproxied = uri;
+    String proxied = "http://shindig.com/gadgets/proxy?url="; + uri;
+    
+    expect(proxyUriManager.make(EasyMock.anyObject(List.class), 
EasyMock.isNull(Integer.class)))
+        .andReturn(ImmutableList.<Uri>of(Uri.parse(proxied))).anyTimes();
+    replay(proxyUriManager);
+
+    // Uris that transistion the page
+    assertUrlRewritten("a", "href", uri, unproxied);
+    assertUrlRewritten("area", "href", uri, unproxied);
+    
+    // Uris that load media
+    assertUrlRewritten("img", "src", uri, proxied);
+    
+    // Uris that have no effect on the document
+    assertUrlRewritten("blockquote", "cite", uri, unproxied);
+    assertUrlRewritten("q", "cite", uri, unproxied);
+    assertUrlRewritten("del", "cite", uri, unproxied);
+    assertUrlRewritten("ins", "cite", uri, unproxied);
+  }
+  
   private void testMarkup(String markup, String expected) throws 
GadgetException{
     testMarkup(markup, expected, null);
   }
 
+  private void assertUrlRewritten(String tagName, String attr, String orig, 
String rewritten)
+      throws Exception {
+    String markUp = "<" + tagName + " " + attr + "=\"" + orig + "\">";
+    String expected = attr + "=\"" + rewritten + "\"";
+    testMarkup(markUp, expected);
+  }
+  
   private void testMarkup(String markup, String expected, List<String> msgs) 
throws GadgetException{
     Gadget gadget = makeGadget();
     for (GadgetHtmlParser parser : parsers) {

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java?rev=1065878&r1=1065877&r2=1065878&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetsHandlerTest.java
 Tue Feb  1 01:14:38 2011
@@ -186,7 +186,7 @@ public class GadgetsHandlerTest extends 
   }
 
   private CajoledResult cajole(Uri uri, String mime, String content) throws 
ParseException {
-    CajaContentRewriter rw = new CajaContentRewriter(null, null, null);
+    CajaContentRewriter rw = new CajaContentRewriter(null, null, null, 
proxyUriManager);
     InputSource is = new InputSource(uri.toJavaUri());
     MessageQueue mq = new SimpleMessageQueue();
     CharProducer cp = CharProducer.Factory.create(new StringReader(content), 
is);


Reply via email to