]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix mapping of relative paths
authorLukas Reschke <lukas@owncloud.com>
Wed, 17 Sep 2014 09:36:08 +0000 (11:36 +0200)
committerLukas Reschke <lukas@owncloud.com>
Wed, 17 Sep 2014 09:38:10 +0000 (11:38 +0200)
lib/private/files/mapper.php
lib/private/files/storage/common.php

index 94dda807c2b42d9aae0eaf25dc01e3bf2b795d13..5e78ef03dd04ba80624378fab1463207d2ec4271 100644 (file)
@@ -66,8 +66,8 @@ class Mapper
         */
        public function copy($path1, $path2)
        {
-               $path1 = $this->stripLast($path1);
-               $path2 = $this->stripLast($path2);
+               $path1 = $this->resolveRelativePath($path1);
+               $path2 = $this->resolveRelativePath($path2);
                $physicPath1 = $this->logicToPhysical($path1, true);
                $physicPath2 = $this->logicToPhysical($path2, true);
 
@@ -113,18 +113,11 @@ class Mapper
                return '';
        }
 
-       private function stripLast($path) {
-               if (substr($path, -1) == '/') {
-                       $path = substr_replace($path, '', -1);
-               }
-               return $path;
-       }
-
        /**
         * @param string $logicPath
         */
        private function resolveLogicPath($logicPath) {
-               $logicPath = $this->stripLast($logicPath);
+               $logicPath = $this->resolveRelativePath($logicPath);
                $sql = 'SELECT * FROM `*PREFIX*file_map` WHERE `logic_path_hash` = ?';
                $result = \OC_DB::executeAudited($sql, array(md5($logicPath)));
                $result = $result->fetchRow();
@@ -136,7 +129,7 @@ class Mapper
        }
 
        private function resolvePhysicalPath($physicalPath) {
-               $physicalPath = $this->stripLast($physicalPath);
+               $physicalPath = $this->resolveRelativePath($physicalPath);
                $sql = \OC_DB::prepare('SELECT * FROM `*PREFIX*file_map` WHERE `physic_path_hash` = ?');
                $result = \OC_DB::executeAudited($sql, array(md5($physicalPath)));
                $result = $result->fetchRow();
@@ -144,12 +137,35 @@ class Mapper
                return $result['logic_path'];
        }
 
+       private function resolveRelativePath($path) {
+               $explodedPath = explode('/', $path);
+               $pathArray = array();
+               foreach ($explodedPath as $pathElement) {
+                       if (empty($pathElement) || ($pathElement == '.')) {
+                               continue;
+                       } elseif ($pathElement == '..') {
+                               if (count($pathArray) == 0) {
+                                       return false;
+                               }
+                               array_pop($pathArray);
+                       } else {
+                               array_push($pathArray, $pathElement);
+                       }
+               }
+               if (substr($path, 0, 1) == '/') {
+                       $path = '/';
+               } else {
+                       $path = '';
+               }
+               return $path.implode('/', $pathArray);
+       }
+
        /**
         * @param string $logicPath
         * @param boolean $store
         */
        private function create($logicPath, $store) {
-               $logicPath = $this->stripLast($logicPath);
+               $logicPath = $this->resolveRelativePath($logicPath);
                $index = 0;
 
                // create the slugified path
@@ -205,8 +221,8 @@ class Mapper
                        }
                }
 
-               $sluggedPath = $this->unchangedPhysicalRoot . implode('/', $sluggedElements);
-               return $this->stripLast($sluggedPath);
+               $sluggedPath = $this->unchangedPhysicalRoot.implode('/', $sluggedElements);
+               return $this->resolveRelativePath($sluggedPath);
        }
 
        /**
index 483a9ac6668354af982dde7441a581f51905e2ac..975f44df541b145cc850d62c8fbbbaf521ff0c76 100644 (file)
@@ -99,7 +99,7 @@ abstract class Common implements \OC\Files\Storage\Storage {
                        return false;
                }
                $parent = dirname($path);
-               return $this->isUpdatable($parent) and $this->isUpdatable($path);
+               return $this->isUpdatable($parent) && $this->isUpdatable($path);
        }
 
        public function isSharable($path) {