Passed
Push — master ( bdb152...365819 )
by Christoph
17:37 queued 11s
created
lib/private/OCS/CoreCapabilities.php 1 patch
Indentation   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -33,27 +33,27 @@
 block discarded – undo
33 33
  */
34 34
 class CoreCapabilities implements ICapability {
35 35
 
36
-	/** @var IConfig */
37
-	private $config;
36
+    /** @var IConfig */
37
+    private $config;
38 38
 
39
-	/**
40
-	 * @param IConfig $config
41
-	 */
42
-	public function __construct(IConfig $config) {
43
-		$this->config = $config;
44
-	}
39
+    /**
40
+     * @param IConfig $config
41
+     */
42
+    public function __construct(IConfig $config) {
43
+        $this->config = $config;
44
+    }
45 45
 
46
-	/**
47
-	 * Return this classes capabilities
48
-	 *
49
-	 * @return array
50
-	 */
51
-	public function getCapabilities() {
52
-		return [
53
-			'core' => [
54
-				'pollinterval' => $this->config->getSystemValue('pollinterval', 60),
55
-				'webdav-root' => $this->config->getSystemValue('webdav-root', 'remote.php/webdav'),
56
-			]
57
-		];
58
-	}
46
+    /**
47
+     * Return this classes capabilities
48
+     *
49
+     * @return array
50
+     */
51
+    public function getCapabilities() {
52
+        return [
53
+            'core' => [
54
+                'pollinterval' => $this->config->getSystemValue('pollinterval', 60),
55
+                'webdav-root' => $this->config->getSystemValue('webdav-root', 'remote.php/webdav'),
56
+            ]
57
+        ];
58
+    }
59 59
 }
Please login to merge, or discard this patch.
lib/private/Files/Node/Root.php 2 patches
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -372,12 +372,12 @@
 block discarded – undo
372 372
 			\OC\Files\Filesystem::initMountPoints($userId);
373 373
 
