Passed
Push — master ( 4e9cd2...bc8d14 )
by Roeland
19:16 queued 09:49
created
lib/private/Share20/Share.php 2 patches
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -86,10 +86,10 @@  discard block
 block discarded – undo
86 86
 	 */
87 87
 	public function setId($id) {
88 88
 		if (is_int($id)) {
89
-			$id = (string)$id;
89
+			$id = (string) $id;
90 90
 		}
91 91
 
92
-		if(!is_string($id)) {
92
+		if (!is_string($id)) {
93 93
 			throw new \InvalidArgumentException('String expected.');
94 94
 		}
95 95
 
@@ -115,14 +115,14 @@  discard block
 block discarded – undo
115 115
 		if ($this->providerId === null || $this->id === null) {
116 116
 			throw new \UnexpectedValueException;
117 117
 		}
118
-		return $this->providerId . ':' . $this->id;
118
+		return $this->providerId.':'.$this->id;
119 119
 	}
120 120
 
121 121
 	/**
122 122
 	 * @inheritdoc
123 123
 	 */
124 124
 	public function setProviderId($id) {
125
-		if(!is_string($id)) {
125
+		if (!is_string($id)) {
126 126
 			throw new \InvalidArgumentException('String expected.');
127 127
 		}
128 128
 
@@ -156,7 +156,7 @@  discard block
 block discarded – undo
156 156
 
157 157
 			// for federated shares the owner can be a remote user, in this
158 158
 			// case we use the initiator
159
-			if($this->userManager->userExists($this->shareOwner)) {
159
+			if ($this->userManager->userExists($this->shareOwner)) {
160 160
 				$userFolder = $this->rootFolder->getUserFolder($this->shareOwner);
161 161
 			} else {
162 162
 				$userFolder = $this->rootFolder->getUserFolder($this->sharedBy);
@@ -164,7 +164,7 @@  discard block
 block discarded – undo
164 164
 
165 165
 			$nodes = $userFolder->getById($this->fileId);
166 166
 			if (empty($nodes)) {
167
-				throw new NotFoundException('Node for share not found, fileid: ' . $this->fileId);
167
+				throw new NotFoundException('Node for share not found, fileid: '.$this->fileId);
168 168
 			}
169 169
 
170 170
 			$this->node = $nodes[0];
Please login to merge, or discard this patch.
Indentation   +535 added lines, -535 removed lines patch added patch discarded remove patch
@@ -34,539 +34,539 @@
 block discarded – undo
34 34
 
35 35
 class Share implements \OCP\Share\IShare {
36 36
 
37
-	/** @var string */
38
-	private $id;
39
-	/** @var string */
40
-	private $providerId;
41
-	/** @var Node */
42
-	private $node;
43
-	/** @var int */
44
-	private $fileId;
45
-	/** @var string */
46
-	private $nodeType;
47
-	/** @var int */
48
-	private $shareType;
49
-	/** @var string */
50
-	private $sharedWith;
51
-	/** @var string */
52
-	private $sharedWithDisplayName;
53
-	/** @var string */
54
-	private $sharedWithAvatar;
55
-	/** @var string */
56
-	private $sharedBy;
57
-	/** @var string */
58
-	private $shareOwner;
59
-	/** @var int */
60
-	private $permissions;
61
-	/** @var int */
62
-	private $status;
63
-	/** @var string */
64
-	private $note = '';
65
-	/** @var \DateTime */
66
-	private $expireDate;
67
-	/** @var string */
68
-	private $password;
69
-	/** @var bool */
70
-	private $sendPasswordByTalk = false;
71
-	/** @var string */
72
-	private $token;
73
-	/** @var int */
74
-	private $parent;
75
-	/** @var string */
76
-	private $target;
77
-	/** @var \DateTime */
78
-	private $shareTime;
79
-	/** @var bool */
80
-	private $mailSend;
81
-	/** @var string */
82
-	private $label = '';
83
-
84
-	/** @var IRootFolder */
85
-	private $rootFolder;
86
-
87
-	/** @var IUserManager */
88
-	private $userManager;
89
-
90
-	/** @var ICacheEntry|null */
91
-	private $nodeCacheEntry;
92
-
93
-	/** @var bool */
94
-	private $hideDownload = false;
95
-
96
-	public function __construct(IRootFolder $rootFolder, IUserManager $userManager) {
97
-		$this->rootFolder = $rootFolder;
98
-		$this->userManager = $userManager;
99
-	}
100
-
101
-	/**
102
-	 * @inheritdoc
103
-	 */
104
-	public function setId($id) {
105
-		if (is_int($id)) {
106
-			$id = (string)$id;
107
-		}
108
-
109
-		if(!is_string($id)) {
110
-			throw new \InvalidArgumentException('String expected.');
111
-		}
112
-
113
-		if ($this->id !== null) {
114
-			throw new IllegalIDChangeException('Not allowed to assign a new internal id to a share');
115
-		}
116
-
117
-		$this->id = trim($id);
118
-		return $this;
119
-	}
120
-
121
-	/**
122
-	 * @inheritdoc
123
-	 */
124
-	public function getId() {
125
-		return $this->id;
126
-	}
127
-
128
-	/**
129
-	 * @inheritdoc
130
-	 */
131
-	public function getFullId() {
132
-		if ($this->providerId === null || $this->id === null) {
133
-			throw new \UnexpectedValueException;
134
-		}
135
-		return $this->providerId . ':' . $this->id;
136
-	}
137
-
138
-	/**
139
-	 * @inheritdoc
140
-	 */
141
-	public function setProviderId($id) {
142
-		if(!is_string($id)) {
143
-			throw new \InvalidArgumentException('String expected.');
144
-		}
145
-
146
-		if ($this->providerId !== null) {
147
-			throw new IllegalIDChangeException('Not allowed to assign a new provider id to a share');
148
-		}
149
-
150
-		$this->providerId = trim($id);
151
-		return $this;
152
-	}
153
-
154
-	/**
155
-	 * @inheritdoc
156
-	 */
157
-	public function setNode(Node $node) {
158
-		$this->fileId = null;
159
-		$this->nodeType = null;
160
-		$this->node = $node;
161
-		return $this;
162
-	}
163
-
164
-	/**
165
-	 * @inheritdoc
166
-	 */
167
-	public function getNode() {
168
-		if ($this->node === null) {
169
-
170
-			if ($this->shareOwner === null || $this->fileId === null) {
171
-				throw new NotFoundException();
172
-			}
173
-
174
-			// for federated shares the owner can be a remote user, in this
175
-			// case we use the initiator
176
-			if($this->userManager->userExists($this->shareOwner)) {
177
-				$userFolder = $this->rootFolder->getUserFolder($this->shareOwner);
178
-			} else {
179
-				$userFolder = $this->rootFolder->getUserFolder($this->sharedBy);
180
-			}
181
-
182
-			$nodes = $userFolder->getById($this->fileId);
183
-			if (empty($nodes)) {
184
-				throw new NotFoundException('Node for share not found, fileid: ' . $this->fileId);
185
-			}
186
-
187
-			$this->node = $nodes[0];
188
-		}
189
-
190
-		return $this->node;
191
-	}
192
-
193
-	/**
194
-	 * @inheritdoc
195
-	 */
196
-	public function setNodeId($fileId) {
197
-		$this->node = null;
198
-		$this->fileId = $fileId;
199
-		return $this;
200
-	}
201
-
202
-	/**
203
-	 * @inheritdoc
204
-	 */
205
-	public function getNodeId() {
206
-		if ($this->fileId === null) {
207
-			$this->fileId = $this->getNode()->getId();
208
-		}
209
-
210
-		return $this->fileId;
211
-	}
212
-
213
-	/**
214
-	 * @inheritdoc
215
-	 */
216
-	public function setNodeType($type) {
217
-		if ($type !== 'file' && $type !== 'folder') {
218
-			throw new \InvalidArgumentException();
219
-		}
220
-
221
-		$this->nodeType = $type;
222
-		return $this;
223
-	}
224
-
225
-	/**
226
-	 * @inheritdoc
227
-	 */
228
-	public function getNodeType() {
229
-		if ($this->nodeType === null) {
230
-			$node = $this->getNode();
231
-			$this->nodeType = $node instanceof File ? 'file' : 'folder';
232
-		}
233
-
234
-		return $this->nodeType;
235
-	}
236
-
237
-	/**
238
-	 * @inheritdoc
239
-	 */
240
-	public function setShareType($shareType) {
241
-		$this->shareType = $shareType;
242
-		return $this;
243
-	}
244
-
245
-	/**
246
-	 * @inheritdoc
247
-	 */
248
-	public function getShareType() {
249
-		return $this->shareType;
250
-	}
251
-
252
-	/**
253
-	 * @inheritdoc
254
-	 */
255
-	public function setSharedWith($sharedWith) {
256
-		if (!is_string($sharedWith)) {
257
-			throw new \InvalidArgumentException();
258
-		}
259
-		$this->sharedWith = $sharedWith;
260
-		return $this;
261
-	}
262
-
263
-	/**
264
-	 * @inheritdoc
265
-	 */
266
-	public function getSharedWith() {
267
-		return $this->sharedWith;
268
-	}
269
-
270
-	/**
271
-	 * @inheritdoc
272
-	 */
273
-	public function setSharedWithDisplayName($displayName) {
274
-		if (!is_string($displayName)) {
275
-			throw new \InvalidArgumentException();
276
-		}
277
-		$this->sharedWithDisplayName = $displayName;
278
-		return $this;
279
-	}
280
-
281
-	/**
282
-	 * @inheritdoc
283
-	 */
284
-	public function getSharedWithDisplayName() {
285
-		return $this->sharedWithDisplayName;
286
-	}
287
-
288
-	/**
289
-	 * @inheritdoc
290
-	 */
291
-	public function setSharedWithAvatar($src) {
292
-		if (!is_string($src)) {
293
-			throw new \InvalidArgumentException();
294
-		}
295
-		$this->sharedWithAvatar = $src;
296
-		return $this;
297
-	}
298
-
299
-	/**
300
-	 * @inheritdoc
301
-	 */
302
-	public function getSharedWithAvatar() {
303
-		return $this->sharedWithAvatar;
304
-	}
305
-
306
-	/**
307
-	 * @inheritdoc
308
-	 */
309
-	public function setPermissions($permissions) {
310
-		//TODO checkes
311
-
312
-		$this->permissions = $permissions;
313
-		return $this;
314
-	}
315
-
316
-	/**
317
-	 * @inheritdoc
318
-	 */
319
-	public function getPermissions() {
320
-		return $this->permissions;
321
-	}
322
-
323
-	/**
324
-	 * @inheritdoc
325
-	 */
326
-	public function setStatus(int $status): IShare {
327
-		$this->status = $status;
328
-		return $this;
329
-	}
330
-
331
-	/**
332
-	 * @inheritdoc
333
-	 */
334
-	public function getStatus(): int {
335
-		return $this->status;
336
-	}
337
-
338
-	/**
339
-	 * @inheritdoc
340
-	 */
341
-	public function setNote($note) {
342
-		$this->note = $note;
343
-		return $this;
344
-	}
345
-
346
-	/**
347
-	 * @inheritdoc
348
-	 */
349
-	public function getNote() {
350
-		if (is_string($this->note)) {
351
-			return $this->note;
352
-		}
353
-		return '';
354
-	}
355
-
356
-	/**
357
-	 * @inheritdoc
358
-	 */
359
-	public function setLabel($label) {
360
-		$this->label = $label;
361
-		return $this;
362
-	}
363
-
364
-	/**
365
-	 * @inheritdoc
366
-	 */
367
-	public function getLabel() {
368
-		return $this->label;
369
-	}
370
-
371
-	/**
372
-	 * @inheritdoc
373
-	 */
374
-	public function setExpirationDate($expireDate) {
375
-		//TODO checks
376
-
377
-		$this->expireDate = $expireDate;
378
-		return $this;
379
-	}
380
-
381
-	/**
382
-	 * @inheritdoc
383
-	 */
384
-	public function getExpirationDate() {
385
-		return $this->expireDate;
386
-	}
387
-
388
-	/**
389
-	 * @inheritdoc
390
-	 */
391
-	public function isExpired() {
392
-		return $this->getExpirationDate() !== null &&
393
-			$this->getExpirationDate() <= new \DateTime();
394
-	}
395
-
396
-	/**
397
-	 * @inheritdoc
398
-	 */
399
-	public function setSharedBy($sharedBy) {
400
-		if (!is_string($sharedBy)) {
401
-			throw new \InvalidArgumentException();
402
-		}
403
-		//TODO checks
404
-		$this->sharedBy = $sharedBy;
405
-
406
-		return $this;
407
-	}
408
-
409
-	/**
410
-	 * @inheritdoc
411
-	 */
412
-	public function getSharedBy() {
413
-		//TODO check if set
414
-		return $this->sharedBy;
415
-	}
416
-
417
-	/**
418
-	 * @inheritdoc
419
-	 */
420
-	public function setShareOwner($shareOwner) {
421
-		if (!is_string($shareOwner)) {
422
-			throw new \InvalidArgumentException();
423
-		}
424
-		//TODO checks
425
-
426
-		$this->shareOwner = $shareOwner;
427
-		return $this;
428
-	}
429
-
430
-	/**
431
-	 * @inheritdoc
432
-	 */
433
-	public function getShareOwner() {
434
-		//TODO check if set
435
-		return $this->shareOwner;
436
-	}
437
-
438
-	/**
439
-	 * @inheritdoc
440
-	 */
441
-	public function setPassword($password) {
442
-		$this->password = $password;
443
-		return $this;
444
-	}
445
-
446
-	/**
447
-	 * @inheritdoc
448
-	 */
449
-	public function getPassword() {
450
-		return $this->password;
451
-	}
452
-
453
-	/**
454
-	 * @inheritdoc
455
-	 */
456
-	public function setSendPasswordByTalk(bool $sendPasswordByTalk) {
457
-		$this->sendPasswordByTalk = $sendPasswordByTalk;
458
-		return $this;
459
-	}
460
-
461
-	/**
462
-	 * @inheritdoc
463
-	 */
464
-	public function getSendPasswordByTalk(): bool {
465
-		return $this->sendPasswordByTalk;
466
-	}
467
-
468
-	/**
469
-	 * @inheritdoc
470
-	 */
471
-	public function setToken($token) {
472
-		$this->token = $token;
473
-		return $this;
474
-	}
475
-
476
-	/**
477
-	 * @inheritdoc
478
-	 */
479
-	public function getToken() {
480
-		return $this->token;
481
-	}
482
-
483
-	/**
484
-	 * Set the parent of this share
485
-	 *
486
-	 * @param int parent
487
-	 * @return \OCP\Share\IShare
488
-	 * @deprecated The new shares do not have parents. This is just here for legacy reasons.
489
-	 */
490
-	public function setParent($parent) {
491
-		$this->parent = $parent;
492
-		return $this;
493
-	}
494
-
495
-	/**
496
-	 * Get the parent of this share.
497
-	 *
498
-	 * @return int
499
-	 * @deprecated The new shares do not have parents. This is just here for legacy reasons.
500
-	 */
501
-	public function getParent() {
502
-		return $this->parent;
503
-	}
504
-
505
-	/**
506
-	 * @inheritdoc
507
-	 */
508
-	public function setTarget($target) {
509
-		$this->target = $target;
510
-		return $this;
511
-	}
512
-
513
-	/**
514
-	 * @inheritdoc
515
-	 */
516
-	public function getTarget() {
517
-		return $this->target;
518
-	}
519
-
520
-	/**
521
-	 * @inheritdoc
522
-	 */
523
-	public function setShareTime(\DateTime $shareTime) {
524
-		$this->shareTime = $shareTime;
525
-		return $this;
526
-	}
527
-
528
-	/**
529
-	 * @inheritdoc
530
-	 */
531
-	public function getShareTime() {
532
-		return $this->shareTime;
533
-	}
534
-
535
-	/**
536
-	 * @inheritdoc
537
-	 */
538
-	public function setMailSend($mailSend) {
539
-		$this->mailSend = $mailSend;
540
-		return $this;
541
-	}
542
-
543
-	/**
544
-	 * @inheritdoc
545
-	 */
546
-	public function getMailSend() {
547
-		return $this->mailSend;
548
-	}
549
-
550
-	/**
551
-	 * @inheritdoc
552
-	 */
553
-	public function setNodeCacheEntry(ICacheEntry $entry) {
554
-		$this->nodeCacheEntry = $entry;
555
-	}
556
-
557
-	/**
558
-	 * @inheritdoc
559
-	 */
560
-	public function getNodeCacheEntry() {
561
-		return $this->nodeCacheEntry;
562
-	}
563
-
564
-	public function setHideDownload(bool $hide): IShare {
565
-		$this->hideDownload = $hide;
566
-		return $this;
567
-	}
568
-
569
-	public function getHideDownload(): bool {
570
-		return $this->hideDownload;
571
-	}
37
+    /** @var string */
38
+    private $id;
39
+    /** @var string */
40
+    private $providerId;
41
+    /** @var Node */
42
+    private $node;
43
+    /** @var int */
44
+    private $fileId;
45
+    /** @var string */
46
+    private $nodeType;
47
+    /** @var int */
48
+    private $shareType;
49
+    /** @var string */
50
+    private $sharedWith;
51
+    /** @var string */
52
+    private $sharedWithDisplayName;
53
+    /** @var string */
54
+    private $sharedWithAvatar;
55
+    /** @var string */
56
+    private $sharedBy;
57
+    /** @var string */
58
+    private $shareOwner;
59
+    /** @var int */
60
+    private $permissions;
61
+    /** @var int */
62
+    private $status;
63
+    /** @var string */
64
+    private $note = '';
65
+    /** @var \DateTime */
66
+    private $expireDate;
67
+    /** @var string */
68
+    private $password;
69
+    /** @var bool */
70
+    private $sendPasswordByTalk = false;
71
+    /** @var string */
72
+    private $token;
73
+    /** @var int */
74
+    private $parent;
75
+    /** @var string */
76
+    private $target;
77
+    /** @var \DateTime */
78
+    private $shareTime;
79
+    /** @var bool */
80
+    private $mailSend;
81
+    /** @var string */
82
+    private $label = '';
83
+
84
+    /** @var IRootFolder */
85
+    private $rootFolder;
86
+
87
+    /** @var IUserManager */
88
+    private $userManager;
89
+
90
+    /** @var ICacheEntry|null */
91
+    private $nodeCacheEntry;
92
+
93
+    /** @var bool */
94
+    private $hideDownload = false;
95
+
96
+    public function __construct(IRootFolder $rootFolder, IUserManager $userManager) {
97
+        $this->rootFolder = $rootFolder;
98
+        $this->userManager = $userManager;
99
+    }
100
+
101
+    /**
102
+     * @inheritdoc
103
+     */
104
+    public function setId($id) {
105
+        if (is_int($id)) {
106
+            $id = (string)$id;
107
+        }
108
+
109
+        if(!is_string($id)) {
110
+            throw new \InvalidArgumentException('String expected.');
111
+        }
112
+
113
+        if ($this->id !== null) {
114
+            throw new IllegalIDChangeException('Not allowed to assign a new internal id to a share');
115
+        }
116
+
117
+        $this->id = trim($id);
118
+        return $this;
119
+    }
120
+
121
+    /**
122
+     * @inheritdoc
123
+     */
124
+    public function getId() {
125
+        return $this->id;
126
+    }
127
+
128
+    /**
129
+     * @inheritdoc
130
+     */
131
+    public function getFullId() {
132
+        if ($this->providerId === null || $this->id === null) {
133
+            throw new \UnexpectedValueException;
134
+        }
135
+        return $this->providerId . ':' . $this->id;
136
+    }
137
+
138
+    /**
139
+     * @inheritdoc
140
+     */
141
+    public function setProviderId($id) {
142
+        if(!is_string($id)) {
143
+            throw new \InvalidArgumentException('String expected.');
144
+        }
145
+
146
+        if ($this->providerId !== null) {
147
+            throw new IllegalIDChangeException('Not allowed to assign a new provider id to a share');
148
+        }
149
+
150
+        $this->providerId = trim($id);
151
+        return $this;
152
+    }
153
+
154
+    /**
155
+     * @inheritdoc
156
+     */
157
+    public function setNode(Node $node) {
158
+        $this->fileId = null;
159
+        $this->nodeType = null;
160
+        $this->node = $node;
161
+        return $this;
162
+    }
163
+
164
+    /**
165
+     * @inheritdoc
166
+     */
167
+    public function getNode() {
168
+        if ($this->node === null) {
169
+
170
+            if ($this->shareOwner === null || $this->fileId === null) {
171
+                throw new NotFoundException();
172
+            }
173
+
174
+            // for federated shares the owner can be a remote user, in this
175
+            // case we use the initiator
176
+            if($this->userManager->userExists($this->shareOwner)) {
177
+                $userFolder = $this->rootFolder->getUserFolder($this->shareOwner);
178
+            } else {
179
+                $userFolder = $this->rootFolder->getUserFolder($this->sharedBy);
180
+            }
181
+
182
+            $nodes = $userFolder->getById($this->fileId);
183
+            if (empty($nodes)) {
184
+                throw new NotFoundException('Node for share not found, fileid: ' . $this->fileId);
185
+            }
186
+
187
+            $this->node = $nodes[0];
188
+        }
189
+
190
+        return $this->node;
191
+    }
192
+
193
+    /**
194
+     * @inheritdoc
195
+     */
196
+    public function setNodeId($fileId) {
197
+        $this->node = null;
198
+        $this->fileId = $fileId;
199
+        return $this;
200
+    }
201
+
202
+    /**
203
+     * @inheritdoc
204
+     */
205
+    public function getNodeId() {
206
+        if ($this->fileId === null) {
207
+            $this->fileId = $this->getNode()->getId();
208
+        }
209
+
210
+        return $this->fileId;
211
+    }
212
+
213
+    /**
214
+     * @inheritdoc
215
+     */
216
+    public function setNodeType($type) {
217
+        if ($type !== 'file' && $type !== 'folder') {
218
+            throw new \InvalidArgumentException();
219
+        }
220
+
221
+        $this->nodeType = $type;
222
+        return $this;
223
+    }
224
+
225
+    /**
226
+     * @inheritdoc
227
+     */
228
+    public function getNodeType() {
229
+        if ($this->nodeType === null) {
230
+            $node = $this->getNode();
231
+            $this->nodeType = $node instanceof File ? 'file' : 'folder';
232
+        }
233
+
234
+        return $this->nodeType;
235
+    }
236
+
237
+    /**
238
+     * @inheritdoc
239
+     */
240
+    public function setShareType($shareType) {
241
+        $this->shareType = $shareType;
242
+        return $this;
243
+    }
244
+
245
+    /**
246
+     * @inheritdoc
247
+     */
248
+    public function getShareType() {
249
+        return $this->shareType;
250
+    }
251
+
252
+    /**
253
+     * @inheritdoc
254
+     */
255
+    public function setSharedWith($sharedWith) {
256
+        if (!is_string($sharedWith)) {
257
+            throw new \InvalidArgumentException();
258
+        }
259
+        $this->sharedWith = $sharedWith;
260
+        return $this;
261
+    }
262
+
263
+    /**
264
+     * @inheritdoc
265
+     */
266
+    public function getSharedWith() {
267
+        return $this->sharedWith;
268
+    }
269
+
270
+    /**
271
+     * @inheritdoc
272
+     */
273
+    public function setSharedWithDisplayName($displayName) {
274
+        if (!is_string($displayName)) {
275
+            throw new \InvalidArgumentException();
276
+        }
277
+        $this->sharedWithDisplayName = $displayName;
278
+        return $this;
279
+    }
280
+
281
+    /**
282
+     * @inheritdoc
283
+     */
284
+    public function getSharedWithDisplayName() {
285
+        return $this->sharedWithDisplayName;
286
+    }
287
+
288
+    /**
289
+     * @inheritdoc
290
+     */
291
+    public function setSharedWithAvatar($src) {
292
+        if (!is_string($src)) {
293
+            throw new \InvalidArgumentException();
294
+        }
295
+        $this->sharedWithAvatar = $src;
296
+        return $this;
297
+    }
298
+
299
+    /**
300
+     * @inheritdoc
301
+     */
302
+    public function getSharedWithAvatar() {
303
+        return $this->sharedWithAvatar;
304
+    }
305
+
306
+    /**
307
+     * @inheritdoc
308
+     */
309
+    public function setPermissions($permissions) {
310
+        //TODO checkes
311
+
312
+        $this->permissions = $permissions;
313
+        return $this;
314
+    }
315
+
316
+    /**
317
+     * @inheritdoc
318
+     */
319
+    public function getPermissions() {
320
+        return $this->permissions;
321
+    }
322
+
323
+    /**
324
+     * @inheritdoc
325
+     */
326
+    public function setStatus(int $status): IShare {
327
+        $this->status = $status;
328
+        return $this;
329
+    }
330
+
331
+    /**
332
+     * @inheritdoc
333
+     */
334
+    public function getStatus(): int {
335
+        return $this->status;
336
+    }
337
+
338
+    /**
339
+     * @inheritdoc
340
+     */
341
+    public function setNote($note) {
342
+        $this->note = $note;
343
+        return $this;
344
+    }
345
+
346
+    /**
347
+     * @inheritdoc
348
+     */
349
+    public function getNote() {
350
+        if (is_string($this->note)) {
351
+            return $this->note;
352
+        }
353
+        return '';
354
+    }
355
+
356
+    /**
357
+     * @inheritdoc
358
+     */
359
+    public function setLabel($label) {
360
+        $this->label = $label;
361
+        return $this;
362
+    }
363
+
364
+    /**
365
+     * @inheritdoc
366
+     */
367
+    public function getLabel() {
368
+        return $this->label;
369
+    }
370
+
371
+    /**
372
+     * @inheritdoc
373
+     */
374
+    public function setExpirationDate($expireDate) {
375
+        //TODO checks
376
+
377
+        $this->expireDate = $expireDate;
378
+        return $this;
379
+    }
380
+
381
+    /**
382
+     * @inheritdoc
383
+     */
384
+    public function getExpirationDate() {
385
+        return $this->expireDate;
386
+    }
387
+
388
+    /**
389
+     * @inheritdoc
390
+     */
391
+    public function isExpired() {
392
+        return $this->getExpirationDate() !== null &&
393
+            $this->getExpirationDate() <= new \DateTime();
394
+    }
395
+
396
+    /**
397
+     * @inheritdoc
398
+     */
399
+    public function setSharedBy($sharedBy) {
400
+        if (!is_string($sharedBy)) {
401
+            throw new \InvalidArgumentException();
402
+        }
403
+        //TODO checks
404
+        $this->sharedBy = $sharedBy;
405
+
406
+        return $this;
407
+    }
408
+
409
+    /**
410
+     * @inheritdoc
411
+     */
412
+    public function getSharedBy() {
413
+        //TODO check if set
414
+        return $this->sharedBy;
415
+    }
416
+
417
+    /**
418
+     * @inheritdoc
419
+     */
420
+    public function setShareOwner($shareOwner) {
421
+        if (!is_string($shareOwner)) {
422
+            throw new \InvalidArgumentException();
423
+        }
424
+        //TODO checks
425
+
426
+        $this->shareOwner = $shareOwner;
427
+        return $this;
428
+    }
429
+
430
+    /**
431
+     * @inheritdoc
432
+     */
433
+    public function getShareOwner() {
434
+        //TODO check if set
435
+        return $this->shareOwner;
436
+    }
437
+
438
+    /**
439
+     * @inheritdoc
440
+     */
441
+    public function setPassword($password) {
442
+        $this->password = $password;
443
+        return $this;
444
+    }
445
+
446
+    /**
447
+     * @inheritdoc
448
+     */
449
+    public function getPassword() {
450
+        return $this->password;
451
+    }
452
+
453
+    /**
454
+     * @inheritdoc
455
+     */
456
+    public function setSendPasswordByTalk(bool $sendPasswordByTalk) {
457
+        $this->sendPasswordByTalk = $sendPasswordByTalk;
458
+        return $this;
459
+    }
460
+
461
+    /**
462
+     * @inheritdoc
463
+     */
464
+    public function getSendPasswordByTalk(): bool {
465
+        return $this->sendPasswordByTalk;
466
+    }
467
+
468
+    /**
469
+     * @inheritdoc
470
+     */
471
+    public function setToken($token) {
472
+        $this->token = $token;
473
+        return $this;
474
+    }
475
+
476
+    /**
477
+     * @inheritdoc
478
+     */
479
+    public function getToken() {
480
+        return $this->token;
481
+    }
482
+
483
+    /**
484
+     * Set the parent of this share
485
+     *
486
+     * @param int parent
487
+     * @return \OCP\Share\IShare
488
+     * @deprecated The new shares do not have parents. This is just here for legacy reasons.
489
+     */
490
+    public function setParent($parent) {
491
+        $this->parent = $parent;
492
+        return $this;
493
+    }
494
+
495
+    /**
496
+     * Get the parent of this share.
497
+     *
498
+     * @return int
499
+     * @deprecated The new shares do not have parents. This is just here for legacy reasons.
500
+     */
501
+    public function getParent() {
502
+        return $this->parent;
503
+    }
504
+
505
+    /**
506
+     * @inheritdoc
507
+     */
508
+    public function setTarget($target) {
509
+        $this->target = $target;
510
+        return $this;
511
+    }
512
+
513
+    /**
514
+     * @inheritdoc
515
+     */
516
+    public function getTarget() {
517
+        return $this->target;
518
+    }
519
+
520
+    /**
521
+     * @inheritdoc
522
+     */
523
+    public function setShareTime(\DateTime $shareTime) {
524
+        $this->shareTime = $shareTime;
525
+        return $this;
526
+    }
527
+
528
+    /**
529
+     * @inheritdoc
530
+     */
531
+    public function getShareTime() {
532
+        return $this->shareTime;
533
+    }
534
+
535
+    /**
536
+     * @inheritdoc
537
+     */
538
+    public function setMailSend($mailSend) {
539
+        $this->mailSend = $mailSend;
540
+        return $this;
541
+    }
542
+
543
+    /**
544
+     * @inheritdoc
545
+     */
546
+    public function getMailSend() {
547
+        return $this->mailSend;
548
+    }
549
+
550
+    /**
551
+     * @inheritdoc
552
+     */
553
+    public function setNodeCacheEntry(ICacheEntry $entry) {
554
+        $this->nodeCacheEntry = $entry;
555
+    }
556
+
557
+    /**
558
+     * @inheritdoc
559
+     */
560
+    public function getNodeCacheEntry() {
561
+        return $this->nodeCacheEntry;
562
+    }
563
+
564
+    public function setHideDownload(bool $hide): IShare {
565
+        $this->hideDownload = $hide;
566
+        return $this;
567
+    }
568
+
569
+    public function getHideDownload(): bool {
570
+        return $this->hideDownload;
571
+    }
572 572
 }
Please login to merge, or discard this patch.
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   +359 added lines, -359 removed lines patch added patch discarded remove patch
@@ -39,368 +39,368 @@
 block discarded – undo
39 39
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
40 40
 
41 41
 class PreviewManager implements IPreview {
42
-	/** @var IConfig */
43
-	protected $config;
42
+    /** @var IConfig */
43
+    protected $config;
44 44
 
45
-	/** @var IRootFolder */
46
-	protected $rootFolder;
45
+    /** @var IRootFolder */
46
+    protected $rootFolder;
47 47
 
48
-	/** @var IAppData */
49
-	protected $appData;
48
+    /** @var IAppData */
49
+    protected $appData;
50 50
 
51
-	/** @var EventDispatcherInterface */
52
-	protected $eventDispatcher;
51
+    /** @var EventDispatcherInterface */
52
+    protected $eventDispatcher;
53 53
 
54
-	/** @var Generator */
55
-	private $generator;
54
+    /** @var Generator */
55
+    private $generator;
56 56
 	
57
-	/** @var GeneratorHelper */
58
-	private $helper;
59
-
60
-	/** @var bool */
61
-	protected $providerListDirty = false;
62
-
63
-	/** @var bool */
64
-	protected $registeredCoreProviders = false;
65
-
66
-	/** @var array */
67
-	protected $providers = [];
68
-
69
-	/** @var array mime type => support status */
70
-	protected $mimeTypeSupportMap = [];
71
-
72
-	/** @var array */
73
-	protected $defaultProviders;
74
-
75
-	/** @var string */
76
-	protected $userId;
77
-
78
-	/**
79
-	 * PreviewManager constructor.
80
-	 *
81
-	 * @param IConfig $config
82
-	 * @param IRootFolder $rootFolder
83
-	 * @param IAppData $appData
84
-	 * @param EventDispatcherInterface $eventDispatcher
85
-	 * @param string $userId
86
-	 */
87
-	public function __construct(IConfig $config,
88
-								IRootFolder $rootFolder,
89
-								IAppData $appData,
90
-								EventDispatcherInterface $eventDispatcher,
91
-								GeneratorHelper $helper,
92
-								$userId) {
93
-		$this->config = $config;
94
-		$this->rootFolder = $rootFolder;
95
-		$this->appData = $appData;
96
-		$this->eventDispatcher = $eventDispatcher;
97
-		$this->helper = $helper;
98
-		$this->userId = $userId;
99
-	}
100
-
101
-	/**
102
-	 * In order to improve lazy loading a closure can be registered which will be
103
-	 * called in case preview providers are actually requested
104
-	 *
105
-	 * $callable has to return an instance of \OCP\Preview\IProvider or \OCP\Preview\IProviderV2
106
-	 *
107
-	 * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider
108
-	 * @param \Closure $callable
109
-	 * @return void
110
-	 */
111
-	public function registerProvider($mimeTypeRegex, \Closure $callable) {
112
-		if (!$this->config->getSystemValue('enable_previews', true)) {
113
-			return;
114
-		}
115
-
116
-		if (!isset($this->providers[$mimeTypeRegex])) {
117
-			$this->providers[$mimeTypeRegex] = [];
118
-		}
119
-		$this->providers[$mimeTypeRegex][] = $callable;
120
-		$this->providerListDirty = true;
121
-	}
122
-
123
-	/**
124
-	 * Get all providers
125
-	 * @return array
126
-	 */
127
-	public function getProviders() {
128
-		if (!$this->config->getSystemValue('enable_previews', true)) {
129
-			return [];
130
-		}
131
-
132
-		$this->registerCoreProviders();
133
-		if ($this->providerListDirty) {
134
-			$keys = array_map('strlen', array_keys($this->providers));
135
-			array_multisort($keys, SORT_DESC, $this->providers);
136
-			$this->providerListDirty = false;
137
-		}
138
-
139
-		return $this->providers;
140
-	}
141
-
142
-	/**
143
-	 * Does the manager have any providers
144
-	 * @return bool
145
-	 */
146
-	public function hasProviders() {
147
-		$this->registerCoreProviders();
148
-		return !empty($this->providers);
149
-	}
150
-
151
-	/**
152
-	 * Returns a preview of a file
153
-	 *
154
-	 * The cache is searched first and if nothing usable was found then a preview is
155
-	 * generated by one of the providers
156
-	 *
157
-	 * @param File $file
158
-	 * @param int $width
159
-	 * @param int $height
160
-	 * @param bool $crop
161
-	 * @param string $mode
162
-	 * @param string $mimeType
163
-	 * @return ISimpleFile
164
-	 * @throws NotFoundException
165
-	 * @throws \InvalidArgumentException if the preview would be invalid (in case the original image is invalid)
166
-	 * @since 11.0.0 - \InvalidArgumentException was added in 12.0.0
167
-	 */
168
-	public function getPreview(File $file, $width = -1, $height = -1, $crop = false, $mode = IPreview::MODE_FILL, $mimeType = null) {
169
-		if ($this->generator === null) {
170
-			$this->generator = new Generator(
171
-				$this->config,
172
-				$this,
173
-				$this->appData,
174
-				new GeneratorHelper(
175
-					$this->rootFolder,
176
-					$this->config
177
-				),
178
-				$this->eventDispatcher
179
-			);
180
-		}
181
-
182
-		return $this->generator->getPreview($file, $width, $height, $crop, $mode, $mimeType);
183
-	}
184
-
185
-	/**
186
-	 * returns true if the passed mime type is supported
187
-	 *
188
-	 * @param string $mimeType
189
-	 * @return boolean
190
-	 */
191
-	public function isMimeSupported($mimeType = '*') {
192
-		if (!$this->config->getSystemValue('enable_previews', true)) {
193
-			return false;
194
-		}
195
-
196
-		if (isset($this->mimeTypeSupportMap[$mimeType])) {
197
-			return $this->mimeTypeSupportMap[$mimeType];
198
-		}
199
-
200
-		$this->registerCoreProviders();
201
-		$providerMimeTypes = array_keys($this->providers);
202
-		foreach ($providerMimeTypes as $supportedMimeType) {
203
-			if (preg_match($supportedMimeType, $mimeType)) {
204
-				$this->mimeTypeSupportMap[$mimeType] = true;
205
-				return true;
206
-			}
207
-		}
208
-		$this->mimeTypeSupportMap[$mimeType] = false;
209
-		return false;
210
-	}
211
-
212
-	/**
213
-	 * Check if a preview can be generated for a file
214
-	 *
215
-	 * @param \OCP\Files\FileInfo $file
216
-	 * @return bool
217
-	 */
218
-	public function isAvailable(\OCP\Files\FileInfo $file) {
219
-		if (!$this->config->getSystemValue('enable_previews', true)) {
220
-			return false;
221
-		}
222
-
223
-		$this->registerCoreProviders();
224
-		if (!$this->isMimeSupported($file->getMimetype())) {
225
-			return false;
226
-		}
227
-
228
-		$mount = $file->getMountPoint();
229
-		if ($mount and !$mount->getOption('previews', true)){
230
-			return false;
231
-		}
232
-
233
-		foreach ($this->providers as $supportedMimeType => $providers) {
234
-			if (preg_match($supportedMimeType, $file->getMimetype())) {
235
-				foreach ($providers as $providerClosure) {
236
-					$provider = $this->helper->getProvider($providerClosure);
237
-					if (!($provider instanceof IProviderV2)) {
238
-						continue;
239
-					}
240
-
241
-					/** @var $provider IProvider */
242
-					if ($provider->isAvailable($file)) {
243
-						return true;
244
-					}
245
-				}
246
-			}
247
-		}
248
-		return false;
249
-	}
250
-
251
-	/**
252
-	 * List of enabled default providers
253
-	 *
254
-	 * The following providers are enabled by default:
255
-	 *  - OC\Preview\PNG
256
-	 *  - OC\Preview\JPEG
257
-	 *  - OC\Preview\GIF
258
-	 *  - OC\Preview\BMP
259
-	 *  - OC\Preview\HEIC
260
-	 *  - OC\Preview\XBitmap
261
-	 *  - OC\Preview\MarkDown
262
-	 *  - OC\Preview\MP3
263
-	 *  - OC\Preview\TXT
264
-	 *
265
-	 * The following providers are disabled by default due to performance or privacy concerns:
266
-	 *  - OC\Preview\Font
267
-	 *  - OC\Preview\Illustrator
268
-	 *  - OC\Preview\Movie
269
-	 *  - OC\Preview\MSOfficeDoc
270
-	 *  - OC\Preview\MSOffice2003
271
-	 *  - OC\Preview\MSOffice2007
272
-	 *  - OC\Preview\OpenDocument
273
-	 *  - OC\Preview\PDF
274
-	 *  - OC\Preview\Photoshop
275
-	 *  - OC\Preview\Postscript
276
-	 *  - OC\Preview\StarOffice
277
-	 *  - OC\Preview\SVG
278
-	 *  - OC\Preview\TIFF
279
-	 *
280
-	 * @return array
281
-	 */
282
-	protected function getEnabledDefaultProvider() {
283
-		if ($this->defaultProviders !== null) {
284
-			return $this->defaultProviders;
285
-		}
286
-
287
-		$imageProviders = [
288
-			Preview\PNG::class,
289
-			Preview\JPEG::class,
290
-			Preview\GIF::class,
291
-			Preview\BMP::class,
292
-			Preview\HEIC::class,
293
-			Preview\XBitmap::class
294
-		];
295
-
296
-		$this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', array_merge([
297
-			Preview\MarkDown::class,
298
-			Preview\MP3::class,
299
-			Preview\TXT::class,
300
-		], $imageProviders));
301
-
302
-		if (in_array(Preview\Image::class, $this->defaultProviders)) {
303
-			$this->defaultProviders = array_merge($this->defaultProviders, $imageProviders);
304
-		}
305
-		$this->defaultProviders = array_unique($this->defaultProviders);
306
-		return $this->defaultProviders;
307
-	}
308
-
309
-	/**
310
-	 * Register the default providers (if enabled)
311
-	 *
312
-	 * @param string $class
313
-	 * @param string $mimeType
314
-	 */
315
-	protected function registerCoreProvider($class, $mimeType, $options = []) {
316
-		if (in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
317
-			$this->registerProvider($mimeType, function () use ($class, $options) {
318
-				return new $class($options);
319
-			});
320
-		}
321
-	}
322
-
323
-	/**
324
-	 * Register the default providers (if enabled)
325
-	 */
326
-	protected function registerCoreProviders() {
327
-		if ($this->registeredCoreProviders) {
328
-			return;
329
-		}
330
-		$this->registeredCoreProviders = true;
331
-
332
-		$this->registerCoreProvider(Preview\TXT::class, '/text\/plain/');
333
-		$this->registerCoreProvider(Preview\MarkDown::class, '/text\/(x-)?markdown/');
334
-		$this->registerCoreProvider(Preview\PNG::class, '/image\/png/');
335
-		$this->registerCoreProvider(Preview\JPEG::class, '/image\/jpeg/');
336
-		$this->registerCoreProvider(Preview\GIF::class, '/image\/gif/');
337
-		$this->registerCoreProvider(Preview\BMP::class, '/image\/bmp/');
338
-		$this->registerCoreProvider(Preview\XBitmap::class, '/image\/x-xbitmap/');
339
-		$this->registerCoreProvider(Preview\MP3::class, '/audio\/mpeg/');
340
-
341
-		// SVG, Office and Bitmap require imagick
342
-		if (extension_loaded('imagick')) {
343
-			$checkImagick = new \Imagick();
344
-
345
-			$imagickProviders = [
346
-				'SVG'	=> ['mimetype' => '/image\/svg\+xml/', 'class' => Preview\SVG::class],
347
-				'TIFF'	=> ['mimetype' => '/image\/tiff/', 'class' => Preview\TIFF::class],
348
-				'PDF'	=> ['mimetype' => '/application\/pdf/', 'class' => Preview\PDF::class],
349
-				'AI'	=> ['mimetype' => '/application\/illustrator/', 'class' => Preview\Illustrator::class],
350
-				'PSD'	=> ['mimetype' => '/application\/x-photoshop/', 'class' => Preview\Photoshop::class],
351
-				'EPS'	=> ['mimetype' => '/application\/postscript/', 'class' => Preview\Postscript::class],
352
-				'TTF'	=> ['mimetype' => '/application\/(?:font-sfnt|x-font$)/', 'class' => Preview\Font::class],
353
-				'HEIC'  => ['mimetype' => '/image\/hei(f|c)/', 'class' => Preview\HEIC::class],
354
-			];
355
-
356
-			foreach ($imagickProviders as $queryFormat => $provider) {
357
-				$class = $provider['class'];
358
-				if (!in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
359
-					continue;
360
-				}
361
-
362
-				if (count($checkImagick->queryFormats($queryFormat)) === 1) {
363
-					$this->registerCoreProvider($class, $provider['mimetype']);
364
-				}
365
-			}
366
-
367
-			if (count($checkImagick->queryFormats('PDF')) === 1) {
368
-				if (\OC_Helper::is_function_enabled('shell_exec')) {
369
-					$officeFound = is_string($this->config->getSystemValue('preview_libreoffice_path', null));
370
-
371
-					if (!$officeFound) {
372
-						//let's see if there is libreoffice or openoffice on this machine
373
-						$whichLibreOffice = shell_exec('command -v libreoffice');
374
-						$officeFound = !empty($whichLibreOffice);
375
-						if (!$officeFound) {
376
-							$whichOpenOffice = shell_exec('command -v openoffice');
377
-							$officeFound = !empty($whichOpenOffice);
378
-						}
379
-					}
380
-
381
-					if ($officeFound) {
382
-						$this->registerCoreProvider(Preview\MSOfficeDoc::class, '/application\/msword/');
383
-						$this->registerCoreProvider(Preview\MSOffice2003::class, '/application\/vnd.ms-.*/');
384
-						$this->registerCoreProvider(Preview\MSOffice2007::class, '/application\/vnd.openxmlformats-officedocument.*/');
385
-						$this->registerCoreProvider(Preview\OpenDocument::class, '/application\/vnd.oasis.opendocument.*/');
386
-						$this->registerCoreProvider(Preview\StarOffice::class, '/application\/vnd.sun.xml.*/');
387
-					}
388
-				}
389
-			}
390
-		}
391
-
392
-		// Video requires avconv or ffmpeg
393
-		if (in_array(Preview\Movie::class, $this->getEnabledDefaultProvider())) {
394
-			$avconvBinary = \OC_Helper::findBinaryPath('avconv');
395
-			$ffmpegBinary = $avconvBinary ? null : \OC_Helper::findBinaryPath('ffmpeg');
396
-
397
-			if ($avconvBinary || $ffmpegBinary) {
398
-				// FIXME // a bit hacky but didn't want to use subclasses
399
-				\OC\Preview\Movie::$avconvBinary = $avconvBinary;
400
-				\OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary;
401
-
402
-				$this->registerCoreProvider(Preview\Movie::class, '/video\/.*/');
403
-			}
404
-		}
405
-	}
57
+    /** @var GeneratorHelper */
58
+    private $helper;
59
+
60
+    /** @var bool */
61
+    protected $providerListDirty = false;
62
+
63
+    /** @var bool */
64
+    protected $registeredCoreProviders = false;
65
+
66
+    /** @var array */
67
+    protected $providers = [];
68
+
69
+    /** @var array mime type => support status */
70
+    protected $mimeTypeSupportMap = [];
71
+
72
+    /** @var array */
73
+    protected $defaultProviders;
74
+
75
+    /** @var string */
76
+    protected $userId;
77
+
78
+    /**
79
+     * PreviewManager constructor.
80
+     *
81
+     * @param IConfig $config
82
+     * @param IRootFolder $rootFolder
83
+     * @param IAppData $appData
84
+     * @param EventDispatcherInterface $eventDispatcher
85
+     * @param string $userId
86
+     */
87
+    public function __construct(IConfig $config,
88
+                                IRootFolder $rootFolder,
89
+                                IAppData $appData,
90
+                                EventDispatcherInterface $eventDispatcher,
91
+                                GeneratorHelper $helper,
92
+                                $userId) {
93
+        $this->config = $config;
94
+        $this->rootFolder = $rootFolder;
95
+        $this->appData = $appData;
96
+        $this->eventDispatcher = $eventDispatcher;
97
+        $this->helper = $helper;
98
+        $this->userId = $userId;
99
+    }
100
+
101
+    /**
102
+     * In order to improve lazy loading a closure can be registered which will be
103
+     * called in case preview providers are actually requested
104
+     *
105
+     * $callable has to return an instance of \OCP\Preview\IProvider or \OCP\Preview\IProviderV2
106
+     *
107
+     * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider
108
+     * @param \Closure $callable
109
+     * @return void
110
+     */
111
+    public function registerProvider($mimeTypeRegex, \Closure $callable) {
112
+        if (!$this->config->getSystemValue('enable_previews', true)) {
113
+            return;
114
+        }
115
+
116
+        if (!isset($this->providers[$mimeTypeRegex])) {
117
+            $this->providers[$mimeTypeRegex] = [];
118
+        }
119
+        $this->providers[$mimeTypeRegex][] = $callable;
120
+        $this->providerListDirty = true;
121
+    }
122
+
123
+    /**
124
+     * Get all providers
125
+     * @return array
126
+     */
127
+    public function getProviders() {
128
+        if (!$this->config->getSystemValue('enable_previews', true)) {
129
+            return [];
130
+        }
131
+
132
+        $this->registerCoreProviders();
133
+        if ($this->providerListDirty) {
134
+            $keys = array_map('strlen', array_keys($this->providers));
135
+            array_multisort($keys, SORT_DESC, $this->providers);
136
+            $this->providerListDirty = false;
137
+        }
138
+
139
+        return $this->providers;
140
+    }
141
+
142
+    /**
143
+     * Does the manager have any providers
144
+     * @return bool
145
+     */
146
+    public function hasProviders() {
147
+        $this->registerCoreProviders();
148
+        return !empty($this->providers);
149
+    }
150
+
151
+    /**
152
+     * Returns a preview of a file
153
+     *
154
+     * The cache is searched first and if nothing usable was found then a preview is
155
+     * generated by one of the providers
156
+     *
157
+     * @param File $file
158
+     * @param int $width
159
+     * @param int $height
160
+     * @param bool $crop
161
+     * @param string $mode
162
+     * @param string $mimeType
163
+     * @return ISimpleFile
164
+     * @throws NotFoundException
165
+     * @throws \InvalidArgumentException if the preview would be invalid (in case the original image is invalid)
166
+     * @since 11.0.0 - \InvalidArgumentException was added in 12.0.0
167
+     */
168
+    public function getPreview(File $file, $width = -1, $height = -1, $crop = false, $mode = IPreview::MODE_FILL, $mimeType = null) {
169
+        if ($this->generator === null) {
170
+            $this->generator = new Generator(
171
+                $this->config,
172
+                $this,
173
+                $this->appData,
174
+                new GeneratorHelper(
175
+                    $this->rootFolder,
176
+                    $this->config
177
+                ),
178
+                $this->eventDispatcher
179
+            );
180
+        }
181
+
182
+        return $this->generator->getPreview($file, $width, $height, $crop, $mode, $mimeType);
183
+    }
184
+
185
+    /**
186
+     * returns true if the passed mime type is supported
187
+     *
188
+     * @param string $mimeType
189
+     * @return boolean
190
+     */
191
+    public function isMimeSupported($mimeType = '*') {
192
+        if (!$this->config->getSystemValue('enable_previews', true)) {
193
+            return false;
194
+        }
195
+
196
+        if (isset($this->mimeTypeSupportMap[$mimeType])) {
197
+            return $this->mimeTypeSupportMap[$mimeType];
198
+        }
199
+
200
+        $this->registerCoreProviders();
201
+        $providerMimeTypes = array_keys($this->providers);
202
+        foreach ($providerMimeTypes as $supportedMimeType) {
203
+            if (preg_match($supportedMimeType, $mimeType)) {
204
+                $this->mimeTypeSupportMap[$mimeType] = true;
205
+                return true;
206
+            }
207
+        }
208
+        $this->mimeTypeSupportMap[$mimeType] = false;
209
+        return false;
210
+    }
211
+
212
+    /**
213
+     * Check if a preview can be generated for a file
214
+     *
215
+     * @param \OCP\Files\FileInfo $file
216
+     * @return bool
217
+     */
218
+    public function isAvailable(\OCP\Files\FileInfo $file) {
219
+        if (!$this->config->getSystemValue('enable_previews', true)) {
220
+            return false;
221
+        }
222
+
223
+        $this->registerCoreProviders();
224
+        if (!$this->isMimeSupported($file->getMimetype())) {
225
+            return false;
226
+        }
227
+
228
+        $mount = $file->getMountPoint();
229
+        if ($mount and !$mount->getOption('previews', true)){
230
+            return false;
231
+        }
232
+
233
+        foreach ($this->providers as $supportedMimeType => $providers) {
234
+            if (preg_match($supportedMimeType, $file->getMimetype())) {
235
+                foreach ($providers as $providerClosure) {
236
+                    $provider = $this->helper->getProvider($providerClosure);
237
+                    if (!($provider instanceof IProviderV2)) {
238
+                        continue;
239
+                    }
240
+
241
+                    /** @var $provider IProvider */
242
+                    if ($provider->isAvailable($file)) {
243
+                        return true;
244
+                    }
245
+                }
246
+            }
247
+        }
248
+        return false;
249
+    }
250
+
251
+    /**
252
+     * List of enabled default providers
253
+     *
254
+     * The following providers are enabled by default:
255
+     *  - OC\Preview\PNG
256
+     *  - OC\Preview\JPEG
257
+     *  - OC\Preview\GIF
258
+     *  - OC\Preview\BMP
259
+     *  - OC\Preview\HEIC
260
+     *  - OC\Preview\XBitmap
261
+     *  - OC\Preview\MarkDown
262
+     *  - OC\Preview\MP3
263
+     *  - OC\Preview\TXT
264
+     *
265
+     * The following providers are disabled by default due to performance or privacy concerns:
266
+     *  - OC\Preview\Font
267
+     *  - OC\Preview\Illustrator
268
+     *  - OC\Preview\Movie
269
+     *  - OC\Preview\MSOfficeDoc
270
+     *  - OC\Preview\MSOffice2003
271
+     *  - OC\Preview\MSOffice2007
272
+     *  - OC\Preview\OpenDocument
273
+     *  - OC\Preview\PDF
274
+     *  - OC\Preview\Photoshop
275
+     *  - OC\Preview\Postscript
276
+     *  - OC\Preview\StarOffice
277
+     *  - OC\Preview\SVG
278
+     *  - OC\Preview\TIFF
279
+     *
280
+     * @return array
281
+     */
282
+    protected function getEnabledDefaultProvider() {
283
+        if ($this->defaultProviders !== null) {
284
+            return $this->defaultProviders;
285
+        }
286
+
287
+        $imageProviders = [
288
+            Preview\PNG::class,
289
+            Preview\JPEG::class,
290
+            Preview\GIF::class,
291
+            Preview\BMP::class,
292
+            Preview\HEIC::class,
293
+            Preview\XBitmap::class
294
+        ];
295
+
296
+        $this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', array_merge([
297
+            Preview\MarkDown::class,
298
+            Preview\MP3::class,
299
+            Preview\TXT::class,
300
+        ], $imageProviders));
301
+
302
+        if (in_array(Preview\Image::class, $this->defaultProviders)) {
303
+            $this->defaultProviders = array_merge($this->defaultProviders, $imageProviders);
304
+        }
305
+        $this->defaultProviders = array_unique($this->defaultProviders);
306
+        return $this->defaultProviders;
307
+    }
308
+
309
+    /**
310
+     * Register the default providers (if enabled)
311
+     *
312
+     * @param string $class
313
+     * @param string $mimeType
314
+     */
315
+    protected function registerCoreProvider($class, $mimeType, $options = []) {
316
+        if (in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
317
+            $this->registerProvider($mimeType, function () use ($class, $options) {
318
+                return new $class($options);
319
+            });
320
+        }
321
+    }
322
+
323
+    /**
324
+     * Register the default providers (if enabled)
325
+     */
326
+    protected function registerCoreProviders() {
327
+        if ($this->registeredCoreProviders) {
328
+            return;
329
+        }
330
+        $this->registeredCoreProviders = true;
331
+
332
+        $this->registerCoreProvider(Preview\TXT::class, '/text\/plain/');
333
+        $this->registerCoreProvider(Preview\MarkDown::class, '/text\/(x-)?markdown/');
334
+        $this->registerCoreProvider(Preview\PNG::class, '/image\/png/');
335
+        $this->registerCoreProvider(Preview\JPEG::class, '/image\/jpeg/');
336
+        $this->registerCoreProvider(Preview\GIF::class, '/image\/gif/');
337
+        $this->registerCoreProvider(Preview\BMP::class, '/image\/bmp/');
338
+        $this->registerCoreProvider(Preview\XBitmap::class, '/image\/x-xbitmap/');
339
+        $this->registerCoreProvider(Preview\MP3::class, '/audio\/mpeg/');
340
+
341
+        // SVG, Office and Bitmap require imagick
342
+        if (extension_loaded('imagick')) {
343
+            $checkImagick = new \Imagick();
344
+
345
+            $imagickProviders = [
346
+                'SVG'	=> ['mimetype' => '/image\/svg\+xml/', 'class' => Preview\SVG::class],
347
+                'TIFF'	=> ['mimetype' => '/image\/tiff/', 'class' => Preview\TIFF::class],
348
+                'PDF'	=> ['mimetype' => '/application\/pdf/', 'class' => Preview\PDF::class],
349
+                'AI'	=> ['mimetype' => '/application\/illustrator/', 'class' => Preview\Illustrator::class],
350
+                'PSD'	=> ['mimetype' => '/application\/x-photoshop/', 'class' => Preview\Photoshop::class],
351
+                'EPS'	=> ['mimetype' => '/application\/postscript/', 'class' => Preview\Postscript::class],
352
+                'TTF'	=> ['mimetype' => '/application\/(?:font-sfnt|x-font$)/', 'class' => Preview\Font::class],
353
+                'HEIC'  => ['mimetype' => '/image\/hei(f|c)/', 'class' => Preview\HEIC::class],
354
+            ];
355
+
356
+            foreach ($imagickProviders as $queryFormat => $provider) {
357
+                $class = $provider['class'];
358
+                if (!in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) {
359
+                    continue;
360
+                }
361
+
362
+                if (count($checkImagick->queryFormats($queryFormat)) === 1) {
363
+                    $this->registerCoreProvider($class, $provider['mimetype']);
364
+                }
365
+            }
366
+
367
+            if (count($checkImagick->queryFormats('PDF')) === 1) {
368
+                if (\OC_Helper::is_function_enabled('shell_exec')) {
369
+                    $officeFound = is_string($this->config->getSystemValue('preview_libreoffice_path', null));
370
+
371
+                    if (!$officeFound) {
372
+                        //let's see if there is libreoffice or openoffice on this machine
373
+                        $whichLibreOffice = shell_exec('command -v libreoffice');
374
+                        $officeFound = !empty($whichLibreOffice);
375
+                        if (!$officeFound) {
376
+                            $whichOpenOffice = shell_exec('command -v openoffice');
377
+                            $officeFound = !empty($whichOpenOffice);
378
+                        }
379
+                    }
380
+
381
+                    if ($officeFound) {
382
+                        $this->registerCoreProvider(Preview\MSOfficeDoc::class, '/application\/msword/');
383
+                        $this->registerCoreProvider(Preview\MSOffice2003::class, '/application\/vnd.ms-.*/');
384
+                        $this->registerCoreProvider(Preview\MSOffice2007::class, '/application\/vnd.openxmlformats-officedocument.*/');
385
+                        $this->registerCoreProvider(Preview\OpenDocument::class, '/application\/vnd.oasis.opendocument.*/');
386
+                        $this->registerCoreProvider(Preview\StarOffice::class, '/application\/vnd.sun.xml.*/');
387
+                    }
388
+                }
389
+            }
390
+        }
391
+
392
+        // Video requires avconv or ffmpeg
393
+        if (in_array(Preview\Movie::class, $this->getEnabledDefaultProvider())) {
394
+            $avconvBinary = \OC_Helper::findBinaryPath('avconv');
395
+            $ffmpegBinary = $avconvBinary ? null : \OC_Helper::findBinaryPath('ffmpeg');
396
+
397
+            if ($avconvBinary || $ffmpegBinary) {
398
+                // FIXME // a bit hacky but didn't want to use subclasses
399
+                \OC\Preview\Movie::$avconvBinary = $avconvBinary;
400
+                \OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary;
401
+
402
+                $this->registerCoreProvider(Preview\Movie::class, '/video\/.*/');
403
+            }
404
+        }
405
+    }
406 406
 }
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/Keys/Storage.php 2 patches
Spacing   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -66,8 +66,8 @@  discard block
 block discarded – undo
