Passed
Push — master ( a54144...fce1dd )
by Morris
12:27 queued 11s
created
lib/private/Files/Config/CachedMountInfo.php 1 patch
Indentation   +110 added lines, -110 removed lines patch added patch discarded remove patch
@@ -28,114 +28,114 @@
 block discarded – undo
28 28
 use OCP\IUser;
29 29
 
30 30
 class CachedMountInfo implements ICachedMountInfo {
31
-	/**
32
-	 * @var IUser
33
-	 */
34
-	protected $user;
35
-
36
-	/**
37
-	 * @var int
38
-	 */
39
-	protected $storageId;
40
-
41
-	/**
42
-	 * @var int
43
-	 */
44
-	protected $rootId;
45
-
46
-	/**
47
-	 * @var string
48
-	 */
49
-	protected $mountPoint;
50
-
51
-	/**
52
-	 * @var int|null
53
-	 */
54
-	protected $mountId;
55
-
56
-	/**
57
-	 * @var string
58
-	 */
59
-	protected $rootInternalPath;
60
-
61
-	/**
62
-	 * CachedMountInfo constructor.
63
-	 *
64
-	 * @param IUser $user
65
-	 * @param int $storageId
66
-	 * @param int $rootId
67
-	 * @param string $mountPoint
68
-	 * @param int|null $mountId
69
-	 * @param string $rootInternalPath
70
-	 */
71
-	public function __construct(IUser $user, $storageId, $rootId, $mountPoint, $mountId = null, $rootInternalPath = '') {
72
-		$this->user = $user;
73
-		$this->storageId = $storageId;
74
-		$this->rootId = $rootId;
75
-		$this->mountPoint = $mountPoint;
76
-		$this->mountId = $mountId;
77
-		$this->rootInternalPath = $rootInternalPath;
78
-	}
79
-
80
-	/**
81
-	 * @return IUser
82
-	 */
83
-	public function getUser() {
84
-		return $this->user;
85
-	}
86
-
87
-	/**
88
-	 * @return int the numeric storage id of the mount
89
-	 */
90
-	public function getStorageId() {
91
-		return $this->storageId;
92
-	}
93
-
94
-	/**
95
-	 * @return int the fileid of the root of the mount
96
-	 */
97
-	public function getRootId() {
98
-		return $this->rootId;
99
-	}
100
-
101
-	/**
102
-	 * @return Node the root node of the mount
103
-	 */
104
-	public function getMountPointNode() {
105
-		// TODO injection etc
106
-		Filesystem::initMountPoints($this->getUser()->getUID());
107
-		$userNode = \OC::$server->getUserFolder($this->getUser()->getUID());
108
-		$nodes = $userNode->getParent()->getById($this->getRootId());
109
-		if (count($nodes) > 0) {
110
-			return $nodes[0];
111
-		} else {
112
-			return null;
113
-		}
114
-	}
115
-
116
-	/**
117
-	 * @return string the mount point of the mount for the user
118
-	 */
119
-	public function getMountPoint() {
120
-		return $this->mountPoint;
121
-	}
122
-
123
-	/**
124
-	 * Get the id of the configured mount
125
-	 *
126
-	 * @return int|null mount id or null if not applicable
127
-	 * @since 9.1.0
128
-	 */
129
-	public function getMountId() {
130
-		return $this->mountId;
131
-	}
132
-
133
-	/**
134
-	 * Get the internal path (within the storage) of the root of the mount
135
-	 *
136
-	 * @return string
137
-	 */
138
-	public function getRootInternalPath() {
139
-		return $this->rootInternalPath;
140
-	}
31
+    /**
32
+     * @var IUser
33
+     */
34
+    protected $user;
35
+
36
+    /**
37
+     * @var int
38
+     */
39
+    protected $storageId;
40
+
41
+    /**
42
+     * @var int
43
+     */
44
+    protected $rootId;
45
+
46
+    /**
47
+     * @var string
48
+     */
49
+    protected $mountPoint;
50
+
51
+    /**
52
+     * @var int|null
53
+     */
54
+    protected $mountId;
55
+
56
+    /**
57
+     * @var string
58
+     */
59
+    protected $rootInternalPath;
60
+
61
+    /**
62
+     * CachedMountInfo constructor.
63
+     *
64
+     * @param IUser $user
65
+     * @param int $storageId
66
+     * @param int $rootId
67
+     * @param string $mountPoint
68
+     * @param int|null $mountId
69
+     * @param string $rootInternalPath
70
+     */
71
+    public function __construct(IUser $user, $storageId, $rootId, $mountPoint, $mountId = null, $rootInternalPath = '') {
72
+        $this->user = $user;
73
+        $this->storageId = $storageId;
74
+        $this->rootId = $rootId;
75
+        $this->mountPoint = $mountPoint;
76
+        $this->mountId = $mountId;
77
+        $this->rootInternalPath = $rootInternalPath;
78
+    }
79
+
80
+    /**
81
+     * @return IUser
82
+     */
83
+    public function getUser() {
84
+        return $this->user;
85
+    }
86
+
87
+    /**
88
+     * @return int the numeric storage id of the mount
89
+     */
90
+    public function getStorageId() {
91
+        return $this->storageId;
92
+    }
93
+
94
+    /**
95
+     * @return int the fileid of the root of the mount
96
+     */
97
+    public function getRootId() {
98
+        return $this->rootId;
99
+    }
100
+
101
+    /**
102
+     * @return Node the root node of the mount
103
+     */
104
+    public function getMountPointNode() {
105
+        // TODO injection etc
106
+        Filesystem::initMountPoints($this->getUser()->getUID());
107
+        $userNode = \OC::$server->getUserFolder($this->getUser()->getUID());
108
+        $nodes = $userNode->getParent()->getById($this->getRootId());
109
+        if (count($nodes) > 0) {
110
+            return $nodes[0];
111
+        } else {
112
+            return null;
113
+        }
114
+    }
115
+
116
+    /**
117
+     * @return string the mount point of the mount for the user
118
+     */
119
+    public function getMountPoint() {
120
+        return $this->mountPoint;
121
+    }
122
+
123
+    /**
124
+     * Get the id of the configured mount
125
+     *
126
+     * @return int|null mount id or null if not applicable
127
+     * @since 9.1.0
128
+     */
129
+    public function getMountId() {
130
+        return $this->mountId;
131
+    }
132
+
133
+    /**
134
+     * Get the internal path (within the storage) of the root of the mount
135
+     *
136
+     * @return string
137
+     */
138
+    public function getRootInternalPath() {
139
+        return $this->rootInternalPath;
140
+    }
141 141
 }
Please login to merge, or discard this patch.
lib/private/Files/ObjectStore/HomeObjectStoreStorage.php 2 patches
Indentation   +33 added lines, -33 removed lines patch added patch discarded remove patch
@@ -28,42 +28,42 @@
 block discarded – undo
28 28
 
29 29
 class HomeObjectStoreStorage extends ObjectStoreStorage implements \OCP\Files\IHomeStorage {
30 30
 
31
-	/**
32
-	 * The home user storage requires a user object to create a unique storage id
33
-	 * @param array $params
34
-	 */
35
-	public function __construct($params) {
36
-		if ( ! isset($params['user']) || ! $params['user'] instanceof User) {
37
-			throw new \Exception('missing user object in parameters');
38
-		}
39
-		$this->user = $params['user'];
40
-		parent::__construct($params);
41
-	}
31
+    /**
32
+     * The home user storage requires a user object to create a unique storage id
33
+     * @param array $params
34
+     */
35
+    public function __construct($params) {
36
+        if ( ! isset($params['user']) || ! $params['user'] instanceof User) {
37
+            throw new \Exception('missing user object in parameters');
38
+        }
39
+        $this->user = $params['user'];
40
+        parent::__construct($params);
41
+    }
42 42
 
43
-	public function getId () {
44
-		return 'object::user:' . $this->user->getUID();
45
-	}
43
+    public function getId () {
44
+        return 'object::user:' . $this->user->getUID();
45
+    }
46 46
 
47
-	/**
48
-	 * get the owner of a path
49
-	 *
50
-	 * @param string $path The path to get the owner
51
-	 * @return false|string uid
52
-	 */
53
-	public function getOwner($path) {
54
-		if (is_object($this->user)) {
55
-			return $this->user->getUID();
56
-		}
57
-		return false;
58
-	}
47
+    /**
48
+     * get the owner of a path
49
+     *
50
+     * @param string $path The path to get the owner
51
+     * @return false|string uid
52
+     */
53
+    public function getOwner($path) {
54
+        if (is_object($this->user)) {
55
+            return $this->user->getUID();
56
+        }
57
+        return false;
58
+    }
59 59
 
60
-	/**
61
-	 * @param string $path, optional
62
-	 * @return \OC\User\User
63
-	 */
64
-	public function getUser($path = null) {
65
-		return $this->user;
66
-	}
60
+    /**
61
+     * @param string $path, optional
62
+     * @return \OC\User\User
63
+     */
64
+    public function getUser($path = null) {
65
+        return $this->user;
66
+    }
67 67
 
68 68
 
69 69
 }
70 70
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -33,15 +33,15 @@
 block discarded – undo
33 33
 	 * @param array $params
34 34
 	 */
35 35
 	public function __construct($params) {
36
-		if ( ! isset($params['user']) || ! $params['user'] instanceof User) {
36
+		if (!isset($params['user']) || !$params['user'] instanceof User) {
37 37
 			throw new \Exception('missing user object in parameters');
38 38
 		}
39 39
 		$this->user = $params['user'];
40 40
 		parent::__construct($params);
41 41
 	}
42 42
 
43
-	public function getId () {
44
-		return 'object::user:' . $this->user->getUID();
43
+	public function getId() {
44
+		return 'object::user:'.$this->user->getUID();
45 45
 	}
46 46
 
47 47
 	/**
Please login to merge, or discard this patch.
lib/private/Files/ObjectStore/NoopScanner.php 1 patch
Indentation   +44 added lines, -44 removed lines patch added patch discarded remove patch
@@ -29,52 +29,52 @@
 block discarded – undo
29 29
 
30 30
 class NoopScanner extends Scanner {
31 31
 
32
-	public function __construct(Storage $storage) {
33
-		//we don't need the storage, so do nothing here
34
-	}
32
+    public function __construct(Storage $storage) {
33
+        //we don't need the storage, so do nothing here
34
+    }
35 35
 
36
-	/**
37
-	 * scan a single file and store it in the cache
38
-	 *
39
-	 * @param string $file
40
-	 * @param int $reuseExisting
41
-	 * @param int $parentId
42
-	 * @param array|null $cacheData existing data in the cache for the file to be scanned
43
-	 * @return array an array of metadata of the scanned file
44
-	 */
45
-	public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) {
46
-		return array();
47
-	}
36
+    /**
37
+     * scan a single file and store it in the cache
38
+     *
39
+     * @param string $file
40
+     * @param int $reuseExisting
41
+     * @param int $parentId
42
+     * @param array|null $cacheData existing data in the cache for the file to be scanned
43
+     * @return array an array of metadata of the scanned file
44
+     */
45
+    public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) {
46
+        return array();
47
+    }
48 48
 