374 374
 			try {
375
-				$folder = $this->get('/' . $userId . '/files');
375
+				$folder = $this->get('/'.$userId.'/files');
376 376
 			} catch (NotFoundException $e) {
377
-				if (!$this->nodeExists('/' . $userId)) {
378
-					$this->newFolder('/' . $userId);
377
+				if (!$this->nodeExists('/'.$userId)) {
378
+					$this->newFolder('/'.$userId);
379 379
 				}
380
-				$folder = $this->newFolder('/' . $userId . '/files');
380
+				$folder = $this->newFolder('/'.$userId.'/files');
381 381
 			}
382 382
 
383 383
 			$this->userFolderCache->set($userId, $folder);
Please login to merge, or discard this patch.
Indentation   +336 added lines, -336 removed lines patch added patch discarded remove patch
@@ -64,340 +64,340 @@
 block discarded – undo
64 64
  * @package OC\Files\Node
65 65
  */
66 66
 class Root extends Folder implements IRootFolder {
67
-	/** @var Manager */
68
-	private $mountManager;
69
-	/** @var PublicEmitter */
70
-	private $emitter;
71
-	/** @var null|\OC\User\User */
72
-	private $user;
73
-	/** @var CappedMemoryCache */
74
-	private $userFolderCache;
75
-	/** @var IUserMountCache */
76
-	private $userMountCache;
77
-	/** @var ILogger */
78
-	private $logger;
79
-	/** @var IUserManager */
80
-	private $userManager;
81
-
82
-	/**
83
-	 * @param \OC\Files\Mount\Manager $manager
84
-	 * @param \OC\Files\View $view
85
-	 * @param \OC\User\User|null $user
86
-	 * @param IUserMountCache $userMountCache
87
-	 * @param ILogger $logger
88
-	 * @param IUserManager $userManager
89
-	 */
90
-	public function __construct($manager,
91
-								$view,
92
-								$user,
93
-								IUserMountCache $userMountCache,
94
-								ILogger $logger,
95
-								IUserManager $userManager) {
96
-		parent::__construct($this, $view, '');
97
-		$this->mountManager = $manager;
98
-		$this->user = $user;
99
-		$this->emitter = new PublicEmitter();
100
-		$this->userFolderCache = new CappedMemoryCache();
101
-		$this->userMountCache = $userMountCache;
102
-		$this->logger = $logger;
103
-		$this->userManager = $userManager;
104
-	}
105
-
106
-	/**
107
-	 * Get the user for which the filesystem is setup
108
-	 *
109
-	 * @return \OC\User\User
110
-	 */
111
-	public function getUser() {
112
-		return $this->user;
113
-	}
114
-
115
-	/**
116
-	 * @param string $scope
117
-	 * @param string $method
118
-	 * @param callable $callback
119
-	 */
120
-	public function listen($scope, $method, callable $callback) {
121
-		$this->emitter->listen($scope, $method, $callback);
122
-	}
123
-
124
-	/**
125
-	 * @param string $scope optional
126
-	 * @param string $method optional
127
-	 * @param callable $callback optional
128
-	 */
129
-	public function removeListener($scope = null, $method = null, callable $callback = null) {
130
-		$this->emitter->removeListener($scope, $method, $callback);
131
-	}
132
-
133
-	/**
134
-	 * @param string $scope
135
-	 * @param string $method
136
-	 * @param Node[] $arguments
137
-	 */
138
-	public function emit($scope, $method, $arguments = []) {
139
-		$this->emitter->emit($scope, $method, $arguments);
140
-	}
141
-
142
-	/**
143
-	 * @param \OC\Files\Storage\Storage $storage
144
-	 * @param string $mountPoint
145
-	 * @param array $arguments
146
-	 */
147
-	public function mount($storage, $mountPoint, $arguments = []) {
148
-		$mount = new MountPoint($storage, $mountPoint, $arguments);
149
-		$this->mountManager->addMount($mount);
150
-	}
151
-
152
-	/**
153
-	 * @param string $mountPoint
154
-	 * @return \OC\Files\Mount\MountPoint
155
-	 */
156
-	public function getMount($mountPoint) {
157
-		return $this->mountManager->find($mountPoint);
158
-	}
159
-
160
-	/**
161
-	 * @param string $mountPoint
162
-	 * @return \OC\Files\Mount\MountPoint[]
163
-	 */
164
-	public function getMountsIn($mountPoint) {
165
-		return $this->mountManager->findIn($mountPoint);
166
-	}
167
-
168
-	/**
169
-	 * @param string $storageId
170
-	 * @return \OC\Files\Mount\MountPoint[]
171
-	 */
172
-	public function getMountByStorageId($storageId) {
173
-		return $this->mountManager->findByStorageId($storageId);
174
-	}
175
-
176
-	/**
177
-	 * @param int $numericId
178
-	 * @return MountPoint[]
179
-	 */
180
-	public function getMountByNumericStorageId($numericId) {
181
-		return $this->mountManager->findByNumericId($numericId);
182
-	}
183
-
184
-	/**
185
-	 * @param \OC\Files\Mount\MountPoint $mount
186
-	 */
187
-	public function unMount($mount) {
188
-		$this->mountManager->remove($mount);
189
-	}
190
-
191
-	/**
192
-	 * @param string $path
193
-	 * @throws \OCP\Files\NotFoundException
194
-	 * @throws \OCP\Files\NotPermittedException
195
-	 * @return Node
196
-	 */
197
-	public function get($path) {
198
-		$path = $this->normalizePath($path);
199
-		if ($this->isValidPath($path)) {
200
-			$fullPath = $this->getFullPath($path);
201
-			$fileInfo = $this->view->getFileInfo($fullPath);
202
-			if ($fileInfo) {
203
-				return $this->createNode($fullPath, $fileInfo);
204
-			} else {
205
-				throw new NotFoundException($path);
206
-			}
207
-		} else {
208
-			throw new NotPermittedException();
209
-		}
210
-	}
211
-
212
-	//most operations can't be done on the root
213
-
214
-	/**
215
-	 * @param string $targetPath
216
-	 * @throws \OCP\Files\NotPermittedException
217
-	 * @return \OC\Files\Node\Node
218
-	 */
219
-	public function rename($targetPath) {
220
-		throw new NotPermittedException();
221
-	}
222
-
223
-	public function delete() {
224
-		throw new NotPermittedException();
225
-	}
226
-
227
-	/**
228
-	 * @param string $targetPath
229
-	 * @throws \OCP\Files\NotPermittedException
230
-	 * @return \OC\Files\Node\Node
231
-	 */
232
-	public function copy($targetPath) {
233
-		throw new NotPermittedException();
234
-	}
235
-
236
-	/**
237
-	 * @param int $mtime
238
-	 * @throws \OCP\Files\NotPermittedException
239
-	 */
240
-	public function touch($mtime = null) {
241
-		throw new NotPermittedException();
242
-	}
243
-
244
-	/**
245
-	 * @return \OC\Files\Storage\Storage
246
-	 * @throws \OCP\Files\NotFoundException
247
-	 */
248
-	public function getStorage() {
249
-		throw new NotFoundException();
250
-	}
251
-
252
-	/**
253
-	 * @return string
254
-	 */
255
-	public function getPath() {
256
-		return '/';
257
-	}
258
-
259
-	/**
260
-	 * @return string
261
-	 */
262
-	public function getInternalPath() {
263
-		return '';
264
-	}
265
-
266
-	/**
267
-	 * @return int
268
-	 */
269
-	public function getId() {
270
-		return null;
271
-	}
272
-
273
-	/**
274
-	 * @return array
275
-	 */
276
-	public function stat() {
277
-		return null;
278
-	}
279
-
280
-	/**
281
-	 * @return int
282
-	 */
283
-	public function getMTime() {
284
-		return null;
285
-	}
286
-
287
-	/**
288
-	 * @param bool $includeMounts
289
-	 * @return int
290
-	 */
291
-	public function getSize($includeMounts = true) {
292
-		return null;
293
-	}
294
-
295
-	/**
296
-	 * @return string
297
-	 */
298
-	public function getEtag() {
299
-		return null;
300
-	}
301
-
302
-	/**
303
-	 * @return int
304
-	 */
305
-	public function getPermissions() {
306
-		return \OCP\Constants::PERMISSION_CREATE;
307
-	}
308
-
309
-	/**
310
-	 * @return bool
311
-	 */
312
-	public function isReadable() {
313
-		return false;
314
-	}
315
-
316
-	/**
317
-	 * @return bool
318
-	 */
319
-	public function isUpdateable() {
320
-		return false;
321
-	}
322
-
323
-	/**
324
-	 * @return bool
325
-	 */
326
-	public function isDeletable() {
327
-		return false;
328
-	}
329
-
330
-	/**
331
-	 * @return bool
332
-	 */
333
-	public function isShareable() {
334
-		return false;
335
-	}
336
-
337
-	/**
338
-	 * @return Node
339
-	 * @throws \OCP\Files\NotFoundException
340
-	 */
341
-	public function getParent() {
342
-		throw new NotFoundException();
343
-	}
344
-
345
-	/**
346
-	 * @return string
347
-	 */
348
-	public function getName() {
349
-		return '';
350
-	}
351
-
352
-	/**
353
-	 * Returns a view to user's files folder
354
-	 *
355
-	 * @param string $userId user ID
356
-	 * @return \OCP\Files\Folder
357
-	 * @throws NoUserException
358
-	 * @throws NotPermittedException
359
-	 */
360
-	public function getUserFolder($userId) {
361
-		$userObject = $this->userManager->get($userId);
362
-
363
-		if (is_null($userObject)) {
364
-			$this->logger->error(
365
-				sprintf(
366
-					'Backends provided no user object for %s',
367
-					$userId
368
-				),
369
-				[
370
-					'app' => 'files',
371
-				]
372
-			);
373
-			throw new NoUserException('Backends provided no user object');
374
-		}
375
-
376
-		$userId = $userObject->getUID();
377
-
378
-		if (!$this->userFolderCache->hasKey($userId)) {
379
-			\OC\Files\Filesystem::initMountPoints($userId);
380
-
381
-			try {
382
-				$folder = $this->get('/' . $userId . '/files');
383
-			} catch (NotFoundException $e) {
384
-				if (!$this->nodeExists('/' . $userId)) {
385
-					$this->newFolder('/' . $userId);
386
-				}
387
-				$folder = $this->newFolder('/' . $userId . '/files');
388
-			}
389
-
390
-			$this->userFolderCache->set($userId, $folder);
391
-		}
392
-
393
-		return $this->userFolderCache->get($userId);
394
-	}
395
-
396
-	public function clearCache() {
397
-		$this->userFolderCache = new CappedMemoryCache();
398
-	}
399
-
400
-	public function getUserMountCache() {
401
-		return $this->userMountCache;
402
-	}
67
+    /** @var Manager */
68
+    private $mountManager;
69
+    /** @var PublicEmitter */
70
+    private $emitter;
71
+    /** @var null|\OC\User\User */
72
+    private $user;
73
+    /** @var CappedMemoryCache */
74
+    private $userFolderCache;
75
+    /** @var IUserMountCache */
76
+    private $userMountCache;
77
+    /** @var ILogger */
78
+    private $logger;
79
+    /** @var IUserManager */
80
+    private $userManager;
81
+
82
+    /**
83
+     * @param \OC\Files\Mount\Manager $manager
84
+     * @param \OC\Files\View $view
85
+     * @param \OC\User\User|null $user
86
+     * @param IUserMountCache $userMountCache
87
+     * @param ILogger $logger
88
+     * @param IUserManager $userManager
89
+     */
90
+    public function __construct($manager,
91
+                                $view,
92
+                                $user,
93
+                                IUserMountCache $userMountCache,
94
+                                ILogger $logger,
95
+                                IUserManager $userManager) {
96
+        parent::__construct($this, $view, '');
97
+        $this->mountManager = $manager;
98
+        $this->user = $user;
99
+        $this->emitter = new PublicEmitter();
100
+        $this->userFolderCache = new CappedMemoryCache();
101
+        $this->userMountCache = $userMountCache;
102
+        $this->logger = $logger;
103
+        $this->userManager = $userManager;
104
+    }
105
+
106
+    /**
107
+     * Get the user for which the filesystem is setup
108
+     *
109
+     * @return \OC\User\User
110
+     */
111
+    public function getUser() {
112
+        return $this->user;
113
+    }
114
+
115
+    /**
116
+     * @param string $scope
117
+     * @param string $method
118
+     * @param callable $callback
119
+     */
120
+    public function listen($scope, $method, callable $callback) {
121
+        $this->emitter->listen($scope, $method, $callback);
122
+    }
123
+
124
+    /**
125
+     * @param string $scope optional
126
+     * @param string $method optional
127
+     * @param callable $callback optional
128
+     */
129
+    public function removeListener($scope = null, $method = null, callable $callback = null) {
130
+        $this->emitter->removeListener($scope, $method, $callback);
131
+    }
132
+
133
+    /**
134
+     * @param string $scope
135
+     * @param string $method
136
+     * @param Node[] $arguments
137
+     */
138
+    public function emit($scope, $method, $arguments = []) {
139
+        $this->emitter->emit($scope, $method, $arguments);
140
+    }
141
+
142
+    /**
143
+     * @param \OC\Files\Storage\Storage $storage
144
+     * @param string $mountPoint
145
+     * @param array $arguments
146
+     */
147
+    public function mount($storage, $mountPoint, $arguments = []) {
148
+        $mount = new MountPoint($storage, $mountPoint, $arguments);
149
+        $this->mountManager->addMount($mount);
150
+    }
151
+
152
+    /**
153
+     * @param string $mountPoint
154
+     * @return \OC\Files\Mount\MountPoint
155
+     */
156
+    public function getMount($mountPoint) {
157
+        return $this->mountManager->find($mountPoint);
158
+    }
159
+
160
+    /**
161
+     * @param string $mountPoint
162
+     * @return \OC\Files\Mount\MountPoint[]
163
+     */
164
+    public function getMountsIn($mountPoint) {
165
+        return $this->mountManager->findIn($mountPoint);
166
+    }
167
+
168
+    /**
169
+     * @param string $storageId
170
+     * @return \OC\Files\Mount\MountPoint[]
171
+     */
172
+    public function getMountByStorageId($storageId) {
173
+        return $this->mountManager->findByStorageId($storageId);
174
+    }
175
+
176
+    /**
177
+     * @param int $numericId
178
+     * @return MountPoint[]
179
+     */
180
+    public function getMountByNumericStorageId($numericId) {
181
+        return $this->mountManager->findByNumericId($numericId);
182
+    }
183
+
184
+    /**
185
+     * @param \OC\Files\Mount\MountPoint $mount
186
+     */
187
+    public function unMount($mount) {
188
+        $this->mountManager->remove($mount);
189
+    }
190
+
191
+    /**
192
+     * @param string $path
193
+     * @throws \OCP\Files\NotFoundException
194
+     * @throws \OCP\Files\NotPermittedException
195
+     * @return Node
196
+     */
197
+    public function get($path) {
198
+        $path = $this->normalizePath($path);
199
+        if ($this->isValidPath($path)) {
200
+            $fullPath = $this->getFullPath($path);
201
+            $fileInfo = $this->view->getFileInfo($fullPath);
202
+            if ($fileInfo) {
203
+                return $this->createNode($fullPath, $fileInfo);
204
+            } else {
205
+                throw new NotFoundException($path);
206
+            }
207
+        } else {
208
+            throw new NotPermittedException();
209
+        }
210
+    }
211
+
212
+    //most operations can't be done on the root
213
+
214
+    /**
215
+     * @param string $targetPath
216
+     * @throws \OCP\Files\NotPermittedException
217
+     * @return \OC\Files\Node\Node
218
+     */
219
+    public function rename($targetPath) {
220
+        throw new NotPermittedException();
221
+    }
222
+
223
+    public function delete() {
224
+        throw new NotPermittedException();
225
+    }
226
+
227
+    /**
228
+     * @param string $targetPath
229
+     * @throws \OCP\Files\NotPermittedException
230
+     * @return \OC\Files\Node\Node
231
+     */
232
+    public function copy($targetPath) {
233
+        throw new NotPermittedException();
234
+    }
235
+
236
+    /**
237
+     * @param int $mtime
238
+     * @throws \OCP\Files\NotPermittedException
239
+     */
240
+    public function touch($mtime = null) {
241
+        throw new NotPermittedException();
242
+    }
243
+
244
+    /**
245
+     * @return \OC\Files\Storage\Storage
246
+     * @throws \OCP\Files\NotFoundException
247
+     */
248
+    public function getStorage() {
249
+        throw new NotFoundException();
250
+    }
251
+
252
+    /**
253
+     * @return string
254
+     */
255
+    public function getPath() {
256
+        return '/';
257
+    }
258
+
259
+    /**
260
+     * @return string
261
+     */
262
+    public function getInternalPath() {
263
+        return '';
264
+    }
265
+
266
+    /**
267
+     * @return int
268
+     */
269
+    public function getId() {
270
+        return null;
271
+    }
272
+
273
+    /**
274
+     * @return array
275
+     */
276
+    public function stat() {
277
+        return null;
278
+    }
279
+
280
+    /**
281
+     * @return int
282
+     */
283
+    public function getMTime() {
284
+        return null;
285
+    }
286
+
287
+    /**
288
+     * @param bool $includeMounts
289
+     * @return int
290
+     */
291
+    public function getSize($includeMounts = true) {
292
+        return null;
293
+    }
294
+
295
+    /**
296
+     * @return string
297
+     */
298
+    public function getEtag() {
299
+        return null;
300
+    }
301
+
302
+    /**
303
+     * @return int
304
+     */
305
+    public function getPermissions() {
306
+        return \OCP\Constants::PERMISSION_CREATE;
307
+    }
308
+
309
+    /**
310
+     * @return bool
311
+     */
312
+    public function isReadable() {
313
+        return false;
314
+    }
315
+
316
+    /**
317
+     * @return bool
318
+     */
319
+    public function isUpdateable() {
320
+        return false;
321
+    }
322
+
323
+    /**
324
+     * @return bool
325
+     */
326
+    public function isDeletable() {
327
+        return false;
328
+    }
329
+
330
+    /**
331
+     * @return bool
332
+     */
333
+    public function isShareable() {
334
+        return false;
335
+    }
336
+
337
+    /**
338
+     * @return Node
339
+     * @throws \OCP\Files\NotFoundException
340
+     */
341
+    public function getParent() {
342
+        throw new NotFoundException();
343
+    }
344
+
345
+    /**
346
+     * @return string
347
+     */
348
+    public function getName() {
349
+        return '';
350
+    }
351
+
352
+    /**
353
+     * Returns a view to user's files folder
354
+     *
355
+     * @param string $userId user ID
356
+     * @return \OCP\Files\Folder
357
+     * @throws NoUserException
358
+     * @throws NotPermittedException
359
+     */
360
+    public function getUserFolder($userId) {
361
+        $userObject = $this->userManager->get($userId);
362
+
363
+        if (is_null($userObject)) {
364
+            $this->logger->error(
365
+                sprintf(
366
+                    'Backends provided no user object for %s',
367
+                    $userId
368
+                ),
369
+                [
370
+                    'app' => 'files',
371
+                ]
372
+            );
373
+            throw new NoUserException('Backends provided no user object');
374
+        }
375
+
376
+        $userId = $userObject->getUID();
377
+
378
+        if (!$this->userFolderCache->hasKey($userId)) {
379
+            \OC\Files\Filesystem::initMountPoints($userId);
380
+
381
+            try {
382
+                $folder = $this->get('/' . $userId . '/files');
383
+            } catch (NotFoundException $e) {
384
+                if (!$this->nodeExists('/' . $userId)) {
385
+                    $this->newFolder('/' . $userId);
386
+                }
387
+                $folder = $this->newFolder('/' . $userId . '/files');
388
+            }
389
+
390
+            $this->userFolderCache->set($userId, $folder);
391
+        }
392
+
393
+        return $this->userFolderCache->get($userId);
394
+    }
395
+
396
+    public function clearCache() {
397
+        $this->userFolderCache = new CappedMemoryCache();
398
+    }
399
+
400
+    public function getUserMountCache() {
401
+        return $this->userMountCache;
402
+    }
403 403
 }
Please login to merge, or discard this patch.
lib/private/Files/Mount/ObjectHomeMountProvider.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -64,7 +64,7 @@
 block discarded – undo
64 64
 			return null;
65 65
 		}
