]> source.dussan.org Git - nextcloud-server.git/commitdiff
start implementing a solution to fix broken etags for shared files
authorBjörn Schießle <schiessle@owncloud.com>
Tue, 6 Nov 2012 12:28:42 +0000 (13:28 +0100)
committerBjörn Schießle <schiessle@owncloud.com>
Thu, 8 Nov 2012 14:17:53 +0000 (15:17 +0100)
lib/connector/sabre/node.php

index f87e9f9a0b1122db3c8f93edd368ede2e937d3e2..01a4bd141a6a6a7b044dd7792d1c931de1c2a718 100644 (file)
@@ -148,25 +148,38 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
         * @return bool|array
         */
        public function updateProperties($properties) {
+               // get source path of shared files
+               if (!strncmp($this->path, '/Shared/', 8)) {
+                       $source = OC_Filestorage_Shared::getSourcePath(str_replace('/Shared/', '', $this->path));
+                       $parts = explode('/', $source, 4);
+                       $user =  $parts[1];
+                       $path = '/'.$parts[3];
+               } else {
+                       $user = OC_User::getUser();
+                       $path = $this->path;
+               }
+               
                $existing = $this->getProperties(array());
                foreach($properties as $propertyName => $propertyValue) {
                        // If it was null, we need to delete the property
                        if (is_null($propertyValue)) {
                                if(array_key_exists( $propertyName, $existing )) {
                                        $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` = ?' );
-                                       $query->execute( array( OC_User::getUser(), $this->path, $propertyName ));
+                                       $query->execute( array( $user, $path, $propertyName ));
                                }
                        }
                        else {
                                if( strcmp( $propertyName, self::LASTMODIFIED_PROPERTYNAME) === 0 ) {
+                                       error_log("propertyName: " . $propertyName);
                                        $this->touch($propertyValue);
                                } else {
+                                       error_log("update/insert property: user: $user; path: $path");
                                        if(!array_key_exists( $propertyName, $existing )) {
                                                $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*properties` (`userid`,`propertypath`,`propertyname`,`propertyvalue`) VALUES(?,?,?,?)' );
-                                               $query->execute( array( OC_User::getUser(), $this->path, $propertyName,$propertyValue ));
+                                               $query->execute( array( $user, $path, $propertyName, $propertyValue ));
                                        } else {
                                                $query = OC_DB::prepare( 'UPDATE `*PREFIX*properties` SET `propertyvalue` = ? WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` = ?' );
-                                               $query->execute( array( $propertyValue,OC_User::getUser(), $this->path, $propertyName ));
+                                               $query->execute( array( $propertyValue, $user, $path, $propertyName ));
                                        }
                                }
                        }
@@ -188,6 +201,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
         * @return array
         */
        public function getProperties($properties) {
+               //TODO: Shared files?!?
                if (is_null($this->property_cache)) {
                        $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?' );
                        $result = $query->execute( array( OC_User::getUser(), $this->path ));
@@ -234,9 +248,19 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
                if (empty($tag)) {
                        return null;
                }
+               
+               if (!strncmp($path, '/Shared/', 8)) {\r
+                       $source = OC_Filestorage_Shared::getSourcePath(str_replace('/Shared/', '', $path));\r
+                       $parts = explode('/', $source, 4);\r
+                       $user =  $parts[1];\r
+                       $path = '/'.$parts[3];\r
+               } else {\r
+                       $user = OC_User::getUser();\r
+               }
+               
                $etag = '"'.$tag.'"';
                $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*properties` (`userid`,`propertypath`,`propertyname`,`propertyvalue`) VALUES(?,?,?,?)' );
-               $query->execute( array( OC_User::getUser(), $path, self::GETETAG_PROPERTYNAME, $etag ));
+               $query->execute( array( $user, $path, self::GETETAG_PROPERTYNAME, $etag ));
                return $etag;
        }
 
@@ -246,6 +270,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
         */
        static public function removeETagPropertyForPath($path) {
                // remove tags from this and parent paths
+               //TODO Shared Files?!?
                $paths = array();
                while ($path != '/' && $path != '.' && $path != '' && $path != '\\') {
                        $paths[] = $path;