49
-	/**
50
-	 * scan a folder and all it's children
51
-	 *
52
-	 * @param string $path
53
-	 * @param bool $recursive
54
-	 * @param int $reuse
55
-	 * @return array with the meta data of the scanned file or folder
56
-	 */
57
-	public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $lock = true) {
58
-		return array();
59
-	}
49
+    /**
50
+     * scan a folder and all it's children
51
+     *
52
+     * @param string $path
53
+     * @param bool $recursive
54
+     * @param int $reuse
55
+     * @return array with the meta data of the scanned file or folder
56
+     */
57
+    public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $lock = true) {
58
+        return array();
59
+    }
60 60
 
61
-	/**
62
-	 * scan all the files and folders in a folder
63
-	 *
64
-	 * @param string $path
65
-	 * @param bool $recursive
66
-	 * @param int $reuse
67
-	 * @param array $folderData existing cache data for the folder to be scanned
68
-	 * @return int the size of the scanned folder or -1 if the size is unknown at this stage
69
-	 */
70
-	protected function scanChildren($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $folderData = null, $lock = true) {
71
-		return 0;
72
-	}
61
+    /**
62
+     * scan all the files and folders in a folder
63
+     *
64
+     * @param string $path
65
+     * @param bool $recursive
66
+     * @param int $reuse
67
+     * @param array $folderData existing cache data for the folder to be scanned
68
+     * @return int the size of the scanned folder or -1 if the size is unknown at this stage
69
+     */
70
+    protected function scanChildren($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $folderData = null, $lock = true) {
71
+        return 0;
72
+    }
73 73
 
74
-	/**
75
-	 * walk over any folders that are not fully scanned yet and scan them
76
-	 */
77
-	public function backgroundScan() {
78
-		//noop
79
-	}
74
+    /**
75
+     * walk over any folders that are not fully scanned yet and scan them
76
+     */
77
+    public function backgroundScan() {
78
+        //noop
79
+    }
80 80
 }
Please login to merge, or discard this patch.
lib/private/Files/ObjectStore/Mapper.php 2 patches
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -31,25 +31,25 @@
 block discarded – undo
31 31
  * Map a user to a bucket.
32 32
  */
33 33
 class Mapper {
34
-	/** @var IUser */
35
-	private $user;
34
+    /** @var IUser */
35
+    private $user;
36 36
 
37
-	/**
38
-	 * Mapper constructor.
39
-	 *
40
-	 * @param IUser $user
41
-	 */
42
-	public function __construct(IUser $user) {
43
-		$this->user = $user;
44
-	}
37
+    /**
38
+     * Mapper constructor.
39
+     *
40
+     * @param IUser $user
41
+     */
42
+    public function __construct(IUser $user) {
43
+        $this->user = $user;
44
+    }
45 45
 
46
-	/**
47
-	 * @param int $numBuckets
48
-	 * @return string
49
-	 */
50
-	public function getBucket($numBuckets = 64) {
51
-		$hash = md5($this->user->getUID());
52
-		$num = hexdec(substr($hash, 0, 4));
53
-		return (string)($num % $numBuckets);
54
-	}
46
+    /**
47
+     * @param int $numBuckets
48
+     * @return string
49
+     */
50
+    public function getBucket($numBuckets = 64) {
51
+        $hash = md5($this->user->getUID());
52
+        $num = hexdec(substr($hash, 0, 4));
53
+        return (string)($num % $numBuckets);
54
+    }
55 55
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -50,6 +50,6 @@
 block discarded – undo
50 50
 	public function getBucket($numBuckets = 64) {
51 51
 		$hash = md5($this->user->getUID());
52 52
 		$num = hexdec(substr($hash, 0, 4));
53
-		return (string)($num % $numBuckets);
53
+		return (string) ($num % $numBuckets);
54 54
 	}
55 55
 }
Please login to merge, or discard this patch.
lib/private/Files/Type/Detection.php 2 patches
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -102,7 +102,7 @@  discard block
 block discarded – undo
102 102
 
103 103
 		// Update the alternative mimetypes to avoid having to look them up each time.
104 104
 		foreach ($this->mimetypes as $mimeType) {
105
-			$this->secureMimeTypes[$mimeType[0]] = isset($mimeType[1]) ? $mimeType[1]: $mimeType[0];
105
+			$this->secureMimeTypes[$mimeType[0]] = isset($mimeType[1]) ? $mimeType[1] : $mimeType[0];
106 106
 		}
107 107
 	}
108 108
 
@@ -114,10 +114,10 @@  discard block
 block discarded – undo
114 114
 			return;
115 115
 		}
116 116
 
117
-		$this->mimeTypeAlias = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypealiases.dist.json'), true);
117
+		$this->mimeTypeAlias = json_decode(file_get_contents($this->defaultConfigDir.'/mimetypealiases.dist.json'), true);
118 118
 
119
-		if (file_exists($this->customConfigDir . '/mimetypealiases.json')) {
120
-			$custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypealiases.json'), true);
119
+		if (file_exists($this->customConfigDir.'/mimetypealiases.json')) {
120
+			$custom = json_decode(file_get_contents($this->customConfigDir.'/mimetypealiases.json'), true);
121 121
 			$this->mimeTypeAlias = array_merge($this->mimeTypeAlias, $custom);
122 122
 		}
123 123
 	}
@@ -138,11 +138,11 @@  discard block
 block discarded – undo
138 138
 			return;
139 139
 		}
140 140
 
141
-		$mimetypeMapping = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypemapping.dist.json'), true);
141
+		$mimetypeMapping = json_decode(file_get_contents($this->defaultConfigDir.'/mimetypemapping.dist.json'), true);
142 142
 
143 143
 		//Check if need to load custom mappings