66 66
 
67
-		return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader);
67
+		return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/'.$user->getUID(), $config['arguments'], $loader);
68 68
 	}
69 69
 
70 70
 	/**
Please login to merge, or discard this patch.
Indentation   +96 added lines, -96 removed lines patch added patch discarded remove patch
@@ -35,107 +35,107 @@
 block discarded – undo
35 35
  * Mount provider for object store home storages
36 36
  */
37 37
 class ObjectHomeMountProvider implements IHomeMountProvider {
38
-	/**
39
-	 * @var IConfig
40
-	 */
41
-	private $config;
42
-
43
-	/**
44
-	 * ObjectStoreHomeMountProvider constructor.
45
-	 *
46
-	 * @param IConfig $config
47
-	 */
48
-	public function __construct(IConfig $config) {
49
-		$this->config = $config;
50
-	}
51
-
52
-	/**
53
-	 * Get the cache mount for a user
54
-	 *
55
-	 * @param IUser $user
56
-	 * @param IStorageFactory $loader
57
-	 * @return \OCP\Files\Mount\IMountPoint
58
-	 */
59
-	public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
60
-		$config = $this->getMultiBucketObjectStoreConfig($user);
61
-		if ($config === null) {
62
-			$config = $this->getSingleBucketObjectStoreConfig($user);
63
-		}
64
-
65
-		if ($config === null) {
66
-			return null;
67
-		}
68
-
69
-		return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader);
70
-	}
71
-
72
-	/**
73
-	 * @param IUser $user
74
-	 * @return array|null
75
-	 */
76
-	private function getSingleBucketObjectStoreConfig(IUser $user) {
77
-		$config = $this->config->getSystemValue('objectstore');
78
-		if (!is_array($config)) {
79
-			return null;
80
-		}
81
-
82
-		// sanity checks
83
-		if (empty($config['class'])) {
84
-			\OCP\Util::writeLog('files', 'No class given for objectstore', ILogger::ERROR);
85
-		}
86
-		if (!isset($config['arguments'])) {
87
-			$config['arguments'] = [];
88
-		}
89
-		// instantiate object store implementation
90
-		$config['arguments']['objectstore'] = new $config['class']($config['arguments']);
91
-
92
-		$config['arguments']['user'] = $user;
93
-
94
-		return $config;
95
-	}
96
-
97
-	/**
98
-	 * @param IUser $user
99
-	 * @return array|null
100
-	 */
101
-	private function getMultiBucketObjectStoreConfig(IUser $user) {
102
-		$config = $this->config->getSystemValue('objectstore_multibucket');
103
-		if (!is_array($config)) {
104
-			return null;
105
-		}
106
-
107
-		// sanity checks
108
-		if (empty($config['class'])) {
109
-			\OCP\Util::writeLog('files', 'No class given for objectstore', ILogger::ERROR);
110
-		}
111
-		if (!isset($config['arguments'])) {
112
-			$config['arguments'] = [];
113
-		}
114
-
115
-		$bucket = $this->config->getUserValue($user->getUID(), 'homeobjectstore', 'bucket', null);
116
-
117
-		if ($bucket === null) {
118
-			/*
38
+    /**
39
+     * @var IConfig
40
+     */
41
+    private $config;
42
+
43
+    /**
44
+     * ObjectStoreHomeMountProvider constructor.
45
+     *
46
+     * @param IConfig $config
47
+     */
48
+    public function __construct(IConfig $config) {
49
+        $this->config = $config;
50
+    }
51
+
52
+    /**
53
+     * Get the cache mount for a user
54
+     *
55
+     * @param IUser $user
56
+     * @param IStorageFactory $loader
57
+     * @return \OCP\Files\Mount\IMountPoint
58
+     */
59
+    public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
60
+        $config = $this->getMultiBucketObjectStoreConfig($user);
61
+        if ($config === null) {
62
+            $config = $this->getSingleBucketObjectStoreConfig($user);
63
+        }
64
+
65
+        if ($config === null) {
66
+            return null;
67
+        }
68
+
69
+        return new MountPoint('\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader);
70
+    }
71
+
72
+    /**
73
+     * @param IUser $user
74
+     * @return array|null
75
+     */
76
+    private function getSingleBucketObjectStoreConfig(IUser $user) {
77
+        $config = $this->config->getSystemValue('objectstore');
78
+        if (!is_array($config)) {
79
+            return null;
80
+        }
81
+
82
+        // sanity checks
83
+        if (empty($config['class'])) {
84
+            \OCP\Util::writeLog('files', 'No class given for objectstore', ILogger::ERROR);
85
+        }
86
+        if (!isset($config['arguments'])) {
87
+            $config['arguments'] = [];
88
+        }
89
+        // instantiate object store implementation
90
+        $config['arguments']['objectstore'] = new $config['class']($config['arguments']);
91
+
92
+        $config['arguments']['user'] = $user;
93
+
94
+        return $config;
95
+    }
96
+
97
+    /**
98
+     * @param IUser $user
99
+     * @return array|null
100
+     */
101
+    private function getMultiBucketObjectStoreConfig(IUser $user) {
102
+        $config = $this->config->getSystemValue('objectstore_multibucket');
103
+        if (!is_array($config)) {
104
+            return null;
105
+        }
106
+
107
+        // sanity checks
108
+        if (empty($config['class'])) {
109
+            \OCP\Util::writeLog('files', 'No class given for objectstore', ILogger::ERROR);
110
+        }
111
+        if (!isset($config['arguments'])) {
112
+            $config['arguments'] = [];
113
+        }
114
+
115
+        $bucket = $this->config->getUserValue($user->getUID(), 'homeobjectstore', 'bucket', null);
116
+
117
+        if ($bucket === null) {
118
+            /*
119 119
 			 * Use any provided bucket argument as prefix
120 120
 			 * and add the mapping from username => bucket
121 121
 			 */
122
-			if (!isset($config['arguments']['bucket'])) {
123
-				$config['arguments']['bucket'] = '';
124
-			}
125
-			$mapper = new \OC\Files\ObjectStore\Mapper($user);
126
-			$numBuckets = isset($config['arguments']['num_buckets']) ? $config['arguments']['num_buckets'] : 64;
127
-			$config['arguments']['bucket'] .= $mapper->getBucket($numBuckets);
122
+            if (!isset($config['arguments']['bucket'])) {
123
+                $config['arguments']['bucket'] = '';
124
+            }
125
+            $mapper = new \OC\Files\ObjectStore\Mapper($user);
126
+            $numBuckets = isset($config['arguments']['num_buckets']) ? $config['arguments']['num_buckets'] : 64;
127
+            $config['arguments']['bucket'] .= $mapper->getBucket($numBuckets);
128 128
 
129
-			$this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $config['arguments']['bucket']);
130
-		} else {
131
-			$config['arguments']['bucket'] = $bucket;
132
-		}
129
+            $this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $config['arguments']['bucket']);
130
+        } else {
131
+            $config['arguments']['bucket'] = $bucket;
132
+        }
133 133
 
