Completed
Pull Request — master (#9942)
by Georg
26:05 queued 08:56
created
lib/private/PreviewManager.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -244,7 +244,7 @@  discard block
 block discarded – undo
244 244
 		}
245 245
 
246 246
 		$mount = $file->getMountPoint();
247
-		if ($mount and !$mount->getOption('previews', true)){
247
+		if ($mount and !$mount->getOption('previews', true)) {
248 248
 			return false;
249 249
 		}
250 250
 
@@ -330,7 +330,7 @@  discard block
 block discarded – undo
330 330
 	 */
331 331
 	protected function registerCoreProvider($class, $mimeType, $options = []) {
332 332
 		if (in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
333
-			$this->registerProvider($mimeType, function () use ($class, $options) {
333
+			$this->registerProvider($mimeType, function() use ($class, $options) {
334 334
 				return new $class($options);
335 335
 			});
336 336
 		}
Please login to merge, or discard this patch.
Indentation   +383 added lines, -383 removed lines patch added patch discarded remove patch
@@ -39,387 +39,387 @@
 block discarded – undo
39 39
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
40 40
 
41 41
 class PreviewManager implements IPreview {
42
-	/** @var IConfig */
43
-	protected $config;
44
-
45
-	/** @var IRootFolder */
46
-	protected $rootFolder;
47
-
48
-	/** @var IAppData */
49
-	protected $appData;
50
-
51
-	/** @var EventDispatcherInterface */
52
-	protected $eventDispatcher;
53
-
54
-	/** @var Generator */
55
-	private $generator;
56
-
57
-	/** @var bool */
58
-	protected $providerListDirty = false;
59
-
60
-	/** @var bool */
61
-	protected $registeredCoreProviders = false;
62
-
63
-	/** @var array */
64
-	protected $providers = [];
65
-
66
-	/** @var array mime type => support status */
67
-	protected $mimeTypeSupportMap = [];
68
-
69
-	/** @var array */
70
-	protected $defaultProviders;
71
-
72
-	/** @var string */
73
-	protected $userId;
74
-
75
-	/**
76
-	 * PreviewManager constructor.
77
-	 *
78
-	 * @param IConfig $config
79
-	 * @param IRootFolder $rootFolder
80
-	 * @param IAppData $appData
81
-	 * @param EventDispatcherInterface $eventDispatcher
82
-	 * @param string $userId
83
-	 */
84
-	public function __construct(IConfig $config,
85
-								IRootFolder $rootFolder,
86
-								IAppData $appData,
87
-								EventDispatcherInterface $eventDispatcher,
88
-								$userId) {
89
-		$this->config = $config;
90
-		$this->rootFolder = $rootFolder;
91
-		$this->appData = $appData;
92
-		$this->eventDispatcher = $eventDispatcher;
93
-		$this->userId = $userId;
94
-	}
95
-
96
-	/**
97
-	 * In order to improve lazy loading a closure can be registered which will be
98
-	 * called in case preview providers are actually requested
99
-	 *
100
-	 * $callable has to return an instance of \OCP\Preview\IProvider
101
-	 *
102
-	 * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider
103
-	 * @param \Closure $callable
104
-	 * @return void
105
-	 */
106
-	public function registerProvider($mimeTypeRegex, \Closure $callable) {
107
-		if (!$this->config->getSystemValue('enable_previews', true)) {
108
-			return;
109
-		}
110
-
111
-		if (!isset($this->providers[$mimeTypeRegex])) {
112
-			$this->providers[$mimeTypeRegex] = [];
113
-		}
114
-		$this->providers[$mimeTypeRegex][] = $callable;
115
-		$this->providerListDirty = true;
116
-	}
117
-
118
-	/**
119
-	 * Get all providers
120
-	 * @return array
121
-	 */
122
-	public function getProviders() {
123
-		if (!$this->config->getSystemValue('enable_previews', true)) {
124
-			return [];
125
-		}
126
-
127
-		$this->registerCoreProviders();
128
-		if ($this->providerListDirty) {
129
-			$keys = array_map('strlen', array_keys($this->providers));
130
-			array_multisort($keys, SORT_DESC, $this->providers);
131
-			$this->providerListDirty = false;
132
-		}
133
-
134
-		return $this->providers;
135
-	}
136
-
137
-	/**
138
-	 * Does the manager have any providers
139
-	 * @return bool
140
-	 */
141
-	public function hasProviders() {
142
-		$this->registerCoreProviders();
143
-		return !empty($this->providers);
144
-	}
145
-
146
-	/**
147
-	 * return a preview of a file
148
-	 *
149
-	 * @param string $file The path to the file where you want a thumbnail from
150
-	 * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
151
-	 * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
152
-	 * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
153
-	 * @return \OCP\IImage
154
-	 * @deprecated 11 Use getPreview
155
-	 */
156
-	public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) {
157
-		try {
158
-			$userRoot = $this->rootFolder->getUserFolder($this->userId)->getParent();
159
-			$node = $userRoot->get($file);
160
-			if (!($file instanceof File)) {
161
-				throw new NotFoundException();
162
-			}
163
-
164
-			$preview = $this->getPreview($node, $maxX, $maxY);
165
-		} catch (\Exception $e) {
166
-			return new \OC_Image();
167
-		}
168
-
169
-		$previewImage = new \OC_Image();
170
-		$previewImage->loadFromData($preview->getContent());
171
-		return $previewImage;
172
-	}
173
-
174
-	/**
175
-	 * Returns a preview of a file
176
-	 *
177
-	 * The cache is searched first and if nothing usable was found then a preview is
178
-	 * generated by one of the providers
179
-	 *
180
-	 * @param File $file
181
-	 * @param int $width
182
-	 * @param int $height
183
-	 * @param bool $crop
184
-	 * @param string $mode
185
-	 * @param string $mimeType
186
-	 * @return ISimpleFile
187
-	 * @throws NotFoundException
188
-	 * @throws \InvalidArgumentException if the preview would be invalid (in case the original image is invalid)
189
-	 * @since 11.0.0 - \InvalidArgumentException was added in 12.0.0
190
-	 */
191
-	public function getPreview(File $file, $width = -1, $height = -1, $crop = false, $mode = IPreview::MODE_FILL, $mimeType = null) {
192
-		if ($this->generator === null) {
193
-			$this->generator = new Generator(
194
-				$this->config,
195
-				$this,
196
-				$this->appData,
197
-				new GeneratorHelper(
198
-					$this->rootFolder
199
-				),
200
-				$this->eventDispatcher
201
-			);
202
-		}
203
-
204
-		return $this->generator->getPreview($file, $width, $height, $crop, $mode, $mimeType);
205
-	}
206
-
207
-	/**
208
-	 * returns true if the passed mime type is supported
209
-	 *
210
-	 * @param string $mimeType
211
-	 * @return boolean
212
-	 */
213
-	public function isMimeSupported($mimeType = '*') {
214
-		if (!$this->config->getSystemValue('enable_previews', true)) {
215
-			return false;
216
-		}
217
-
218
-		if (isset($this->mimeTypeSupportMap[$mimeType])) {
219
-			return $this->mimeTypeSupportMap[$mimeType];
220
-		}
221
-
222
-		$this->registerCoreProviders();
223
-		$providerMimeTypes = array_keys($this->providers);
224
-		foreach ($providerMimeTypes as $supportedMimeType) {
225
-			if (preg_match($supportedMimeType, $mimeType)) {
226
-				$this->mimeTypeSupportMap[$mimeType] = true;
227
-				return true;
228
-			}
229
-		}
230
-		$this->mimeTypeSupportMap[$mimeType] = false;
231
-		return false;
232
-	}
233
-
234
-	/**
235
-	 * Check if a preview can be generated for a file
236
-	 *
237
-	 * @param \OCP\Files\FileInfo $file
238
-	 * @return bool
239
-	 */
240
-	public function isAvailable(\OCP\Files\FileInfo $file) {
241
-		if (!$this->config->getSystemValue('enable_previews', true)) {
242
-			return false;
243
-		}
244
-
245
-		$this->registerCoreProviders();
246
-		if (!$this->isMimeSupported($file->getMimetype())) {
247
-			return false;
248
-		}
249
-
250
-		$mount = $file->getMountPoint();
251
-		if ($mount and !$mount->getOption('previews', true)){
252
-			return false;
253
-		}
254
-
255
-		foreach ($this->providers as $supportedMimeType => $providers) {
256
-			if (preg_match($supportedMimeType, $file->getMimetype())) {
257
-				foreach ($providers as $closure) {
258
-					$provider = $closure();
259
-					if (!($provider instanceof IProvider)) {
260
-						continue;
261
-					}
262
-
263
-					/** @var $provider IProvider */
264
-					if ($provider->isAvailable($file)) {
265
-						return true;
266
-					}
267
-				}
268
-			}
269
-		}
270
-		return false;
271
-	}
272
-
273
-	/**
274
-	 * List of enabled default providers
275
-	 *
276
-	 * The following providers are enabled by default:
277
-	 *  - OC\Preview\PNG
278
-	 *  - OC\Preview\JPEG
279
-	 *  - OC\Preview\GIF
280
-	 *  - OC\Preview\BMP
281
-	 *  - OC\Preview\XBitmap
282
-	 *  - OC\Preview\MarkDown
283
-	 *  - OC\Preview\MP3
284
-	 *  - OC\Preview\TXT
285
-	 *
286
-	 * The following providers are disabled by default due to performance or privacy concerns:
287
-	 *  - OC\Preview\Font
288
-	 *  - OC\Preview\Illustrator
289
-	 *  - OC\Preview\Movie
290
-	 *  - OC\Preview\MSOfficeDoc
291
-	 *  - OC\Preview\MSOffice2003
292
-	 *  - OC\Preview\MSOffice2007
293
-	 *  - OC\Preview\OpenDocument
294
-	 *  - OC\Preview\PDF
295
-	 *  - OC\Preview\Photoshop
296
-	 *  - OC\Preview\Postscript
297
-	 *  - OC\Preview\StarOffice
298
-	 *  - OC\Preview\SVG
299
-	 *  - OC\Preview\TIFF
300
-	 *
301
-	 * @return array
302
-	 */
303
-	protected function getEnabledDefaultProvider() {
304
-		if ($this->defaultProviders !== null) {
305
-			return $this->defaultProviders;
306
-		}
307
-
308
-		$imageProviders = [
309
-			Preview\PNG::class,
310
-			Preview\JPEG::class,
311
-			Preview\GIF::class,
312
-			Preview\BMP::class,
313
-			Preview\XBitmap::class
314
-		];
315
-
316
-		$this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', array_merge([
317
-			Preview\MarkDown::class,
318
-			Preview\MP3::class,
319
-			Preview\TXT::class,
320
-		], $imageProviders));
321
-
322
-		if (in_array(Preview\Image::class, $this->defaultProviders)) {
323
-			$this->defaultProviders = array_merge($this->defaultProviders, $imageProviders);
324
-		}
325
-		$this->defaultProviders = array_unique($this->defaultProviders);
326
-		return $this->defaultProviders;
327
-	}
328
-
329
-	/**
330
-	 * Register the default providers (if enabled)
331
-	 *
332
-	 * @param string $class
333
-	 * @param string $mimeType
334
-	 */
335
-	protected function registerCoreProvider($class, $mimeType, $options = []) {
336
-		if (in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
337
-			$this->registerProvider($mimeType, function () use ($class, $options) {
338
-				return new $class($options);
339
-			});
340
-		}
341
-	}
342
-
343
-	/**
344
-	 * Register the default providers (if enabled)
345
-	 */
346
-	protected function registerCoreProviders() {
347
-		if ($this->registeredCoreProviders) {
348
-			return;
349
-		}
350
-		$this->registeredCoreProviders = true;
351
-
352
-		$this->registerCoreProvider(Preview\TXT::class, '/text\/plain/');
353
-		$this->registerCoreProvider(Preview\MarkDown::class, '/text\/(x-)?markdown/');
354
-		$this->registerCoreProvider(Preview\PNG::class, '/image\/png/');
355
-		$this->registerCoreProvider(Preview\JPEG::class, '/image\/jpeg/');
356
-		$this->registerCoreProvider(Preview\GIF::class, '/image\/gif/');
357
-		$this->registerCoreProvider(Preview\BMP::class, '/image\/bmp/');
358
-		$this->registerCoreProvider(Preview\XBitmap::class, '/image\/x-xbitmap/');
359
-		$this->registerCoreProvider(Preview\MP3::class, '/audio\/mpeg/');
360
-
361
-		// SVG, Office and Bitmap require imagick
362
-		if (extension_loaded('imagick')) {
363
-			$checkImagick = new \Imagick();
364
-
365
-			$imagickProviders = [
366
-				'SVG'	=> ['mimetype' => '/image\/svg\+xml/', 'class' => Preview\SVG::class],
367
-				'TIFF'	=> ['mimetype' => '/image\/tiff/', 'class' => Preview\TIFF::class],
368
-				'PDF'	=> ['mimetype' => '/application\/pdf/', 'class' => Preview\PDF::class],
369
-				'AI'	=> ['mimetype' => '/application\/illustrator/', 'class' => Preview\Illustrator::class],
370
-				'PSD'	=> ['mimetype' => '/application\/x-photoshop/', 'class' => Preview\Photoshop::class],
371
-				'EPS'	=> ['mimetype' => '/application\/postscript/', 'class' => Preview\Postscript::class],
372
-				'TTF'	=> ['mimetype' => '/application\/(?:font-sfnt|x-font$)/', 'class' => Preview\Font::class],
373
-			];
374
-
375
-			foreach ($imagickProviders as $queryFormat => $provider) {
376
-				$class = $provider['class'];
377
-				if (!in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
378
-					continue;
379
-				}
380
-
381
-				if (count($checkImagick->queryFormats($queryFormat)) === 1) {
382
-					$this->registerCoreProvider($class, $provider['mimetype']);
383
-				}
384
-			}
385
-
386
-			if (count($checkImagick->queryFormats('PDF')) === 1) {
387
-				if (\OC_Helper::is_function_enabled('shell_exec')) {
388
-					$officeFound = is_string($this->config->getSystemValue('preview_libreoffice_path', null));
389
-
390
-					if (!$officeFound) {
391
-						//let's see if there is libreoffice or openoffice on this machine
392
-						$whichLibreOffice = shell_exec('command -v libreoffice');
393
-						$officeFound = !empty($whichLibreOffice);
394
-						if (!$officeFound) {
395
-							$whichOpenOffice = shell_exec('command -v openoffice');
396
-							$officeFound = !empty($whichOpenOffice);
397
-						}
398
-					}
399
-
400
-					if ($officeFound) {
401
-						$this->registerCoreProvider(Preview\MSOfficeDoc::class, '/application\/msword/');
402
-						$this->registerCoreProvider(Preview\MSOffice2003::class, '/application\/vnd.ms-.*/');
403
-						$this->registerCoreProvider(Preview\MSOffice2007::class, '/application\/vnd.openxmlformats-officedocument.*/');
404
-						$this->registerCoreProvider(Preview\OpenDocument::class, '/application\/vnd.oasis.opendocument.*/');
405
-						$this->registerCoreProvider(Preview\StarOffice::class, '/application\/vnd.sun.xml.*/');
406
-					}
407
-				}
408
-			}
409
-		}
410
-
411
-		// Video requires avconv or ffmpeg
412
-		if (in_array(Preview\Movie::class, $this->getEnabledDefaultProvider())) {
413
-			$avconvBinary = \OC_Helper::findBinaryPath('avconv');
414
-			$ffmpegBinary = $avconvBinary ? null : \OC_Helper::findBinaryPath('ffmpeg');
415
-
416
-			if ($avconvBinary || $ffmpegBinary) {
417
-				// FIXME // a bit hacky but didn't want to use subclasses
418
-				\OC\Preview\Movie::$avconvBinary = $avconvBinary;
419
-				\OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary;
420
-
421
-				$this->registerCoreProvider(Preview\Movie::class, '/video\/.*/');
422
-			}
423
-		}
424
-	}
42
+    /** @var IConfig */
43
+    protected $config;
44
+
45
+    /** @var IRootFolder */
46
+    protected $rootFolder;
47
+
48
+    /** @var IAppData */
49
+    protected $appData;
50
+
51
+    /** @var EventDispatcherInterface */
52
+    protected $eventDispatcher;
53
+
54
+    /** @var Generator */
55
+    private $generator;
56
+
57
+    /** @var bool */
58
+    protected $providerListDirty = false;
59
+
60
+    /** @var bool */
61
+    protected $registeredCoreProviders = false;
62
+
63
+    /** @var array */
64
+    protected $providers = [];
65
+
66
+    /** @var array mime type => support status */
67
+    protected $mimeTypeSupportMap = [];
68
+
69
+    /** @var array */
70
+    protected $defaultProviders;
71
+
72
+    /** @var string */
73
+    protected $userId;
74
+
75
+    /**
76
+     * PreviewManager constructor.
77
+     *
78
+     * @param IConfig $config
79
+     * @param IRootFolder $rootFolder
80
+     * @param IAppData $appData
81
+     * @param EventDispatcherInterface $eventDispatcher
82
+     * @param string $userId
83
+     */
84
+    public function __construct(IConfig $config,
85
+                                IRootFolder $rootFolder,
86
+                                IAppData $appData,
87
+                                EventDispatcherInterface $eventDispatcher,
88
+                                $userId) {
89
+        $this->config = $config;
90
+        $this->rootFolder = $rootFolder;
91
+        $this->appData = $appData;
92
+        $this->eventDispatcher = $eventDispatcher;
93
+        $this->userId = $userId;
94
+    }
95
+
96
+    /**
97
+     * In order to improve lazy loading a closure can be registered which will be
98
+     * called in case preview providers are actually requested
99
+     *
100
+     * $callable has to return an instance of \OCP\Preview\IProvider
101
+     *
102
+     * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider
103
+     * @param \Closure $callable
104
+     * @return void
105
+     */
106
+    public function registerProvider($mimeTypeRegex, \Closure $callable) {
107
+        if (!$this->config->getSystemValue('enable_previews', true)) {
108
+            return;
109
+        }
110
+
111
+        if (!isset($this->providers[$mimeTypeRegex])) {
112
+            $this->providers[$mimeTypeRegex] = [];
113
+        }
114
+        $this->providers[$mimeTypeRegex][] = $callable;
115
+        $this->providerListDirty = true;
116
+    }
117
+
118
+    /**
119
+     * Get all providers
120
+     * @return array
121
+     */
122
+    public function getProviders() {
123
+        if (!$this->config->getSystemValue('enable_previews', true)) {
124
+            return [];
125
+        }
126
+
127
+        $this->registerCoreProviders();
128
+        if ($this->providerListDirty) {
129
+            $keys = array_map('strlen', array_keys($this->providers));
130
+            array_multisort($keys, SORT_DESC, $this->providers);
131
+            $this->providerListDirty = false;
132
+        }
133
+
134
+        return $this->providers;
135
+    }
136
+
137
+    /**
138
+     * Does the manager have any providers
139
+     * @return bool
140
+     */
141
+    public function hasProviders() {
142
+        $this->registerCoreProviders();
143
+        return !empty($this->providers);
144
+    }
145
+
146
+    /**
147
+     * return a preview of a file
148
+     *
149
+     * @param string $file The path to the file where you want a thumbnail from
150
+     * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
151
+     * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
152
+     * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
153
+     * @return \OCP\IImage
154
+     * @deprecated 11 Use getPreview
155
+     */
156
+    public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) {
157
+        try {
158
+            $userRoot = $this->rootFolder->getUserFolder($this->userId)->getParent();
159
+            $node = $userRoot->get($file);
160
+            if (!($file instanceof File)) {
161
+                throw new NotFoundException();
162
+            }
163
+
164
+            $preview = $this->getPreview($node, $maxX, $maxY);
165
+        } catch (\Exception $e) {
166
+            return new \OC_Image();
167
+        }
168
+
169
+        $previewImage = new \OC_Image();
170
+        $previewImage->loadFromData($preview->getContent());
171
+        return $previewImage;
172
+    }
173
+
174
+    /**
175
+     * Returns a preview of a file
176
+     *
177
+     * The cache is searched first and if nothing usable was found then a preview is
178
+     * generated by one of the providers
179
+     *
180
+     * @param File $file
181
+     * @param int $width
182
+     * @param int $height
183
+     * @param bool $crop
184
+     * @param string $mode
185
+     * @param string $mimeType
186
+     * @return ISimpleFile
187
+     * @throws NotFoundException
188
+     * @throws \InvalidArgumentException if the preview would be invalid (in case the original image is invalid)
189
+     * @since 11.0.0 - \InvalidArgumentException was added in 12.0.0
190
+     */
191
+    public function getPreview(File $file, $width = -1, $height = -1, $crop = false, $mode = IPreview::MODE_FILL, $mimeType = null) {
192
+        if ($this->generator === null) {
193
+            $this->generator = new Generator(
194
+                $this->config,
195
+                $this,
196
+                $this->appData,
197
+                new GeneratorHelper(
198
+                    $this->rootFolder
199
+                ),
200
+                $this->eventDispatcher
201
+            );
202
+        }
203
+
204
+        return $this->generator->getPreview($file, $width, $height, $crop, $mode, $mimeType);
205
+    }
206
+
207
+    /**
208
+     * returns true if the passed mime type is supported
209
+     *
210
+     * @param string $mimeType
211
+     * @return boolean
212
+     */
213
+    public function isMimeSupported($mimeType = '*') {
214
+        if (!$this->config->getSystemValue('enable_previews', true)) {
215
+            return false;
216
+        }
217
+
218
+        if (isset($this->mimeTypeSupportMap[$mimeType])) {
219
+            return $this->mimeTypeSupportMap[$mimeType];
220
+        }
221
+
222
+        $this->registerCoreProviders();
223
+        $providerMimeTypes = array_keys($this->providers);
224
+        foreach ($providerMimeTypes as $supportedMimeType) {
225
+            if (preg_match($supportedMimeType, $mimeType)) {
226
+                $this->mimeTypeSupportMap[$mimeType] = true;
227
+                return true;
228
+            }
229
+        }
230
+        $this->mimeTypeSupportMap[$mimeType] = false;
231
+        return false;
232
+    }
233
+
234
+    /**
235
+     * Check if a preview can be generated for a file
236
+     *
237
+     * @param \OCP\Files\FileInfo $file
238
+     * @return bool
239
+     */
240
+    public function isAvailable(\OCP\Files\FileInfo $file) {
241
+        if (!$this->config->getSystemValue('enable_previews', true)) {
242
+            return false;
243
+        }
244
+
245
+        $this->registerCoreProviders();
246
+        if (!$this->isMimeSupported($file->getMimetype())) {
247
+            return false;
248
+        }
249
+
250
+        $mount = $file->getMountPoint();
251
+        if ($mount and !$mount->getOption('previews', true)){
252
+            return false;
253
+        }
254
+
255
+        foreach ($this->providers as $supportedMimeType => $providers) {
256
+            if (preg_match($supportedMimeType, $file->getMimetype())) {
257
+                foreach ($providers as $closure) {
258
+                    $provider = $closure();
259
+                    if (!($provider instanceof IProvider)) {
260
+                        continue;
261
+                    }
262
+
263
+                    /** @var $provider IProvider */
264
+                    if ($provider->isAvailable($file)) {
265
+                        return true;
266
+                    }
267
+                }
268
+            }
269
+        }
270
+        return false;
271
+    }
272
+
273
+    /**
274
+     * List of enabled default providers
275
+     *
276
+     * The following providers are enabled by default:
277
+     *  - OC\Preview\PNG
278
+     *  - OC\Preview\JPEG
279
+     *  - OC\Preview\GIF
280
+     *  - OC\Preview\BMP
281
+     *  - OC\Preview\XBitmap
282
+     *  - OC\Preview\MarkDown
283
+     *  - OC\Preview\MP3
284
+     *  - OC\Preview\TXT
285
+     *
286
+     * The following providers are disabled by default due to performance or privacy concerns:
287
+     *  - OC\Preview\Font
288
+     *  - OC\Preview\Illustrator
289
+     *  - OC\Preview\Movie
290
+     *  - OC\Preview\MSOfficeDoc
291
+     *  - OC\Preview\MSOffice2003
292
+     *  - OC\Preview\MSOffice2007
293
+     *  - OC\Preview\OpenDocument
294
+     *  - OC\Preview\PDF
295
+     *  - OC\Preview\Photoshop
296
+     *  - OC\Preview\Postscript
297
+     *  - OC\Preview\StarOffice
298
+     *  - OC\Preview\SVG
299
+     *  - OC\Preview\TIFF
300
+     *
301
+     * @return array
302
+     */
303
+    protected function getEnabledDefaultProvider() {
304
+        if ($this->defaultProviders !== null) {
305
+            return $this->defaultProviders;
306
+        }
307
+
308
+        $imageProviders = [
309
+            Preview\PNG::class,
310
+            Preview\JPEG::class,
311
+            Preview\GIF::class,
312
+            Preview\BMP::class,
313
+            Preview\XBitmap::class
314
+        ];
315
+
316
+        $this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', array_merge([
317
+            Preview\MarkDown::class,
318
+            Preview\MP3::class,
319
+            Preview\TXT::class,
320
+        ], $imageProviders));
321
+
322
+        if (in_array(Preview\Image::class, $this->defaultProviders)) {
323
+            $this->defaultProviders = array_merge($this->defaultProviders, $imageProviders);
324
+        }
325
+        $this->defaultProviders = array_unique($this->defaultProviders);
326
+        return $this->defaultProviders;
327
+    }
328
+
329
+    /**
330
+     * Register the default providers (if enabled)
331
+     *
332
+     * @param string $class
333
+     * @param string $mimeType
334
+     */
335
+    protected function registerCoreProvider($class, $mimeType, $options = []) {
336
+        if (in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
337
+            $this->registerProvider($mimeType, function () use ($class, $options) {
338
+                return new $class($options);
339
+            });
340
+        }
341
+    }
342
+
343
+    /**
344
+     * Register the default providers (if enabled)
345
+     */
346
+    protected function registerCoreProviders() {
347
+        if ($this->registeredCoreProviders) {
348
+            return;
349
+        }
350
+        $this->registeredCoreProviders = true;
351
+
352
+        $this->registerCoreProvider(Preview\TXT::class, '/text\/plain/');
353
+        $this->registerCoreProvider(Preview\MarkDown::class, '/text\/(x-)?markdown/');
354
+        $this->registerCoreProvider(Preview\PNG::class, '/image\/png/');
355
+        $this->registerCoreProvider(Preview\JPEG::class, '/image\/jpeg/');
356
+        $this->registerCoreProvider(Preview\GIF::class, '/image\/gif/');
357
+        $this->registerCoreProvider(Preview\BMP::class, '/image\/bmp/');
358
+        $this->registerCoreProvider(Preview\XBitmap::class, '/image\/x-xbitmap/');
359
+        $this->registerCoreProvider(Preview\MP3::class, '/audio\/mpeg/');
360
+
361
+        // SVG, Office and Bitmap require imagick
362
+        if (extension_loaded('imagick')) {
363
+            $checkImagick = new \Imagick();
364
+
365
+            $imagickProviders = [
366
+                'SVG'	=> ['mimetype' => '/image\/svg\+xml/', 'class' => Preview\SVG::class],
367
+                'TIFF'	=> ['mimetype' => '/image\/tiff/', 'class' => Preview\TIFF::class],
368
+                'PDF'	=> ['mimetype' => '/application\/pdf/', 'class' => Preview\PDF::class],
369
+                'AI'	=> ['mimetype' => '/application\/illustrator/', 'class' => Preview\Illustrator::class],
370
+                'PSD'	=> ['mimetype' => '/application\/x-photoshop/', 'class' => Preview\Photoshop::class],
371
+                'EPS'	=> ['mimetype' => '/application\/postscript/', 'class' => Preview\Postscript::class],
372
+                'TTF'	=> ['mimetype' => '/application\/(?:font-sfnt|x-font$)/', 'class' => Preview\Font::class],
373
+            ];
374
+
375
+            foreach ($imagickProviders as $queryFormat => $provider) {
376
+                $class = $provider['class'];
377
+                if (!in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
378
+                    continue;
379
+                }
380
+
381
+                if (count($checkImagick->queryFormats($queryFormat)) === 1) {
382
+                    $this->registerCoreProvider($class, $provider['mimetype']);
383
+                }
384
+            }
385
+
386
+            if (count($checkImagick->queryFormats('PDF')) === 1) {
387
+                if (\OC_Helper::is_function_enabled('shell_exec')) {
388
+                    $officeFound = is_string($this->config->getSystemValue('preview_libreoffice_path', null));
389
+
390
+                    if (!$officeFound) {
391
+                        //let's see if there is libreoffice or openoffice on this machine
392
+                        $whichLibreOffice = shell_exec('command -v libreoffice');
393
+                        $officeFound = !empty($whichLibreOffice);
394
+                        if (!$officeFound) {
395
+                            $whichOpenOffice = shell_exec('command -v openoffice');
396
+                            $officeFound = !empty($whichOpenOffice);
397
+                        }
398
+                    }
399
+
400
+                    if ($officeFound) {
401
+                        $this->registerCoreProvider(Preview\MSOfficeDoc::class, '/application\/msword/');
402
+                        $this->registerCoreProvider(Preview\MSOffice2003::class, '/application\/vnd.ms-.*/');
403
+                        $this->registerCoreProvider(Preview\MSOffice2007::class, '/application\/vnd.openxmlformats-officedocument.*/');
404
+                        $this->registerCoreProvider(Preview\OpenDocument::class, '/application\/vnd.oasis.opendocument.*/');
405
+                        $this->registerCoreProvider(Preview\StarOffice::class, '/application\/vnd.sun.xml.*/');
406
+                    }
407
+                }
408
+            }
409
+        }
410
+
411
+        // Video requires avconv or ffmpeg
412
+        if (in_array(Preview\Movie::class, $this->getEnabledDefaultProvider())) {
413
+            $avconvBinary = \OC_Helper::findBinaryPath('avconv');
414
+            $ffmpegBinary = $avconvBinary ? null : \OC_Helper::findBinaryPath('ffmpeg');
415
+
416
+            if ($avconvBinary || $ffmpegBinary) {
417
+                // FIXME // a bit hacky but didn't want to use subclasses
418
+                \OC\Preview\Movie::$avconvBinary = $avconvBinary;
419
+                \OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary;
420
+
421
+                $this->registerCoreProvider(Preview\Movie::class, '/video\/.*/');
422
+            }
423
+        }
424
+    }
425 425
 }
