Repository: cxf
Updated Branches:
  refs/heads/2.7.x-fixes 292ab8fba -> 235393d64


Using Origin even if allowedAllOrigins is set when allow credentials is enabled


Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/235393d6
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/235393d6
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/235393d6

Branch: refs/heads/2.7.x-fixes
Commit: 235393d64083e1c4c02ac8f1961010bd9d82187f
Parents: 292ab8f
Author: Sergey Beryozkin <[email protected]>
Authored: Tue Jun 9 11:43:58 2015 +0100
Committer: Sergey Beryozkin <[email protected]>
Committed: Tue Jun 9 12:08:19 2015 +0100

----------------------------------------------------------------------
 .../cors/CrossOriginResourceSharingFilter.java  | 44 +++++++++-----------
 .../jaxrs/cors/CrossOriginSimpleTest.java       | 30 +++++++++++++
 .../jaxrs/cors/UnannotatedCorsServer.java       | 15 +++++++
 3 files changed, 65 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/235393d6/rt/rs/security/cors/src/main/java/org/apache/cxf/rs/security/cors/CrossOriginResourceSharingFilter.java
----------------------------------------------------------------------
diff --git 
a/rt/rs/security/cors/src/main/java/org/apache/cxf/rs/security/cors/CrossOriginResourceSharingFilter.java
 
b/rt/rs/security/cors/src/main/java/org/apache/cxf/rs/security/cors/CrossOriginResourceSharingFilter.java
index 21cfae8..d624efa 100644
--- 
a/rt/rs/security/cors/src/main/java/org/apache/cxf/rs/security/cors/CrossOriginResourceSharingFilter.java
+++ 
b/rt/rs/security/cors/src/main/java/org/apache/cxf/rs/security/cors/CrossOriginResourceSharingFilter.java
@@ -113,28 +113,19 @@ public class CrossOriginResourceSharingFilter implements 
RequestHandler, Respons
     }
 
     private Response simpleRequest(Message m, CrossOriginResourceSharing ann) {
-        List<String> values = 
getHeaderValues(CorsHeaderConstants.HEADER_ORIGIN, true);
+        List<String> headerOriginValues = 
getHeaderValues(CorsHeaderConstants.HEADER_ORIGIN, true);
         // 5.1.1 there has to be an origin
-        if (values == null || values.size() == 0) {
+        if (headerOriginValues == null || headerOriginValues.size() == 0) {
             return null;
         }
         
         // 5.1.2 check all the origins
-        if (!effectiveAllowOrigins(ann, values)) {
+        if (!effectiveAllowOrigins(ann, headerOriginValues)) {
             return null;
         }
         
-        String originResponse;
-        // 5.1.3 credentials lives in the output filter
-        // in any case
-        if (effectiveAllowAllOrigins(ann)) {
-            originResponse = "*";
-        } else {
-            originResponse = concatValues(values, true);
-        }
-
         // handle 5.1.3
-        commonRequestProcessing(m, ann, originResponse);
+        setAllowOriginAndCredentials(m, ann, headerOriginValues);
         
         // 5.1.4
         List<String> effectiveExposeHeaders = effectiveExposeHeaders(ann);
@@ -230,13 +221,6 @@ public class CrossOriginResourceSharingFilter implements 
RequestHandler, Respons
             return createPreflightResponse(m, false);
         }
 
-        // 5.2.7: add allow credentials and allow-origin as required: this 
lives in the Output filter
-        String originResponse;
-        if (effectiveAllowAllOrigins(ann)) {
-            originResponse = "*";
-        } else {
-            originResponse = origin;
-        }
         // 5.2.9 add allow-methods; we pass them from here to the output 
filter which actually adds them.
         m.getExchange().put(CorsHeaderConstants.HEADER_AC_ALLOW_METHODS, 
Arrays.asList(requestMethod));
         
@@ -249,7 +233,7 @@ public class CrossOriginResourceSharingFilter implements 
RequestHandler, Respons
         }
 
         // 5.2.7 is in here.
-        commonRequestProcessing(m, ann, originResponse);
+        setAllowOriginAndCredentials(m, ann, headerOriginValues);
 
         return createPreflightResponse(m, true);
     }
@@ -314,10 +298,22 @@ public class CrossOriginResourceSharingFilter implements 
RequestHandler, Respons
         }
     }
     