134
-		// instantiate object store implementation
135
-		$config['arguments']['objectstore'] = new $config['class']($config['arguments']);
134
+        // instantiate object store implementation
135
+        $config['arguments']['objectstore'] = new $config['class']($config['arguments']);
136 136
 
137
-		$config['arguments']['user'] = $user;
137
+        $config['arguments']['user'] = $user;
138 138
 
139
-		return $config;
140
-	}
139
+        return $config;
140
+    }
141 141
 }
Please login to merge, or discard this patch.
lib/private/Files/Mount/LocalHomeMountProvider.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -39,6 +39,6 @@
 block discarded – undo
39 39
 	 */
40 40
 	public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
41 41
 		$arguments = ['user' => $user];
42
-		return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader);
42
+		return new MountPoint('\OC\Files\Storage\Home', '/'.$user->getUID(), $arguments, $loader);
43 43
 	}
44 44
 }
Please login to merge, or discard this patch.
Indentation   +11 added lines, -11 removed lines patch added patch discarded remove patch
@@ -30,15 +30,15 @@
 block discarded – undo
30 30
  * Mount provider for regular posix home folders
31 31
  */
32 32
 class LocalHomeMountProvider implements IHomeMountProvider {
33
-	/**
34
-	 * Get the cache mount for a user
35
-	 *
36
-	 * @param IUser $user
37
-	 * @param IStorageFactory $loader
38
-	 * @return \OCP\Files\Mount\IMountPoint|null
39
-	 */
40
-	public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
41
-		$arguments = ['user' => $user];
42
-		return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader);
43
-	}
33
+    /**
34
+     * Get the cache mount for a user
35
+     *
36
+     * @param IUser $user
37
+     * @param IStorageFactory $loader
38
+     * @return \OCP\Files\Mount\IMountPoint|null
39
+     */
40
+    public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
41
+        $arguments = ['user' => $user];
42
+        return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader);
43
+    }
44 44
 }
Please login to merge, or discard this patch.
lib/private/Files/Mount/MoveableMount.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -27,19 +27,19 @@
 block discarded – undo
27 27
  * Defines the mount point to be (re)moved by the user
28 28
  */
29 29
 interface MoveableMount {
30
-	/**
31
-	 * Move the mount point to $target
32
-	 *
33
-	 * @param string $target the target mount point
34
-	 * @return bool
35
-	 */
36
-	public function moveMount($target);
30
+    /**
31
+     * Move the mount point to $target
32
+     *
33
+     * @param string $target the target mount point
34
+     * @return bool
35
+     */
36
+    public function moveMount($target);
37 37
 
38
-	/**
39
-	 * Remove the mount points
40
-	 *
41
-	 * @return mixed
42
-	 * @return bool
43
-	 */
44
-	public function removeMount();
38
+    /**
39
+     * Remove the mount points
40
+     *
41
+     * @return mixed
42
+     * @return bool
43
+     */
44
+    public function removeMount();
45 45
 }
Please login to merge, or discard this patch.
lib/private/Files/Config/LazyStorageMountInfo.php 1 patch
Indentation   +50 added lines, -50 removed lines patch added patch discarded remove patch
@@ -29,60 +29,60 @@
 block discarded – undo
29 29
 use OCP\IUser;
30 30
 
31 31
 class LazyStorageMountInfo extends CachedMountInfo {
32
-	/** @var IMountPoint */
33
-	private $mount;
32
+    /** @var IMountPoint */
33
+    private $mount;
34 34
 
35
-	/**
36
-	 * CachedMountInfo constructor.
37
-	 *
38
-	 * @param IUser $user
39
-	 * @param IMountPoint $mount
40
-	 */
41
-	public function __construct(IUser $user, IMountPoint $mount) {
42
-		$this->user = $user;
43
-		$this->mount = $mount;
44
-	}
35
+    /**
36
+     * CachedMountInfo constructor.
37
+     *
38
+     * @param IUser $user
39
+     * @param IMountPoint $mount
40
+     */
41
+    public function __construct(IUser $user, IMountPoint $mount) {
42
+        $this->user = $user;
43
+        $this->mount = $mount;
44
+    }
45 45
 
46
-	/**
47
-	 * @return int the numeric storage id of the mount
48
-	 */
49
-	public function getStorageId() {
50
-		if (!$this->storageId) {
51
-			$this->storageId = $this->mount->getNumericStorageId();
52
-		}
53
-		return parent::getStorageId();
54
-	}
46
+    /**
47
+     * @return int the numeric storage id of the mount
48
+     */
49
+    public function getStorageId() {
50
+        if (!$this->storageId) {
51
+            $this->storageId = $this->mount->getNumericStorageId();
52
+        }
53
+        return parent::getStorageId();
54
+    }
55 55
 
56
-	/**
57
-	 * @return int the fileid of the root of the mount
58
-	 */
59
-	public function getRootId() {
60
-		if (!$this->rootId) {
61
-			$this->rootId = $this->mount->getStorageRootId();
62
-		}
63
-		return parent::getRootId();
64
-	}
56
+    /**
57
+     * @return int the fileid of the root of the mount
58
+     */
59
+    public function getRootId() {
60
+        if (!$this->rootId) {
61
+            $this->rootId = $this->mount->getStorageRootId();
62
+        }
63
+        return parent::getRootId();
64
+    }
65 65
 
66
-	/**
67
-	 * @return string the mount point of the mount for the user
68
-	 */
69
-	public function getMountPoint() {
70
-		if (!$this->mountPoint) {
71
-			$this->mountPoint = $this->mount->getMountPoint();
72
-		}
73
-		return parent::getMountPoint();
74
-	}
66
+    /**
67
+     * @return string the mount point of the mount for the user
68
+     */
69
+    public function getMountPoint() {
70
+        if (!$this->mountPoint) {
71
+            $this->mountPoint = $this->mount->getMountPoint();
72
+        }
73
+        return parent::getMountPoint();
74
+    }
75 75
 
76
-	public function getMountId() {
77
-		return $this->mount->getMountId();
78
-	}
76
+    public function getMountId() {
77
+        return $this->mount->getMountId();
78
+    }
79 79
 
80
-	/**
81
-	 * Get the internal path (within the storage) of the root of the mount
82
-	 *
83
-	 * @return string
84
-	 */
85
-	public function getRootInternalPath() {
86
-		return $this->mount->getInternalPath($this->mount->getMountPoint());
87
-	}
80
+    /**
81
+     * Get the internal path (within the storage) of the root of the mount
82
+     *
83
+     * @return string
84
+     */
85
+    public function getRootInternalPath() {
86
+        return $this->mount->getInternalPath($this->mount->getMountPoint());
87
+    }
88 88
 }