Please login to merge, or discard this patch.
lib/private/Encryption/Update.php 2 patches
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -87,7 +87,7 @@  discard block
 block discarded – undo
87 87
 			if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
88 88
 				$path = Filesystem::getPath($params['fileSource']);
89 89
 				list($owner, $ownerPath) = $this->getOwnerPath($path);
90
-				$absPath = '/' . $owner . '/files/' . $ownerPath;
90
+				$absPath = '/'.$owner.'/files/'.$ownerPath;
91 91
 				$this->update($absPath);
92 92
 			}
93 93
 		}
@@ -103,7 +103,7 @@  discard block
 block discarded – undo
103 103
 			if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
104 104
 				$path = Filesystem::getPath($params['fileSource']);
105 105
 				list($owner, $ownerPath) = $this->getOwnerPath($path);
106
-				$absPath = '/' . $owner . '/files/' . $ownerPath;
106
+				$absPath = '/'.$owner.'/files/'.$ownerPath;
107 107
 				$this->update($absPath);
108 108
 			}
109 109
 		}
@@ -117,7 +117,7 @@  discard block
 block discarded – undo
117 117
 	 */
118 118
 	public function postRestore($params) {
119 119
 		if ($this->encryptionManager->isEnabled()) {
120
-			$path = Filesystem::normalizePath('/' . $this->uid . '/files/' . $params['filePath']);
120
+			$path = Filesystem::normalizePath('/'.$this->uid.'/files/'.$params['filePath']);
121 121
 			$this->update($path);
122 122
 		}
123 123
 	}
