You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by re...@apache.org on 2020/07/09 17:06:16 UTC

svn commit: r1879720 - in /jackrabbit/branches/2.20: ./ jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/ jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ jackrabbit-webdav/src/main/java/org/apache/jackrab...

Author: reschke
Date: Thu Jul  9 17:06:16 2020
New Revision: 1879720

URL: http://svn.apache.org/viewvc?rev=1879720&view=rev
Log:
JCR-4587: jackrabbit-webdav: must ignore broken if-unmodified-since in precondition check (merged r1878891 and r1879057 into 2.20)

Modified:
    jackrabbit/branches/2.20/   (props changed)
    jackrabbit/branches/2.20/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java
    jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ConditionalsTest.java
    jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/server/AbstractWebdavServlet.java

Propchange: jackrabbit/branches/2.20/
------------------------------------------------------------------------------
  Merged /jackrabbit/trunk:r1878891,1879057

Modified: jackrabbit/branches/2.20/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.20/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java?rev=1879720&r1=1879719&r2=1879720&view=diff
==============================================================================
--- jackrabbit/branches/2.20/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java (original)
+++ jackrabbit/branches/2.20/jackrabbit-jcr-server/src/main/java/org/apache/jackrabbit/webdav/simple/SimpleWebdavServlet.java Thu Jul  9 17:06:16 2020
@@ -194,6 +194,24 @@ public abstract class SimpleWebdavServle
     @Override
     protected boolean isPreconditionValid(WebdavRequest request,
                                           DavResource resource) {
+
+        long ifUnmodifiedSince = UNDEFINED_TIME;
+        try {
+            // will throw if multiple field lines present
+            String value = AbstractWebdavServlet.getSingletonField(request, "If-Unmodified-Since");
+            if (value != null) {
+                ifUnmodifiedSince = request.getDateHeader("If-Unmodified-Since");
+            }
+        } catch (IllegalArgumentException ex) {
+            log.debug("illegal value for if-unmodified-since ignored: " + ex.getMessage());
+        }
+
+        if (ifUnmodifiedSince > UNDEFINED_TIME && resource.exists()) {
+            if (resource.getModificationTime() / 1000 > ifUnmodifiedSince / 1000) {
+                return false;
+            }
+        }
+
         return !resource.exists() || request.matchesIfHeader(resource);
     }
 

Modified: jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ConditionalsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ConditionalsTest.java?rev=1879720&r1=1879719&r2=1879720&view=diff
==============================================================================
--- jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ConditionalsTest.java (original)
+++ jackrabbit/branches/2.20/jackrabbit-jcr-server/src/test/java/org/apache/jackrabbit/webdav/server/ConditionalsTest.java Thu Jul  9 17:06:16 2020
@@ -138,15 +138,26 @@ public class ConditionalsTest extends We
                 assertEquals(204, status);
             }
 
-            // // conditional PUT once more should fail
-            // {
-            // HttpPut put = new HttpPut(testUri);
-            // put.setHeader("If-Unmodified-Since", lm.getValue());
-            // put.setEntity(new StringEntity("lazydog"));
-            // HttpResponse response = this.client.execute(put, this.context);
-            // int status = response.getStatusLine().getStatusCode();
-            // assertEquals(412, status);
-            // }
+            // conditional PUT once more should fail
+            {
+                HttpPut put = new HttpPut(testUri);
+                put.setHeader("If-Unmodified-Since", lm.getValue());
+                put.setEntity(new StringEntity("lazydog"));
+                HttpResponse response = this.client.execute(put, this.context);
+                int status = response.getStatusLine().getStatusCode();
+                assertEquals(412, status);
+            }
+
+            // conditional PUT with broken If-Unmodified-Since should pass
+            {
+                HttpPut put = new HttpPut(testUri);
+                put.addHeader("If-Unmodified-Since", lm.getValue());
+                put.addHeader("If-Unmodified-Since", "foo");
+                put.setEntity(new StringEntity("qux"));
+                HttpResponse response = this.client.execute(put, this.context);
+                int status = response.getStatusLine().getStatusCode();
+                assertEquals(204, status);
+            }
         } finally {
             delete(testUri);
         }

Modified: jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/server/AbstractWebdavServlet.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/server/AbstractWebdavServlet.java?rev=1879720&r1=1879719&r2=1879720&view=diff
==============================================================================
--- jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/server/AbstractWebdavServlet.java (original)
+++ jackrabbit/branches/2.20/jackrabbit-webdav/src/main/java/org/apache/jackrabbit/webdav/server/AbstractWebdavServlet.java Thu Jul  9 17:06:16 2020
@@ -1529,7 +1529,7 @@ abstract public class AbstractWebdavServ
      * @return the field value (when there is indeed a single field line) or {@code null} when field not present
      * @throws IllegalArgumentException when multiple field lines present
      */
-    private static String getSingletonField(HttpServletRequest request, String fieldName) {
+    protected static String getSingletonField(HttpServletRequest request, String fieldName) {
         @SuppressWarnings("unchecked")
         Enumeration<String> lines = request.getHeaders(fieldName);
         if (!lines.hasMoreElements()) {