Please login to merge, or discard this patch.
lib/private/Files/Config/UserMountCacheListener.php 1 patch
Indentation   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -29,21 +29,21 @@
 block discarded – undo
29 29
  * Listen to hooks and update the mount cache as needed
30 30
  */
31 31
 class UserMountCacheListener {
32
-	/**
33
-	 * @var IUserMountCache
34
-	 */
35
-	private $userMountCache;
32
+    /**
33
+     * @var IUserMountCache
34
+     */
35
+    private $userMountCache;
36 36
 
37
-	/**
38
-	 * UserMountCacheListener constructor.
39
-	 *
40
-	 * @param IUserMountCache $userMountCache
41
-	 */
42
-	public function __construct(IUserMountCache $userMountCache) {
43
-		$this->userMountCache = $userMountCache;
44
-	}
37
+    /**
38
+     * UserMountCacheListener constructor.
39
+     *
40
+     * @param IUserMountCache $userMountCache
41
+     */
42
+    public function __construct(IUserMountCache $userMountCache) {
43
+        $this->userMountCache = $userMountCache;
44
+    }
45 45
 
46
-	public function listen(Manager $manager) {
47
-		$manager->listen('\OC\User', 'postDelete', [$this->userMountCache, 'removeUserMounts']);
48
-	}
46
+    public function listen(Manager $manager) {
47
+        $manager->listen('\OC\User', 'postDelete', [$this->userMountCache, 'removeUserMounts']);
48
+    }
49 49
 }
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/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
@@ -40,502 +40,502 @@
 block discarded – undo
40 40
  */