@@ -131,12 +131,12 @@  discard block
 block discarded – undo
131 131
 	public function postRename($params) {
132 132
 		$source = $params['oldpath'];
133 133
 		$target = $params['newpath'];
134
-		if(
134
+		if (
135 135
 			$this->encryptionManager->isEnabled() &&
136 136
 			dirname($source) !== dirname($target)
137 137
 		) {
138 138
 				list($owner, $ownerPath) = $this->getOwnerPath($target);
139
-				$absPath = '/' . $owner . '/files/' . $ownerPath;
139
+				$absPath = '/'.$owner.'/files/'.$ownerPath;
140 140
 				$this->update($absPath);
141 141
 		}
142 142
 	}
@@ -151,10 +151,10 @@  discard block
 block discarded – undo
151 151
 	protected function getOwnerPath($path) {
152 152
 		$info = Filesystem::getFileInfo($path);
153 153
 		$owner = Filesystem::getOwner($path);
154
-		$view = new View('/' . $owner . '/files');
154
+		$view = new View('/'.$owner.'/files');
155 155
 		$path = $view->getPath($info->getId());
156 156
 		if ($path === null) {
157
-			throw new \InvalidArgumentException('No file found for ' . $info->getId());
157
+			throw new \InvalidArgumentException('No file found for '.$info->getId());
158 158
 		}
159 159
 
160 160
 		return array($owner, $path);
Please login to merge, or discard this patch.
Indentation   +157 added lines, -157 removed lines patch added patch discarded remove patch
@@ -33,162 +33,162 @@
 block discarded – undo
33 33
  */
34 34
 class Update {
35 35
 
36
-	/** @var \OC\Files\View */
37
-	protected $view;
38
-
39
-	/** @var \OC\Encryption\Util */
40
-	protected $util;
41
-
42
-	 /** @var \OC\Files\Mount\Manager */
43
-	protected $mountManager;
44
-
45
-	/** @var \OC\Encryption\Manager */
46
-	protected $encryptionManager;
47
-
48
-	/** @var string */
49
-	protected $uid;
50
-
51
-	/** @var \OC\Encryption\File */
52
-	protected $file;
53
-
54
-	/**
55
-	 *
56
-	 * @param \OC\Files\View $view
57
-	 * @param \OC\Encryption\Util $util
58
-	 * @param \OC\Files\Mount\Manager $mountManager
59
-	 * @param \OC\Encryption\Manager $encryptionManager
60
-	 * @param \OC\Encryption\File $file
61
-	 * @param string $uid
62
-	 */
63
-	public function __construct(
64
-			View $view,
65
-			Util $util,
66
-			Mount\Manager $mountManager,
67
-			Manager $encryptionManager,
68
-			File $file,
69
-			$uid
70
-		) {
71
-
72
-		$this->view = $view;
73
-		$this->util = $util;
74
-		$this->mountManager = $mountManager;
75
-		$this->encryptionManager = $encryptionManager;
76
-		$this->file = $file;
77
-		$this->uid = $uid;
78
-	}
79
-
80
-	/**
81
-	 * hook after file was shared
82
-	 *
83
-	 * @param array $params
84
-	 */
85
-	public function postShared($params) {
86
-		if ($this->encryptionManager->isEnabled()) {
87
-			if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
88
-				$path = Filesystem::getPath($params['fileSource']);
89
-				list($owner, $ownerPath) = $this->getOwnerPath($path);
90
-				$absPath = '/' . $owner . '/files/' . $ownerPath;
91
-				$this->update($absPath);
92
-			}
93
-		}
94
-	}
95
-
96
-	/**
97
-	 * hook after file was unshared
98
-	 *
99
-	 * @param array $params
100
-	 */
101
-	public function postUnshared($params) {
102
-		if ($this->encryptionManager->isEnabled()) {
103
-			if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
104
-				$path = Filesystem::getPath($params['fileSource']);
105
-				list($owner, $ownerPath) = $this->getOwnerPath($path);
106
-				$absPath = '/' . $owner . '/files/' . $ownerPath;
107
-				$this->update($absPath);
108
-			}
109
-		}
110
-	}
111
-
112
-	/**
113
-	 * inform encryption module that a file was restored from the trash bin,
114
-	 * e.g. to update the encryption keys
115
-	 *
116
-	 * @param array $params
117
-	 */
118
-	public function postRestore($params) {
119
-		if ($this->encryptionManager->isEnabled()) {
120
-			$path = Filesystem::normalizePath('/' . $this->uid . '/files/' . $params['filePath']);
121
-			$this->update($path);
122
-		}
123
-	}
124
-
125
-	/**
126
-	 * inform encryption module that a file was renamed,
127
-	 * e.g. to update the encryption keys
128
-	 *
129
-	 * @param array $params
130
-	 */
131
-	public function postRename($params) {
132
-		$source = $params['oldpath'];
133
-		$target = $params['newpath'];
134
-		if(
135
-			$this->encryptionManager->isEnabled() &&
136
-			dirname($source) !== dirname($target)
137
-		) {
138
-				list($owner, $ownerPath) = $this->getOwnerPath($target);
139
-				$absPath = '/' . $owner . '/files/' . $ownerPath;
140
-				$this->update($absPath);
141
-		}
142
-	}
143
-
144
-	/**
145
-	 * get owner and path relative to data/<owner>/files
146
-	 *
147
-	 * @param string $path path to file for current user
148
-	 * @return array ['owner' => $owner, 'path' => $path]
149
-	 * @throw \InvalidArgumentException
150
-	 */
151
-	protected function getOwnerPath($path) {
152
-		$info = Filesystem::getFileInfo($path);
153
-		$owner = Filesystem::getOwner($path);
154
-		$view = new View('/' . $owner . '/files');
155
-		$path = $view->getPath($info->getId());
156
-		if ($path === null) {
157
-			throw new \InvalidArgumentException('No file found for ' . $info->getId());
158
-		}
159
-
160
-		return array($owner, $path);
161
-	}
162
-
163
-	/**
164
-	 * notify encryption module about added/removed users from a file/folder
165
-	 *
166
-	 * @param string $path relative to data/
167
-	 * @throws Exceptions\ModuleDoesNotExistsException
168
-	 */
169
-	public function update($path) {
170
-
171
-		$encryptionModule = $this->encryptionManager->getEncryptionModule();
172
-
173
-		// if the encryption module doesn't encrypt the files on a per-user basis
174
-		// we have nothing to do here.
175
-		if ($encryptionModule->needDetailedAccessList() === false) {
176
-			return;
177
-		}
178
-
179
-		// if a folder was shared, get a list of all (sub-)folders
180
-		if ($this->view->is_dir($path)) {
181
-			$allFiles = $this->util->getAllFiles($path);
182
-		} else {
183
-			$allFiles = array($path);
184
-		}
185
-
186
-
187
-
188
-		foreach ($allFiles as $file) {
189
-			$usersSharing = $this->file->getAccessList($file);
190
-			$encryptionModule->update($file, $this->uid, $usersSharing);
191
-		}
192
-	}
36
+    /** @var \OC\Files\View */
37
+    protected $view;
38
+
39
+    /** @var \OC\Encryption\Util */
40
+    protected $util;
41
+
42
+        /** @var \OC\Files\Mount\Manager */
43
+    protected $mountManager;
44
+
45
+    /** @var \OC\Encryption\Manager */
46
+    protected $encryptionManager;
47
+
48
+    /** @var string */
49
+    protected $uid;
50
+
51
+    /** @var \OC\Encryption\File */
52
+    protected $file;
53
+
54
+    /**
55
+     *
56
+     * @param \OC\Files\View $view
57
+     * @param \OC\Encryption\Util $util
58
+     * @param \OC\Files\Mount\Manager $mountManager
59
+     * @param \OC\Encryption\Manager $encryptionManager
60
+     * @param \OC\Encryption\File $file
61
+     * @param string $uid
62
+     */
63
+    public function __construct(
64
+            View $view,
65
+            Util $util,
66
+            Mount\Manager $mountManager,
67
+            Manager $encryptionManager,
68
+            File $file,
69
+            $uid
70
+        ) {
71
+
72
+        $this->view = $view;
73
+        $this->util = $util;
74
+        $this->mountManager = $mountManager;
75
+        $this->encryptionManager = $encryptionManager;
76
+        $this->file = $file;
77
+        $this->uid = $uid;
78
+    }
79
+
80
+    /**
81
+     * hook after file was shared
82
+     *
83
+     * @param array $params
84
+     */
85
+    public function postShared($params) {
86
+        if ($this->encryptionManager->isEnabled()) {
87
+            if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
88
+                $path = Filesystem::getPath($params['fileSource']);
89
+                list($owner, $ownerPath) = $this->getOwnerPath($path);
90
+                $absPath = '/' . $owner . '/files/' . $ownerPath;
91
+                $this->update($absPath);
92
+            }
93
+        }
94
+    }
95
+
96
+    /**
97
+     * hook after file was unshared
98
+     *
99
+     * @param array $params
100
+     */
101
+    public function postUnshared($params) {
102
+        if ($this->encryptionManager->isEnabled()) {
103
+            if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
104
+                $path = Filesystem::getPath($params['fileSource']);
105
+                list($owner, $ownerPath) = $this->getOwnerPath($path);
106
+                $absPath = '/' . $owner . '/files/' . $ownerPath;
107
+                $this->update($absPath);
108
+            }
109
+        }
110
+    }
111
+
112
+    /**
113
+     * inform encryption module that a file was restored from the trash bin,
114
+     * e.g. to update the encryption keys
115
+     *
116
+     * @param array $params
117
+     */
118
+    public function postRestore($params) {
119
+        if ($this->encryptionManager->isEnabled()) {
120
+            $path = Filesystem::normalizePath('/' . $this->uid . '/files/' . $params['filePath']);
121
+            $this->update($path);
122
+        }
123
+    }
124
+
125
+    /**
126
+     * inform encryption module that a file was renamed,
127
+     * e.g. to update the encryption keys
128
+     *
129
+     * @param array $params
130
+     */
131
+    public function postRename($params) {
132
+        $source = $params['oldpath'];
133
+        $target = $params['newpath'];
134
+        if(
135
+            $this->encryptionManager->isEnabled() &&
136
+            dirname($source) !== dirname($target)
137
+        ) {
138
+                list($owner, $ownerPath) = $this->getOwnerPath($target);
139
+                $absPath = '/' . $owner . '/files/' . $ownerPath;
140
+                $this->update($absPath);
141
+        }
142
+    }
143
+
144
+    /**
145
+     * get owner and path relative to data/<owner>/files
146
+     *
147
+     * @param string $path path to file for current user
148
+     * @return array ['owner' => $owner, 'path' => $path]
149
+     * @throw \InvalidArgumentException
150
+     */
151
+    protected function getOwnerPath($path) {
152
+        $info = Filesystem::getFileInfo($path);
153
+        $owner = Filesystem::getOwner($path);
154
+        $view = new View('/' . $owner . '/files');
155
+        $path = $view->getPath($info->getId());
156
+        if ($path === null) {
157
+            throw new \InvalidArgumentException('No file found for ' . $info->getId());
158
+        }
159
+
160
+        return array($owner, $path);
161
+    }
162
+
163
+    /**
164
+     * notify encryption module about added/removed users from a file/folder
165
+     *
166
+     * @param string $path relative to data/
167
+     * @throws Exceptions\ModuleDoesNotExistsException
168
+     */
169
+    public function update($path) {
170
+
171
+        $encryptionModule = $this->encryptionManager->getEncryptionModule();
172
+
173
+        // if the encryption module doesn't encrypt the files on a per-user basis
174
+        // we have nothing to do here.
175
+        if ($encryptionModule->needDetailedAccessList() === false) {
176
+            return;
177
+        }
178
+
179
+        // if a folder was shared, get a list of all (sub-)folders
180
+        if ($this->view->is_dir($path)) {
181
+            $allFiles = $this->util->getAllFiles($path);
182
+        } else {
183
+            $allFiles = array($path);
184
+        }
185
+
186
+
187
+
188
+        foreach ($allFiles as $file) {
189
+            $usersSharing = $this->file->getAccessList($file);
190
+            $encryptionModule->update($file, $this->uid, $usersSharing);
191
+        }
192
+    }
193 193
 