144
-		if (file_exists($this->customConfigDir . '/mimetypemapping.json')) {
145
-			$custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypemapping.json'), true);
144
+		if (file_exists($this->customConfigDir.'/mimetypemapping.json')) {
145
+			$custom = json_decode(file_get_contents($this->customConfigDir.'/mimetypemapping.json'), true);
146 146
 			$mimetypeMapping = array_merge($mimetypeMapping, $custom);
147 147
 		}
148 148
 
@@ -306,7 +306,7 @@  discard block
 block discarded – undo
306 306
 
307 307
 		// Icon exists?
308 308
 		try {
309
-			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $icon . '.svg');
309
+			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/'.$icon.'.svg');
310 310
 			return $this->mimetypeIcons[$mimetype];
311 311
 		} catch (\RuntimeException $e) {
312 312
 			// Specified image not found
@@ -315,7 +315,7 @@  discard block
 block discarded – undo
315 315
 		// Try only the first part of the filetype
316 316
 		$mimePart = substr($icon, 0, strpos($icon, '-'));
317 317
 		try {
318
-			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $mimePart . '.svg');
318
+			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/'.$mimePart.'.svg');
319 319
 			return $this->mimetypeIcons[$mimetype];
320 320
 		} catch (\RuntimeException $e) {
321 321
 			// Image for the first part of the mimetype not found
Please login to merge, or discard this patch.
Indentation   +287 added lines, -287 removed lines patch added patch discarded remove patch
@@ -41,291 +41,291 @@
 block discarded – undo
41 41
  * @package OC\Files\Type
42 42
  */
43 43
 class Detection implements IMimeTypeDetector {
44
-	protected $mimetypes = [];
45
-	protected $secureMimeTypes = [];
46
-
47
-	protected $mimetypeIcons = [];
48
-	/** @var string[] */
49
-	protected $mimeTypeAlias = [];
50
-
51
-	/** @var IURLGenerator */
52
-	private $urlGenerator;
53
-
54
-	/** @var string */
55
-	private $customConfigDir;
56
-
57
-	/** @var string */
58
-	private $defaultConfigDir;
59
-
60
-	/**
61
-	 * @param IURLGenerator $urlGenerator
62
-	 * @param string $customConfigDir
63
-	 * @param string $defaultConfigDir
64
-	 */
65
-	public function __construct(IURLGenerator $urlGenerator,
66
-								$customConfigDir,
67
-								$defaultConfigDir) {
68
-		$this->urlGenerator = $urlGenerator;
69
-		$this->customConfigDir = $customConfigDir;
70
-		$this->defaultConfigDir = $defaultConfigDir;
71
-	}
72
-
73
-	/**
74
-	 * Add an extension -> mimetype mapping
75
-	 *
76
-	 * $mimetype is the assumed correct mime type
77
-	 * The optional $secureMimeType is an alternative to send to send
78
-	 * to avoid potential XSS.
79
-	 *
80
-	 * @param string $extension
81
-	 * @param string $mimetype
82
-	 * @param string|null $secureMimeType
83
-	 */
84
-	public function registerType($extension,
85
-								 $mimetype,
86
-								 $secureMimeType = null) {
87
-		$this->mimetypes[$extension] = array($mimetype, $secureMimeType);
88
-		$this->secureMimeTypes[$mimetype] = $secureMimeType ?: $mimetype;
89
-	}
90
-
91
-	/**
92
-	 * Add an array of extension -> mimetype mappings
93
-	 *
94
-	 * The mimetype value is in itself an array where the first index is
95
-	 * the assumed correct mimetype and the second is either a secure alternative
96
-	 * or null if the correct is considered secure.
97
-	 *
98
-	 * @param array $types
99
-	 */
100
-	public function registerTypeArray($types) {
101
-		$this->mimetypes = array_merge($this->mimetypes, $types);
102
-
103
-		// Update the alternative mimetypes to avoid having to look them up each time.
104
-		foreach ($this->mimetypes as $mimeType) {
105
-			$this->secureMimeTypes[$mimeType[0]] = isset($mimeType[1]) ? $mimeType[1]: $mimeType[0];
106
-		}
107
-	}
108
-
109
-	/**
110
-	 * Add the mimetype aliases if they are not yet present
111
-	 */
112
-	private function loadAliases() {
113
-		if (!empty($this->mimeTypeAlias)) {
114
-			return;
115
-		}
116
-
117
-		$this->mimeTypeAlias = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypealiases.dist.json'), true);
118
-
119
-		if (file_exists($this->customConfigDir . '/mimetypealiases.json')) {
120
-			$custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypealiases.json'), true);
121
-			$this->mimeTypeAlias = array_merge($this->mimeTypeAlias, $custom);
122
-		}
123
-	}
124
-
125
-	/**
126
-	 * @return string[]
127
-	 */
128
-	public function getAllAliases() {
129
-		$this->loadAliases();
130
-		return $this->mimeTypeAlias;
131
-	}
132
-
133
-	/**
134
-	 * Add mimetype mappings if they are not yet present
135
-	 */
136
-	private function loadMappings() {
137
-		if (!empty($this->mimetypes)) {
138
-			return;
139
-		}
140
-
141
-		$mimetypeMapping = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypemapping.dist.json'), true);
142
-
143
-		//Check if need to load custom mappings
144
-		if (file_exists($this->customConfigDir . '/mimetypemapping.json')) {
145
-			$custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypemapping.json'), true);
146
-			$mimetypeMapping = array_merge($mimetypeMapping, $custom);
147
-		}
148
-
149
-		$this->registerTypeArray($mimetypeMapping);
150
-	}
151
-
152
-	/**
153
-	 * @return array
154
-	 */
155
-	public function getAllMappings() {
156
-		$this->loadMappings();
157
-		return $this->mimetypes;
158
-	}
159
-
160
-	/**
161
-	 * detect mimetype only based on filename, content of file is not used
162
-	 *
163
-	 * @param string $path
164
-	 * @return string
165
-	 */
166
-	public function detectPath($path) {
167
-		$this->loadMappings();
168
-
169
-		$fileName = basename($path);
170
-
171
-		// remove leading dot on hidden files with a file extension
172
-		$fileName = ltrim($fileName, '.');
173
-
174
-		// note: leading dot doesn't qualify as extension
175
-		if (strpos($fileName, '.') > 0) {
176
-
177
-			// remove versioning extension: name.v1508946057 and transfer extension: name.ocTransferId2057600214.part
178
-			$fileName = preg_replace('!((\.v\d+)|((.ocTransferId\d+)?.part))$!', '', $fileName);
179
-
180
-			//try to guess the type by the file extension
181
-			$extension = strtolower(strrchr($fileName, '.'));
182
-			$extension = substr($extension, 1); //remove leading .
183
-			return (isset($this->mimetypes[$extension]) && isset($this->mimetypes[$extension][0]))
184
-				? $this->mimetypes[$extension][0]
185
-				: 'application/octet-stream';
186
-		} else {
187
-			return 'application/octet-stream';
188
-		}
189
-	}
190
-
191
-	/**
192
-	 * detect mimetype based on both filename and content
193
-	 *
194
-	 * @param string $path
195
-	 * @return string
196
-	 */
197
-	public function detect($path) {
198
-		$this->loadMappings();
199
-
200
-		if (@is_dir($path)) {
201
-			// directories are easy
202
-			return "httpd/unix-directory";
203
-		}
204
-
205
-		$mimeType = $this->detectPath($path);
206
-
207
-		if ($mimeType === 'application/octet-stream' and function_exists('finfo_open')
208
-			and function_exists('finfo_file') and $finfo = finfo_open(FILEINFO_MIME)
209
-		) {
210
-			$info = @strtolower(finfo_file($finfo, $path));
211
-			finfo_close($finfo);
212
-			if ($info) {
213
-				$mimeType = strpos($info, ';') !== false ? substr($info, 0, strpos($info, ';')) : $info;
214
-				return empty($mimeType) ? 'application/octet-stream' : $mimeType;
215
-			}
216
-
217
-		}
218
-		$isWrapped = (strpos($path, '://') !== false) and (substr($path, 0, 7) === 'file://');
219
-		if (!$isWrapped and $mimeType === 'application/octet-stream' && function_exists("mime_content_type")) {
220
-			// use mime magic extension if available
221
-			$mimeType = mime_content_type($path);
222
-		}
223
-		if (!$isWrapped and $mimeType === 'application/octet-stream' && \OC_Helper::canExecute("file")) {
224
-			// it looks like we have a 'file' command,
225
-			// lets see if it does have mime support
226
-			$path = escapeshellarg($path);
227
-			$fp = popen("file -b --mime-type $path 2>/dev/null", "r");
228
-			$reply = fgets($fp);
229
-			pclose($fp);
230
-
231
-			//trim the newline
232
-			$mimeType = trim($reply);
233
-
234
-			if (empty($mimeType)) {
235
-				$mimeType = 'application/octet-stream';
236
-			}
237
-
238
-		}
239
-		return $mimeType;
240
-	}
241
-
242
-	/**
243
-	 * detect mimetype based on the content of a string
244
-	 *
245
-	 * @param string $data
246
-	 * @return string
247
-	 */
248
-	public function detectString($data) {
249
-		if (function_exists('finfo_open') and function_exists('finfo_file')) {
250
-			$finfo = finfo_open(FILEINFO_MIME);
251
-			$info = finfo_buffer($finfo, $data);
252
-			return strpos($info, ';') !== false ? substr($info, 0, strpos($info, ';')) : $info;
253
-		} else {
254
-			$tmpFile = \OC::$server->getTempManager()->getTemporaryFile();
255
-			$fh = fopen($tmpFile, 'wb');
256
-			fwrite($fh, $data, 8024);
257
-			fclose($fh);
258
-			$mime = $this->detect($tmpFile);
259
-			unset($tmpFile);
260
-			return $mime;
261
-		}
262
-	}
263
-
264
-	/**
265
-	 * Get a secure mimetype that won't expose potential XSS.
266
-	 *
267
-	 * @param string $mimeType
268
-	 * @return string
269
-	 */
270
-	public function getSecureMimeType($mimeType) {
271
-		$this->loadMappings();
272
-
273
-		return isset($this->secureMimeTypes[$mimeType])
274
-			? $this->secureMimeTypes[$mimeType]
275
-			: 'application/octet-stream';
276
-	}
277
-
278
-	/**
279
-	 * Get path to the icon of a file type
280
-	 * @param string $mimetype the MIME type
281
-	 * @return string the url
282
-	 */
283
-	public function mimeTypeIcon($mimetype) {
284
-		$this->loadAliases();
285
-
286
-		while (isset($this->mimeTypeAlias[$mimetype])) {
287
-			$mimetype = $this->mimeTypeAlias[$mimetype];
288
-		}
289
-		if (isset($this->mimetypeIcons[$mimetype])) {
290
-			return $this->mimetypeIcons[$mimetype];
291
-		}
292
-
293
-		// Replace slash and backslash with a minus
294
-		$icon = str_replace('/', '-', $mimetype);
295
-		$icon = str_replace('\\', '-', $icon);
296
-
297
-		// Is it a dir?
298
-		if ($mimetype === 'dir') {
299
-			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder.svg');
300
-			return $this->mimetypeIcons[$mimetype];
301
-		}
302
-		if ($mimetype === 'dir-shared') {
303
-			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder-shared.svg');
304
-			return $this->mimetypeIcons[$mimetype];
305
-		}
306
-		if ($mimetype === 'dir-external') {
307
-			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder-external.svg');
308
-			return $this->mimetypeIcons[$mimetype];
309
-		}
310
-
311
-		// Icon exists?
312
-		try {
313
-			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $icon . '.svg');
314
-			return $this->mimetypeIcons[$mimetype];
315
-		} catch (\RuntimeException $e) {
316
-			// Specified image not found
317
-		}
318
-
319
-		// Try only the first part of the filetype
320
-		$mimePart = substr($icon, 0, strpos($icon, '-'));
321
-		try {
322
-			$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $mimePart . '.svg');
323
-			return $this->mimetypeIcons[$mimetype];
324
-		} catch (\RuntimeException $e) {
325
-			// Image for the first part of the mimetype not found
326
-		}
327
-
328
-		$this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/file.svg');
329
-		return $this->mimetypeIcons[$mimetype];
330
-	}
44
+    protected $mimetypes = [];
45
+    protected $secureMimeTypes = [];
46
+
47
+    protected $mimetypeIcons = [];
48
+    /** @var string[] */
49
+    protected $mimeTypeAlias = [];
50
+
51
+    /** @var IURLGenerator */
52
+    private $urlGenerator;
53
+
54
+    /** @var string */
55
+    private $customConfigDir;
56
+
57
+    /** @var string */
58
+    private $defaultConfigDir;
59
+
60
+    /**
61
+     * @param IURLGenerator $urlGenerator
62
+     * @param string $customConfigDir
63
+     * @param string $defaultConfigDir
64
+     */
65
+    public function __construct(IURLGenerator $urlGenerator,
66
+                                $customConfigDir,
67
+                                $defaultConfigDir) {
68
+        $this->urlGenerator = $urlGenerator;
69
+        $this->customConfigDir = $customConfigDir;
70
+        $this->defaultConfigDir = $defaultConfigDir;
71
+    }
72
+
73
+    /**
74
+     * Add an extension -> mimetype mapping
75
+     *
76
+     * $mimetype is the assumed correct mime type
77
+     * The optional $secureMimeType is an alternative to send to send
78
+     * to avoid potential XSS.
79
+     *
80
+     * @param string $extension
81
+     * @param string $mimetype
82
+     * @param string|null $secureMimeType
83
+     */
84
+    public function registerType($extension,
85
+                                    $mimetype,
86
+                                    $secureMimeType = null) {
87
+        $this->mimetypes[$extension] = array($mimetype, $secureMimeType);
88
+        $this->secureMimeTypes[$mimetype] = $secureMimeType ?: $mimetype;
89
+    }
90
+
91
+    /**
92
+     * Add an array of extension -> mimetype mappings
93
+     *
94
+     * The mimetype value is in itself an array where the first index is
95
+     * the assumed correct mimetype and the second is either a secure alternative
96
+     * or null if the correct is considered secure.
97
+     *
98
+     * @param array $types
99
+     */
100
+    public function registerTypeArray($types) {
101
+        $this->mimetypes = array_merge($this->mimetypes, $types);
102
+
103
+        // Update the alternative mimetypes to avoid having to look them up each time.
104
+        foreach ($this->mimetypes as $mimeType) {
105
+            $this->secureMimeTypes[$mimeType[0]] = isset($mimeType[1]) ? $mimeType[1]: $mimeType[0];
106
+        }
107
+    }
108
+
109
+    /**
110
+     * Add the mimetype aliases if they are not yet present
111
+     */
112
+    private function loadAliases() {
113
+        if (!empty($this->mimeTypeAlias)) {
114
+            return;
115
+        }
116
+
117
+        $this->mimeTypeAlias = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypealiases.dist.json'), true);
118
+
119
+        if (file_exists($this->customConfigDir . '/mimetypealiases.json')) {
120
+            $custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypealiases.json'), true);
121
+            $this->mimeTypeAlias = array_merge($this->mimeTypeAlias, $custom);
122
+        }
123
+    }
124
+
125
+    /**
126
+     * @return string[]
127
+     */
128
+    public function getAllAliases() {
129
+        $this->loadAliases();
130
+        return $this->mimeTypeAlias;
131
+    }
132
+
133
+    /**
134
+     * Add mimetype mappings if they are not yet present
135
+     */
136
+    private function loadMappings() {
137
+        if (!empty($this->mimetypes)) {
138
+            return;
139
+        }
140
+
141
+        $mimetypeMapping = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypemapping.dist.json'), true);
142
+
143
+        //Check if need to load custom mappings
144
+        if (file_exists($this->customConfigDir . '/mimetypemapping.json')) {
145
+            $custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypemapping.json'), true);
146
+            $mimetypeMapping = array_merge($mimetypeMapping, $custom);
147
+        }
148
+
149
+        $this->registerTypeArray($mimetypeMapping);
150
+    }
151
+
152
+    /**
153
+     * @return array
154
+     */
155
+    public function getAllMappings() {
156
+        $this->loadMappings();
157
+        return $this->mimetypes;
158
+    }
159
+
160
+    /**
161
+     * detect mimetype only based on filename, content of file is not used
162
+     *
163
+     * @param string $path
164
+     * @return string
165
+     */
166
+    public function detectPath($path) {
167
+        $this->loadMappings();
168
+
169
+        $fileName = basename($path);
170
+
171
+        // remove leading dot on hidden files with a file extension
172
+        $fileName = ltrim($fileName, '.');
173
+
174
+        // note: leading dot doesn't qualify as extension
175
+        if (strpos($fileName, '.') > 0) {
176
+
177
+            // remove versioning extension: name.v1508946057 and transfer extension: name.ocTransferId2057600214.part
178
+            $fileName = preg_replace('!((\.v\d+)|((.ocTransferId\d+)?.part))$!', '', $fileName);
179
+
180
+            //try to guess the type by the file extension
181
+            $extension = strtolower(strrchr($fileName, '.'));
182
+            $extension = substr($extension, 1); //remove leading .
183
+            return (isset($this->mimetypes[$extension]) && isset($this->mimetypes[$extension][0]))
184
+                ? $this->mimetypes[$extension][0]
185
+                : 'application/octet-stream';
186
+        } else {
187
+            return 'application/octet-stream';
188
+        }
189
+    }
190
+
191
+    /**
192
+     * detect mimetype based on both filename and content
193
+     *
194
+     * @param string $path
195
+     * @return string
196
+     */
197
+    public function detect($path) {
198
+        $this->loadMappings();
199
+
200
+        if (@is_dir($path)) {
201
+            // directories are easy
202
+            return "httpd/unix-directory";
203
+        }
204
+
205
+        $mimeType = $this->detectPath($path);
206
+
207
+        if ($mimeType === 'application/octet-stream' and function_exists('finfo_open')
208
+            and function_exists('finfo_file') and $finfo = finfo_open(FILEINFO_MIME)
209
+        ) {
210
+            $info = @strtolower(finfo_file($finfo, $path));
211
+            finfo_close($finfo);
212
+            if ($info) {
213
+                $mimeType = strpos($info, ';') !== false ? substr($info, 0, strpos($info, ';')) : $info;
214
+                return empty($mimeType) ? 'application/octet-stream' : $mimeType;
215
+            }
216
+
217
+        }
218
+        $isWrapped = (strpos($path, '://') !== false) and (substr($path, 0, 7) === 'file://');
219
+        if (!$isWrapped and $mimeType === 'application/octet-stream' && function_exists("mime_content_type")) {
220
+            // use mime magic extension if available
221
+            $mimeType = mime_content_type($path);
222
+        }
223
+        if (!$isWrapped and $mimeType === 'application/octet-stream' && \OC_Helper::canExecute("file")) {
224
+            // it looks like we have a 'file' command,
225
+            // lets see if it does have mime support
226
+            $path = escapeshellarg($path);
227
+            $fp = popen("file -b --mime-type $path 2>/dev/null", "r");
228
+            $reply = fgets($fp);
229
+            pclose($fp);
230
+
231
+            //trim the newline
232
+            $mimeType = trim($reply);
233
+
234
+            if (empty($mimeType)) {
235
+                $mimeType = 'application/octet-stream';
236
+            }
237
+
238
+        }
239
+        return $mimeType;
240
+    }
241
+
242
+    /**
243
+     * detect mimetype based on the content of a string
244
+     *
245
+     * @param string $data
246
+     * @return string
247
+     */
248
+    public function detectString($data) {
249
+        if (function_exists('finfo_open') and function_exists('finfo_file')) {
250
+            $finfo = finfo_open(FILEINFO_MIME);
251
+            $info = finfo_buffer($finfo, $data);
252
+            return strpos($info, ';') !== false ? substr($info, 0, strpos($info, ';')) : $info;
253
+        } else {
254
+            $tmpFile = \OC::$server->getTempManager()->getTemporaryFile();
255
+            $fh = fopen($tmpFile, 'wb');
256
+            fwrite($fh, $data, 8024);
257
+            fclose($fh);
258
+            $mime = $this->detect($tmpFile);
259
+            unset($tmpFile);
260
+            return $mime;
261
+        }
262
+    }
263
+
264
+    /**
265
+     * Get a secure mimetype that won't expose potential XSS.
266
+     *
267
+     * @param string $mimeType
268
+     * @return string
269
+     */
270
+    public function getSecureMimeType($mimeType) {
271
+        $this->loadMappings();
272
+
273
+        return isset($this->secureMimeTypes[$mimeType])
274
+            ? $this->secureMimeTypes[$mimeType]
275
+            : 'application/octet-stream';
276
+    }
277
+
278
+    /**
279
+     * Get path to the icon of a file type
280
+     * @param string $mimetype the MIME type
281
+     * @return string the url
282
+     */
283
+    public function mimeTypeIcon($mimetype) {
284
+        $this->loadAliases();
285
+
286
+        while (isset($this->mimeTypeAlias[$mimetype])) {
287
+            $mimetype = $this->mimeTypeAlias[$mimetype];
288
+        }
289
+        if (isset($this->mimetypeIcons[$mimetype])) {
290
+            return $this->mimetypeIcons[$mimetype];
291
+        }
292
+
293
+        // Replace slash and backslash with a minus
294
+        $icon = str_replace('/', '-', $mimetype);
295
+        $icon = str_replace('\\', '-', $icon);
296
+
297
+        // Is it a dir?
298
+        if ($mimetype === 'dir') {
299
+            $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder.svg');
300
+            return $this->mimetypeIcons[$mimetype];
301
+        }
302
+        if ($mimetype === 'dir-shared') {
303
+            $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder-shared.svg');
304
+            return $this->mimetypeIcons[$mimetype];
305
+        }
306
+        if ($mimetype === 'dir-external') {
307
+            $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/folder-external.svg');
308
+            return $this->mimetypeIcons[$mimetype];
309
+        }
310
+
311
+        // Icon exists?
312
+        try {
313
+            $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $icon . '.svg');
314
+            return $this->mimetypeIcons[$mimetype];
315
+        } catch (\RuntimeException $e) {
316
+            // Specified image not found
317
+        }
318
+
319
+        // Try only the first part of the filetype
320
+        $mimePart = substr($icon, 0, strpos($icon, '-'));
321
+        try {
322
+            $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/' . $mimePart . '.svg');
323
+            return $this->mimetypeIcons[$mimetype];
324
+        } catch (\RuntimeException $e) {
325
+            // Image for the first part of the mimetype not found
326
+        }
327
+
328
+        $this->mimetypeIcons[$mimetype] = $this->urlGenerator->imagePath('core', 'filetypes/file.svg');
329
+        return $this->mimetypeIcons[$mimetype];
330
+    }
331 331
 }