41 41
 class Encoding extends Wrapper {
42 42
 
43
-	/**
44
-	 * @var ICache
45
-	 */
46
-	private $namesCache;
47
-
48
-	/**
49
-	 * @param array $parameters
50
-	 */
51
-	public function __construct($parameters) {
52
-		$this->storage = $parameters['storage'];
53
-		$this->namesCache = new CappedMemoryCache();
54
-	}
55
-
56
-	/**
57
-	 * Returns whether the given string is only made of ASCII characters
58
-	 *
59
-	 * @param string $str string
60
-	 *
61
-	 * @return bool true if the string is all ASCII, false otherwise
62
-	 */
63
-	private function isAscii($str) {
64
-		return !preg_match('/[\\x80-\\xff]+/', $str);
65
-	}
66
-
67
-	/**
68
-	 * Checks whether the given path exists in NFC or NFD form after checking
69
-	 * each form for each path section and returns the correct form.
70
-	 * If no existing path found, returns the path as it was given.
71
-	 *
72
-	 * @param string $fullPath path to check
73
-	 *
74
-	 * @return string original or converted path
75
-	 */
76
-	private function findPathToUse($fullPath) {
77
-		$cachedPath = $this->namesCache[$fullPath];
78
-		if ($cachedPath !== null) {
79
-			return $cachedPath;
80
-		}
81
-
82
-		$sections = explode('/', $fullPath);
83
-		$path = '';
84
-		foreach ($sections as $section) {
85
-			$convertedPath = $this->findPathToUseLastSection($path, $section);
86
-			if ($convertedPath === null) {
87
-				// no point in continuing if the section was not found, use original path
88
-				return $fullPath;
89
-			}
90
-			$path = $convertedPath . '/';
91
-		}
92
-		$path = rtrim($path, '/');
93
-		return $path;
94
-	}
95
-
96
-	/**
97
-	 * Checks whether the last path section of the given path exists in NFC or NFD form
98
-	 * and returns the correct form. If no existing path found, returns null.
99
-	 *
100
-	 * @param string $basePath base path to check
101
-	 * @param string $lastSection last section of the path to check for NFD/NFC variations
102
-	 *
103
-	 * @return string|null original or converted path, or null if none of the forms was found
104
-	 */
105
-	private function findPathToUseLastSection($basePath, $lastSection) {
106
-		$fullPath = $basePath . $lastSection;
107
-		if ($lastSection === '' || $this->isAscii($lastSection) || $this->storage->file_exists($fullPath)) {
108
-			$this->namesCache[$fullPath] = $fullPath;
109
-			return $fullPath;
110
-		}
111
-
112
-		// swap encoding
113
-		if (\Normalizer::isNormalized($lastSection, \Normalizer::FORM_C)) {
114
-			$otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_D);
115
-		} else {
116
-			$otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_C);
117
-		}
118
-		$otherFullPath = $basePath . $otherFormPath;
119
-		if ($this->storage->file_exists($otherFullPath)) {
120
-			$this->namesCache[$fullPath] = $otherFullPath;
121
-			return $otherFullPath;
122
-		}
123
-
124
-		// return original path, file did not exist at all
125
-		$this->namesCache[$fullPath] = $fullPath;
126
-		return null;
127
-	}
128
-
129
-	/**
130
-	 * see https://www.php.net/manual/en/function.mkdir.php
131
-	 *
132
-	 * @param string $path
133
-	 * @return bool
134
-	 */
135
-	public function mkdir($path) {
136
-		// note: no conversion here, method should not be called with non-NFC names!
137
-		$result = $this->storage->mkdir($path);
138
-		if ($result) {
139
-			$this->namesCache[$path] = $path;
140
-		}
141
-		return $result;
142
-	}
143
-
144
-	/**
145
-	 * see https://www.php.net/manual/en/function.rmdir.php
146
-	 *
147
-	 * @param string $path
148
-	 * @return bool
149
-	 */
150
-	public function rmdir($path) {
151
-		$result = $this->storage->rmdir($this->findPathToUse($path));
152
-		if ($result) {
153
-			unset($this->namesCache[$path]);
154
-		}
155
-		return $result;
156
-	}
157
-
158
-	/**
159
-	 * see https://www.php.net/manual/en/function.opendir.php
160
-	 *
161
-	 * @param string $path
162
-	 * @return resource|bool
163
-	 */
164
-	public function opendir($path) {
165
-		return $this->storage->opendir($this->findPathToUse($path));
166
-	}
167
-
168
-	/**
169
-	 * see https://www.php.net/manual/en/function.is_dir.php
170
-	 *
171
-	 * @param string $path
172
-	 * @return bool
173
-	 */
174
-	public function is_dir($path) {
175
-		return $this->storage->is_dir($this->findPathToUse($path));
176
-	}
177
-
178
-	/**
179
-	 * see https://www.php.net/manual/en/function.is_file.php
180
-	 *
181
-	 * @param string $path
182
-	 * @return bool
183
-	 */
184
-	public function is_file($path) {
185
-		return $this->storage->is_file($this->findPathToUse($path));
186
-	}
187
-
188
-	/**
189
-	 * see https://www.php.net/manual/en/function.stat.php
190
-	 * only the following keys are required in the result: size and mtime
191
-	 *
192
-	 * @param string $path
193
-	 * @return array|bool
194
-	 */
195
-	public function stat($path) {
196
-		return $this->storage->stat($this->findPathToUse($path));
197
-	}
198
-
199
-	/**
200
-	 * see https://www.php.net/manual/en/function.filetype.php
201
-	 *
202
-	 * @param string $path
203
-	 * @return string|bool
204
-	 */
205
-	public function filetype($path) {
206
-		return $this->storage->filetype($this->findPathToUse($path));
207
-	}
208
-
209
-	/**
210
-	 * see https://www.php.net/manual/en/function.filesize.php
211
-	 * The result for filesize when called on a folder is required to be 0
212
-	 *
213
-	 * @param string $path
214
-	 * @return int|bool
215
-	 */
216
-	public function filesize($path) {
217
-		return $this->storage->filesize($this->findPathToUse($path));
218
-	}
219
-
220
-	/**
221
-	 * check if a file can be created in $path
222
-	 *
223
-	 * @param string $path
224
-	 * @return bool
225
-	 */
226
-	public function isCreatable($path) {
227
-		return $this->storage->isCreatable($this->findPathToUse($path));
228
-	}
229
-
230
-	/**
231
-	 * check if a file can be read
232
-	 *
233
-	 * @param string $path
234
-	 * @return bool
235
-	 */
236
-	public function isReadable($path) {
237
-		return $this->storage->isReadable($this->findPathToUse($path));
238
-	}
239
-
240
-	/**
241
-	 * check if a file can be written to
242
-	 *
243
-	 * @param string $path
244
-	 * @return bool
245
-	 */
246
-	public function isUpdatable($path) {
247
-		return $this->storage->isUpdatable($this->findPathToUse($path));
248
-	}
249
-
250
-	/**
251
-	 * check if a file can be deleted
252
-	 *
253
-	 * @param string $path
254
-	 * @return bool
255
-	 */
256
-	public function isDeletable($path) {
257
-		return $this->storage->isDeletable($this->findPathToUse($path));
258
-	}
259
-
260
-	/**
261
-	 * check if a file can be shared
262
-	 *
263
-	 * @param string $path
264
-	 * @return bool
265
-	 */
266
-	public function isSharable($path) {
267
-		return $this->storage->isSharable($this->findPathToUse($path));
268
-	}
269
-
270
-	/**
271
-	 * get the full permissions of a path.
272
-	 * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php
273
-	 *
274
-	 * @param string $path
275
-	 * @return int
276
-	 */
277
-	public function getPermissions($path) {
278
-		return $this->storage->getPermissions($this->findPathToUse($path));
279
-	}
280
-
281
-	/**
282
-	 * see https://www.php.net/manual/en/function.file_exists.php
283
-	 *
284
-	 * @param string $path
285
-	 * @return bool
286
-	 */
287
-	public function file_exists($path) {
288
-		return $this->storage->file_exists($this->findPathToUse($path));
289
-	}
290
-
291
-	/**
292
-	 * see https://www.php.net/manual/en/function.filemtime.php
293
-	 *
294
-	 * @param string $path
295
-	 * @return int|bool
296
-	 */
297
-	public function filemtime($path) {
298
-		return $this->storage->filemtime($this->findPathToUse($path));
299
-	}
300
-
301
-	/**
302
-	 * see https://www.php.net/manual/en/function.file_get_contents.php
303
-	 *
304
-	 * @param string $path
305
-	 * @return string|bool
306
-	 */
307
-	public function file_get_contents($path) {
308
-		return $this->storage->file_get_contents($this->findPathToUse($path));
309
-	}
310
-
311
-	/**
312
-	 * see https://www.php.net/manual/en/function.file_put_contents.php
313
-	 *
314
-	 * @param string $path
315
-	 * @param mixed $data
316
-	 * @return int|false
317
-	 */
318
-	public function file_put_contents($path, $data) {
319
-		return $this->storage->file_put_contents($this->findPathToUse($path), $data);
320
-	}
321
-
322
-	/**
323
-	 * see https://www.php.net/manual/en/function.unlink.php
324
-	 *
325
-	 * @param string $path
326
-	 * @return bool
327
-	 */
328
-	public function unlink($path) {
329
-		$result = $this->storage->unlink($this->findPathToUse($path));
330
-		if ($result) {
331
-			unset($this->namesCache[$path]);
332
-		}
333
-		return $result;
334
-	}
335
-
336
-	/**
337
-	 * see https://www.php.net/manual/en/function.rename.php
338
-	 *
339
-	 * @param string $path1
340
-	 * @param string $path2
341
-	 * @return bool
342
-	 */
343
-	public function rename($path1, $path2) {
344
-		// second name always NFC
345
-		return $this->storage->rename($this->findPathToUse($path1), $this->findPathToUse($path2));
346
-	}
347
-
348
-	/**
349
-	 * see https://www.php.net/manual/en/function.copy.php
350
-	 *
351
-	 * @param string $path1
352
-	 * @param string $path2
353
-	 * @return bool
354
-	 */
355
-	public function copy($path1, $path2) {
356
-		return $this->storage->copy($this->findPathToUse($path1), $this->findPathToUse($path2));
357
-	}
358
-
359
-	/**
360
-	 * see https://www.php.net/manual/en/function.fopen.php
361
-	 *
362
-	 * @param string $path
363
-	 * @param string $mode
364
-	 * @return resource|bool
365
-	 */
366
-	public function fopen($path, $mode) {
367
-		$result = $this->storage->fopen($this->findPathToUse($path), $mode);
368
-		if ($result && $mode !== 'r' && $mode !== 'rb') {
369
-			unset($this->namesCache[$path]);
370
-		}
371
-		return $result;
372
-	}
373
-
374
-	/**
375
-	 * get the mimetype for a file or folder
376
-	 * The mimetype for a folder is required to be "httpd/unix-directory"
377
-	 *
378
-	 * @param string $path
379
-	 * @return string|bool
380
-	 */
381
-	public function getMimeType($path) {
382
-		return $this->storage->getMimeType($this->findPathToUse($path));
383
-	}
384
-
385
-	/**
386
-	 * see https://www.php.net/manual/en/function.hash.php
387
-	 *
388
-	 * @param string $type
389
-	 * @param string $path
390
-	 * @param bool $raw
391
-	 * @return string|bool
392
-	 */
393
-	public function hash($type, $path, $raw = false) {
394
-		return $this->storage->hash($type, $this->findPathToUse($path), $raw);
395
-	}
396
-
397
-	/**
398
-	 * see https://www.php.net/manual/en/function.free_space.php
399
-	 *
400
-	 * @param string $path
401
-	 * @return int|bool
402
-	 */
403
-	public function free_space($path) {
404
-		return $this->storage->free_space($this->findPathToUse($path));
405
-	}
406
-
407
-	/**
408
-	 * search for occurrences of $query in file names
409
-	 *
410
-	 * @param string $query
411
-	 * @return array|bool
412
-	 */
413
-	public function search($query) {
414
-		return $this->storage->search($query);
415
-	}
416
-
417
-	/**
418
-	 * see https://www.php.net/manual/en/function.touch.php
419
-	 * If the backend does not support the operation, false should be returned
420
-	 *
421
-	 * @param string $path
422
-	 * @param int $mtime
423
-	 * @return bool
424
-	 */
425
-	public function touch($path, $mtime = null) {
426
-		return $this->storage->touch($this->findPathToUse($path), $mtime);
427
-	}
428
-
429
-	/**
430
-	 * get the path to a local version of the file.
431
-	 * The local version of the file can be temporary and doesn't have to be persistent across requests
432
-	 *
433
-	 * @param string $path
434
-	 * @return string|bool
435
-	 */
436
-	public function getLocalFile($path) {
437
-		return $this->storage->getLocalFile($this->findPathToUse($path));
438
-	}
439
-
440
-	/**
441
-	 * check if a file or folder has been updated since $time
442
-	 *
443
-	 * @param string $path
444
-	 * @param int $time
445
-	 * @return bool
446
-	 *
447
-	 * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed.
448
-	 * returning true for other changes in the folder is optional
449
-	 */
450
-	public function hasUpdated($path, $time) {
451
-		return $this->storage->hasUpdated($this->findPathToUse($path), $time);
452
-	}
453
-
454
-	/**
455
-	 * get a cache instance for the storage
456
-	 *
457
-	 * @param string $path
458
-	 * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache
459
-	 * @return \OC\Files\Cache\Cache
460
-	 */
461
-	public function getCache($path = '', $storage = null) {
462
-		if (!$storage) {
463
-			$storage = $this;
464
-		}
465
-		return $this->storage->getCache($this->findPathToUse($path), $storage);
466
-	}
467
-
468
-	/**
469
-	 * get a scanner instance for the storage
470
-	 *
471
-	 * @param string $path
472
-	 * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
473
-	 * @return \OC\Files\Cache\Scanner
474
-	 */
475
-	public function getScanner($path = '', $storage = null) {
476
-		if (!$storage) {
477
-			$storage = $this;
478
-		}
479
-		return $this->storage->getScanner($this->findPathToUse($path), $storage);
480
-	}
481
-
482
-	/**
483
-	 * get the ETag for a file or folder
484
-	 *
485
-	 * @param string $path
486
-	 * @return string|bool
487
-	 */
488
-	public function getETag($path) {
489
-		return $this->storage->getETag($this->findPathToUse($path));
490
-	}
491
-
492
-	/**
493
-	 * @param IStorage $sourceStorage
494
-	 * @param string $sourceInternalPath
495
-	 * @param string $targetInternalPath
496
-	 * @return bool
497
-	 */
498
-	public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
499
-		if ($sourceStorage === $this) {
500
-			return $this->copy($sourceInternalPath, $this->findPathToUse($targetInternalPath));
501
-		}
502
-
503
-		$result = $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
504
-		if ($result) {
505
-			unset($this->namesCache[$targetInternalPath]);
506
-		}
507
-		return $result;
508
-	}
509
-
510
-	/**
511
-	 * @param IStorage $sourceStorage
512
-	 * @param string $sourceInternalPath
513
-	 * @param string $targetInternalPath
514
-	 * @return bool
515
-	 */
516
-	public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
517
-		if ($sourceStorage === $this) {
518
-			$result = $this->rename($sourceInternalPath, $this->findPathToUse($targetInternalPath));
519
-			if ($result) {
520
-				unset($this->namesCache[$sourceInternalPath]);
521
-				unset($this->namesCache[$targetInternalPath]);
522
-			}
523
-			return $result;
524
-		}
525
-
526
-		$result = $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
527
-		if ($result) {
528
-			unset($this->namesCache[$sourceInternalPath]);
529
-			unset($this->namesCache[$targetInternalPath]);
530
-		}
531
-		return $result;
532
-	}
533
-
534
-	public function getMetaData($path) {
535
-		return $this->storage->getMetaData($this->findPathToUse($path));
536
-	}
537
-
538
-	public function getDirectoryContent($directory): \Traversable {
539
-		return $this->storage->getDirectoryContent($this->findPathToUse($directory));
540
-	}
43
+    /**
44
+     * @var ICache
45
+     */
46
+    private $namesCache;
47
+
48
+    /**
49
+     * @param array $parameters
50
+     */
51
+    public function __construct($parameters) {
52
+        $this->storage = $parameters['storage'];
53
+        $this->namesCache = new CappedMemoryCache();
54
+    }
55
+
56
+    /**
57
+     * Returns whether the given string is only made of ASCII characters
58
+     *
59
+     * @param string $str string
60
+     *
61
+     * @return bool true if the string is all ASCII, false otherwise
62
+     */
63
+    private function isAscii($str) {
64
+        return !preg_match('/[\\x80-\\xff]+/', $str);
65
+    }
66
+
67
+    /**
68
+     * Checks whether the given path exists in NFC or NFD form after checking
69
+     * each form for each path section and returns the correct form.
70
+     * If no existing path found, returns the path as it was given.
71
+     *
72
+     * @param string $fullPath path to check
73
+     *
74
+     * @return string original or converted path
75
+     */
76
+    private function findPathToUse($fullPath) {
77
+        $cachedPath = $this->namesCache[$fullPath];
78
+        if ($cachedPath !== null) {
79
+            return $cachedPath;
80
+        }
81
+
82
+        $sections = explode('/', $fullPath);
83
+        $path = '';
84
+        foreach ($sections as $section) {
85
+            $convertedPath = $this->findPathToUseLastSection($path, $section);
86
+            if ($convertedPath === null) {
87
+                // no point in continuing if the section was not found, use original path
88
+                return $fullPath;
89
+            }
90
+            $path = $convertedPath . '/';
91
+        }
92
+        $path = rtrim($path, '/');
93
+        return $path;
94
+    }
95
+
96
+    /**
97
+     * Checks whether the last path section of the given path exists in NFC or NFD form
98
+     * and returns the correct form. If no existing path found, returns null.
99
+     *
100
+     * @param string $basePath base path to check
101
+     * @param string $lastSection last section of the path to check for NFD/NFC variations
102
+     *
103
+     * @return string|null original or converted path, or null if none of the forms was found
104
+     */
105
+    private function findPathToUseLastSection($basePath, $lastSection) {
106
+        $fullPath = $basePath . $lastSection;
107
+        if ($lastSection === '' || $this->isAscii($lastSection) || $this->storage->file_exists($fullPath)) {
108
+            $this->namesCache[$fullPath] = $fullPath;
109
+            return $fullPath;
110
+        }
111
+
112
+        // swap encoding
113
+        if (\Normalizer::isNormalized($lastSection, \Normalizer::FORM_C)) {
114
+            $otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_D);
115
+        } else {
116
+            $otherFormPath = \Normalizer::normalize($lastSection, \Normalizer::FORM_C);
117
+        }
118
+        $otherFullPath = $basePath . $otherFormPath;
119
+        if ($this->storage->file_exists($otherFullPath)) {
120
+            $this->namesCache[$fullPath] = $otherFullPath;
121
+            return $otherFullPath;
122
+        }
123
+
124
+        // return original path, file did not exist at all
125
+        $this->namesCache[$fullPath] = $fullPath;
126
+        return null;
127
+    }
128
+
129
+    /**
130
+     * see https://www.php.net/manual/en/function.mkdir.php
131
+     *
132
+     * @param string $path
133
+     * @return bool
134
+     */
135
+    public function mkdir($path) {
136
+        // note: no conversion here, method should not be called with non-NFC names!
137
+        $result = $this->storage->mkdir($path);
138
+        if ($result) {
139
+            $this->namesCache[$path] = $path;
140
+        }
141
+        return $result;
142
+    }
143
+
144
+    /**
145
+     * see https://www.php.net/manual/en/function.rmdir.php
146
+     *
147
+     * @param string $path
148
+     * @return bool
149
+     */
150
+    public function rmdir($path) {
151
+        $result = $this->storage->rmdir($this->findPathToUse($path));
152
+        if ($result) {
153
+            unset($this->namesCache[$path]);
154
+        }
155
+        return $result;
156
+    }
157
+
158
+    /**
159
+     * see https://www.php.net/manual/en/function.opendir.php
160
+     *
161
+     * @param string $path
162
+     * @return resource|bool
163
+     */
164
+    public function opendir($path) {
165
+        return $this->storage->opendir($this->findPathToUse($path));
166
+    }
167
+
168
+    /**
169
+     * see https://www.php.net/manual/en/function.is_dir.php
170
+     *
171
+     * @param string $path
172
+     * @return bool
173
+     */
174
+    public function is_dir($path) {
175
+        return $this->storage->is_dir($this->findPathToUse($path));
176
+    }
177
+
178
+    /**
179
+     * see https://www.php.net/manual/en/function.is_file.php
180
+     *
181
+     * @param string $path
182
+     * @return bool
183
+     */
184
+    public function is_file($path) {
185
+        return $this->storage->is_file($this->findPathToUse($path));
186
+    }
187
+
188
+    /**
189
+     * see https://www.php.net/manual/en/function.stat.php
190
+     * only the following keys are required in the result: size and mtime
191
+     *
192
+     * @param string $path
193
+     * @return array|bool
194
+     */
195
+    public function stat($path) {
196
+        return $this->storage->stat($this->findPathToUse($path));
197
+    }
198
+
199
+    /**
200
+     * see https://www.php.net/manual/en/function.filetype.php
201
+     *
202
+     * @param string $path
203
+     * @return string|bool
204
+     */
205
+    public function filetype($path) {
206
+        return $this->storage->filetype($this->findPathToUse($path));
207
+    }
208
+
209
+    /**
210
+     * see https://www.php.net/manual/en/function.filesize.php
211
+     * The result for filesize when called on a folder is required to be 0
212
+     *
213
+     * @param string $path
214
+     * @return int|bool
215
+     */
216
+    public function filesize($path) {
217
+        return $this->storage->filesize($this->findPathToUse($path));
218
+    }
219
+
220
+    /**
221
+     * check if a file can be created in $path
222
+     *
223
+     * @param string $path
224
+     * @return bool
225
+     */
226
+    public function isCreatable($path) {
227
+        return $this->storage->isCreatable($this->findPathToUse($path));
228
+    }
229
+
230
+    /**
231
+     * check if a file can be read
232
+     *
233
+     * @param string $path
234
+     * @return bool
235
+     */
236
+    public function isReadable($path) {
237
+        return $this->storage->isReadable($this->findPathToUse($path));
238
+    }
239
+
240
+    /**
241
+     * check if a file can be written to
242
+     *
243
+     * @param string $path
244
+     * @return bool
245
+     */
246
+    public function isUpdatable($path) {
247
+        return $this->storage->isUpdatable($this->findPathToUse($path));
248
+    }
249
+
250
+    /**
251
+     * check if a file can be deleted
252
+     *
253
+     * @param string $path
254
+     * @return bool
255
+     */
256
+    public function isDeletable($path) {
257
+        return $this->storage->isDeletable($this->findPathToUse($path));
258
+    }
259
+
260
+    /**
261
+     * check if a file can be shared
262
+     *
263
+     * @param string $path
264
+     * @return bool
265
+     */
266
+    public function isSharable($path) {
267
+        return $this->storage->isSharable($this->findPathToUse($path));
268
+    }
269
+
270
+    /**
271
+     * get the full permissions of a path.
272
+     * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php
273
+     *
274
+     * @param string $path
275
+     * @return int
276
+     */
277
+    public function getPermissions($path) {
278
+        return $this->storage->getPermissions($this->findPathToUse($path));
279
+    }
280
+
281
+    /**
282
+     * see https://www.php.net/manual/en/function.file_exists.php
283
+     *
284
+     * @param string $path
285
+     * @return bool
286
+     */
287
+    public function file_exists($path) {
288
+        return $this->storage->file_exists($this->findPathToUse($path));
289
+    }
290
+
291
+    /**
292
+     * see https://www.php.net/manual/en/function.filemtime.php
293
+     *
294
+     * @param string $path
295
+     * @return int|bool
296
+     */
297
+    public function filemtime($path) {
298
+        return $this->storage->filemtime($this->findPathToUse($path));
299
+    }
300
+
301
+    /**
302
+     * see https://www.php.net/manual/en/function.file_get_contents.php
303
+     *
304
+     * @param string $path
305
+     * @return string|bool
306
+     */
307
+    public function file_get_contents($path) {
308
+        return $this->storage->file_get_contents($this->findPathToUse($path));
309
+    }
310
+
311
+    /**
312
+     * see https://www.php.net/manual/en/function.file_put_contents.php
313
+     *
314
+     * @param string $path
315
+     * @param mixed $data
316
+     * @return int|false
317
+     */
318
+    public function file_put_contents($path, $data) {
319
+        return $this->storage->file_put_contents($this->findPathToUse($path), $data);
320
+    }
321
+
322
+    /**
323
+     * see https://www.php.net/manual/en/function.unlink.php
324
+     *
325
+     * @param string $path
326
+     * @return bool
327
+     */
328
+    public function unlink($path) {
329
+        $result = $this->storage->unlink($this->findPathToUse($path));
330
+        if ($result) {
331
+            unset($this->namesCache[$path]);
332
+        }
333
+        return $result;
334
+    }
335
+
336
+    /**
337
+     * see https://www.php.net/manual/en/function.rename.php
338
+     *
339
+     * @param string $path1
340
+     * @param string $path2
341
+     * @return bool
342
+     */
343
+    public function rename($path1, $path2) {
344
+        // second name always NFC
345
+        return $this->storage->rename($this->findPathToUse($path1), $this->findPathToUse($path2));
346
+    }
347
+
348
+    /**
349
+     * see https://www.php.net/manual/en/function.copy.php
350
+     *
351
+     * @param string $path1
352
+     * @param string $path2
353
+     * @return bool
354
+     */
355
+    public function copy($path1, $path2) {
356
+        return $this->storage->copy($this->findPathToUse($path1), $this->findPathToUse($path2));
357
+    }
358
+
359
+    /**
360
+     * see https://www.php.net/manual/en/function.fopen.php
361
+     *
362
+     * @param string $path
363
+     * @param string $mode
364
+     * @return resource|bool
365
+     */
366
+    public function fopen($path, $mode) {
367
+        $result = $this->storage->fopen($this->findPathToUse($path), $mode);
368
+        if ($result && $mode !== 'r' && $mode !== 'rb') {
369
+            unset($this->namesCache[$path]);
370
+        }
371
+        return $result;
372
+    }
373
+
374
+    /**
375
+     * get the mimetype for a file or folder
376
+     * The mimetype for a folder is required to be "httpd/unix-directory"
377
+     *
378
+     * @param string $path
379
+     * @return string|bool
380
+     */
381
+    public function getMimeType($path) {
382
+        return $this->storage->getMimeType($this->findPathToUse($path));
383
+    }
384
+
385
+    /**
386
+     * see https://www.php.net/manual/en/function.hash.php
387
+     *
388
+     * @param string $type
389
+     * @param string $path
390
+     * @param bool $raw
391
+     * @return string|bool
392
+     */
393
+    public function hash($type, $path, $raw = false) {
394
+        return $this->storage->hash($type, $this->findPathToUse($path), $raw);
395
+    }
396
+
397
+    /**
398
+     * see https://www.php.net/manual/en/function.free_space.php
399
+     *
400
+     * @param string $path
401
+     * @return int|bool
402
+     */
403
+    public function free_space($path) {
404
+        return $this->storage->free_space($this->findPathToUse($path));
405
+    }
406
+
407
+    /**
408
+     * search for occurrences of $query in file names
409
+     *
410
+     * @param string $query
411
+     * @return array|bool
412
+     */
413
+    public function search($query) {
414
+        return $this->storage->search($query);
415
+    }
416
+
417
+    /**
418
+     * see https://www.php.net/manual/en/function.touch.php
419
+     * If the backend does not support the operation, false should be returned
420
+     *
421
+     * @param string $path
422
+     * @param int $mtime
423
+     * @return bool
424
+     */
425
+    public function touch($path, $mtime = null) {
426
+        return $this->storage->touch($this->findPathToUse($path), $mtime);
427
+    }
428
+
429
+    /**
430
+     * get the path to a local version of the file.
431
+     * The local version of the file can be temporary and doesn't have to be persistent across requests
432
+     *
433
+     * @param string $path
434
+     * @return string|bool
435
+     */
436
+    public function getLocalFile($path) {
437
+        return $this->storage->getLocalFile($this->findPathToUse($path));
438
+    }
439
+
440
+    /**
441
+     * check if a file or folder has been updated since $time
442
+     *
443
+     * @param string $path
444
+     * @param int $time
445
+     * @return bool
446
+     *
447
+     * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed.
448
+     * returning true for other changes in the folder is optional
449
+     */
450
+    public function hasUpdated($path, $time) {
451
+        return $this->storage->hasUpdated($this->findPathToUse($path), $time);
452
+    }
453
+
454
+    /**
455
+     * get a cache instance for the storage
456
+     *
457
+     * @param string $path
458
+     * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache
459
+     * @return \OC\Files\Cache\Cache
460
+     */
461
+    public function getCache($path = '', $storage = null) {
462
+        if (!$storage) {
463
+            $storage = $this;
464
+        }
465
+        return $this->storage->getCache($this->findPathToUse($path), $storage);
466
+    }
467
+
468
+    /**
469
+     * get a scanner instance for the storage
470
+     *
471
+     * @param string $path
472
+     * @param \OC\Files\Storage\Storage (optional) the storage to pass to the scanner
473
+     * @return \OC\Files\Cache\Scanner
474
+     */
475
+    public function getScanner($path = '', $storage = null) {
476
+        if (!$storage) {
477
+            $storage = $this;
478
+        }
479
+        return $this->storage->getScanner($this->findPathToUse($path), $storage);
480
+    }
481
+
482
+    /**
483
+     * get the ETag for a file or folder
484
+     *
485
+     * @param string $path
486
+     * @return string|bool
487
+     */
488
+    public function getETag($path) {
489
+        return $this->storage->getETag($this->findPathToUse($path));
490
+    }
491
+
492
+    /**
493
+     * @param IStorage $sourceStorage
494
+     * @param string $sourceInternalPath
495
+     * @param string $targetInternalPath
496
+     * @return bool
497
+     */
498
+    public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
499
+        if ($sourceStorage === $this) {
500
+            return $this->copy($sourceInternalPath, $this->findPathToUse($targetInternalPath));
501
+        }
502
+
503
+        $result = $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
504
+        if ($result) {
505
+            unset($this->namesCache[$targetInternalPath]);
506
+        }
507
+        return $result;
508
+    }
509
+
510
+    /**
511
+     * @param IStorage $sourceStorage
512
+     * @param string $sourceInternalPath
513
+     * @param string $targetInternalPath
514
+     * @return bool
515
+     */
516
+    public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) {
517
+        if ($sourceStorage === $this) {
518
+            $result = $this->rename($sourceInternalPath, $this->findPathToUse($targetInternalPath));
519
+            if ($result) {
520
+                unset($this->namesCache[$sourceInternalPath]);
521
+                unset($this->namesCache[$targetInternalPath]);
522
+            }
523
+            return $result;
524
+        }
525
+
526
+        $result = $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $this->findPathToUse($targetInternalPath));
527
+        if ($result) {
528
+            unset($this->namesCache[$sourceInternalPath]);
529
+            unset($this->namesCache[$targetInternalPath]);
530
+        }
531
+        return $result;
532
+    }
533
+
534
+    public function getMetaData($path) {
535
+        return $this->storage->getMetaData($this->findPathToUse($path));
536
+    }
537
+
538
+    public function getDirectoryContent($directory): \Traversable {
539
+        return $this->storage->getDirectoryContent($this->findPathToUse($directory));
540
+    }
541 541
 }
Please login to merge, or discard this patch.