Author: jtarrio
Date: Sat May  7 01:20:08 2011
New Revision: 1100426

URL: http://svn.apache.org/viewvc?rev=1100426&view=rev
Log:
Apply gadget blacklist for proxy and makeRequest requests

After a gadget has been blacklisted, it may still remain loaded in some browsers
and continue issuing requests. This applies the blacklist to proxy and
makeRequest so they will no longer be processed for blacklisted gadgets.

Review: http://codereview.appspot.com/4462041/

Modified:
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
    
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
    
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java?rev=1100426&r1=1100425&r2=1100426&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/MakeRequestHandler.java
 Sat May  7 01:20:08 2011
@@ -33,6 +33,7 @@ import org.apache.shindig.config.Contain
 import org.apache.shindig.gadgets.AuthType;
 import org.apache.shindig.gadgets.FeedProcessor;
 import org.apache.shindig.gadgets.FetchResponseUtils;
+import org.apache.shindig.gadgets.GadgetBlacklist;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.GadgetException.Code;
 import org.apache.shindig.gadgets.http.HttpRequest;
@@ -76,15 +77,18 @@ public class MakeRequestHandler {
   private final RequestPipeline requestPipeline;
   private final ResponseRewriterRegistry contentRewriterRegistry;
   private final Provider<FeedProcessor> feedProcessorProvider;
+  private final GadgetBlacklist gadgetBlacklist;
 
   @Inject
   public MakeRequestHandler(RequestPipeline requestPipeline,
       @RewriterRegistry(rewriteFlow = RewriteFlow.DEFAULT)
       ResponseRewriterRegistry contentRewriterRegistry,
-      Provider<FeedProcessor> feedProcessorProvider) {
+      Provider<FeedProcessor> feedProcessorProvider,
+      GadgetBlacklist gadgetBlacklist) {
     this.requestPipeline = requestPipeline;
     this.contentRewriterRegistry = contentRewriterRegistry;
     this.feedProcessorProvider = feedProcessorProvider;
+    this.gadgetBlacklist = gadgetBlacklist;
   }
 
   /**
@@ -94,6 +98,11 @@ public class MakeRequestHandler {
       throws GadgetException, IOException {
     HttpRequest rcr = buildHttpRequest(request);
 
+    if (rcr.getGadget() != null && 
gadgetBlacklist.isBlacklisted(rcr.getGadget())) {
+      throw new GadgetException(GadgetException.Code.BLACKLISTED_GADGET,
+          "The requested content is unavailable", HttpResponse.SC_FORBIDDEN);
+    }
+    
     // Serialize the response
     HttpResponse results = requestPipeline.execute(rcr);
 

Modified: 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java?rev=1100426&r1=1100425&r2=1100426&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/ProxyHandler.java
 Sat May  7 01:20:08 2011
@@ -26,6 +26,7 @@ import com.google.inject.name.Named;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.GadgetBlacklist;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
@@ -53,16 +54,19 @@ public class ProxyHandler {
   private final RequestPipeline requestPipeline;
   private final ResponseRewriterRegistry contentRewriterRegistry;
   protected final boolean remapInternalServerError;
+  private final GadgetBlacklist gadgetBlacklist;
 
   @Inject
   public ProxyHandler(RequestPipeline requestPipeline,
                       @RewriterRegistry(rewriteFlow = RewriteFlow.DEFAULT)
                       ResponseRewriterRegistry contentRewriterRegistry,
                       @Named("shindig.proxy.remapInternalServerError")
-                      Boolean remapInternalServerError) {
+                      Boolean remapInternalServerError,
+                      GadgetBlacklist gadgetBlacklist) {
     this.requestPipeline = requestPipeline;
     this.contentRewriterRegistry = contentRewriterRegistry;
     this.remapInternalServerError = remapInternalServerError;
+    this.gadgetBlacklist = gadgetBlacklist;
   }
 
   /**
@@ -84,6 +88,11 @@ public class ProxyHandler {
           "No url parameter in request", HttpResponse.SC_BAD_REQUEST);
     }
 
+    if (rcr.getGadget() != null && 
gadgetBlacklist.isBlacklisted(rcr.getGadget())) {
+      throw new GadgetException(GadgetException.Code.BLACKLISTED_GADGET,
+          "The requested content is unavailable", HttpResponse.SC_FORBIDDEN);
+    }
+    
     HttpResponse results = requestPipeline.execute(rcr);
 
     if (results.isError()) {

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java?rev=1100426&r1=1100425&r2=1100426&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestHandlerTest.java
 Sat May  7 01:20:08 2011
@@ -21,6 +21,7 @@ package org.apache.shindig.gadgets.servl
 import static junitx.framework.StringAssert.assertStartsWith;
 import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
 
 import com.google.common.collect.Lists;
 
@@ -31,6 +32,7 @@ import org.apache.shindig.common.testing
 import org.apache.shindig.common.uri.Uri;
 import org.apache.shindig.config.ContainerConfig;
 import org.apache.shindig.gadgets.AuthType;
+import org.apache.shindig.gadgets.GadgetBlacklist;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
@@ -62,8 +64,9 @@ public class MakeRequestHandlerTest exte
   private static final String RESPONSE_BODY = "makeRequest response body";
   private static final SecurityToken DUMMY_TOKEN = new FakeGadgetToken();
 
+  private final GadgetBlacklist gadgetBlacklist = mock(GadgetBlacklist.class);
   private final MakeRequestHandler handler
-      = new MakeRequestHandler(pipeline, rewriterRegistry, 
feedProcessorProvider);
+      = new MakeRequestHandler(pipeline, rewriterRegistry, 
feedProcessorProvider, gadgetBlacklist);
 
   private void expectGetAndReturnBody(String response) throws Exception {
     expectGetAndReturnBody(AuthType.NONE, response);
@@ -171,6 +174,22 @@ public class MakeRequestHandlerTest exte
     assertEquals(-1, httpRequest.getCacheTtl());
   }
 
+  @Test
+  public void GetRequestWithBlacklistedGadget() throws Exception {
+    
expect(request.getParameter(Param.GADGET.getKey())).andReturn("http://some/gadget.xml";).anyTimes();
+    expect(gadgetBlacklist.isBlacklisted(isA(Uri.class))).andReturn(true);
+    replay();
+    boolean exceptionThrown = false;
+    try {
+      handler.fetch(request, recorder);
+    } catch (GadgetException e) {
+      exceptionThrown = true;
+      assertEquals(403, e.getHttpStatusCode());
+      assertEquals(GadgetException.Code.BLACKLISTED_GADGET, e.getCode());
+    }
+    assertTrue(exceptionThrown);
+    verify();
+  }
 
   @Test
   public void testExplicitHeaders() throws Exception {

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java?rev=1100426&r1=1100425&r2=1100426&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/MakeRequestServletTest.java
 Sat May  7 01:20:08 2011
@@ -23,6 +23,7 @@ import static junitx.framework.StringAss
 import static org.easymock.EasyMock.expect;
 
 import org.apache.shindig.common.uri.Uri;
+import org.apache.shindig.gadgets.GadgetBlacklist;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
@@ -50,8 +51,10 @@ public class MakeRequestServletTest exte
   private static final Enumeration<String> EMPTY_ENUM
       = Collections.enumeration(Collections.<String>emptyList());
 
+  private final GadgetBlacklist gadgetBlacklist = mock(GadgetBlacklist.class);
   private final MakeRequestServlet servlet = new MakeRequestServlet();
-  private final MakeRequestHandler handler = new MakeRequestHandler(pipeline, 
null, feedProcessorProvider);
+  private final MakeRequestHandler handler =
+      new MakeRequestHandler(pipeline, null, feedProcessorProvider, 
gadgetBlacklist);
 
   private final HttpRequest internalRequest = new HttpRequest(REQUEST_URL);
   private final HttpResponse internalResponse = new 
HttpResponse(RESPONSE_BODY);

Modified: 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
URL: 
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java?rev=1100426&r1=1100425&r2=1100426&view=diff
==============================================================================
--- 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
 (original)
+++ 
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/ProxyHandlerTest.java
 Sat May  7 01:20:08 2011
@@ -27,6 +27,7 @@ import org.apache.shindig.common.uri.Uri
 import org.apache.shindig.common.util.FakeTimeSource;
 import org.apache.shindig.config.ContainerConfig;
 import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetBlacklist;
 import org.apache.shindig.gadgets.GadgetException;
 import org.apache.shindig.gadgets.http.HttpRequest;
 import org.apache.shindig.gadgets.http.HttpResponse;
@@ -46,6 +47,7 @@ import org.easymock.EasyMock;
 import static org.easymock.EasyMock.capture;
 import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.isA;
+
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -53,21 +55,24 @@ import java.util.List;
 import java.util.Map;
 
 public class ProxyHandlerTest extends EasyMockTestCase {
+  private final static String GADGET = "http://some/gadget.xml";;
   private final static String URL_ONE = "http://www.example.org/test.html";;
   private final static String DATA_ONE = "hello world";
 
   public final RequestPipeline pipeline = mock(RequestPipeline.class);
+  private GadgetBlacklist gadgetBlacklist = mock(GadgetBlacklist.class); 
   public CaptureRewriter rewriter = new CaptureRewriter();
   public ResponseRewriterRegistry rewriterRegistry
       = new 
DefaultResponseRewriterRegistry(Arrays.<ResponseRewriter>asList(rewriter), 
null);
   private ProxyUriManager.ProxyUri request;
 
   private final ProxyHandler proxyHandler
-      = new ProxyHandler(pipeline, rewriterRegistry, true);
+      = new ProxyHandler(pipeline, rewriterRegistry, true, gadgetBlacklist);
 
   private void expectGetAndReturnData(String url, byte[] data) throws 
Exception {
     HttpRequest req = new HttpRequest(Uri.parse(url));
     HttpResponse resp = new HttpResponseBuilder().setResponse(data).create();
+    expect(gadgetBlacklist.isBlacklisted(isA(Uri.class))).andReturn(false);
     expect(pipeline.execute(req)).andReturn(resp);
   }
 
@@ -75,20 +80,21 @@ public class ProxyHandlerTest extends Ea
       throws Exception {
     HttpRequest req = new HttpRequest(Uri.parse(url));
     HttpResponse resp = new 
HttpResponseBuilder().addAllHeaders(headers).create();
+    expect(gadgetBlacklist.isBlacklisted(isA(Uri.class))).andReturn(false);
     expect(pipeline.execute(req)).andReturn(resp);
   }
-
+  
   private void setupProxyRequestMock(String host, String url,
       boolean noCache, int refresh, String rewriteMime, String fallbackUrl) 
throws Exception {
     request = new ProxyUriManager.ProxyUri(
-        refresh, false, noCache, ContainerConfig.DEFAULT_CONTAINER, null, 
Uri.parse(url));
+        refresh, false, noCache, ContainerConfig.DEFAULT_CONTAINER, GADGET, 
Uri.parse(url));
     request.setFallbackUrl(fallbackUrl);
     request.setRewriteMimeType(rewriteMime);
   }
 
   private void setupNoArgsProxyRequestMock(String host, String url) throws 
Exception {
     request = new ProxyUriManager.ProxyUri(
-        -1, false, false, ContainerConfig.DEFAULT_CONTAINER, null,
+        -1, false, false, ContainerConfig.DEFAULT_CONTAINER, GADGET,
         url != null ? Uri.parse(url) : null);
   }
 
@@ -112,6 +118,26 @@ public class ProxyHandlerTest extends Ea
   }
 
   @Test
+  public void testBlacklistedGadget() throws Exception {
+    String url = "http://example.org/mypage.html";;
+    String domain = "example.org";
+    String gadget = "http://blacklisted/gadget.xml";;
+    setupProxyRequestMock(domain, url, true, -1, null, null);
+    expect(gadgetBlacklist.isBlacklisted(isA(Uri.class))).andReturn(true);
+    replay();
+    boolean exceptionCaught = false;
+    try {
+      proxyHandler.fetch(request);
+    } catch (GadgetException e) {
+      exceptionCaught = true;
+      assertEquals(GadgetException.Code.BLACKLISTED_GADGET, e.getCode());
+      assertEquals(HttpResponse.SC_FORBIDDEN, e.getHttpStatusCode());
+    }
+    assertTrue(exceptionCaught);
+    verify();
+  }
+  
+  @Test
   public void testInvalidHeaderDropped() throws Exception {
     String url = "http://example.org/mypage.html";;
     String domain = "example.org";
@@ -301,6 +327,7 @@ public class ProxyHandlerTest extends Ea
         .addHeader("Content-Type", contentType)
         .create();
 
+    expect(gadgetBlacklist.isBlacklisted(isA(Uri.class))).andReturn(false);
     expect(pipeline.execute((HttpRequest) 
EasyMock.anyObject())).andReturn(resp);
 
     replay();
@@ -311,7 +338,7 @@ public class ProxyHandlerTest extends Ea
     ResponseRewriterRegistry rewriterRegistry =
         new DefaultResponseRewriterRegistry(
             Arrays.<ResponseRewriter>asList(rewriter), null);
-    ProxyHandler proxyHandler = new ProxyHandler(pipeline, rewriterRegistry, 
true);
+    ProxyHandler proxyHandler = new ProxyHandler(pipeline, rewriterRegistry, 
true, gadgetBlacklist);
 
     request.setReturnOriginalContentOnError(true);
     HttpResponse recorder = proxyHandler.fetch(request);
@@ -338,6 +365,7 @@ public class ProxyHandlerTest extends Ea
         .addHeader("Content-Type", contentType)
         .create();
 
+    expect(gadgetBlacklist.isBlacklisted(isA(Uri.class))).andReturn(false);
     expect(pipeline.execute((HttpRequest) 
EasyMock.anyObject())).andReturn(resp);
 
     replay();
@@ -348,7 +376,7 @@ public class ProxyHandlerTest extends Ea
     ResponseRewriterRegistry rewriterRegistry =
         new DefaultResponseRewriterRegistry(
             Arrays.<ResponseRewriter>asList(rewriter), null);
-    ProxyHandler proxyHandler = new ProxyHandler(pipeline, rewriterRegistry, 
true);
+    ProxyHandler proxyHandler = new ProxyHandler(pipeline, rewriterRegistry, 
true, gadgetBlacklist);
 
     boolean exceptionCaught = false;
     try {


Reply via email to