194 194
 }
Please login to merge, or discard this patch.
lib/private/Encryption/Exceptions/ModuleAlreadyExistsException.php 2 patches
Indentation   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -27,12 +27,12 @@
 block discarded – undo
27 27
 
28 28
 class ModuleAlreadyExistsException extends GenericEncryptionException {
29 29
 
30
-	/**
31
-	 * @param string $id
32
-	 * @param string $name
33
-	 */
34
-	public function __construct($id, $name) {
35
-		parent::__construct('Id "' . $id . '" already used by encryption module "' . $name . '"');
36
-	}
30
+    /**
31
+     * @param string $id
32
+     * @param string $name
33
+     */
34
+    public function __construct($id, $name) {
35
+        parent::__construct('Id "' . $id . '" already used by encryption module "' . $name . '"');
36
+    }
37 37
 
38 38
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -32,7 +32,7 @@
 block discarded – undo
32 32
 	 * @param string $name
33 33
 	 */
34 34
 	public function __construct($id, $name) {
35
-		parent::__construct('Id "' . $id . '" already used by encryption module "' . $name . '"');
35
+		parent::__construct('Id "'.$id.'" already used by encryption module "'.$name.'"');
36 36
 	}
37 37
 
38 38
 }
Please login to merge, or discard this patch.
lib/private/Encryption/Exceptions/EncryptionHeaderToLargeException.php 1 patch
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -28,8 +28,8 @@
 block discarded – undo