Please login to merge, or discard this patch.
lib/private/Files/Type/TemplateManager.php 1 patch
Indentation   +31 added lines, -31 removed lines patch added patch discarded remove patch
@@ -25,38 +25,38 @@
 block discarded – undo
25 25
 namespace OC\Files\Type;
26 26
 
27 27
 class TemplateManager {
28
-	protected $templates = array();
28
+    protected $templates = array();
29 29
 
30
-	public function registerTemplate($mimetype, $path) {
31
-		$this->templates[$mimetype] = $path;
32
-	}
30
+    public function registerTemplate($mimetype, $path) {
31
+        $this->templates[$mimetype] = $path;
32
+    }
33 33
 
34
-	/**
35
-	 * get the path of the template for a mimetype
36
-	 *
37
-	 * @param string $mimetype
38
-	 * @return string|null
39
-	 */
40
-	public function getTemplatePath($mimetype) {
41
-		if (isset($this->templates[$mimetype])) {
42
-			return $this->templates[$mimetype];
43
-		} else {
44
-			return null;
45
-		}
46
-	}
34
+    /**
35
+     * get the path of the template for a mimetype
36
+     *
37
+     * @param string $mimetype
38
+     * @return string|null
39
+     */
40
+    public function getTemplatePath($mimetype) {
41
+        if (isset($this->templates[$mimetype])) {
42
+            return $this->templates[$mimetype];
43
+        } else {
44
+            return null;
45
+        }
46
+    }
47 47
 
48
-	/**
49
-	 * get the template content for a mimetype
50
-	 *
51
-	 * @param string $mimetype
52
-	 * @return string
53
-	 */
54
-	public function getTemplate($mimetype) {
55
-		$path = $this->getTemplatePath($mimetype);
56
-		if ($path) {
57
-			return file_get_contents($path);
58
-		} else {
59
-			return '';
60
-		}
61
-	}
48
+    /**
49
+     * get the template content for a mimetype
50
+     *
51
+     * @param string $mimetype
52
+     * @return string
53
+     */
54
+    public function getTemplate($mimetype) {
55
+        $path = $this->getTemplatePath($mimetype);
56
+        if ($path) {
57
+            return file_get_contents($path);
58
+        } else {
59
+            return '';
60
+        }
61
+    }
62 62
 }
Please login to merge, or discard this patch.
lib/private/Files/SimpleFS/SimpleFile.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -26,7 +26,7 @@
 block discarded – undo
26 26
 use OCP\Files\NotPermittedException;
27 27
 use OCP\Files\SimpleFS\ISimpleFile;
28 28
 