66 66
 		$this->util = $util;
67 67
 
68 68
 		$this->encryption_base_dir = '/files_encryption';
69
-		$this->keys_base_dir = $this->encryption_base_dir .'/keys';
70
-		$this->backup_base_dir = $this->encryption_base_dir .'/backup';
69
+		$this->keys_base_dir = $this->encryption_base_dir.'/keys';
70
+		$this->backup_base_dir = $this->encryption_base_dir.'/backup';
71 71
 		$this->root_dir = $this->util->getKeyStorageRoot();
72 72
 	}
73 73
 
@@ -85,14 +85,14 @@  discard block
 block discarded – undo
85 85
 	public function getFileKey($path, $keyId, $encryptionModuleId) {
86 86
 		$realFile = $this->util->stripPartialFileExtension($path);
87 87
 		$keyDir = $this->getFileKeyDir($encryptionModuleId, $realFile);
88
-		$key = $this->getKey($keyDir . $keyId);
88
+		$key = $this->getKey($keyDir.$keyId);
89 89
 
90 90
 		if ($key === '' && $realFile !== $path) {
91 91
 			// Check if the part file has keys and use them, if no normal keys
92 92
 			// exist. This is required to fix copyBetweenStorage() when we
93 93
 			// rename a .part file over storage borders.
94 94
 			$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
95
-			$key = $this->getKey($keyDir . $keyId);
95
+			$key = $this->getKey($keyDir.$keyId);
96 96
 		}
97 97
 
98 98
 		return $key;
@@ -119,7 +119,7 @@  discard block
 block discarded – undo
119 119
 	 */
120 120
 	public function setFileKey($path, $keyId, $key, $encryptionModuleId) {
121 121
 		$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
122
-		return $this->setKey($keyDir . $keyId, $key);
122
+		return $this->setKey($keyDir.$keyId, $key);
123 123
 	}
124 124
 
125 125
 	/**
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
 	 */
144 144
 	public function deleteFileKey($path, $keyId, $encryptionModuleId) {
145 145
 		$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
146
-		return !$this->view->file_exists($keyDir . $keyId) || $this->view->unlink($keyDir . $keyId);
146
+		return !$this->view->file_exists($keyDir.$keyId) || $this->view->unlink($keyDir.$keyId);
147 147
 	}
148 148
 
149 149
 	/**
@@ -173,10 +173,10 @@  discard block
 block discarded – undo
173 173
 	protected function constructUserKeyPath($encryptionModuleId, $keyId, $uid) {
174 174
 
175 175
 		if ($uid === null) {
176
-			$path = $this->root_dir . '/' . $this->encryption_base_dir . '/' . $encryptionModuleId . '/' . $keyId;
176
+			$path = $this->root_dir.'/'.$this->encryption_base_dir.'/'.$encryptionModuleId.'/'.$keyId;
177 177
 		} else {
178
-			$path = $this->root_dir . '/' . $uid . $this->encryption_base_dir . '/'
179
-				. $encryptionModuleId . '/' . $uid . '.' . $keyId;
178
+			$path = $this->root_dir.'/'.$uid.$this->encryption_base_dir.'/'
179
+				. $encryptionModuleId.'/'.$uid.'.'.$keyId;
180 180
 		}
181 181
 
182 182
 		return \OC\Files\Filesystem::normalizePath($path);
@@ -194,7 +194,7 @@  discard block
 block discarded – undo
194 194
 
195 195
 		if ($this->view->file_exists($path)) {
196 196
 			if (isset($this->keyCache[$path])) {
197
-				$key =  $this->keyCache[$path];
197
+				$key = $this->keyCache[$path];
198 198
 			} else {
199 199
 				$key = $this->view->file_get_contents($path);
200 200
 				$this->keyCache[$path] = $key;
@@ -238,12 +238,12 @@  discard block
 block discarded – undo
238 238
 
239 239
 		// in case of system wide mount points the keys are stored directly in the data directory
240 240
 		if ($this->util->isSystemWideMountPoint($filename, $owner)) {
241
-			$keyPath = $this->root_dir . '/' . $this->keys_base_dir . $filename . '/';
241
+			$keyPath = $this->root_dir.'/'.$this->keys_base_dir.$filename.'/';
242 242
 		} else {
243
-			$keyPath = $this->root_dir . '/' . $owner . $this->keys_base_dir . $filename . '/';
243
+			$keyPath = $this->root_dir.'/'.$owner.$this->keys_base_dir.$filename.'/';
244 244
 		}
245 245
 
246
-		return Filesystem::normalizePath($keyPath . $encryptionModuleId . '/', false);
246
+		return Filesystem::normalizePath($keyPath.$encryptionModuleId.'/', false);
247 247
 	}
248 248
 
249 249
 	/**
@@ -300,13 +300,13 @@  discard block
 block discarded – undo
300 300
 	 * @since 12.0.0
301 301
 	 */
302 302
 	public function backupUserKeys($encryptionModuleId, $purpose, $uid) {
303
-		$source = $uid . $this->encryption_base_dir . '/' . $encryptionModuleId;
304
-		$backupDir = $uid . $this->backup_base_dir;
303
+		$source = $uid.$this->encryption_base_dir.'/'.$encryptionModuleId;
304
+		$backupDir = $uid.$this->backup_base_dir;
305 305
 		if (!$this->view->file_exists($backupDir)) {
306 306
 			$this->view->mkdir($backupDir);
307 307
 		}
308 308
 
309
-		$backupDir = $backupDir . '/' . $purpose . '.' . $encryptionModuleId . '.' . $this->getTimestamp();
309
+		$backupDir = $backupDir.'/'.$purpose.'.'.$encryptionModuleId.'.'.$this->getTimestamp();
310 310
 		$this->view->mkdir($backupDir);
311 311
 
312 312
 		return $this->view->copy($source, $backupDir);
@@ -332,9 +332,9 @@  discard block
 block discarded – undo
332 332
 		$systemWideMountPoint = $this->util->isSystemWideMountPoint($relativePath, $owner);
333 333
 
334 334
 		if ($systemWideMountPoint) {
335
-			$systemPath = $this->root_dir . '/' . $this->keys_base_dir . $relativePath . '/';
335
+			$systemPath = $this->root_dir.'/'.$this->keys_base_dir.$relativePath.'/';
336 336
 		} else {
337
-			$systemPath = $this->root_dir . '/' . $owner . $this->keys_base_dir . $relativePath . '/';
337
+			$systemPath = $this->root_dir.'/'.$owner.$this->keys_base_dir.$relativePath.'/';
338 338
 		}
339 339
 
340 340
 		return  Filesystem::normalizePath($systemPath, false);
@@ -351,7 +351,7 @@  discard block
 block discarded – undo
351 351
 			$sub_dirs = explode('/', ltrim($path, '/'));
352 352
 			$dir = '';
353 353
 			foreach ($sub_dirs as $sub_dir) {
354
-				$dir .= '/' . $sub_dir;
354
+				$dir .= '/'.$sub_dir;
355 355
 				if (!$this->view->is_dir($dir)) {
356 356
 					$this->view->mkdir($dir);
357 357
 				}
Please login to merge, or discard this patch.
Indentation   +340 added lines, -340 removed lines patch added patch discarded remove patch
@@ -32,345 +32,345 @@
 block discarded – undo
32 32
 
33 33
 class Storage implements IStorage {
34 34
 
35
-	// hidden file which indicate that the folder is a valid key storage
36
-	const KEY_STORAGE_MARKER = '.oc_key_storage';
37
-
38
-	/** @var View */
39
-	private $view;
40
-
41
-	/** @var Util */
42
-	private $util;
43
-
44
-	// base dir where all the file related keys are stored
45
-	/** @var string */
46
-	private $keys_base_dir;
47
-
48
-	// root of the key storage default is empty which means that we use the data folder
49
-	/** @var string */
50
-	private $root_dir;
51
-
52
-	/** @var string */
53
-	private $encryption_base_dir;
54
-
55
-	/** @var string */
56
-	private $backup_base_dir;
57
-
58
-	/** @var array */
59
-	private $keyCache = [];
60
-
61
-	/**
62
-	 * @param View $view
63
-	 * @param Util $util
64
-	 */
65
-	public function __construct(View $view, Util $util) {
66
-		$this->view = $view;
67
-		$this->util = $util;
68
-
69
-		$this->encryption_base_dir = '/files_encryption';
70
-		$this->keys_base_dir = $this->encryption_base_dir .'/keys';
71
-		$this->backup_base_dir = $this->encryption_base_dir .'/backup';
72
-		$this->root_dir = $this->util->getKeyStorageRoot();
73
-	}
74
-
75
-	/**
76
-	 * @inheritdoc
77
-	 */
78
-	public function getUserKey($uid, $keyId, $encryptionModuleId) {
79
-		$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
80
-		return $this->getKey($path);
81
-	}
82
-
83
-	/**
84
-	 * @inheritdoc
85
-	 */
86
-	public function getFileKey($path, $keyId, $encryptionModuleId) {
87
-		$realFile = $this->util->stripPartialFileExtension($path);
88
-		$keyDir = $this->getFileKeyDir($encryptionModuleId, $realFile);
89
-		$key = $this->getKey($keyDir . $keyId);
90
-
91
-		if ($key === '' && $realFile !== $path) {
92
-			// Check if the part file has keys and use them, if no normal keys
93
-			// exist. This is required to fix copyBetweenStorage() when we
94
-			// rename a .part file over storage borders.
95
-			$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
96
-			$key = $this->getKey($keyDir . $keyId);
97
-		}
98
-
99
-		return $key;
100
-	}
101
-
102
-	/**
103
-	 * @inheritdoc
104
-	 */
105
-	public function getSystemUserKey($keyId, $encryptionModuleId) {
106
-		$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
107
-		return $this->getKey($path);
108
-	}
109
-
110
-	/**
111
-	 * @inheritdoc
112
-	 */
113
-	public function setUserKey($uid, $keyId, $key, $encryptionModuleId) {
114
-		$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
115
-		return $this->setKey($path, $key);
116
-	}
117
-
118
-	/**
119
-	 * @inheritdoc
120
-	 */
121
-	public function setFileKey($path, $keyId, $key, $encryptionModuleId) {
122
-		$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
123
-		return $this->setKey($keyDir . $keyId, $key);
124
-	}
125
-
126
-	/**
127
-	 * @inheritdoc
128
-	 */
129
-	public function setSystemUserKey($keyId, $key, $encryptionModuleId) {
130
-		$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
131
-		return $this->setKey($path, $key);
132
-	}
133
-
134
-	/**
135
-	 * @inheritdoc
136
-	 */
137
-	public function deleteUserKey($uid, $keyId, $encryptionModuleId) {
138
-		try {
139
-			$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
140
-			return !$this->view->file_exists($path) || $this->view->unlink($path);
141
-		} catch (NoUserException $e) {
142
-			// this exception can come from initMountPoints() from setupUserMounts()
143
-			// for a deleted user.
144
-			//
145
-			// It means, that:
146
-			// - we are not running in alternative storage mode because we don't call
147
-			// initMountPoints() in that mode
148
-			// - the keys were in the user's home but since the user was deleted, the
149
-			// user's home is gone and so are the keys
150
-			//
151
-			// So there is nothing to do, just ignore.
152
-		}
153
-	}
154
-
155
-	/**
156
-	 * @inheritdoc
157
-	 */
158
-	public function deleteFileKey($path, $keyId, $encryptionModuleId) {
159
-		$keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
160
-		return !$this->view->file_exists($keyDir . $keyId) || $this->view->unlink($keyDir . $keyId);
161
-	}
162
-
163
-	/**
164
-	 * @inheritdoc
165
-	 */
166
-	public function deleteAllFileKeys($path) {
167
-		$keyDir = $this->getFileKeyDir('', $path);
168
-		return !$this->view->file_exists($keyDir) || $this->view->deleteAll($keyDir);
169
-	}
170
-
171
-	/**
172
-	 * @inheritdoc
173
-	 */
174
-	public function deleteSystemUserKey($keyId, $encryptionModuleId) {
175
-		$path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
176
-		return !$this->view->file_exists($path) || $this->view->unlink($path);
177
-	}
178
-
179
-	/**
180
-	 * construct path to users key
181
-	 *
182
-	 * @param string $encryptionModuleId
183
-	 * @param string $keyId
184
-	 * @param string $uid
185
-	 * @return string
186
-	 */
187
-	protected function constructUserKeyPath($encryptionModuleId, $keyId, $uid) {
188
-
189
-		if ($uid === null) {
190
-			$path = $this->root_dir . '/' . $this->encryption_base_dir . '/' . $encryptionModuleId . '/' . $keyId;
191
-		} else {
192
-			$path = $this->root_dir . '/' . $uid . $this->encryption_base_dir . '/'
193
-				. $encryptionModuleId . '/' . $uid . '.' . $keyId;
194
-		}
195
-
196
-		return \OC\Files\Filesystem::normalizePath($path);
197
-	}
198
-
199
-	/**
200
-	 * read key from hard disk
201
-	 *
202
-	 * @param string $path to key
203
-	 * @return string
204
-	 */
205
-	private function getKey($path) {
206
-
207
-		$key = '';
208
-
209
-		if ($this->view->file_exists($path)) {
210
-			if (isset($this->keyCache[$path])) {
211
-				$key =  $this->keyCache[$path];
212
-			} else {
213
-				$key = $this->view->file_get_contents($path);
214
-				$this->keyCache[$path] = $key;
215
-			}
216
-		}
217
-
218
-		return $key;
219
-	}
220
-
221
-	/**
222
-	 * write key to disk
223
-	 *
224
-	 *
225
-	 * @param string $path path to key directory
226
-	 * @param string $key key
227
-	 * @return bool
228
-	 */
229
-	private function setKey($path, $key) {
230
-		$this->keySetPreparation(dirname($path));
231
-
232
-		$result = $this->view->file_put_contents($path, $key);
233
-
234
-		if (is_int($result) && $result > 0) {
235
-			$this->keyCache[$path] = $key;
236
-			return true;
237
-		}
238
-
239
-		return false;
240
-	}
241
-
242
-	/**
243
-	 * get path to key folder for a given file
244
-	 *
245
-	 * @param string $encryptionModuleId
246
-	 * @param string $path path to the file, relative to data/
247
-	 * @return string
248
-	 */
249
-	private function getFileKeyDir($encryptionModuleId, $path) {
250
-
251
-		list($owner, $filename) = $this->util->getUidAndFilename($path);
252
-
253
-		// in case of system wide mount points the keys are stored directly in the data directory
254
-		if ($this->util->isSystemWideMountPoint($filename, $owner)) {
255
-			$keyPath = $this->root_dir . '/' . $this->keys_base_dir . $filename . '/';
256
-		} else {
257
-			$keyPath = $this->root_dir . '/' . $owner . $this->keys_base_dir . $filename . '/';
258
-		}
259
-
260
-		return Filesystem::normalizePath($keyPath . $encryptionModuleId . '/', false);
261
-	}
262
-
263
-	/**
264
-	 * move keys if a file was renamed
265
-	 *
266
-	 * @param string $source
267
-	 * @param string $target
268
-	 * @return boolean
269
-	 */
270
-	public function renameKeys($source, $target) {
271
-
272
-		$sourcePath = $this->getPathToKeys($source);
273
-		$targetPath = $this->getPathToKeys($target);
274
-
275
-		if ($this->view->file_exists($sourcePath)) {
276
-			$this->keySetPreparation(dirname($targetPath));
277
-			$this->view->rename($sourcePath, $targetPath);
278
-
279
-			return true;
280
-		}
281
-
282
-		return false;
283
-	}
284
-
285
-
286
-	/**
287
-	 * copy keys if a file was renamed
288
-	 *
289
-	 * @param string $source
290
-	 * @param string $target
291
-	 * @return boolean
292
-	 */
293
-	public function copyKeys($source, $target) {
294
-
295
-		$sourcePath = $this->getPathToKeys($source);
296
-		$targetPath = $this->getPathToKeys($target);
297
-
298
-		if ($this->view->file_exists($sourcePath)) {
299
-			$this->keySetPreparation(dirname($targetPath));
300
-			$this->view->copy($sourcePath, $targetPath);
301
-			return true;
302
-		}
303
-
304
-		return false;
305
-	}
306
-
307
-	/**
308
-	 * backup keys of a given encryption module
309
-	 *
310
-	 * @param string $encryptionModuleId
311
-	 * @param string $purpose
312
-	 * @param string $uid
313
-	 * @return bool
314
-	 * @since 12.0.0
315
-	 */
316
-	public function backupUserKeys($encryptionModuleId, $purpose, $uid) {
317
-		$source = $uid . $this->encryption_base_dir . '/' . $encryptionModuleId;
318
-		$backupDir = $uid . $this->backup_base_dir;
319
-		if (!$this->view->file_exists($backupDir)) {
320
-			$this->view->mkdir($backupDir);
321
-		}
322
-
323
-		$backupDir = $backupDir . '/' . $purpose . '.' . $encryptionModuleId . '.' . $this->getTimestamp();
324
-		$this->view->mkdir($backupDir);
325
-
326
-		return $this->view->copy($source, $backupDir);
327
-	}
328
-
329
-	/**
330
-	 * get the current timestamp
331
-	 *
332
-	 * @return int
333
-	 */
334
-	protected function getTimestamp() {
335
-		return time();
336
-	}
337
-
338
-	/**
339
-	 * get system wide path and detect mount points
340
-	 *
341
-	 * @param string $path
342
-	 * @return string
343
-	 */
344
-	protected function getPathToKeys($path) {
345
-		list($owner, $relativePath) = $this->util->getUidAndFilename($path);
346
-		$systemWideMountPoint = $this->util->isSystemWideMountPoint($relativePath, $owner);
347
-
348
-		if ($systemWideMountPoint) {
349
-			$systemPath = $this->root_dir . '/' . $this->keys_base_dir . $relativePath . '/';
350
-		} else {
351
-			$systemPath = $this->root_dir . '/' . $owner . $this->keys_base_dir . $relativePath . '/';
352
-		}
353
-
354
-		return  Filesystem::normalizePath($systemPath, false);
355
-	}
356
-
357
-	/**
358
-	 * Make preparations to filesystem for saving a key file
359
-	 *
360
-	 * @param string $path relative to the views root
361
-	 */
362
-	protected function keySetPreparation($path) {
363
-		// If the file resides within a subdirectory, create it
364
-		if (!$this->view->file_exists($path)) {
365
-			$sub_dirs = explode('/', ltrim($path, '/'));
366
-			$dir = '';
367
-			foreach ($sub_dirs as $sub_dir) {
368
-				$dir .= '/' . $sub_dir;
369
-				if (!$this->view->is_dir($dir)) {
370
-					$this->view->mkdir($dir);
371
-				}
372
-			}
373
-		}
374
-	}
35
+    // hidden file which indicate that the folder is a valid key storage
36
+    const KEY_STORAGE_MARKER = '.oc_key_storage';
37
+
38
+    /** @var View */
39
+    private $view;
40
+
41
+    /** @var Util */
42
+    private $util;
43
+
44
+    // base dir where all the file related keys are stored
45
+    /** @var string */
46
+    private $keys_base_dir;
47
+
48
+    // root of the key storage default is empty which means that we use the data folder
49
+    /** @var string */
50
+    private $root_dir;
51
+
52
+    /** @var string */
53
+    private $encryption_base_dir;
54
+
55
+    /** @var string */
56
+    private $backup_base_dir;
57
+
58
+    /** @var array */
59
+    private $keyCache = [];
60
+
61
+    /**
62
+     * @param View $view
63
+     * @param Util $util
64
+     */
65
+    public function __construct(View $view, Util $util) {
66
+        $this->view = $view;
67
+        $this->util = $util;
68
+
69
+        $this->encryption_base_dir = '/files_encryption';
70
+        $this->keys_base_dir = $this->encryption_base_dir .'/keys';
71
+        $this->backup_base_dir = $this->encryption_base_dir .'/backup';
72
+        $this->root_dir = $this->util->getKeyStorageRoot();
73
+    }
74
+
75
+    /**
76
+     * @inheritdoc
77
+     */
78
+    public function getUserKey($uid, $keyId, $encryptionModuleId) {
79
+        $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
80
+        return $this->getKey($path);
81
+    }
82
+
83
+    /**
84
+     * @inheritdoc
85
+     */
86
+    public function getFileKey($path, $keyId, $encryptionModuleId) {
87
+        $realFile = $this->util->stripPartialFileExtension($path);
88
+        $keyDir = $this->getFileKeyDir($encryptionModuleId, $realFile);
89
+        $key = $this->getKey($keyDir . $keyId);
90
+
91
+        if ($key === '' && $realFile !== $path) {
92
+            // Check if the part file has keys and use them, if no normal keys
93
+            // exist. This is required to fix copyBetweenStorage() when we
94
+            // rename a .part file over storage borders.
95
+            $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
96
+            $key = $this->getKey($keyDir . $keyId);
97
+        }
98
+
99
+        return $key;
100
+    }
101
+
102
+    /**
103
+     * @inheritdoc
104
+     */
105
+    public function getSystemUserKey($keyId, $encryptionModuleId) {
106
+        $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
107
+        return $this->getKey($path);
108
+    }
109
+
110
+    /**
111
+     * @inheritdoc
112
+     */
113
+    public function setUserKey($uid, $keyId, $key, $encryptionModuleId) {
114
+        $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
115
+        return $this->setKey($path, $key);
116
+    }
117
+
118
+    /**
119
+     * @inheritdoc
120
+     */
121
+    public function setFileKey($path, $keyId, $key, $encryptionModuleId) {
122
+        $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
123
+        return $this->setKey($keyDir . $keyId, $key);
124
+    }
125
+
126
+    /**
127
+     * @inheritdoc
128
+     */
129
+    public function setSystemUserKey($keyId, $key, $encryptionModuleId) {
130
+        $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
131
+        return $this->setKey($path, $key);
132
+    }
133
+
134
+    /**
135
+     * @inheritdoc
136
+     */
137
+    public function deleteUserKey($uid, $keyId, $encryptionModuleId) {
138
+        try {
139
+            $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, $uid);
140
+            return !$this->view->file_exists($path) || $this->view->unlink($path);
141
+        } catch (NoUserException $e) {
142
+            // this exception can come from initMountPoints() from setupUserMounts()
143
+            // for a deleted user.
144
+            //
145
+            // It means, that:
146
+            // - we are not running in alternative storage mode because we don't call
147
+            // initMountPoints() in that mode
148
+            // - the keys were in the user's home but since the user was deleted, the
149
+            // user's home is gone and so are the keys
150
+            //
151
+            // So there is nothing to do, just ignore.
152
+        }
153
+    }
154
+
155
+    /**
156
+     * @inheritdoc
157
+     */
158
+    public function deleteFileKey($path, $keyId, $encryptionModuleId) {
159
+        $keyDir = $this->getFileKeyDir($encryptionModuleId, $path);
160
+        return !$this->view->file_exists($keyDir . $keyId) || $this->view->unlink($keyDir . $keyId);
161
+    }
162
+
163
+    /**
164
+     * @inheritdoc
165
+     */
166
+    public function deleteAllFileKeys($path) {
167
+        $keyDir = $this->getFileKeyDir('', $path);
168
+        return !$this->view->file_exists($keyDir) || $this->view->deleteAll($keyDir);
169
+    }
170
+
171
+    /**
172
+     * @inheritdoc
173
+     */
174
+    public function deleteSystemUserKey($keyId, $encryptionModuleId) {
175
+        $path = $this->constructUserKeyPath($encryptionModuleId, $keyId, null);
176
+        return !$this->view->file_exists($path) || $this->view->unlink($path);
177
+    }
178
+
179
+    /**
180
+     * construct path to users key
181
+     *
182
+     * @param string $encryptionModuleId
183
+     * @param string $keyId
184
+     * @param string $uid
185
+     * @return string
186
+     */
187
+    protected function constructUserKeyPath($encryptionModuleId, $keyId, $uid) {
188
+
189
+        if ($uid === null) {
190
+            $path = $this->root_dir . '/' . $this->encryption_base_dir . '/' . $encryptionModuleId . '/' . $keyId;
191
+        } else {
192
+            $path = $this->root_dir . '/' . $uid . $this->encryption_base_dir . '/'
193
+                . $encryptionModuleId . '/' . $uid . '.' . $keyId;
194
+        }
195
+
196
+        return \OC\Files\Filesystem::normalizePath($path);
197
+    }
198
+
199
+    /**
200
+     * read key from hard disk
201
+     *
202
+     * @param string $path to key
203
+     * @return string
204
+     */
205
+    private function getKey($path) {
206
+
207
+        $key = '';
208
+
209
+        if ($this->view->file_exists($path)) {
210
+            if (isset($this->keyCache[$path])) {
211
+                $key =  $this->keyCache[$path];
212
+            } else {
213
+                $key = $this->view->file_get_contents($path);
214
+                $this->keyCache[$path] = $key;
215
+            }
216
+        }
217
+
218
+        return $key;
219
+    }
220
+
221
+    /**
222
+     * write key to disk
223
+     *
224
+     *
225
+     * @param string $path path to key directory
226
+     * @param string $key key
227
+     * @return bool
228
+     */
229
+    private function setKey($path, $key) {
230
+        $this->keySetPreparation(dirname($path));
231
+
232
+        $result = $this->view->file_put_contents($path, $key);
233
+
234
+        if (is_int($result) && $result > 0) {
235
+            $this->keyCache[$path] = $key;
236
+            return true;
237
+        }
238
+
239
+        return false;
240
+    }
241
+
242
+    /**
243
+     * get path to key folder for a given file
244
+     *
245
+     * @param string $encryptionModuleId
246
+     * @param string $path path to the file, relative to data/
247
+     * @return string
248
+     */
249
+    private function getFileKeyDir($encryptionModuleId, $path) {
250
+
251
+        list($owner, $filename) = $this->util->getUidAndFilename($path);
252
+
253
+        // in case of system wide mount points the keys are stored directly in the data directory
254
+        if ($this->util->isSystemWideMountPoint($filename, $owner)) {
255
+            $keyPath = $this->root_dir . '/' . $this->keys_base_dir . $filename . '/';
256
+        } else {
257
+            $keyPath = $this->root_dir . '/' . $owner . $this->keys_base_dir . $filename . '/';
258
+        }
259
+
260
+        return Filesystem::normalizePath($keyPath . $encryptionModuleId . '/', false);
261
+    }
262
+
263
+    /**
264
+     * move keys if a file was renamed
265
+     *
266
+     * @param string $source
267
+     * @param string $target
268
+     * @return boolean
269
+     */
270
+    public function renameKeys($source, $target) {
271
+
272
+        $sourcePath = $this->getPathToKeys($source);
273
+        $targetPath = $this->getPathToKeys($target);
274
+
275
+        if ($this->view->file_exists($sourcePath)) {
276
+            $this->keySetPreparation(dirname($targetPath));
277
+            $this->view->rename($sourcePath, $targetPath);
278
+
279
+            return true;
280
+        }
281
+
282
+        return false;
283
+    }
284
+
285
+
286
+    /**
287
+     * copy keys if a file was renamed
288
+     *
289
+     * @param string $source
290
+     * @param string $target
291
+     * @return boolean
292
+     */
293
+    public function copyKeys($source, $target) {
294
+
295
+        $sourcePath = $this->getPathToKeys($source);
296
+        $targetPath = $this->getPathToKeys($target);
297
+
298
+        if ($this->view->file_exists($sourcePath)) {
299
+            $this->keySetPreparation(dirname($targetPath));
300
+            $this->view->copy($sourcePath, $targetPath);
301
+            return true;
302
+        }
303
+
304
+        return false;
305
+    }
306
+
307
+    /**
308
+     * backup keys of a given encryption module
309
+     *
310
+     * @param string $encryptionModuleId
311
+     * @param string $purpose
312
+     * @param string $uid
313
+     * @return bool
314
+     * @since 12.0.0
315
+     */
316
+    public function backupUserKeys($encryptionModuleId, $purpose, $uid) {
317
+        $source = $uid . $this->encryption_base_dir . '/' . $encryptionModuleId;
318
+        $backupDir = $uid . $this->backup_base_dir;
319
+        if (!$this->view->file_exists($backupDir)) {
320
+            $this->view->mkdir($backupDir);
321
+        }
322
+
323
+        $backupDir = $backupDir . '/' . $purpose . '.' . $encryptionModuleId . '.' . $this->getTimestamp();
324
+        $this->view->mkdir($backupDir);
325
+
326
+        return $this->view->copy($source, $backupDir);
327
+    }
328
+
329
+    /**
330
+     * get the current timestamp
331
+     *
332
+     * @return int
333
+     */
334
+    protected function getTimestamp() {
335
+        return time();
336
+    }
337
+
338
+    /**
339
+     * get system wide path and detect mount points
340
+     *
341
+     * @param string $path
342
+     * @return string
343
+     */
344
+    protected function getPathToKeys($path) {
345
+        list($owner, $relativePath) = $this->util->getUidAndFilename($path);
346
+        $systemWideMountPoint = $this->util->isSystemWideMountPoint($relativePath, $owner);
347
+
348
+        if ($systemWideMountPoint) {
349
+            $systemPath = $this->root_dir . '/' . $this->keys_base_dir . $relativePath . '/';
350
+        } else {
351
+            $systemPath = $this->root_dir . '/' . $owner . $this->keys_base_dir . $relativePath . '/';
352
+        }
353
+
354
+        return  Filesystem::normalizePath($systemPath, false);
355
+    }
356
+
357
+    /**
358
+     * Make preparations to filesystem for saving a key file
359
+     *
360
+     * @param string $path relative to the views root
361
+     */
362
+    protected function keySetPreparation($path) {
363
+        // If the file resides within a subdirectory, create it
364
+        if (!$this->view->file_exists($path)) {
365
+            $sub_dirs = explode('/', ltrim($path, '/'));
366
+            $dir = '';
367
+            foreach ($sub_dirs as $sub_dir) {
368
+                $dir .= '/' . $sub_dir;
369
+                if (!$this->view->is_dir($dir)) {
370
+                    $this->view->mkdir($dir);
371
+                }
372
+            }
373
+        }
374
+    }
375 375
 
376 376
 }
Please login to merge, or discard this patch.
lib/private/Encryption/Manager.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -274,7 +274,7 @@
 block discarded – undo
274 274
 		}
275 275
 
276 276
 		// check if key storage is mounted correctly
277
-		if ($this->rootView->file_exists($rootDir . '/' . Storage::KEY_STORAGE_MARKER)) {
277
+		if ($this->rootView->file_exists($rootDir.'/'.Storage::KEY_STORAGE_MARKER)) {
278 278
 			return true;
279 279
 		}
280 280
 
Please login to merge, or discard this patch.
Indentation   +236 added lines, -236 removed lines patch added patch discarded remove patch
@@ -38,242 +38,242 @@
 block discarded – undo
38 38
 
39 39
 class Manager implements IManager {
40 40
 
41
-	/** @var array */
42
-	protected $encryptionModules;
43
-
44
-	/** @var IConfig */
45
-	protected $config;
46
-
47
-	/** @var ILogger */
48
-	protected $logger;
49
-
50
-	/** @var Il10n */
51
-	protected $l;
52
-
53
-	/** @var View  */
54
-	protected $rootView;
55
-
56
-	/** @var Util  */
57
-	protected $util;
58
-
59
-	/** @var ArrayCache  */
60
-	protected $arrayCache;
61
-
62
-	/**
63
-	 * @param IConfig $config
64
-	 * @param ILogger $logger
65
-	 * @param IL10N $l10n
66
-	 * @param View $rootView
67
-	 * @param Util $util
68
-	 * @param ArrayCache $arrayCache
69
-	 */
70
-	public function __construct(IConfig $config, ILogger $logger, IL10N $l10n, View $rootView, Util $util, ArrayCache $arrayCache) {
71
-		$this->encryptionModules = [];
72
-		$this->config = $config;
73
-		$this->logger = $logger;
74
-		$this->l = $l10n;
75
-		$this->rootView = $rootView;
76
-		$this->util = $util;
77
-		$this->arrayCache = $arrayCache;
78
-	}
79
-
80
-	/**
81
-	 * Check if encryption is enabled
82
-	 *
83
-	 * @return bool true if enabled, false if not
84
-	 */
85
-	public function isEnabled() {
86
-
87
-		$installed = $this->config->getSystemValue('installed', false);
88
-		if (!$installed) {
89
-			return false;
90
-		}
91
-
92
-		$enabled = $this->config->getAppValue('core', 'encryption_enabled', 'no');
93
-		return $enabled === 'yes';
94
-	}
95
-
96
-	/**
97
-	 * check if new encryption is ready
98
-	 *
99
-	 * @return bool
100
-	 * @throws ServiceUnavailableException
101
-	 */
102
-	public function isReady() {
103
-
104
-		if ($this->isKeyStorageReady() === false) {
105
-			throw new ServiceUnavailableException('Key Storage is not ready');
106
-		}
107
-
108
-		return true;
109
-	}
110
-
111
-	/**
112
-	 * @param string $user
113
-	 */
114
-	public function isReadyForUser($user) {
115
-		if (!$this->isReady()) {
116
-			return false;
117
-		}
118
-
119
-		foreach ($this->getEncryptionModules() as $module) {
120
-			/** @var IEncryptionModule $m */
121
-			$m = call_user_func($module['callback']);
122
-			if (!$m->isReadyForUser($user)) {
123
-				return false;
124
-			}
125
-		}
126
-
127
-		return true;
128
-	}
129
-
130
-		/**
131
-	 * Registers an callback function which must return an encryption module instance
132
-	 *
133
-	 * @param string $id
134
-	 * @param string $displayName
135
-	 * @param callable $callback
136
-	 * @throws Exceptions\ModuleAlreadyExistsException
137
-	 */
138
-	public function registerEncryptionModule($id, $displayName, callable $callback) {
139
-
140
-		if (isset($this->encryptionModules[$id])) {
141
-			throw new Exceptions\ModuleAlreadyExistsException($id, $displayName);
142
-		}
143
-
144
-		$this->encryptionModules[$id] = [
145
-			'id' => $id,
146
-			'displayName' => $displayName,
147
-			'callback' => $callback,
148
-		];
149
-
150
-		$defaultEncryptionModuleId = $this->getDefaultEncryptionModuleId();
151
-
152
-		if (empty($defaultEncryptionModuleId)) {
153
-			$this->setDefaultEncryptionModule($id);
154
-		}
155
-	}
156
-
157
-	/**
158
-	 * Unregisters an encryption module
159
-	 *
160
-	 * @param string $moduleId
161
-	 */
162
-	public function unregisterEncryptionModule($moduleId) {
163
-		unset($this->encryptionModules[$moduleId]);
164
-	}
165
-
166
-	/**
167
-	 * get a list of all encryption modules
168
-	 *
169
-	 * @return array [id => ['id' => $id, 'displayName' => $displayName, 'callback' => callback]]
170
-	 */
171
-	public function getEncryptionModules() {
172
-		return $this->encryptionModules;
173
-	}
174
-
175
-	/**
176
-	 * get a specific encryption module
177
-	 *
178
-	 * @param string $moduleId
179
-	 * @return IEncryptionModule
180
-	 * @throws Exceptions\ModuleDoesNotExistsException
181
-	 */
182
-	public function getEncryptionModule($moduleId = '') {
183
-		if (!empty($moduleId)) {
184
-			if (isset($this->encryptionModules[$moduleId])) {
185
-				return call_user_func($this->encryptionModules[$moduleId]['callback']);
186
-			} else {
187
-				$message = "Module with ID: $moduleId does not exist.";
188
-				$hint = $this->l->t('Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator.', [$moduleId]);
189
-				throw new Exceptions\ModuleDoesNotExistsException($message, $hint);
190
-			}
191
-		} else {
192
-			return $this->getDefaultEncryptionModule();
193
-		}
194
-	}
195
-
196
-	/**
197
-	 * get default encryption module
198
-	 *
199
-	 * @return \OCP\Encryption\IEncryptionModule
200
-	 * @throws Exceptions\ModuleDoesNotExistsException
201
-	 */
202
-	protected function getDefaultEncryptionModule() {
203
-		$defaultModuleId = $this->getDefaultEncryptionModuleId();
204
-		if (!empty($defaultModuleId)) {
205
-			if (isset($this->encryptionModules[$defaultModuleId])) {
206
-				return call_user_func($this->encryptionModules[$defaultModuleId]['callback']);
207
-			} else {
208
-				$message = 'Default encryption module not loaded';
209
-				throw new Exceptions\ModuleDoesNotExistsException($message);
210
-			}
211
-		} else {
212
-			$message = 'No default encryption module defined';
213
-			throw new Exceptions\ModuleDoesNotExistsException($message);
214
-		}
215
-
216
-	}
217
-
218
-	/**
219
-	 * set default encryption module Id
220
-	 *
221
-	 * @param string $moduleId
222
-	 * @return bool
223
-	 */
224
-	public function setDefaultEncryptionModule($moduleId) {
225
-		try {
226
-			$this->getEncryptionModule($moduleId);
227
-		} catch (\Exception $e) {
228
-			return false;
229
-		}
230
-
231
-		$this->config->setAppValue('core', 'default_encryption_module', $moduleId);
232
-		return true;
233
-	}
234
-
235
-	/**
236
-	 * get default encryption module Id
237
-	 *
238
-	 * @return string
239
-	 */
240
-	public function getDefaultEncryptionModuleId() {
241
-		return $this->config->getAppValue('core', 'default_encryption_module');
242
-	}
243
-
244
-	/**
245
-	 * Add storage wrapper
246
-	 */
247
-	public function setupStorage() {
248
-		// If encryption is disabled and there are no loaded modules it makes no sense to load the wrapper
249
-		if (!empty($this->encryptionModules) || $this->isEnabled()) {
250
-			$encryptionWrapper = new EncryptionWrapper($this->arrayCache, $this, $this->logger);
251
-			Filesystem::addStorageWrapper('oc_encryption', [$encryptionWrapper, 'wrapStorage'], 2);
252
-		}
253
-	}
254
-
255
-
256
-	/**
257
-	 * check if key storage is ready
258
-	 *
259
-	 * @return bool
260
-	 */
261
-	protected function isKeyStorageReady() {
262
-
263
-		$rootDir = $this->util->getKeyStorageRoot();
264
-
265
-		// the default root is always valid
266
-		if ($rootDir === '') {
267
-			return true;
268
-		}
269
-
270
-		// check if key storage is mounted correctly
271
-		if ($this->rootView->file_exists($rootDir . '/' . Storage::KEY_STORAGE_MARKER)) {
272
-			return true;
273
-		}
274
-
275
-		return false;
276
-	}
41
+    /** @var array */
42
+    protected $encryptionModules;
43
+
44
+    /** @var IConfig */
45
+    protected $config;
46
+
47
+    /** @var ILogger */
48
+    protected $logger;
49
+
50
+    /** @var Il10n */
51
+    protected $l;
52
+
53
+    /** @var View  */
54
+    protected $rootView;
55
+
56
+    /** @var Util  */
57
+    protected $util;
58
+
59
+    /** @var ArrayCache  */
60
+    protected $arrayCache;
61
+
62
+    /**
63
+     * @param IConfig $config
64
+     * @param ILogger $logger
65
+     * @param IL10N $l10n
66
+     * @param View $rootView
67
+     * @param Util $util
68
+     * @param ArrayCache $arrayCache
69
+     */
70
+    public function __construct(IConfig $config, ILogger $logger, IL10N $l10n, View $rootView, Util $util, ArrayCache $arrayCache) {
71
+        $this->encryptionModules = [];
72
+        $this->config = $config;
73
+        $this->logger = $logger;
74
+        $this->l = $l10n;
75
+        $this->rootView = $rootView;
76
+        $this->util = $util;
77
+        $this->arrayCache = $arrayCache;
78
+    }
79
+
80
+    /**
81
+     * Check if encryption is enabled
82
+     *
83
+     * @return bool true if enabled, false if not
84
+     */
85
+    public function isEnabled() {
86
+
87
+        $installed = $this->config->getSystemValue('installed', false);
88
+        if (!$installed) {
89
+            return false;
90
+        }
91
+
92
+        $enabled = $this->config->getAppValue('core', 'encryption_enabled', 'no');
93
+        return $enabled === 'yes';
94
+    }
95
+
96
+    /**
97
+     * check if new encryption is ready
98
+     *
99
+     * @return bool
100
+     * @throws ServiceUnavailableException
101
+     */
102
+    public function isReady() {
103
+
104
+        if ($this->isKeyStorageReady() === false) {
105
+            throw new ServiceUnavailableException('Key Storage is not ready');
106
+        }
107
+
108
+        return true;
109
+    }
110
+
111
+    /**
112
+     * @param string $user
113
+     */
114
+    public function isReadyForUser($user) {
115
+        if (!$this->isReady()) {
116
+            return false;
117
+        }
118
+
119
+        foreach ($this->getEncryptionModules() as $module) {
120
+            /** @var IEncryptionModule $m */
121
+            $m = call_user_func($module['callback']);
122
+            if (!$m->isReadyForUser($user)) {
123
+                return false;
124
+            }
125
+        }
126
+
127
+        return true;
128
+    }
129
+
130
+        /**
131
+         * Registers an callback function which must return an encryption module instance
132
+         *
133
+         * @param string $id
134
+         * @param string $displayName
135
+         * @param callable $callback
136
+         * @throws Exceptions\ModuleAlreadyExistsException
137
+         */
138
+    public function registerEncryptionModule($id, $displayName, callable $callback) {
139
+
140
+        if (isset($this->encryptionModules[$id])) {
141
+            throw new Exceptions\ModuleAlreadyExistsException($id, $displayName);
142
+        }
143
+
144
+        $this->encryptionModules[$id] = [
145
+            'id' => $id,
146
+            'displayName' => $displayName,
147
+            'callback' => $callback,
148
+        ];
149
+
150
+        $defaultEncryptionModuleId = $this->getDefaultEncryptionModuleId();
151
+
152
+        if (empty($defaultEncryptionModuleId)) {
153
+            $this->setDefaultEncryptionModule($id);
154
+        }
155
+    }
156
+
157
+    /**
158
+     * Unregisters an encryption module
159
+     *
160
+     * @param string $moduleId
161
+     */
162
+    public function unregisterEncryptionModule($moduleId) {
163
+        unset($this->encryptionModules[$moduleId]);
164
+    }
165
+
166
+    /**
167
+     * get a list of all encryption modules
168
+     *
169
+     * @return array [id => ['id' => $id, 'displayName' => $displayName, 'callback' => callback]]
170
+     */
171
+    public function getEncryptionModules() {
172
+        return $this->encryptionModules;
173
+    }
174
+
175
+    /**
176
+     * get a specific encryption module
177
+     *
178
+     * @param string $moduleId
179
+     * @return IEncryptionModule
180
+     * @throws Exceptions\ModuleDoesNotExistsException
181
+     */
182
+    public function getEncryptionModule($moduleId = '') {
183
+        if (!empty($moduleId)) {
184
+            if (isset($this->encryptionModules[$moduleId])) {
185
+                return call_user_func($this->encryptionModules[$moduleId]['callback']);
186
+            } else {
187
+                $message = "Module with ID: $moduleId does not exist.";
188
+                $hint = $this->l->t('Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator.', [$moduleId]);
189
+                throw new Exceptions\ModuleDoesNotExistsException($message, $hint);
190
+            }
191
+        } else {
192
+            return $this->getDefaultEncryptionModule();
193
+        }
194
+    }
195
+
196
+    /**
197
+     * get default encryption module
198
+     *
199
+     * @return \OCP\Encryption\IEncryptionModule
200
+     * @throws Exceptions\ModuleDoesNotExistsException
201
+     */
202
+    protected function getDefaultEncryptionModule() {
203
+        $defaultModuleId = $this->getDefaultEncryptionModuleId();
204
+        if (!empty($defaultModuleId)) {
205
+            if (isset($this->encryptionModules[$defaultModuleId])) {
206
+                return call_user_func($this->encryptionModules[$defaultModuleId]['callback']);
207
+            } else {
208
+                $message = 'Default encryption module not loaded';
209
+                throw new Exceptions\ModuleDoesNotExistsException($message);
210
+            }
211
+        } else {
212
+            $message = 'No default encryption module defined';
213
+            throw new Exceptions\ModuleDoesNotExistsException($message);
214
+        }
215
+
216
+    }
217
+
218
+    /**
219
+     * set default encryption module Id
220
+     *
221
+     * @param string $moduleId
222
+     * @return bool
223
+     */
224
+    public function setDefaultEncryptionModule($moduleId) {
225
+        try {
226
+            $this->getEncryptionModule($moduleId);
227
+        } catch (\Exception $e) {
228
+            return false;
229
+        }
230
+
231
+        $this->config->setAppValue('core', 'default_encryption_module', $moduleId);
232
+        return true;
233
+    }
234
+
235
+    /**
236
+     * get default encryption module Id
237
+     *
238
+     * @return string
239
+     */
240
+    public function getDefaultEncryptionModuleId() {
241
+        return $this->config->getAppValue('core', 'default_encryption_module');
242
+    }
243
+
244
+    /**
245
+     * Add storage wrapper
246
+     */
247
+    public function setupStorage() {
248
+        // If encryption is disabled and there are no loaded modules it makes no sense to load the wrapper
249
+        if (!empty($this->encryptionModules) || $this->isEnabled()) {
250
+            $encryptionWrapper = new EncryptionWrapper($this->arrayCache, $this, $this->logger);
251
+            Filesystem::addStorageWrapper('oc_encryption', [$encryptionWrapper, 'wrapStorage'], 2);
252
+        }
253
+    }
254
+
255
+
256
+    /**
257
+     * check if key storage is ready
258
+     *
259
+     * @return bool
260
+     */
261
+    protected function isKeyStorageReady() {
262
+
263
+        $rootDir = $this->util->getKeyStorageRoot();
264
+
265
+        // the default root is always valid
266
+        if ($rootDir === '') {
267
+            return true;
268
+        }
269
+
270
+        // check if key storage is mounted correctly
271
+        if ($this->rootView->file_exists($rootDir . '/' . Storage::KEY_STORAGE_MARKER)) {
272
+            return true;
273
+        }
274
+
275
+        return false;
276
+    }
277 277
 
278 278
 
279 279
 }
Please login to merge, or discard this patch.