28 28
 
29 29
 class EncryptionHeaderToLargeException extends GenericEncryptionException {
30 30
 
31
-	public function __construct() {
32
-		parent::__construct('max header size exceeded');
33
-	}
31
+    public function __construct() {
32
+        parent::__construct('max header size exceeded');
33
+    }
34 34
 
35 35
 }
Please login to merge, or discard this patch.
lib/private/Encryption/Exceptions/EncryptionHeaderKeyExistsException.php 2 patches
Indentation   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -27,10 +27,10 @@
 block discarded – undo
27 27
 
28 28
 class EncryptionHeaderKeyExistsException extends GenericEncryptionException {
29 29
 
30
-	/**
31
-	 * @param string $key
32
-	 */
33
-	public function __construct($key) {
34
-		parent::__construct('header key "'. $key . '" already reserved by ownCloud');
35
-	}
30
+    /**
31
+     * @param string $key
32
+     */
33
+    public function __construct($key) {
34
+        parent::__construct('header key "'. $key . '" already reserved by ownCloud');
35
+    }
36 36
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -31,6 +31,6 @@
 block discarded – undo
31 31
 	 * @param string $key
32 32
 	 */
33 33
 	public function __construct($key) {
34
-		parent::__construct('header key "'. $key . '" already reserved by ownCloud');
34
+		parent::__construct('header key "'.$key.'" already reserved by ownCloud');
35 35
 	}
36 36
 }
Please login to merge, or discard this patch.
lib/private/Encryption/Exceptions/EncryptionFailedException.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -26,6 +26,6 @@
 block discarded – undo
26 26
 
27 27
 use OCP\Encryption\Exceptions\GenericEncryptionException;
28 28
 