-    private void commonRequestProcessing(Message m, CrossOriginResourceSharing 
ann, String origin) {
+    private void setAllowOriginAndCredentials(Message m, 
+                                              CrossOriginResourceSharing ann,
+                                              List<String> headerOriginValues) 
{
+     
+        boolean allowCreds = effectiveAllowCredentials(ann);
+        m.getExchange().put(CorsHeaderConstants.HEADER_AC_ALLOW_CREDENTIALS, 
allowCreds);
+        
+        String originResponse;
+        if (!allowCreds && effectiveAllowAllOrigins(ann)) {
+            originResponse = "*";
+        } else {
+            originResponse = concatValues(headerOriginValues, true);
+        }
+        
+        m.getExchange().put(CorsHeaderConstants.HEADER_ORIGIN, originResponse);
         
-        m.getExchange().put(CorsHeaderConstants.HEADER_ORIGIN, origin);
-        m.getExchange().put(CorsHeaderConstants.HEADER_AC_ALLOW_CREDENTIALS, 
effectiveAllowCredentials(ann));
     }
 
     public Response handleResponse(Message m, OperationResourceInfo ori, 
Response response) {

http://git-wip-us.apache.org/repos/asf/cxf/blob/235393d6/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java
----------------------------------------------------------------------
diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java
 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java
index 81c9a23..63b4049 100644
--- 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java
+++ 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/CrossOriginSimpleTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.cxf.systest.jaxrs.cors;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -393,6 +394,35 @@ public class CrossOriginSimpleTest extends 
AbstractBusClientServerTestBase {
     }
     
     @Test
+    public void testAnnotatedMethodPreflight2() throws Exception {
+        configureAllowOrigins(true, null);
+        String r = configClient.replacePath("/setAllowCredentials/false")
+            .accept("text/plain").post(null, String.class);
+        assertEquals("ok", r);
+        HttpClient httpclient = new DefaultHttpClient();
+        HttpOptions http = new HttpOptions("http://localhost:"; + PORT + 
"/untest/annotatedPut2");
+        // this is the origin we expect to get.
+        http.addHeader("Origin", "http://area51.mil:31415";);
+        http.addHeader(CorsHeaderConstants.HEADER_AC_REQUEST_METHOD, "PUT");
+        http.addHeader(CorsHeaderConstants.HEADER_AC_REQUEST_HEADERS, 
"X-custom-1, x-custom-2");
+        HttpResponse response = httpclient.execute(http);
+        assertEquals(200, response.getStatusLine().getStatusCode());
+        assertOriginResponse(false, new String[]{"http://area51.mil:31415"}, 
true, response);
+        assertAllowCredentials(response, true);
+        List<String> exposeHeadersValues 
+            = 
headerValues(response.getHeaders(CorsHeaderConstants.HEADER_AC_EXPOSE_HEADERS));
+        // preflight never returns Expose-Headers
+        assertEquals(Collections.emptyList(), exposeHeadersValues);
+        List<String> allowHeadersValues 
+            = 
headerValues(response.getHeaders(CorsHeaderConstants.HEADER_AC_ALLOW_HEADERS));
+        assertEquals(Arrays.asList(new String[] {"X-custom-1", "x-custom-2" 
}), allowHeadersValues);
+        if (httpclient instanceof Closeable) {
+            ((Closeable)httpclient).close();
+        }
+
+    }
+    
+    @Test
     public void testAnnotatedClassCorrectOrigin() throws Exception {
         HttpClient httpclient = new DefaultHttpClient();
         HttpGet httpget = new HttpGet("http://localhost:"; + PORT + 
"/antest/simpleGet/HelloThere");

http://git-wip-us.apache.org/repos/asf/cxf/blob/235393d6/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/UnannotatedCorsServer.java
----------------------------------------------------------------------
diff --git 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/UnannotatedCorsServer.java
 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/UnannotatedCorsServer.java
index 94b4764..102ea1e 100644
--- 
a/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/UnannotatedCorsServer.java
+++ 
b/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/cors/UnannotatedCorsServer.java
@@ -77,4 +77,19 @@ public class UnannotatedCorsServer {
     public String annotatedPut(String input) {
         return input;
     }
+    
+    @PUT
+    @Consumes("text/plain")
+    @Produces("text/plain")
+    @Path("/annotatedPut2")
+    @CrossOriginResourceSharing(
+        allowAllOrigins = true, 
+        allowCredentials = true, 
+        maxAge = 1, 
+        allowHeaders = { "X-custom-1", "X-custom-2" },
+        exposeHeaders = {"X-custom-3", "X-custom-4" }
+    )
+    public String annotatedPut2(String input) {
+        return input;
+    }
 }

Reply via email to