This is an automated email from the ASF dual-hosted git repository.

enorman pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-jcr-jackrabbit-accessmanager.git


The following commit(s) were added to refs/heads/master by this push:
     new fb71bfb  SLING-10452 adjust HTTP status code for invalid :redirect 
value (#4)
fb71bfb is described below

commit fb71bfb95d89a1ff6981e4eaeb824ec28965e2a5
Author: Eric Norman <[email protected]>
AuthorDate: Wed Jun 2 13:23:21 2021 -0700

    SLING-10452 adjust HTTP status code for invalid :redirect value (#4)
    
    for modifyAce/deleteAce post request
---
 .../post/AbstractAccessPostServlet.java            | 25 ++++++++++++-----
 .../it/AccessManagerClientTestSupport.java         |  2 ++
 .../jackrabbit/accessmanager/it/ModifyAceIT.java   | 31 ++++++++++++++++++++++
 .../jackrabbit/accessmanager/it/RemoveAcesIT.java  | 27 +++++++++++++++++++
 4 files changed, 78 insertions(+), 7 deletions(-)

diff --git 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java
 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java
index b3db033..92a12d9 100644
--- 
a/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java
+++ 
b/src/main/java/org/apache/sling/jcr/jackrabbit/accessmanager/post/AbstractAccessPostServlet.java
@@ -138,7 +138,18 @@ public abstract class AbstractAccessPostServlet extends 
SlingAllMethodsServlet {
 
         // check for redirect URL if processing succeeded
         if (response.isSuccessful()) {
-            String redirect = getRedirectUrl(request, response);
+            String redirect = null;
+            try {
+                redirect = getRedirectUrl(request, response);
+            } catch (IOException e) {
+                if (log.isDebugEnabled()) {
+                    log.debug(String.format("Exception while handling redirect 
for POST %s with %s",
+                            request.getResource().getPath(), 
getClass().getName()), e);
+                }
+                // http status code for 422 Unprocessable Entity
+                response.setStatus(422, "invalid redirect");
+                response.setError(e);
+            }
             if (redirect != null) {
                 httpResponse.sendRedirect(redirect);
                 return;
@@ -240,10 +251,11 @@ public abstract class AbstractAccessPostServlet extends 
SlingAllMethodsServlet {
      * @param request the sling http request to process
      * @param ctx the post processor
      * @return the redirect location or <code>null</code>
+     * @throws IOException if there is something invalid with the :redirect 
value
      * @deprecated use {@link #getRedirectUrl(HttpServletRequest, 
PostResponse)} instead
      */
     @Deprecated
-    protected String getRedirectUrl(HttpServletRequest request, 
AbstractPostResponse ctx) {
+    protected String getRedirectUrl(HttpServletRequest request, 
AbstractPostResponse ctx) throws IOException {
         return getRedirectUrl(request, (PostResponse)ctx);
     }
     
@@ -253,8 +265,9 @@ public abstract class AbstractAccessPostServlet extends 
SlingAllMethodsServlet {
      * @param request the sling http request to process
      * @param ctx the post processor
      * @return the redirect location or <code>null</code>
+     * @throws IOException if there is something invalid with the :redirect 
value
      */
-    protected String getRedirectUrl(HttpServletRequest request, PostResponse 
ctx) {
+    protected String getRedirectUrl(HttpServletRequest request, PostResponse 
ctx) throws IOException {
         // redirect param has priority (but see below, magic star)
         String result = 
request.getParameter(SlingPostConstants.RP_REDIRECT_TO);
         if (result != null) {
@@ -262,12 +275,10 @@ public abstract class AbstractAccessPostServlet extends 
SlingAllMethodsServlet {
                 URI redirectUri = new URI(result);
                 if (redirectUri.getAuthority() != null) {
                     // if it has a host information
-                    log.warn("redirect target includes host information ({}). 
This is not allowed for security reasons!", redirectUri.getAuthority());
-                    return null;
+                    throw new IOException("The redirect target included host 
information. This is not allowed for security reasons!");
                 }
             } catch (URISyntaxException e) {
-                log.warn("given redirect target is not a valid uri: {}", 
e.getLocalizedMessage());
-                return null;
+                throw new IOException("The redirect target was not a valid 
uri");
             }
 
             if (ctx.getPath() != null) {
diff --git 
a/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/AccessManagerClientTestSupport.java
 
b/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/AccessManagerClientTestSupport.java
index ebda239..a7eca1f 100644
--- 
a/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/AccessManagerClientTestSupport.java
+++ 
b/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/AccessManagerClientTestSupport.java
@@ -80,6 +80,8 @@ import org.osgi.service.cm.ConfigurationAdmin;
  * servlets
  */
 public abstract class AccessManagerClientTestSupport extends 
AccessManagerTestSupport {
+    protected static final int SC_UNPROCESSABLE_ENTITY = 422; // http status 
code for 422 Unprocessable Entity
+
     protected static final String TEST_FOLDER_JSON = "{'jcr:primaryType': 
'nt:unstructured'}";
 
     protected static final String CONTENT_TYPE_JSON = "application/json";
diff --git 
a/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/ModifyAceIT.java
 
b/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/ModifyAceIT.java
index 1398027..62bacc2 100644
--- 
a/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/ModifyAceIT.java
+++ 
b/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/ModifyAceIT.java
@@ -1399,4 +1399,35 @@ public class ModifyAceIT extends 
AccessManagerClientTestSupport {
         assertEquals(testUserId, change.getString("argument"));
     }
 
+    private void testModifyAceRedirect(String redirectTo, int expectedStatus) 
throws IOException {
+        testUserId = createTestUser();
+
+        testFolderUrl = createTestFolder();
+
+        String postUrl = testFolderUrl + ".modifyAce.html";
+
+        List<NameValuePair> postParams = new ArrayList<>();
+        postParams.add(new BasicNameValuePair("principalId", testUserId));
+        postParams.add(new BasicNameValuePair("privilege@jcr:read", 
"granted"));
+        postParams.add(new BasicNameValuePair(":redirect", redirectTo));
+
+        Credentials creds = new UsernamePasswordCredentials("admin", "admin");
+        assertAuthenticatedPostStatus(creds, postUrl, expectedStatus, 
postParams, null);
+    }
+
+    @Test
+    public void testModifyAceValidRedirect() throws IOException, JsonException 
{
+        testModifyAceRedirect("/*.html", 
HttpServletResponse.SC_MOVED_TEMPORARILY);
+    }
+
+    @Test
+    public void testModifyAceInvalidRedirectWithAuthority() throws 
IOException, JsonException {
+        testModifyAceRedirect("https://sling.apache.org";, 
SC_UNPROCESSABLE_ENTITY);
+    }
+
+    @Test
+    public void testModifyAceInvalidRedirectWithInvalidURI() throws 
IOException, JsonException {
+        testModifyAceRedirect("https://";, SC_UNPROCESSABLE_ENTITY);
+    }
+
 }
diff --git 
a/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/RemoveAcesIT.java
 
b/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/RemoveAcesIT.java
index 77db5e8..77b04b3 100644
--- 
a/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/RemoveAcesIT.java
+++ 
b/src/test/java/org/apache/sling/jcr/jackrabbit/accessmanager/it/RemoveAcesIT.java
@@ -312,5 +312,32 @@ public class RemoveAcesIT extends 
AccessManagerClientTestSupport {
         assertEquals(testUserId, change.getString("argument"));
     }
 
+    private void testRemoveAceRedirect(String redirectTo, int expectedStatus) 
throws IOException {
+        String folderUrl = createFolderWithAces(false);
+
+        //remove the ace for the testUser principal
+        String postUrl = folderUrl + ".deleteAce.html";
+        List<NameValuePair> postParams = new ArrayList<>();
+        postParams.add(new BasicNameValuePair(":applyTo", testUserId));
+        postParams.add(new BasicNameValuePair(":redirect", redirectTo));
+        Credentials creds = new UsernamePasswordCredentials("admin", "admin");
+        assertAuthenticatedPostStatus(creds, postUrl, expectedStatus, 
postParams, null);
+    }
+
+    @Test
+    public void testRemoveAceValidRedirect() throws IOException, JsonException 
{
+        testRemoveAceRedirect("/*.html", 
HttpServletResponse.SC_MOVED_TEMPORARILY);
+    }
+
+    @Test
+    public void testRemoveAceInvalidRedirectWithAuthority() throws 
IOException, JsonException {
+        testRemoveAceRedirect("https://sling.apache.org";, 
SC_UNPROCESSABLE_ENTITY);
+    }
+
+    @Test
+    public void testRemoveAceInvalidRedirectWithInvalidURI() throws 
IOException, JsonException {
+        testRemoveAceRedirect("https://";, SC_UNPROCESSABLE_ENTITY);
+    }
+
 }
 

Reply via email to