29
-class EncryptionFailedException extends GenericEncryptionException{
29
+class EncryptionFailedException extends GenericEncryptionException {
30 30
 
31 31
 }
Please login to merge, or discard this patch.
lib/private/Encryption/Exceptions/EmptyEncryptionDataException.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -26,6 +26,6 @@
 block discarded – undo
26 26
 
27 27
 use OCP\Encryption\Exceptions\GenericEncryptionException;
28 28
 
29
-class EmptyEncryptionDataException extends GenericEncryptionException{
29
+class EmptyEncryptionDataException extends GenericEncryptionException {
30 30
 
31 31
 }
Please login to merge, or discard this patch.
lib/private/Encryption/DecryptAll.php 2 patches
Indentation   +250 added lines, -250 removed lines patch added patch discarded remove patch
@@ -36,255 +36,255 @@
 block discarded – undo
36 36
 
37 37
 class DecryptAll {
38 38
 
39
-	/** @var  OutputInterface */
40
-	protected $output;
41
-
42
-	/** @var  InputInterface */
43
-	protected $input;
44
-
45
-	/** @var  Manager */
46
-	protected $encryptionManager;
47
-
48
-	/** @var IUserManager */
49
-	protected $userManager;
50
-
51
-	/** @var View */
52
-	protected $rootView;
53
-
54
-	/** @var  array files which couldn't be decrypted */
55
-	protected $failed;
56
-
57
-	/**
58
-	 * @param Manager $encryptionManager
59
-	 * @param IUserManager $userManager
60
-	 * @param View $rootView
61
-	 */
62
-	public function __construct(
63
-		Manager $encryptionManager,
64
-		IUserManager $userManager,
65
-		View $rootView
66
-	) {
67
-		$this->encryptionManager = $encryptionManager;
68
-		$this->userManager = $userManager;
69
-		$this->rootView = $rootView;
70
-		$this->failed = [];
71
-	}
72
-
73
-	/**
74
-	 * start to decrypt all files
75
-	 *
76
-	 * @param InputInterface $input
77
-	 * @param OutputInterface $output
78
-	 * @param string $user which users data folder should be decrypted, default = all users
79
-	 * @return bool
80
-	 * @throws \Exception
81
-	 */
82
-	public function decryptAll(InputInterface $input, OutputInterface $output, $user = '') {
83
-
84
-		$this->input = $input;
85
-		$this->output = $output;
86
-
87
-		if ($user !== '' && $this->userManager->userExists($user) === false) {
88
-			$this->output->writeln('User "' . $user . '" does not exist. Please check the username and try again');
89
-			return false;
90
-		}
91
-
92
-		$this->output->writeln('prepare encryption modules...');
93
-		if ($this->prepareEncryptionModules($user) === false) {
94
-			return false;
95
-		}
96
-		$this->output->writeln(' done.');
97
-
98
-		$this->decryptAllUsersFiles($user);
99
-
100
-		if (empty($this->failed)) {
101
-			$this->output->writeln('all files could be decrypted successfully!');
102
-		} else {
103
-			$this->output->writeln('Files for following users couldn\'t be decrypted, ');
104
-			$this->output->writeln('maybe the user is not set up in a way that supports this operation: ');
105
-			foreach ($this->failed as $uid => $paths) {
106
-				$this->output->writeln('    ' . $uid);
107
-			}
108
-			$this->output->writeln('');
109
-		}
110
-
111
-		return true;
112
-	}
113
-
114
-	/**
115
-	 * prepare encryption modules to perform the decrypt all function
116
-	 *
117
-	 * @param $user
118
-	 * @return bool
119
-	 */
120
-	protected function prepareEncryptionModules($user) {
121
-		// prepare all encryption modules for decrypt all
122
-		$encryptionModules = $this->encryptionManager->getEncryptionModules();
123
-		foreach ($encryptionModules as $moduleDesc) {
124
-			/** @var IEncryptionModule $module */
125
-			$module = call_user_func($moduleDesc['callback']);
126
-			$this->output->writeln('');
127
-			$this->output->writeln('Prepare "' . $module->getDisplayName() . '"');
128
-			$this->output->writeln('');
129
-			if ($module->prepareDecryptAll($this->input, $this->output, $user) === false) {
130
-				$this->output->writeln('Module "' . $moduleDesc['displayName'] . '" does not support the functionality to decrypt all files again or the initialization of the module failed!');
131
-				return false;
132
-			}
133
-		}
134
-
135
-		return true;
136
-	}
137
-
138
-	/**
139
-	 * iterate over all user and encrypt their files
140
-	 *
141
-	 * @param string $user which users files should be decrypted, default = all users
142
-	 */
143
-	protected function decryptAllUsersFiles($user = '') {
144
-
145
-		$this->output->writeln("\n");
146
-
147
-		$userList = [];
148
-		if ($user === '') {
149
-
150
-			$fetchUsersProgress = new ProgressBar($this->output);
151
-			$fetchUsersProgress->setFormat(" %message% \n [%bar%]");
152
-			$fetchUsersProgress->start();
153
-			$fetchUsersProgress->setMessage("Fetch list of users...");
154
-			$fetchUsersProgress->advance();
155
-
156
-			foreach ($this->userManager->getBackends() as $backend) {
157
-				$limit = 500;
158
-				$offset = 0;
159
-				do {
160
-					$users = $backend->getUsers('', $limit, $offset);
161
-					foreach ($users as $user) {
162
-						$userList[] = $user;
163
-					}
164
-					$offset += $limit;
165
-					$fetchUsersProgress->advance();
166
-				} while (count($users) >= $limit);
167
-				$fetchUsersProgress->setMessage("Fetch list of users... finished");
168
-				$fetchUsersProgress->finish();
169
-			}
170
-		} else {
171
-			$userList[] = $user;
172
-		}
173
-
174
-		$this->output->writeln("\n\n");
175
-
176
-		$progress = new ProgressBar($this->output);
177
-		$progress->setFormat(" %message% \n [%bar%]");
178
-		$progress->start();
179
-		$progress->setMessage("starting to decrypt files...");
180
-		$progress->advance();
181
-
182
-		$numberOfUsers = count($userList);
183
-		$userNo = 1;
184
-		foreach ($userList as $uid) {
185
-			$userCount = "$uid ($userNo of $numberOfUsers)";
186
-			$this->decryptUsersFiles($uid, $progress, $userCount);
187
-			$userNo++;
188
-		}
189
-
190
-		$progress->setMessage("starting to decrypt files... finished");
191
-		$progress->finish();
192
-
193
-		$this->output->writeln("\n\n");
194
-
195
-	}
196
-
197
-	/**
198
-	 * encrypt files from the given user
199
-	 *
200
-	 * @param string $uid
201
-	 * @param ProgressBar $progress
202
-	 * @param string $userCount
203
-	 */
204
-	protected function decryptUsersFiles($uid, ProgressBar $progress, $userCount) {
205
-
206
-		$this->setupUserFS($uid);
207
-		$directories = array();
208
-		$directories[] = '/' . $uid . '/files';
209
-
210
-		while ($root = array_pop($directories)) {
211
-			$content = $this->rootView->getDirectoryContent($root);
212
-			foreach ($content as $file) {
213
-				// only decrypt files owned by the user
214
-				if($file->getStorage()->instanceOfStorage('OCA\Files_Sharing\SharedStorage')) {
215
-					continue;
216
-				}
217
-				$path = $root . '/' . $file['name'];
218
-				if ($this->rootView->is_dir($path)) {
219
-					$directories[] = $path;
220
-					continue;
221
-				} else {
222
-					try {
223
-						$progress->setMessage("decrypt files for user $userCount: $path");
224
-						$progress->advance();
225
-						if ($file->isEncrypted() === false) {
226
-							$progress->setMessage("decrypt files for user $userCount: $path (already decrypted)");
227
-							$progress->advance();
228
-						} else {
229
-							if ($this->decryptFile($path) === false) {
230
-								$progress->setMessage("decrypt files for user $userCount: $path (already decrypted)");
231
-								$progress->advance();
232
-							}
233
-						}
234
-					} catch (\Exception $e) {
235
-						if (isset($this->failed[$uid])) {
236
-							$this->failed[$uid][] = $path;
237
-						} else {
238
-							$this->failed[$uid] = [$path];
239
-						}
240
-					}
241
-				}
242
-			}
243
-		}
244
-	}
245
-
246
-	/**
247
-	 * encrypt file
248
-	 *
249
-	 * @param string $path
250
-	 * @return bool
251
-	 */
252
-	protected function decryptFile($path) {
253
-
254
-		$source = $path;
255
-		$target = $path . '.decrypted.' . $this->getTimestamp();
256
-
257
-		try {
258
-			$this->rootView->copy($source, $target);
259
-			$this->rootView->rename($target, $source);
260
-		} catch (DecryptionFailedException $e) {
261
-			if ($this->rootView->file_exists($target)) {
262
-				$this->rootView->unlink($target);
263
-			}
264
-			return false;
265
-		}
266
-
267
-		return true;
268
-	}
269
-
270
-	/**
271
-	 * get current timestamp
272
-	 *
273
-	 * @return int
274
-	 */
275
-	protected function getTimestamp() {
276
-		return time();
277
-	}
278
-
279
-
280
-	/**
281
-	 * setup user file system
282
-	 *
283
-	 * @param string $uid
284
-	 */
285
-	protected function setupUserFS($uid) {
286
-		\OC_Util::tearDownFS();
287
-		\OC_Util::setupFS($uid);
288
-	}
39
+    /** @var  OutputInterface */
40
+    protected $output;
41
+
42
+    /** @var  InputInterface */
43
+    protected $input;
44
+
45
+    /** @var  Manager */
46
+    protected $encryptionManager;
47
+
48
+    /** @var IUserManager */
49
+    protected $userManager;
50
+
51
+    /** @var View */
52
+    protected $rootView;
53
+
54
+    /** @var  array files which couldn't be decrypted */
55
+    protected $failed;
56
+
57
+    /**
58
+     * @param Manager $encryptionManager
59
+     * @param IUserManager $userManager
60
+     * @param View $rootView
61
+     */
62
+    public function __construct(
63
+        Manager $encryptionManager,
64
+        IUserManager $userManager,
65
+        View $rootView
66
+    ) {
67
+        $this->encryptionManager = $encryptionManager;
68
+        $this->userManager = $userManager;
69
+        $this->rootView = $rootView;
70
+        $this->failed = [];
71
+    }
72
+
73
+    /**
74
+     * start to decrypt all files
75
+     *
76
+     * @param InputInterface $input
77
+     * @param OutputInterface $output
78
+     * @param string $user which users data folder should be decrypted, default = all users
79
+     * @return bool
80
+     * @throws \Exception
81
+     */
82
+    public function decryptAll(InputInterface $input, OutputInterface $output, $user = '') {
83
+
84
+        $this->input = $input;
85
+        $this->output = $output;
86
+
87
+        if ($user !== '' && $this->userManager->userExists($user) === false) {
88
+            $this->output->writeln('User "' . $user . '" does not exist. Please check the username and try again');
89
+            return false;
90
+        }
91
+
92
+        $this->output->writeln('prepare encryption modules...');
93
+        if ($this->prepareEncryptionModules($user) === false) {
94
+            return false;
95
+        }
96
+        $this->output->writeln(' done.');
97
+
98
+        $this->decryptAllUsersFiles($user);
99
+
100
+        if (empty($this->failed)) {
101
+            $this->output->writeln('all files could be decrypted successfully!');
102
+        } else {
103
+            $this->output->writeln('Files for following users couldn\'t be decrypted, ');
104
+            $this->output->writeln('maybe the user is not set up in a way that supports this operation: ');
105
+            foreach ($this->failed as $uid => $paths) {
106
+                $this->output->writeln('    ' . $uid);
107
+            }
108
+            $this->output->writeln('');
109
+        }
110
+
111
+        return true;
112
+    }
113
+
114
+    /**
115
+     * prepare encryption modules to perform the decrypt all function
116
+     *
117
+     * @param $user
118
+     * @return bool
119
+     */
120
+    protected function prepareEncryptionModules($user) {
121
+        // prepare all encryption modules for decrypt all
122
+        $encryptionModules = $this->encryptionManager->getEncryptionModules();
123
+        foreach ($encryptionModules as $moduleDesc) {
124
+            /** @var IEncryptionModule $module */
125
+            $module = call_user_func($moduleDesc['callback']);
126
+            $this->output->writeln('');
127
+            $this->output->writeln('Prepare "' . $module->getDisplayName() . '"');
128
+            $this->output->writeln('');
129
+            if ($module->prepareDecryptAll($this->input, $this->output, $user) === false) {
130
+                $this->output->writeln('Module "' . $moduleDesc['displayName'] . '" does not support the functionality to decrypt all files again or the initialization of the module failed!');
131
+                return false;
132
+            }
133
+        }
134
+
135
+        return true;
136
+    }
137
+
138
+    /**
139
+     * iterate over all user and encrypt their files
140
+     *
141
+     * @param string $user which users files should be decrypted, default = all users
142
+     */
143
+    protected function decryptAllUsersFiles($user = '') {
144
+
145
+        $this->output->writeln("\n");
146
+
147
+        $userList = [];
148
+        if ($user === '') {
149
+
150
+            $fetchUsersProgress = new ProgressBar($this->output);
151
+            $fetchUsersProgress->setFormat(" %message% \n [%bar%]");
152
+            $fetchUsersProgress->start();
153
+            $fetchUsersProgress->setMessage("Fetch list of users...");
154
+            $fetchUsersProgress->advance();
155
+
156
+            foreach ($this->userManager->getBackends() as $backend) {
157
+                $limit = 500;
158
+                $offset = 0;
159
+                do {
160
+                    $users = $backend->getUsers('', $limit, $offset);
161
+                    foreach ($users as $user) {
162
+                        $userList[] = $user;
163
+                    }
164
+                    $offset += $limit;
165
+                    $fetchUsersProgress->advance();
166
+                } while (count($users) >= $limit);
167
+                $fetchUsersProgress->setMessage("Fetch list of users... finished");
168
+                $fetchUsersProgress->finish();
169
+            }
170
+        } else {
171
+            $userList[] = $user;
172
+        }
173
+
174
+        $this->output->writeln("\n\n");
175
+
176
+        $progress = new ProgressBar($this->output);
177
+        $progress->setFormat(" %message% \n [%bar%]");
178
+        $progress->start();
179
+        $progress->setMessage("starting to decrypt files...");
180
+        $progress->advance();
181
+
182
+        $numberOfUsers = count($userList);
183
+        $userNo = 1;
184
+        foreach ($userList as $uid) {
185
+            $userCount = "$uid ($userNo of $numberOfUsers)";
186
+            $this->decryptUsersFiles($uid, $progress, $userCount);
187
+            $userNo++;
188
+        }
189
+
190
+        $progress->setMessage("starting to decrypt files... finished");
191
+        $progress->finish();
192
+
193
+        $this->output->writeln("\n\n");
194
+
195
+    }
196
+
197
+    /**
198
+     * encrypt files from the given user
199
+     *
200
+     * @param string $uid
201
+     * @param ProgressBar $progress
202
+     * @param string $userCount
203
+     */
204
+    protected function decryptUsersFiles($uid, ProgressBar $progress, $userCount) {
205
+
206
+        $this->setupUserFS($uid);
207
+        $directories = array();
208
+        $directories[] = '/' . $uid . '/files';
209
+
210
+        while ($root = array_pop($directories)) {
211
+            $content = $this->rootView->getDirectoryContent($root);
212
+            foreach ($content as $file) {
213
+                // only decrypt files owned by the user
214
+                if($file->getStorage()->instanceOfStorage('OCA\Files_Sharing\SharedStorage')) {
215
+                    continue;
216
+                }
217
+                $path = $root . '/' . $file['name'];
218
+                if ($this->rootView->is_dir($path)) {
219
+                    $directories[] = $path;
220
+                    continue;
221
+                } else {
222
+                    try {
223
+                        $progress->setMessage("decrypt files for user $userCount: $path");
224
+                        $progress->advance();
225
+                        if ($file->isEncrypted() === false) {
226
+                            $progress->setMessage("decrypt files for user $userCount: $path (already decrypted)");
227
+                            $progress->advance();
228
+                        } else {
229
+                            if ($this->decryptFile($path) === false) {
230
+                                $progress->setMessage("decrypt files for user $userCount: $path (already decrypted)");
231
+                                $progress->advance();
232
+                            }
233
+                        }
234
+                    } catch (\Exception $e) {
235
+                        if (isset($this->failed[$uid])) {
236
+                            $this->failed[$uid][] = $path;
237
+                        } else {
238
+                            $this->failed[$uid] = [$path];
239
+                        }
240
+                    }
241
+                }
242
+            }
243
+        }
244
+    }
245
+
246
+    /**
247
+     * encrypt file
248
+     *
249
+     * @param string $path
250
+     * @return bool
251
+     */
252
+    protected function decryptFile($path) {
253
+
254
+        $source = $path;
255
+        $target = $path . '.decrypted.' . $this->getTimestamp();
256
+
257
+        try {
258
+            $this->rootView->copy($source, $target);
259
+            $this->rootView->rename($target, $source);
260
+        } catch (DecryptionFailedException $e) {
261
+            if ($this->rootView->file_exists($target)) {
262
+                $this->rootView->unlink($target);
263
+            }
264
+            return false;
265
+        }
266
+
267
+        return true;
268
+    }
269
+
270
+    /**
271
+     * get current timestamp
272
+     *
273
+     * @return int
274
+     */
275
+    protected function getTimestamp() {
276
+        return time();
277
+    }
278
+
279
+
280
+    /**
281
+     * setup user file system
282
+     *
283
+     * @param string $uid
284
+     */
285
+    protected function setupUserFS($uid) {
286
+        \OC_Util::tearDownFS();
287
+        \OC_Util::setupFS($uid);
288
+    }
289 289
 
290 290
 }
Please login to merge, or discard this patch.
Spacing   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -85,7 +85,7 @@  discard block
 block discarded – undo
85 85
 		$this->output = $output;
86 86
 
87 87
 		if ($user !== '' && $this->userManager->userExists($user) === false) {
88
-			$this->output->writeln('User "' . $user . '" does not exist. Please check the username and try again');
88
+			$this->output->writeln('User "'.$user.'" does not exist. Please check the username and try again');
89 89
 			return false;
90 90
 		}
91 91
 
@@ -103,7 +103,7 @@  discard block
 block discarded – undo
103 103
 			$this->output->writeln('Files for following users couldn\'t be decrypted, ');
104 104
 			$this->output->writeln('maybe the user is not set up in a way that supports this operation: ');
105 105
 			foreach ($this->failed as $uid => $paths) {
106
-				$this->output->writeln('    ' . $uid);
106
+				$this->output->writeln('    '.$uid);
107 107
 			}
108 108
 			$this->output->writeln('');
109 109
 		}
@@ -124,10 +124,10 @@  discard block
 block discarded – undo
124 124
 			/** @var IEncryptionModule $module */
125 125
 			$module = call_user_func($moduleDesc['callback']);
126 126
 			$this->output->writeln('');
127
-			$this->output->writeln('Prepare "' . $module->getDisplayName() . '"');
127
+			$this->output->writeln('Prepare "'.$module->getDisplayName().'"');
128 128
 			$this->output->writeln('');
129 129
 			if ($module->prepareDecryptAll($this->input, $this->output, $user) === false) {
130
-				$this->output->writeln('Module "' . $moduleDesc['displayName'] . '" does not support the functionality to decrypt all files again or the initialization of the module failed!');
130
+				$this->output->writeln('Module "'.$moduleDesc['displayName'].'" does not support the functionality to decrypt all files again or the initialization of the module failed!');
131 131
 				return false;
132 132
 			}
133 133
 		}
