]> source.dussan.org Git - nextcloud-server.git/commitdiff
Check whether remote DAV server accepted the mtime on touch
authorVincent Petry <pvince81@owncloud.com>
Fri, 1 Apr 2016 19:16:29 +0000 (21:16 +0200)
committerVincent Petry <pvince81@owncloud.com>
Mon, 30 May 2016 14:10:30 +0000 (16:10 +0200)
ownCloud as remote DAV always accepts the mtime on touch, but other
servers like Apache's DAV server doesn't. The latter doesn't give any
visible hint in its response to detect this case, so this fix does a
subsequent PROPFIND to check whether the mtime was actually set.

Since a touch() operation seldom happens (only on uploads), the minor
performance loss should hopefully be acceptable.

lib/private/Files/Storage/DAV.php

index 4713eb86fc0591575dbb2017c1a6cc6c8f12b300..0d41b3bab029f6466dbdf73700ddab2ef877b6ff 100644 (file)
@@ -449,7 +449,16 @@ class DAV extends Common {
                if ($this->file_exists($path)) {
                        try {
                                $this->statCache->remove($path);
-                               $this->client->proppatch($this->encodePath($path), array('{DAV:}lastmodified' => $mtime));
+                               $this->client->proppatch($this->encodePath($path), ['{DAV:}lastmodified' => $mtime]);
+                               // non-owncloud clients might not have accepted the property, need to recheck it
+                               $response = $this->client->propfind($this->encodePath($path), ['{DAV:}getlastmodified'], 0);
+                               if (isset($response['{DAV:}getlastmodified'])) {
+                                       $remoteMtime = strtotime($response['{DAV:}getlastmodified']);
+                                       if ($remoteMtime !== $mtime) {
+                                               // server has not accepted the mtime
+                                               return false;
+                                       }
+                               }
                        } catch (ClientHttpException $e) {
                                if ($e->getHttpStatus() === 501) {
                                        return false;