29
-class SimpleFile implements ISimpleFile  {
29
+class SimpleFile implements ISimpleFile {
30 30
 
31 31
 	/** @var File $file */
32 32
 	private $file;
Please login to merge, or discard this patch.
Indentation   +139 added lines, -139 removed lines patch added patch discarded remove patch
@@ -29,144 +29,144 @@
 block discarded – undo
29 29
 
30 30
 class SimpleFile implements ISimpleFile  {
31 31
 
32
-	/** @var File $file */
33
-	private $file;
34
-
35
-	/**
36
-	 * File constructor.
37
-	 *
38
-	 * @param File $file
39
-	 */
40
-	public function __construct(File $file) {
41
-		$this->file = $file;
42
-	}
43
-
44
-	/**
45
-	 * Get the name
46
-	 *
47
-	 * @return string
48
-	 */
49
-	public function getName() {
50
-		return $this->file->getName();
51
-	}
52
-
53
-	/**
54
-	 * Get the size in bytes
55
-	 *
56
-	 * @return int
57
-	 */
58
-	public function getSize() {
59
-		return $this->file->getSize();
60
-	}
61
-
62
-	/**
63
-	 * Get the ETag
64
-	 *
65
-	 * @return string
66
-	 */
67
-	public function getETag() {
68
-		return $this->file->getEtag();
69
-	}
70
-
71
-	/**
72
-	 * Get the last modification time
73
-	 *
74
-	 * @return int
75
-	 */
76
-	public function getMTime() {
77
-		return $this->file->getMTime();
78
-	}
79
-
80
-	/**
81
-	 * Get the content
82
-	 *
83
-	 * @throws NotPermittedException
84
-	 * @throws NotFoundException
85
-	 * @return string
86
-	 */
87
-	public function getContent() {
88
-		$result = $this->file->getContent();
89
-
90
-		if ($result === false) {
91
-			$this->checkFile();
92
-		}
93
-
94
-		return $result;
95
-	}
96
-
97
-	/**
98
-	 * Overwrite the file
99
-	 *
100
-	 * @param string|resource $data
101
-	 * @throws NotPermittedException
102
-	 */
103
-	public function putContent($data) {
104
-		$this->file->putContent($data);
105
-	}
106
-
107
-	/**
108
-	 * Sometimes there are some issues with the AppData. Most of them are from
109
-	 * user error. But we should handle them gracefull anyway.
110
-	 *
111
-	 * If for some reason the current file can't be found. We remove it.
112
-	 * Then traverse up and check all folders if they exists. This so that the
113
-	 * next request will have a valid appdata structure again.
114
-	 *
115
-	 * @throws NotFoundException
116
-	 */
117
-	private function checkFile() {
118
-		$cur = $this->file;
119
-
120
-		while ($cur->stat() === false) {
121
-			$parent = $cur->getParent();
122
-			$cur->delete();
123
-			$cur = $parent;
124
-		}
125
-
126
-		if ($cur !== $this->file) {
127
-			throw new NotFoundException('File does not exist');
128
-		}
129
-	}
130
-
131
-
132
-	/**
133
-	 * Delete the file
134
-	 *
135
-	 * @throws NotPermittedException
136
-	 */
137
-	public function delete() {
138
-		$this->file->delete();
139
-	}
140
-
141
-	/**
142
-	 * Get the MimeType
143
-	 *
144
-	 * @return string
145
-	 */
146
-	public function getMimeType() {
147
-		return $this->file->getMimeType();
148
-	}
149
-
150
-	/**
151
-	 * Open the file as stream for reading, resulting resource can be operated as stream like the result from php's own fopen
152
-	 *
153
-	 * @return resource
154
-	 * @throws \OCP\Files\NotPermittedException
155
-	 * @since 14.0.0
156
-	 */
157
-	public function read() {
158
-		return $this->file->fopen('r');
159
-	}
160
-
161
-	/**
162
-	 * Open the file as stream for writing, resulting resource can be operated as stream like the result from php's own fopen
163
-	 *
164
-	 * @return resource
165
-	 * @throws \OCP\Files\NotPermittedException
166
-	 * @since 14.0.0
167
-	 */
168
-	public function write() {
169
-		return $this->file->fopen('w');
170
-	}
32
+    /** @var File $file */
33
+    private $file;
34
+
35
+    /**
36
+     * File constructor.
37
+     *
38
+     * @param File $file
39
+     */
40
+    public function __construct(File $file) {
41
+        $this->file = $file;
42
+    }
43
+
44
+    /**
45
+     * Get the name
46
+     *
47
+     * @return string
48
+     */
49
+    public function getName() {
50
+        return $this->file->getName();
51
+    }
52
+
53
+    /**
54
+     * Get the size in bytes
55
+     *
56
+     * @return int
57
+     */
58
+    public function getSize() {
59
+        return $this->file->getSize();
60
+    }
61
+
62
+    /**
63
+     * Get the ETag
64
+     *
65
+     * @return string
66
+     */
67
+    public function getETag() {
68
+        return $this->file->getEtag();
69
+    }
70
+
71
+    /**
72
+     * Get the last modification time
73
+     *
74
+     * @return int
75
+     */
76
+    public function getMTime() {
77
+        return $this->file->getMTime();
78
+    }
79
+
80
+    /**
81
+     * Get the content
82
+     *
83
+     * @throws NotPermittedException
84
+     * @throws NotFoundException
85
+     * @return string
86
+     */
87
+    public function getContent() {
88
+        $result = $this->file->getContent();
89
+
90
+        if ($result === false) {
91
+            $this->checkFile();
92
+        }
93
+
94
+        return $result;
95
+    }
96
+
97
+    /**
98
+     * Overwrite the file
99
+     *
100
+     * @param string|resource $data
101
+     * @throws NotPermittedException
102
+     */
103
+    public function putContent($data) {
104
+        $this->file->putContent($data);
105
+    }
106
+
107
+    /**
108
+     * Sometimes there are some issues with the AppData. Most of them are from
109
+     * user error. But we should handle them gracefull anyway.
110
+     *
111
+     * If for some reason the current file can't be found. We remove it.
112
+     * Then traverse up and check all folders if they exists. This so that the
113
+     * next request will have a valid appdata structure again.
114
+     *
115
+     * @throws NotFoundException
116
+     */
117
+    private function checkFile() {
118
+        $cur = $this->file;
119
+
120
+        while ($cur->stat() === false) {
121
+            $parent = $cur->getParent();
122
+            $cur->delete();
123
+            $cur = $parent;
124
+        }
125
+
126
+        if ($cur !== $this->file) {
127
+            throw new NotFoundException('File does not exist');
128
+        }
129
+    }
130
+
131
+
132
+    /**
133
+     * Delete the file
134
+     *
135
+     * @throws NotPermittedException
136
+     */
137
+    public function delete() {
138
+        $this->file->delete();
139
+    }
140
+
141
+    /**
142
+     * Get the MimeType
143
+     *
144
+     * @return string
145
+     */
146
+    public function getMimeType() {
147
+        return $this->file->getMimeType();
148
+    }
149
+
150
+    /**
151
+     * Open the file as stream for reading, resulting resource can be operated as stream like the result from php's own fopen
152
+     *
153
+     * @return resource
154
+     * @throws \OCP\Files\NotPermittedException
155
+     * @since 14.0.0
156
+     */
157
+    public function read() {
158
+        return $this->file->fopen('r');
159
+    }
160
+
161
+    /**
162
+     * Open the file as stream for writing, resulting resource can be operated as stream like the result from php's own fopen
163
+     *
164
+     * @return resource
165
+     * @throws \OCP\Files\NotPermittedException
166
+     * @since 14.0.0
167
+     */
168
+    public function write() {
169
+        return $this->file->fopen('w');
170
+    }
171 171
 
172 172
 }
Please login to merge, or discard this patch.
lib/private/Files/SimpleFS/SimpleFolder.php 2 patches
Indentation   +41 added lines, -41 removed lines patch added patch discarded remove patch
@@ -30,58 +30,58 @@
 block discarded – undo
30 30
 
31 31
 class SimpleFolder implements ISimpleFolder   {
32 32
 
33
-	/** @var Folder */
34
-	private $folder;
33
+    /** @var Folder */
34
+    private $folder;
35 35
 
36
-	/**
37
-	 * Folder constructor.
38
-	 *
39
-	 * @param Folder $folder
40
-	 */
41
-	public function __construct(Folder $folder) {
42
-		$this->folder = $folder;
43
-	}
36
+    /**
37
+     * Folder constructor.
38
+     *
39
+     * @param Folder $folder
40
+     */
41
+    public function __construct(Folder $folder) {
42
+        $this->folder = $folder;
43
+    }
44 44
 
45
-	public function getName() {
46
-		return $this->folder->getName();
47
-	}
45
+    public function getName() {
46
+        return $this->folder->getName();
47
+    }
48 48
 
49
-	public function getDirectoryListing() {
50
-		$listing = $this->folder->getDirectoryListing();
49
+    public function getDirectoryListing() {
50
+        $listing = $this->folder->getDirectoryListing();
51 51
 
52
-		$fileListing = array_map(function(Node $file) {
53
-			if ($file instanceof File) {
54
-				return new SimpleFile($file);
55
-			}
56
-			return null;
57
-		}, $listing);
52
+        $fileListing = array_map(function(Node $file) {
53
+            if ($file instanceof File) {
54
+                return new SimpleFile($file);
55
+            }
56
+            return null;
57
+        }, $listing);
58 58
 
59
-		$fileListing = array_filter($fileListing);
59
+        $fileListing = array_filter($fileListing);
60 60
 
61
-		return array_values($fileListing);
62
-	}
61
+        return array_values($fileListing);
62
+    }
63 63
 
64
-	public function delete() {
65
-		$this->folder->delete();
66
-	}
64
+    public function delete() {
65
+        $this->folder->delete();
66
+    }
67 67
 
68
-	public function fileExists($name) {
69
-		return $this->folder->nodeExists($name);
70
-	}
68
+    public function fileExists($name) {
69
+        return $this->folder->nodeExists($name);
70
+    }
71 71
 
72
-	public function getFile($name) {
73
-		$file = $this->folder->get($name);
72
+    public function getFile($name) {
73
+        $file = $this->folder->get($name);
74 74
 
75
-		if (!($file instanceof File)) {
76
-			throw new NotFoundException();
77
-		}
75
+        if (!($file instanceof File)) {
76
+            throw new NotFoundException();
77
+        }
78 78
 
79
-		return new SimpleFile($file);
80
-	}
79
+        return new SimpleFile($file);
80
+    }
81 81
 
82
-	public function newFile($name) {
83
-		$file = $this->folder->newFile($name);
82
+    public function newFile($name) {
83
+        $file = $this->folder->newFile($name);
84 84
 
85
-		return new SimpleFile($file);
86
-	}
85
+        return new SimpleFile($file);
86
+    }
87 87
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -28,7 +28,7 @@
 block discarded – undo
28 28
 use OCP\Files\NotFoundException;
29 29
 use OCP\Files\SimpleFS\ISimpleFolder;
30 30
 
31
-class SimpleFolder implements ISimpleFolder   {
31
+class SimpleFolder implements ISimpleFolder {
32 32
 
33 33
 	/** @var Folder */
34 34
 	private $folder;
Please login to merge, or discard this patch.
lib/private/Files/Storage/Wrapper/Encoding.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
 				// no point in continuing if the section was not found, use original path
81 81
 				return $fullPath;
82 82
 			}
83
-			$path = $convertedPath . '/';
83
+			$path = $convertedPath.'/';
84 84
 		}
85 85
 		$path = rtrim($path, '/');
86 86
 		return $path;
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
 	 * @return string|null original or converted path, or null if none of the forms was found
97 97
 	 */
98 98
 	private function findPathToUseLastSection($basePath, $lastSection) {
99
-		$fullPath = $basePath . $lastSection;
99
+		$fullPath = $basePath.$lastSection;
100 100
 		if ($lastSection === '' || $this->isAscii($lastSection) || $this->storage->file_exists($fullPath)) {
101 101
 			$this->namesCache[$fullPath] = $fullPath;
102 102
 			return $fullPath;
@@ -108,7 +108,7 @@  discard block
 block discarded – undo
108 108
 		} else {
109 109
 			$otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_C);
110 110
 		}
111
-		$otherFullPath = $basePath . $otherFormPath;
111
+		$otherFullPath = $basePath.$otherFormPath;
112 112
 		if ($this->storage->file_exists($otherFullPath)) {
113 113
 			$this->namesCache[$fullPath] = $otherFullPath;
114 114
 			return $otherFullPath;
Please login to merge, or discard this patch.
Indentation   +498 added lines, -498 removed lines patch added patch discarded remove patch
@@ -34,502 +34,502 @@
 block discarded – undo
34 34
  */
35 35
 class Encoding extends Wrapper {
36 36
 
37
-	/**
38
-	 * @var ICache
39
-	 */
40
-	private $namesCache;
41
-
42
-	/**
43
-	 * @param array $parameters
44
-	 */
45
-	public function __construct($parameters) {
46
-		$this->storage = $parameters['storage'];
47
-		$this->namesCache = new CappedMemoryCache();
48
-	}
49
-
50
-	/**
51
-	 * Returns whether the given string is only made of ASCII characters
52
-	 *
53
-	 * @param string $str string
54
-	 *
55
-	 * @return bool true if the string is all ASCII, false otherwise
56
-	 */
57
-	private function isAscii($str) {
58
-		return (bool) !preg_match('/[\\x80-\\xff]+/', $str);
59
-	}
60
-
61
-	/**
62
-	 * Checks whether the given path exists in NFC or NFD form after checking
63
-	 * each form for each path section and returns the correct form.
64
-	 * If no existing path found, returns the path as it was given.
65
-	 *
66
-	 * @param string $fullPath path to check
67
-	 *
68
-	 * @return string original or converted path
69
-	 */
70
-	private function findPathToUse($fullPath) {
71
-		$cachedPath = $this->namesCache[$fullPath];
72
-		if ($cachedPath !== null) {
73
-			return $cachedPath;
74
-		}
75
-
76
-		$sections = explode('/', $fullPath);
77
-		$path = '';
78
-		foreach ($sections as $section) {
79
-			$convertedPath = $this->findPathToUseLastSection($path, $section);
80
-			if ($convertedPath === null) {
81
-				// no point in continuing if the section was not found, use original path
82
-				return $fullPath;
83
-			}
84
-			$path = $convertedPath . '/';
85
-		}
86
-		$path = rtrim($path, '/');
87
-		return $path;
88
-	}
89
-
90
-	/**
91
-	 * Checks whether the last path section of the given path exists in NFC or NFD form
92
-	 * and returns the correct form. If no existing path found, returns null.
93
-	 *
94
-	 * @param string $basePath base path to check
95
-	 * @param string $lastSection last section of the path to check for NFD/NFC variations
96
-	 *
97
-	 * @return string|null original or converted path, or null if none of the forms was found
98
-	 */
99
-	private function findPathToUseLastSection($basePath, $lastSection) {
100
-		$fullPath = $basePath . $lastSection;
101
-		if ($lastSection === '' || $this->isAscii($lastSection) || $this->storage->file_exists($fullPath)) {
102
-			$this->namesCache[$fullPath] = $fullPath;
103
-			return $fullPath;
104
-		}
105
-
106
-		// swap encoding
107
-		if (\Normalizer::isNormalized($lastSection, \Normalizer::FORM_C)) {
108
-			$otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_D);
109
-		} else {
110
-			$otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_C);
111
-		}
112
-		$otherFullPath = $basePath . $otherFormPath;
113
-		if ($this->storage->file_exists($otherFullPath)) {
114
-			$this->namesCache[$fullPath] = $otherFullPath;
115
-			return $otherFullPath;
116
-		}
117
-
118
-		// return original path, file did not exist at all
119
-		$this->namesCache[$fullPath] = $fullPath;
120
-		return null;
121
-	}
122
-
123
-	/**
124
-	 * see http://php.net/manual/en/function.mkdir.php
125
-	 *
126
-	 * @param string $path
127
-	 * @return bool
128
-	 */
129
-	public function mkdir($path) {
130
-		// note: no conversion here, method should not be called with non-NFC names!
131
-		$result = $this->storage->mkdir($path);
132
-		if ($result) {
133
-			$this->namesCache[$path] = $path;
134
-		}
135
-		return $result;
136
-	}
137
-
138
-	/**
139
-	 * see http://php.net/manual/en/function.rmdir.php
140
-	 *
141
-	 * @param string $path
142
-	 * @return bool
143
-	 */
144
-	public function rmdir($path) {
145
-		$result = $this->storage->rmdir($this->findPathToUse($path));
146
-		if ($result) {
147
-			unset($this->namesCache[$path]);
148
-		}
149
-		return $result;
150
-	}
151
-
152
-	/**
153
-	 * see http://php.net/manual/en/function.opendir.php
154
-	 *
155
-	 * @param string $path
156
-	 * @return resource
157
-	 */
158
-	public function opendir($path) {
159
-		return $this->storage->opendir($this->findPathToUse($path));
160
-	}
161
-
162
-	/**
163
-	 * see http://php.net/manual/en/function.is_dir.php
164
-	 *
165
-	 * @param string $path
166
-	 * @return bool
167
-	 */
168
-	public function is_dir($path) {
169
-		return $this->storage->is_dir($this->findPathToUse($path));
170
-	}
171
-
172
-	/**
173
-	 * see http://php.net/manual/en/function.is_file.php
174
-	 *
175
-	 * @param string $path
176
-	 * @return bool
177
-	 */
178
-	public function is_file($path) {
179
-		return $this->storage->is_file($this->findPathToUse($path));
180
-	}
181
-
182
-	/**
183
-	 * see http://php.net/manual/en/function.stat.php
184
-	 * only the following keys are required in the result: size and mtime
185
-	 *
186
-	 * @param string $path
187
-	 * @return array
188
-	 */
189
-	public function stat($path) {
190
-		return $this->storage->stat($this->findPathToUse($path));
191
-	}
192
-
193
-	/**
194
-	 * see http://php.net/manual/en/function.filetype.php
195
-	 *
196
-	 * @param string $path
197
-	 * @return bool
198
-	 */
199
-	public function filetype($path) {
200
-		return $this->storage->filetype($this->findPathToUse($path));
201
-	}
202
-
203
-	/**
204
-	 * see http://php.net/manual/en/function.filesize.php
205
-	 * The result for filesize when called on a folder is required to be 0
206
-	 *
207
-	 * @param string $path
208
-	 * @return int
209
-	 */
210
-	public function filesize($path) {
211
-		return $this->storage->filesize($this->findPathToUse($path));
212
-	}
213
-
214
-	/**
215
-	 * check if a file can be created in $path
216
-	 *
217
-	 * @param string $path
218
-	 * @return bool
219
-	 */
220
-	public function isCreatable($path) {
221
-		return $this->storage->isCreatable($this->findPathToUse($path));
222
-	}
223
-
224
-	/**
225
-	 * check if a file can be read
226
-	 *
227
-	 * @param string $path
228
-	 * @return bool
229
-	 */
230
-	public function isReadable($path) {
231
-		return $this->storage->isReadable($this->findPathToUse($path));
232
-	}
233
-
234
-	/**
235
-	 * check if a file can be written to
236
-	 *
237
-	 * @param string $path
238
-	 * @return bool
239
-	 */
240
-	public function isUpdatable($path) {
241
-		return $this->storage->isUpdatable($this->findPathToUse($path));
242
-	}
243
-
244
-	/**
245
-	 * check if a file can be deleted
246
-	 *
247
-	 * @param string $path
248
-	 * @return bool
249
-	 */
250
-	public function isDeletable($path) {
251
-		return $this->storage->isDeletable($this->findPathToUse($path));
252
-	}
253
-
254
-	/**
255
-	 * check if a file can be shared
256
-	 *
257
-	 * @param string $path
258
-	 * @return bool
259
-	 */
260
-	public function isSharable($path) {
261
-		return $this->storage->isSharable($this->findPathToUse($path));
262
-	}
263
-
264
-	/**
265
-	 * get the full permissions of a path.
266
-	 * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php
267
-	 *
268
-	 * @param string $path
269
-	 * @return int
270
-	 */
271
-	public function getPermissions($path) {
272
-		return $this->storage->getPermissions($this->findPathToUse($path));
273
-	}
274
-
275
-	/**
276
-	 * see http://php.net/manual/en/function.file_exists.php
277
-	 *
278
-	 * @param string $path
279
-	 * @return bool
280
-	 */
281
-	public function file_exists($path) {
282
-		return $this->storage->file_exists($this->findPathToUse($path));
283
-	}
284
-
285
-	/**
286
-	 * see http://php.net/manual/en/function.filemtime.php
287
-	 *
288
-	 * @param string $path
289
-	 * @return int
290
-	 */
291
-	public function filemtime($path) {
292
-		return $this->storage->filemtime($this->findPathToUse($path));
293
-	}
294
-
295
-	/**
296
-	 * see http://php.net/manual/en/function.file_get_contents.php
297
-	 *
298
-	 * @param string $path
299
-	 * @return string
300
-	 */
301
-	public function file_get_contents($path) {
302
-		return $this->storage->file_get_contents($this->findPathToUse($path));
303
-	}
304
-
305
-	/**
306
-	 * see http://php.net/manual/en/function.file_put_contents.php
307
-	 *
308
-	 * @param string $path
309
-	 * @param string $data
310
-	 * @return bool
311
-	 */
312
-	public function file_put_contents($path, $data) {
313
-		return $this->storage->file_put_contents($this->findPathToUse($path), $data);
314
-	}
315
-
316
-	/**
317
-	 * see http://php.net/manual/en/function.unlink.php
318
-	 *
319
-	 * @param string $path
320
-	 * @return bool
321
-	 */
322
-	public function unlink($path) {
323
-		$result = $this->storage->unlink($this->findPathToUse($path));
324
-		if ($result) {
325
-			unset($this->namesCache[$path]);
326
-		}
327
-		return $result;
328
-	}
329
-
330
-	/**
331
-	 * see http://php.net/manual/en/function.rename.php
332
-	 *
333
-	 * @param string $path1
334
-	 * @param string $path2
335
-	 * @return bool
336
-	 */
337
-	public function rename($path1, $path2) {
338
-		// second name always NFC
339
-		return $this->storage->rename($this->findPathToUse($path1), $this->findPathToUse($path2));
340
-	}
341
-
342
-	/**
343
-	 * see http://php.net/manual/en/function.copy.php
344
-	 *
345
-	 * @param string $path1
346
-	 * @param string $path2
347
-	 * @return bool
348
-	 */
349
-	public function copy($path1, $path2) {
350
-		return $this->storage->copy($this->findPathToUse($path1), $this->findPathToUse($path2));
351
-	}
352
-
353
-	/**
354
-	 * see http://php.net/manual/en/function.fopen.php
355
-	 *
356
-	 * @param string $path
357
-	 * @param string $mode
358
-	 * @return resource
359
-	 */
360
-	public function fopen($path, $mode) {
361
-		$result = $this->storage->fopen($this->findPathToUse($path), $mode);
362
-		if ($result && $mode !== 'r' && $mode !== 'rb') {
363
-			unset($this->namesCache[$path]);
364
-		}
365
-		return $result;
366
-	}
367
-
368
-	/**
369
-	 * get the mimetype for a file or folder
370
-	 * The mimetype for a folder is required to be "httpd/unix-directory"
371
-	 *
372
-	 * @param string $path
373
-	 * @return string
374
-	 */
375
-	public function getMimeType($path) {
376
-		return $this->storage->getMimeType($this->findPathToUse($path));
377
-	}
378
-
379
-	/**
380
-	 * see http://php.net/manual/en/function.hash.php
381
-	 *
382
-	 * @param string $type
383
-	 * @param string $path
384
-	 * @param bool $raw
385
-	 * @return string
386
-	 */
387
-	public function hash($type, $path, $raw = false) {
388
-		return $this->storage->hash($type, $this->findPathToUse($path), $raw);
389
-	}
390
-
391
-	/**
392
-	 * see http://php.net/manual/en/function.free_space.php
393
-	 *
394
-	 * @param string $path
395
-	 * @return int
396
-	 */
397
-	public function free_space($path) {
398
-		return $this->storage->free_space($this->findPathToUse($path));
399
-	}
400
-
401
-	/**
402
-	 * search for occurrences of $query in file names
403
-	 *
404
-	 * @param string $query
405
-	 * @return array
406
-	 */
407
-	public function search($query) {
408
-		return $this->storage->search($query);
409
-	}
410
-
411
-	/**
412
-	 * see http://php.net/manual/en/function.touch.php
413
-	 * If the backend does not support the operation, false should be returned
414
-	 *
415
-	 * @param string $path
416
-	 * @param int $mtime
417
-	 * @return bool
418
-	 */
419
-	public function touch($path, $mtime = null) {
420
-		return $this->storage->touch($this->findPathToUse($path), $mtime);
421
-	}
422
-
423
-	/**
424
-	 * get the path to a local version of the file.
425
-	 * The local version of the file can be temporary and doesn't have to be persistent across requests
426
-	 *
427
-	 * @param string $path
428
-	 * @return string
429
-	 */
430
-	public function getLocalFile($path) {
431
-		return $this->storage->getLocalFile($this->findPathToUse($path));
432
-	}
433
-
434
-	/**
435
-	 * check if a file or folder has been updated since $time
436
-	 *
437
-	 * @param string $path
438
-	 * @param int $time
439
-	 * @return bool
440
-	 *
441
-	 * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed.
442
-	 * returning true for other changes in the folder is optional
443
-	 */
444
-	public function hasUpdated($path, $time) {
445
-		return $this->storage->hasUpdated($this->findPathToUse($path), $time);
446
-	}
447
-
448
-	/**
449
-	 * get a cache instance for the storage
450
-	 *
451
-	 * @param string $path
452
-	 * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache
453
-	 * @return \OC\Files\Cache\Cache
454
-	 */
455
-	public function getCache($path = '', $storage = null) {
456
-		if (!$storage) {
457
-			$storage = $this;
458
-		}
459
-		return $this->storage->getCache($this->findPathToUse($path), $storage);
460
-	}
461
-
462
-	/**
463
-	 * get a scanner instance for the storage
464
-	 *
465
-	 * @param string $path
466
-	 * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
467
-	 * @return \OC\Files\Cache\Scanner
468
-	 */
469
-	public function getScanner($path = '', $storage = null) {
470
-		if (!$storage) {
471
-			$storage = $this;
472
-		}
473
-		return $this->storage->getScanner($this->findPathToUse($path), $storage);
474
-	}
475
-
476
-	/**
477
-	 * get the ETag for a file or folder
478
-	 *
479
-	 * @param string $path
480
-	 * @return string
481
-	 */
482
-	public function getETag($path) {
483
-		return $this->storage->getETag($this->findPathToUse($path));
484
-	}
485
-
486
-	/**
487
-	 * @param IStorage $sourceStorage
488
-	 * @param string $sourceInternalPath
489
-	 * @param string $targetInternalPath
490
-	 * @return bool
491
-	 */
492
-	public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
493
-		if ($sourceStorage === $this) {
494
-			return $this->copy($sourceInternalPath, $this->findPathToUse($targetInternalPath));
495
-		}
496
-
497
-		$result = $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
498
-		if ($result) {
499
-			unset($this->namesCache[$targetInternalPath]);
500
-		}
501
-		return $result;
502
-	}
503
-
504
-	/**
505
-	 * @param IStorage $sourceStorage
506
-	 * @param string $sourceInternalPath
507
-	 * @param string $targetInternalPath
508
-	 * @return bool
509
-	 */
510
-	public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
511
-		if ($sourceStorage === $this) {
512
-			$result = $this->rename($sourceInternalPath, $this->findPathToUse($targetInternalPath));
513
-			if ($result) {
514
-				unset($this->namesCache[$sourceInternalPath]);
515
-				unset($this->namesCache[$targetInternalPath]);
516
-			}
517
-			return $result;
518
-		}
519
-
520
-		$result = $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
521
-		if ($result) {
522
-			unset($this->namesCache[$sourceInternalPath]);
523
-			unset($this->namesCache[$targetInternalPath]);
524
-		}
525
-		return $result;
526
-	}
527
-
528
-	/**
529
-	 * @param string $path
530
-	 * @return array
531
-	 */
532
-	public function getMetaData($path) {
533
-		return $this->storage->getMetaData($this->findPathToUse($path));
534
-	}
37
+    /**
38
+     * @var ICache
39
+     */
40
+    private $namesCache;
41
+
42
+    /**
43
+     * @param array $parameters
44
+     */
45
+    public function __construct($parameters) {
46
+        $this->storage = $parameters['storage'];
47
+        $this->namesCache = new CappedMemoryCache();
48
+    }
49
+
50
+    /**
51
+     * Returns whether the given string is only made of ASCII characters
52
+     *
53
+     * @param string $str string
54
+     *
55
+     * @return bool true if the string is all ASCII, false otherwise
56
+     */
57
+    private function isAscii($str) {
58
+        return (bool) !preg_match('/[\\x80-\\xff]+/', $str);
59
+    }
60
+
61
+    /**
62
+     * Checks whether the given path exists in NFC or NFD form after checking
63
+     * each form for each path section and returns the correct form.
64
+     * If no existing path found, returns the path as it was given.
65
+     *
66
+     * @param string $fullPath path to check
67
+     *
68
+     * @return string original or converted path
69
+     */
70
+    private function findPathToUse($fullPath) {
71
+        $cachedPath = $this->namesCache[$fullPath];
72
+        if ($cachedPath !== null) {
73
+            return $cachedPath;
74
+        }
75
+
76
+        $sections = explode('/', $fullPath);
77
+        $path = '';
78
+        foreach ($sections as $section) {
79
+            $convertedPath = $this->findPathToUseLastSection($path, $section);
80
+            if ($convertedPath === null) {
81
+                // no point in continuing if the section was not found, use original path
82
+                return $fullPath;
83
+            }
84
+            $path = $convertedPath . '/';
85
+        }
86
+        $path = rtrim($path, '/');
87
+        return $path;
88
+    }
89
+
90
+    /**
91
+     * Checks whether the last path section of the given path exists in NFC or NFD form
92
+     * and returns the correct form. If no existing path found, returns null.
93
+     *
94
+     * @param string $basePath base path to check
95
+     * @param string $lastSection last section of the path to check for NFD/NFC variations
96
+     *
97
+     * @return string|null original or converted path, or null if none of the forms was found
98
+     */
99
+    private function findPathToUseLastSection($basePath, $lastSection) {
100
+        $fullPath = $basePath . $lastSection;
101
+        if ($lastSection === '' || $this->isAscii($lastSection) || $this->storage->file_exists($fullPath)) {
102
+            $this->namesCache[$fullPath] = $fullPath;
103
+            return $fullPath;
104
+        }
105
+
106
+        // swap encoding
107
+        if (\Normalizer::isNormalized($lastSection, \Normalizer::FORM_C)) {
108
+            $otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_D);
109
+        } else {
110
+            $otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_C);
111
+        }
112
+        $otherFullPath = $basePath . $otherFormPath;
113
+        if ($this->storage->file_exists($otherFullPath)) {
114
+            $this->namesCache[$fullPath] = $otherFullPath;
115
+            return $otherFullPath;
116
+        }
117
+
118
+        // return original path, file did not exist at all
119
+        $this->namesCache[$fullPath] = $fullPath;
120
+        return null;
121
+    }
122
+
123
+    /**
124
+     * see http://php.net/manual/en/function.mkdir.php
125
+     *
126
+     * @param string $path
127
+     * @return bool
128
+     */
129
+    public function mkdir($path) {
130
+        // note: no conversion here, method should not be called with non-NFC names!
131
+        $result = $this->storage->mkdir($path);
132
+        if ($result) {
133
+            $this->namesCache[$path] = $path;
134
+        }
135
+        return $result;
136
+    }
137
+
138
+    /**
139
+     * see http://php.net/manual/en/function.rmdir.php
140
+     *
141
+     * @param string $path
142
+     * @return bool
143
+     */
144
+    public function rmdir($path) {
145
+        $result = $this->storage->rmdir($this->findPathToUse($path));
146
+        if ($result) {
147
+            unset($this->namesCache[$path]);
148
+        }
149
+        return $result;
150
+    }
151
+
152
+    /**
153
+     * see http://php.net/manual/en/function.opendir.php
154
+     *
155
+     * @param string $path
156
+     * @return resource
157
+     */
158
+    public function opendir($path) {
159
+        return $this->storage->opendir($this->findPathToUse($path));
160
+    }
161
+
162
+    /**
163
+     * see http://php.net/manual/en/function.is_dir.php
164
+     *
165
+     * @param string $path
166
+     * @return bool
167
+     */
168
+    public function is_dir($path) {
169
+        return $this->storage->is_dir($this->findPathToUse($path));
170
+    }
171
+
172
+    /**
173
+     * see http://php.net/manual/en/function.is_file.php
174
+     *
175
+     * @param string $path
176
+     * @return bool
177
+     */
178
+    public function is_file($path) {
179
+        return $this->storage->is_file($this->findPathToUse($path));
180
+    }
181
+
182
+    /**
183
+     * see http://php.net/manual/en/function.stat.php
184
+     * only the following keys are required in the result: size and mtime
185
+     *
186
+     * @param string $path
187
+     * @return array
188
+     */
189
+    public function stat($path) {
190
+        return $this->storage->stat($this->findPathToUse($path));
191
+    }
192
+
193
+    /**
194
+     * see http://php.net/manual/en/function.filetype.php
195
+     *
196
+     * @param string $path
197
+     * @return bool
198
+     */
199
+    public function filetype($path) {
200
+        return $this->storage->filetype($this->findPathToUse($path));
201
+    }
202
+
203
+    /**
204
+     * see http://php.net/manual/en/function.filesize.php
205
+     * The result for filesize when called on a folder is required to be 0
206
+     *
207
+     * @param string $path
208
+     * @return int
209
+     */
210
+    public function filesize($path) {
211
+        return $this->storage->filesize($this->findPathToUse($path));
212
+    }
213
+
214
+    /**
215
+     * check if a file can be created in $path
216
+     *
217
+     * @param string $path
218
+     * @return bool
219
+     */
220
+    public function isCreatable($path) {
221
+        return $this->storage->isCreatable($this->findPathToUse($path));
222
+    }
223
+
224
+    /**
225
+     * check if a file can be read
226
+     *
227
+     * @param string $path
228
+     * @return bool
229
+     */
230
+    public function isReadable($path) {
231
+        return $this->storage->isReadable($this->findPathToUse($path));
232
+    }
233
+
234
+    /**
235
+     * check if a file can be written to
236
+     *
237
+     * @param string $path
238
+     * @return bool
239
+     */
240
+    public function isUpdatable($path) {
241
+        return $this->storage->isUpdatable($this->findPathToUse($path));
242
+    }
243
+
244
+    /**
245
+     * check if a file can be deleted
246
+     *
247
+     * @param string $path
248
+     * @return bool
249
+     */
250
+    public function isDeletable($path) {
251
+        return $this->storage->isDeletable($this->findPathToUse($path));
252
+    }
253
+
254
+    /**
255
+     * check if a file can be shared
256
+     *
257
+     * @param string $path
258
+     * @return bool
259
+     */
260
+    public function isSharable($path) {
261
+        return $this->storage->isSharable($this->findPathToUse($path));
262
+    }
263
+
264
+    /**
265
+     * get the full permissions of a path.
266
+     * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php
267
+     *
268
+     * @param string $path
269
+     * @return int
270
+     */
271
+    public function getPermissions($path) {
272
+        return $this->storage->getPermissions($this->findPathToUse($path));
273
+    }
274
+
275
+    /**
276
+     * see http://php.net/manual/en/function.file_exists.php
277
+     *
278
+     * @param string $path
279
+     * @return bool
280
+     */
281
+    public function file_exists($path) {
282
+        return $this->storage->file_exists($this->findPathToUse($path));
283
+    }
284
+
285
+    /**
286
+     * see http://php.net/manual/en/function.filemtime.php
287
+     *
288
+     * @param string $path
289
+     * @return int
290
+     */
291
+    public function filemtime($path) {
292
+        return $this->storage->filemtime($this->findPathToUse($path));
293
+    }
294
+
295
+    /**
296
+     * see http://php.net/manual/en/function.file_get_contents.php
297
+     *
298
+     * @param string $path
299
+     * @return string
300
+     */
301
+    public function file_get_contents($path) {
302
+        return $this->storage->file_get_contents($this->findPathToUse($path));
303
+    }
304
+
305
+    /**
306
+     * see http://php.net/manual/en/function.file_put_contents.php
307
+     *
308
+     * @param string $path
309
+     * @param string $data
310
+     * @return bool
311
+     */
312
+    public function file_put_contents($path, $data) {
313
+        return $this->storage->file_put_contents($this->findPathToUse($path), $data);
314
+    }
315
+
316
+    /**
317
+     * see http://php.net/manual/en/function.unlink.php
318
+     *
319
+     * @param string $path
320
+     * @return bool
321
+     */
322
+    public function unlink($path) {
323
+        $result = $this->storage->unlink($this->findPathToUse($path));
324
+        if ($result) {
325
+            unset($this->namesCache[$path]);
326
+        }
327
+        return $result;
328
+    }
329
+
330
+    /**
331
+     * see http://php.net/manual/en/function.rename.php
332
+     *
333
+     * @param string $path1
334
+     * @param string $path2
335
+     * @return bool
336
+     */
337
+    public function rename($path1, $path2) {
338
+        // second name always NFC
339
+        return $this->storage->rename($this->findPathToUse($path1), $this->findPathToUse($path2));
340
+    }
341
+
342
+    /**
343
+     * see http://php.net/manual/en/function.copy.php
344
+     *
345
+     * @param string $path1
346
+     * @param string $path2
347
+     * @return bool
348
+     */
349
+    public function copy($path1, $path2) {
350
+        return $this->storage->copy($this->findPathToUse($path1), $this->findPathToUse($path2));
351
+    }
352
+
353
+    /**
354
+     * see http://php.net/manual/en/function.fopen.php
355
+     *
356
+     * @param string $path
357
+     * @param string $mode
358
+     * @return resource
359
+     */
360
+    public function fopen($path, $mode) {
361
+        $result = $this->storage->fopen($this->findPathToUse($path), $mode);
362
+        if ($result && $mode !== 'r' && $mode !== 'rb') {
363
+            unset($this->namesCache[$path]);
364
+        }
365
+        return $result;
366
+    }
367
+
368
+    /**
369
+     * get the mimetype for a file or folder
370
+     * The mimetype for a folder is required to be "httpd/unix-directory"
371
+     *
372
+     * @param string $path
373
+     * @return string
374
+     */
375
+    public function getMimeType($path) {
376
+        return $this->storage->getMimeType($this->findPathToUse($path));
377
+    }
378
+
379
+    /**
380
+     * see http://php.net/manual/en/function.hash.php
381
+     *
382
+     * @param string $type
383
+     * @param string $path
384
+     * @param bool $raw
385
+     * @return string
386
+     */
387
+    public function hash($type, $path, $raw = false) {
388
+        return $this->storage->hash($type, $this->findPathToUse($path), $raw);
389
+    }
390
+
391
+    /**
392
+     * see http://php.net/manual/en/function.free_space.php
393
+     *
394
+     * @param string $path
395
+     * @return int
396
+     */
397
+    public function free_space($path) {
398
+        return $this->storage->free_space($this->findPathToUse($path));
399
+    }
400
+
401
+    /**
402
+     * search for occurrences of $query in file names
403
+     *
404
+     * @param string $query
405
+     * @return array
406
+     */
407
+    public function search($query) {
408
+        return $this->storage->search($query);
409
+    }
410
+
411
+    /**
412
+     * see http://php.net/manual/en/function.touch.php
413
+     * If the backend does not support the operation, false should be returned
414
+     *
415
+     * @param string $path
416
+     * @param int $mtime
417
+     * @return bool
418
+     */
419
+    public function touch($path, $mtime = null) {
420
+        return $this->storage->touch($this->findPathToUse($path), $mtime);
421
+    }
422
+
423
+    /**
424
+     * get the path to a local version of the file.
425
+     * The local version of the file can be temporary and doesn't have to be persistent across requests
426
+     *
427
+     * @param string $path
428
+     * @return string
429
+     */
430
+    public function getLocalFile($path) {
431
+        return $this->storage->getLocalFile($this->findPathToUse($path));
432
+    }
433
+
434
+    /**
435
+     * check if a file or folder has been updated since $time
436
+     *
437
+     * @param string $path
438
+     * @param int $time
439
+     * @return bool
440
+     *
441
+     * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed.
442
+     * returning true for other changes in the folder is optional
443
+     */
444
+    public function hasUpdated($path, $time) {
445
+        return $this->storage->hasUpdated($this->findPathToUse($path), $time);
446
+    }
447
+
448
+    /**
449
+     * get a cache instance for the storage
450
+     *
451
+     * @param string $path
452
+     * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache
453
+     * @return \OC\Files\Cache\Cache
454
+     */
455
+    public function getCache($path = '', $storage = null) {
456
+        if (!$storage) {
457
+            $storage = $this;
458
+        }
459
+        return $this->storage->getCache($this->findPathToUse($path), $storage);
460
+    }
461
+
462
+    /**
463
+     * get a scanner instance for the storage
464
+     *
465
+     * @param string $path
466
+     * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
467
+     * @return \OC\Files\Cache\Scanner
468
+     */
469
+    public function getScanner($path = '', $storage = null) {
470
+        if (!$storage) {
471
+            $storage = $this;
472
+        }
473
+        return $this->storage->getScanner($this->findPathToUse($path), $storage);
474
+    }
475
+
476
+    /**
477
+     * get the ETag for a file or folder
478
+     *
479
+     * @param string $path
480
+     * @return string
481
+     */
482
+    public function getETag($path) {
483
+        return $this->storage->getETag($this->findPathToUse($path));
484
+    }
485
+
486
+    /**
487
+     * @param IStorage $sourceStorage
488
+     * @param string $sourceInternalPath
489
+     * @param string $targetInternalPath
490
+     * @return bool
491
+     */
492
+    public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
493
+        if ($sourceStorage === $this) {
494
+            return $this->copy($sourceInternalPath, $this->findPathToUse($targetInternalPath));
495
+        }
496
+
497
+        $result = $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
498
+        if ($result) {
499
+            unset($this->namesCache[$targetInternalPath]);
500
+        }
501
+        return $result;
502
+    }
503
+
504
+    /**
505
+     * @param IStorage $sourceStorage
506
+     * @param string $sourceInternalPath
507
+     * @param string $targetInternalPath
508
+     * @return bool
509
+     */
510
+    public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
511
+        if ($sourceStorage === $this) {
512
+            $result = $this->rename($sourceInternalPath, $this->findPathToUse($targetInternalPath));
513
+            if ($result) {
514
+                unset($this->namesCache[$sourceInternalPath]);
515
+                unset($this->namesCache[$targetInternalPath]);
516
+            }
517
+            return $result;
518
+        }
519
+
520
+        $result = $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
521
+        if ($result) {
522
+            unset($this->namesCache[$sourceInternalPath]);
523
+            unset($this->namesCache[$targetInternalPath]);
524
+        }
525
+        return $result;
526
+    }
527
+
528
+    /**
529
+     * @param string $path
530
+     * @return array
531
+     */
532
+    public function getMetaData($path) {
533
+        return $this->storage->getMetaData($this->findPathToUse($path));
534
+    }
535 535
 }
Please login to merge, or discard this patch.