@@ -205,16 +205,16 @@  discard block
 block discarded – undo
205 205
 
206 206
 		$this->setupUserFS($uid);
207 207
 		$directories = array();
208
-		$directories[] = '/' . $uid . '/files';
208
+		$directories[] = '/'.$uid.'/files';
209 209
 
210 210
 		while ($root = array_pop($directories)) {
211 211
 			$content = $this->rootView->getDirectoryContent($root);
212 212
 			foreach ($content as $file) {
213 213
 				// only decrypt files owned by the user
214
-				if($file->getStorage()->instanceOfStorage('OCA\Files_Sharing\SharedStorage')) {
214
+				if ($file->getStorage()->instanceOfStorage('OCA\Files_Sharing\SharedStorage')) {
215 215
 					continue;
216 216
 				}
217
-				$path = $root . '/' . $file['name'];
217
+				$path = $root.'/'.$file['name'];
218 218
 				if ($this->rootView->is_dir($path)) {
219 219
 					$directories[] = $path;
220 220
 					continue;
@@ -252,7 +252,7 @@  discard block
 block discarded – undo
252 252
 	protected function decryptFile($path) {
253 253
 
254 254
 		$source = $path;
255
-		$target = $path . '.decrypted.' . $this->getTimestamp();
255
+		$target = $path.'.decrypted.'.$this->getTimestamp();
256 256
 
257 257
 		try {
258 258
 			$this->rootView->copy($source, $target);
Please login to merge, or discard this patch.
lib/private/Encryption/File.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -58,7 +58,7 @@
 block discarded – undo
58 58
 		// always add owner to the list of users with access to the file
59 59
 		$userIds = array($owner);
60 60
 
61
-		if (!$this->util->isFile($owner . '/' . $ownerPath)) {
61
+		if (!$this->util->isFile($owner.'/'.$ownerPath)) {
62 62
 			return array('users' => $userIds, 'public' => false);
63 63
 		}
64 64
 
Please login to merge, or discard this patch.
Indentation   +90 added lines, -90 removed lines patch added patch discarded remove patch
@@ -31,95 +31,95 @@
 block discarded – undo
31 31
 
32 32
 class File implements \OCP\Encryption\IFile {
33 33
 
34
-	/** @var Util */
35
-	protected $util;
36
-
37
-	/** @var IRootFolder */
38
-	private $rootFolder;
39
-
40
-	/** @var IManager */
41
-	private $shareManager;
42
-
43
-	/**
44
-	 * cache results of already checked folders
45
-	 *
46
-	 * @var array
47
-	 */
48
-	protected $cache;
49
-
50
-	public function __construct(Util $util,
51
-								IRootFolder $rootFolder,
52
-								IManager $shareManager) {
53
-		$this->util = $util;
54
-		$this->cache = new CappedMemoryCache();
55
-		$this->rootFolder = $rootFolder;
56
-		$this->shareManager = $shareManager;
57
-	}
58
-
59
-
60
-	/**
61
-	 * get list of users with access to the file
62
-	 *
63
-	 * @param string $path to the file
64
-	 * @return array  ['users' => $uniqueUserIds, 'public' => $public]
65
-	 */
66
-	public function getAccessList($path) {
67
-
68
-		// Make sure that a share key is generated for the owner too
69
-		list($owner, $ownerPath) = $this->util->getUidAndFilename($path);
70
-
71
-		// always add owner to the list of users with access to the file
72
-		$userIds = array($owner);
73
-
74
-		if (!$this->util->isFile($owner . '/' . $ownerPath)) {
75
-			return array('users' => $userIds, 'public' => false);
76
-		}
77
-
78
-		$ownerPath = substr($ownerPath, strlen('/files'));
79
-		$userFolder = $this->rootFolder->getUserFolder($owner);
80
-		try {
81
-			$file = $userFolder->get($ownerPath);
82
-		} catch (NotFoundException $e) {
83
-			$file = null;
84
-		}
85
-		$ownerPath = $this->util->stripPartialFileExtension($ownerPath);
86
-
87
-		// first get the shares for the parent and cache the result so that we don't
88
-		// need to check all parents for every file
89
-		$parent = dirname($ownerPath);
90
-		$parentNode = $userFolder->get($parent);
91
-		if (isset($this->cache[$parent])) {
92
-			$resultForParents = $this->cache[$parent];
93
-		} else {
94
-			$resultForParents = $this->shareManager->getAccessList($parentNode);
95
-			$this->cache[$parent] = $resultForParents;
96
-		}
97
-		$userIds = array_merge($userIds, $resultForParents['users']);
98
-		$public = $resultForParents['public'] || $resultForParents['remote'];
99
-
100
-
101
-		// Find out who, if anyone, is sharing the file
102
-		if ($file !== null) {
103
-			$resultForFile = $this->shareManager->getAccessList($file, false);
104
-			$userIds = array_merge($userIds, $resultForFile['users']);
105
-			$public = $resultForFile['public'] || $resultForFile['remote'] || $public;
106
-		}
107
-
108
-		// check if it is a group mount
109
-		if (\OCP\App::isEnabled("files_external")) {
110
-			$mounts = \OC_Mount_Config::getSystemMountPoints();
111
-			foreach ($mounts as $mount) {
112
-				if ($mount['mountpoint'] == substr($ownerPath, 1, strlen($mount['mountpoint']))) {
113
-					$mountedFor = $this->util->getUserWithAccessToMountPoint($mount['applicable']['users'], $mount['applicable']['groups']);
114
-					$userIds = array_merge($userIds, $mountedFor);
115
-				}
116
-			}
117
-		}
118
-
119
-		// Remove duplicate UIDs
120
-		$uniqueUserIds = array_unique($userIds);
121
-
122
-		return array('users' => $uniqueUserIds, 'public' => $public);
123
-	}
34
+    /** @var Util */
35
+    protected $util;
36
+
37
+    /** @var IRootFolder */
38
+    private $rootFolder;
39
+
40
+    /** @var IManager */
41
+    private $shareManager;
42
+
43
+    /**
44
+     * cache results of already checked folders
45
+     *
46
+     * @var array
47
+     */
48
+    protected $cache;
49
+
50
+    public function __construct(Util $util,
51
+                                IRootFolder $rootFolder,
52
+                                IManager $shareManager) {
53
+        $this->util = $util;
54
+        $this->cache = new CappedMemoryCache();
55
+        $this->rootFolder = $rootFolder;
56
+        $this->shareManager = $shareManager;
57
+    }
58
+
59
+
60
+    /**
61
+     * get list of users with access to the file
62
+     *
63
+     * @param string $path to the file
64
+     * @return array  ['users' => $uniqueUserIds, 'public' => $public]
65
+     */
66
+    public function getAccessList($path) {
67
+
68
+        // Make sure that a share key is generated for the owner too
69
+        list($owner, $ownerPath) = $this->util->getUidAndFilename($path);
70
+
71
+        // always add owner to the list of users with access to the file
72
+        $userIds = array($owner);
73
+
74
+        if (!$this->util->isFile($owner . '/' . $ownerPath)) {
75
+            return array('users' => $userIds, 'public' => false);
76
+        }
77
+
78
+        $ownerPath = substr($ownerPath, strlen('/files'));
79
+        $userFolder = $this->rootFolder->getUserFolder($owner);
80
+        try {
81
+            $file = $userFolder->get($ownerPath);
82
+        } catch (NotFoundException $e) {
83
+            $file = null;
84
+        }
85
+        $ownerPath = $this->util->stripPartialFileExtension($ownerPath);
86
+
87
+        // first get the shares for the parent and cache the result so that we don't
88
+        // need to check all parents for every file
89
+        $parent = dirname($ownerPath);
90
+        $parentNode = $userFolder->get($parent);
91
+        if (isset($this->cache[$parent])) {
92
+            $resultForParents = $this->cache[$parent];
93
+        } else {
94
+            $resultForParents = $this->shareManager->getAccessList($parentNode);
95
+            $this->cache[$parent] = $resultForParents;
96
+        }
97
+        $userIds = array_merge($userIds, $resultForParents['users']);
98
+        $public = $resultForParents['public'] || $resultForParents['remote'];
99
+
100
+
101
+        // Find out who, if anyone, is sharing the file
102
+        if ($file !== null) {
103
+            $resultForFile = $this->shareManager->getAccessList($file, false);
104
+            $userIds = array_merge($userIds, $resultForFile['users']);
105
+            $public = $resultForFile['public'] || $resultForFile['remote'] || $public;
106
+        }
107
+
108
+        // check if it is a group mount
109
+        if (\OCP\App::isEnabled("files_external")) {
110
+            $mounts = \OC_Mount_Config::getSystemMountPoints();
111
+            foreach ($mounts as $mount) {
112
+                if ($mount['mountpoint'] == substr($ownerPath, 1, strlen($mount['mountpoint']))) {
113
+                    $mountedFor = $this->util->getUserWithAccessToMountPoint($mount['applicable']['users'], $mount['applicable']['groups']);
114
+                    $userIds = array_merge($userIds, $mountedFor);
115
+                }
116
+            }
117
+        }
118
+
119
+        // Remove duplicate UIDs
120
+        $uniqueUserIds = array_unique($userIds);
121
+
122
+        return array('users' => $uniqueUserIds, 'public' => $public);
123
+    }
124 124
 
125 125
 }
Please login to merge, or discard this patch.