Passed
Push — master ( 1463f9...fdec86 )
by Joas
23:31 queued 14s
created
apps/dav/lib/CardDAV/Activity/Backend.php 1 patch
Indentation   +465 added lines, -465 removed lines patch added patch discarded remove patch
@@ -39,469 +39,469 @@
 block discarded – undo
39 39
 
40 40
 class Backend {
41 41
 
42
-	/** @var IActivityManager */
43
-	protected $activityManager;
44
-
45
-	/** @var IGroupManager */
46
-	protected $groupManager;
47
-
48
-	/** @var IUserSession */
49
-	protected $userSession;
50
-
51
-	/** @var IAppManager */
52
-	protected $appManager;
53
-
54
-	/** @var IUserManager */
55
-	protected $userManager;
56
-
57
-	public function __construct(IActivityManager $activityManager,
58
-								IGroupManager $groupManager,
59
-								IUserSession $userSession,
60
-								IAppManager $appManager,
61
-								IUserManager $userManager) {
62
-		$this->activityManager = $activityManager;
63
-		$this->groupManager = $groupManager;
64
-		$this->userSession = $userSession;
65
-		$this->appManager = $appManager;
66
-		$this->userManager = $userManager;
67
-	}
68
-
69
-	/**
70
-	 * Creates activities when an addressbook was creates
71
-	 *
72
-	 * @param array $addressbookData
73
-	 */
74
-	public function onAddressbookCreate(array $addressbookData): void {
75
-		$this->triggerAddressbookActivity(Addressbook::SUBJECT_ADD, $addressbookData);
76
-	}
77
-
78
-	/**
79
-	 * Creates activities when a calendar was updated
80
-	 *
81
-	 * @param array $addressbookData
82
-	 * @param array $shares
83
-	 * @param array $properties
84
-	 */
85
-	public function onAddressbookUpdate(array $addressbookData, array $shares, array $properties): void {
86
-		$this->triggerAddressbookActivity(Addressbook::SUBJECT_UPDATE, $addressbookData, $shares, $properties);
87
-	}
88
-
89
-	/**
90
-	 * Creates activities when a calendar was deleted
91
-	 *
92
-	 * @param array $addressbookData
93
-	 * @param array $shares
94
-	 */
95
-	public function onAddressbookDelete(array $addressbookData, array $shares): void {
96
-		$this->triggerAddressbookActivity(Addressbook::SUBJECT_DELETE, $addressbookData, $shares);
97
-	}
98
-
99
-	/**
100
-	 * Creates activities for all related users when a calendar was touched
101
-	 *
102
-	 * @param string $action
103
-	 * @param array $addressbookData
104
-	 * @param array $shares
105
-	 * @param array $changedProperties
106
-	 */
107
-	protected function triggerAddressbookActivity(string $action, array $addressbookData, array $shares = [], array $changedProperties = []): void {
108
-		if (!isset($addressbookData['principaluri'])) {
109
-			return;
110
-		}
111
-
112
-		$principalUri = $addressbookData['principaluri'];
113
-
114
-		// We are not interested in changes from the system addressbook
115
-		if ($principalUri === 'principals/system/system') {
116
-			return;
117
-		}
118
-
119
-		$principal = explode('/', $principalUri);
120
-		$owner = array_pop($principal);
121
-
122
-		$currentUser = $this->userSession->getUser();
123
-		if ($currentUser instanceof IUser) {
124
-			$currentUser = $currentUser->getUID();
125
-		} else {
126
-			$currentUser = $owner;
127
-		}
128
-
129
-		$event = $this->activityManager->generateEvent();
130
-		$event->setApp('dav')
131
-			->setObject('addressbook', (int) $addressbookData['id'])
132
-			->setType('contacts')
133
-			->setAuthor($currentUser);
134
-
135
-		$changedVisibleInformation = array_intersect([
136
-			'{DAV:}displayname',
137
-			'{' . Plugin::NS_CARDDAV . '}addressbook-description',
138
-		], array_keys($changedProperties));
139
-
140
-		if (empty($shares) || ($action === Addressbook::SUBJECT_UPDATE && empty($changedVisibleInformation))) {
141
-			$users = [$owner];
142
-		} else {
143
-			$users = $this->getUsersForShares($shares);
144
-			$users[] = $owner;
145
-		}
146
-
147
-		foreach ($users as $user) {
148
-			if ($action === Addressbook::SUBJECT_DELETE && !$this->userManager->userExists($user)) {
149
-				// Avoid creating addressbook_delete activities for deleted users
150
-				continue;
151
-			}
152
-
153
-			$event->setAffectedUser($user)
154
-				->setSubject(
155
-					$user === $currentUser ? $action . '_self' : $action,
156
-					[
157
-						'actor' => $currentUser,
158
-						'addressbook' => [
159
-							'id' => (int) $addressbookData['id'],
160
-							'uri' => $addressbookData['uri'],
161
-							'name' => $addressbookData['{DAV:}displayname'],
162
-						],
163
-					]
164
-				);
165
-			$this->activityManager->publish($event);
166
-		}
167
-	}
168
-
169
-	/**
170
-	 * Creates activities for all related users when an addressbook was (un-)shared
171
-	 *
172
-	 * @param array $addressbookData
173
-	 * @param array $shares
174
-	 * @param array $add
175
-	 * @param array $remove
176
-	 */
177
-	public function onAddressbookUpdateShares(array $addressbookData, array $shares, array $add, array $remove): void {
178
-		$principal = explode('/', $addressbookData['principaluri']);
179
-		$owner = $principal[2];
180
-
181
-		$currentUser = $this->userSession->getUser();
182
-		if ($currentUser instanceof IUser) {
183
-			$currentUser = $currentUser->getUID();
184
-		} else {
185
-			$currentUser = $owner;
186
-		}
187
-
188
-		$event = $this->activityManager->generateEvent();
189
-		$event->setApp('dav')
190
-			->setObject('addressbook', (int) $addressbookData['id'])
191
-			->setType('contacts')
192
-			->setAuthor($currentUser);
193
-
194
-		foreach ($remove as $principal) {
195
-			// principal:principals/users/test
196
-			$parts = explode(':', $principal, 2);
197
-			if ($parts[0] !== 'principal') {
198
-				continue;
199
-			}
200
-			$principal = explode('/', $parts[1]);
201
-
202
-			if ($principal[1] === 'users') {
203
-				$this->triggerActivityUser(
204
-					$principal[2],
205
-					$event,
206
-					$addressbookData,
207
-					Addressbook::SUBJECT_UNSHARE_USER,
208
-					Addressbook::SUBJECT_DELETE . '_self'
209
-				);
210
-
211
-				if ($owner !== $principal[2]) {
212
-					$parameters = [
213
-						'actor' => $event->getAuthor(),
214
-						'addressbook' => [
215
-							'id' => (int) $addressbookData['id'],
216
-							'uri' => $addressbookData['uri'],
217
-							'name' => $addressbookData['{DAV:}displayname'],
218
-						],
219
-						'user' => $principal[2],
220
-					];
221
-
222
-					if ($owner === $event->getAuthor()) {
223
-						$subject = Addressbook::SUBJECT_UNSHARE_USER . '_you';
224
-					} elseif ($principal[2] === $event->getAuthor()) {
225
-						$subject = Addressbook::SUBJECT_UNSHARE_USER . '_self';
226
-					} else {
227
-						$event->setAffectedUser($event->getAuthor())
228
-							->setSubject(Addressbook::SUBJECT_UNSHARE_USER . '_you', $parameters);
229
-						$this->activityManager->publish($event);
230
-
231
-						$subject = Addressbook::SUBJECT_UNSHARE_USER . '_by';
232
-					}
233
-
234
-					$event->setAffectedUser($owner)
235
-						->setSubject($subject, $parameters);
236
-					$this->activityManager->publish($event);
237
-				}
238
-			} elseif ($principal[1] === 'groups') {
239
-				$this->triggerActivityGroup($principal[2], $event, $addressbookData, Addressbook::SUBJECT_UNSHARE_USER);
240
-
241
-				$parameters = [
242
-					'actor' => $event->getAuthor(),
243
-					'addressbook' => [
244
-						'id' => (int) $addressbookData['id'],
245
-						'uri' => $addressbookData['uri'],
246
-						'name' => $addressbookData['{DAV:}displayname'],
247
-					],
248
-					'group' => $principal[2],
249
-				];
250
-
251
-				if ($owner === $event->getAuthor()) {
252
-					$subject = Addressbook::SUBJECT_UNSHARE_GROUP . '_you';
253
-				} else {
254
-					$event->setAffectedUser($event->getAuthor())
255
-						->setSubject(Addressbook::SUBJECT_UNSHARE_GROUP . '_you', $parameters);
256
-					$this->activityManager->publish($event);
257
-
258
-					$subject = Addressbook::SUBJECT_UNSHARE_GROUP . '_by';
259
-				}
260
-
261
-				$event->setAffectedUser($owner)
262
-					->setSubject($subject, $parameters);
263
-				$this->activityManager->publish($event);
264
-			}
265
-		}
266
-
267
-		foreach ($add as $share) {
268
-			if ($this->isAlreadyShared($share['href'], $shares)) {
269
-				continue;
270
-			}
271
-
272
-			// principal:principals/users/test
273
-			$parts = explode(':', $share['href'], 2);
274
-			if ($parts[0] !== 'principal') {
275
-				continue;
276
-			}
277
-			$principal = explode('/', $parts[1]);
278
-
279
-			if ($principal[1] === 'users') {
280
-				$this->triggerActivityUser($principal[2], $event, $addressbookData, Addressbook::SUBJECT_SHARE_USER);
281
-
282
-				if ($owner !== $principal[2]) {
283
-					$parameters = [
284
-						'actor' => $event->getAuthor(),
285
-						'addressbook' => [
286
-							'id' => (int) $addressbookData['id'],
287
-							'uri' => $addressbookData['uri'],
288
-							'name' => $addressbookData['{DAV:}displayname'],
289
-						],
290
-						'user' => $principal[2],
291
-					];
292
-
293
-					if ($owner === $event->getAuthor()) {
294
-						$subject = Addressbook::SUBJECT_SHARE_USER . '_you';
295
-					} else {
296
-						$event->setAffectedUser($event->getAuthor())
297
-							->setSubject(Addressbook::SUBJECT_SHARE_USER . '_you', $parameters);
298
-						$this->activityManager->publish($event);
299
-
300
-						$subject = Addressbook::SUBJECT_SHARE_USER . '_by';
301
-					}
302
-
303
-					$event->setAffectedUser($owner)
304
-						->setSubject($subject, $parameters);
305
-					$this->activityManager->publish($event);
306
-				}
307
-			} elseif ($principal[1] === 'groups') {
308
-				$this->triggerActivityGroup($principal[2], $event, $addressbookData, Addressbook::SUBJECT_SHARE_USER);
309
-
310
-				$parameters = [
311
-					'actor' => $event->getAuthor(),
312
-					'addressbook' => [
313
-						'id' => (int) $addressbookData['id'],
314
-						'uri' => $addressbookData['uri'],
315
-						'name' => $addressbookData['{DAV:}displayname'],
316
-					],
317
-					'group' => $principal[2],
318
-				];
319
-
320
-				if ($owner === $event->getAuthor()) {
321
-					$subject = Addressbook::SUBJECT_SHARE_GROUP . '_you';
322
-				} else {
323
-					$event->setAffectedUser($event->getAuthor())
324
-						->setSubject(Addressbook::SUBJECT_SHARE_GROUP . '_you', $parameters);
325
-					$this->activityManager->publish($event);
326
-
327
-					$subject = Addressbook::SUBJECT_SHARE_GROUP . '_by';
328
-				}
329
-
330
-				$event->setAffectedUser($owner)
331
-					->setSubject($subject, $parameters);
332
-				$this->activityManager->publish($event);
333
-			}
334
-		}
335
-	}
336
-
337
-	/**
338
-	 * Checks if a calendar is already shared with a principal
339
-	 *
340
-	 * @param string $principal
341
-	 * @param array[] $shares
342
-	 * @return bool
343
-	 */
344
-	protected function isAlreadyShared(string $principal, array $shares): bool {
345
-		foreach ($shares as $share) {
346
-			if ($principal === $share['href']) {
347
-				return true;
348
-			}
349
-		}
350
-
351
-		return false;
352
-	}
353
-
354
-	/**
355
-	 * Creates the given activity for all members of the given group
356
-	 *
357
-	 * @param string $gid
358
-	 * @param IEvent $event
359
-	 * @param array $properties
360
-	 * @param string $subject
361
-	 */
362
-	protected function triggerActivityGroup(string $gid, IEvent $event, array $properties, string $subject): void {
363
-		$group = $this->groupManager->get($gid);
364
-
365
-		if ($group instanceof IGroup) {
366
-			foreach ($group->getUsers() as $user) {
367
-				// Exclude current user
368
-				if ($user->getUID() !== $event->getAuthor()) {
369
-					$this->triggerActivityUser($user->getUID(), $event, $properties, $subject);
370
-				}
371
-			}
372
-		}
373
-	}
374
-
375
-	/**
376
-	 * Creates the given activity for the given user
377
-	 *
378
-	 * @param string $user
379
-	 * @param IEvent $event
380
-	 * @param array $properties
381
-	 * @param string $subject
382
-	 * @param string $subjectSelf
383
-	 */
384
-	protected function triggerActivityUser(string $user, IEvent $event, array $properties, string $subject, string $subjectSelf = ''): void {
385
-		$event->setAffectedUser($user)
386
-			->setSubject(
387
-				$user === $event->getAuthor() && $subjectSelf ? $subjectSelf : $subject,
388
-				[
389
-					'actor' => $event->getAuthor(),
390
-					'addressbook' => [
391
-						'id' => (int) $properties['id'],
392
-						'uri' => $properties['uri'],
393
-						'name' => $properties['{DAV:}displayname'],
394
-					],
395
-				]
396
-			);
397
-
398
-		$this->activityManager->publish($event);
399
-	}
400
-
401
-	/**
402
-	 * Creates activities when a card was created/updated/deleted
403
-	 *
404
-	 * @param string $action
405
-	 * @param array $addressbookData
406
-	 * @param array $shares
407
-	 * @param array $cardData
408
-	 */
409
-	public function triggerCardActivity(string $action, array $addressbookData, array $shares, array $cardData): void {
410
-		if (!isset($addressbookData['principaluri'])) {
411
-			return;
412
-		}
413
-
414
-		$principalUri = $addressbookData['principaluri'];
415
-
416
-		// We are not interested in changes from the system addressbook
417
-		if ($principalUri === 'principals/system/system') {
418
-			return;
419
-		}
420
-
421
-		$principal = explode('/', $principalUri);
422
-		$owner = array_pop($principal);
423
-
424
-		$currentUser = $this->userSession->getUser();
425
-		if ($currentUser instanceof IUser) {
426
-			$currentUser = $currentUser->getUID();
427
-		} else {
428
-			$currentUser = $owner;
429
-		}
430
-
431
-		$card = $this->getCardNameAndId($cardData);
432
-
433
-		$event = $this->activityManager->generateEvent();
434
-		$event->setApp('dav')
435
-			->setObject('addressbook', (int) $addressbookData['id'])
436
-			->setType('contacts')
437
-			->setAuthor($currentUser);
438
-
439
-		$users = $this->getUsersForShares($shares);
440
-		$users[] = $owner;
441
-
442
-		// Users for share can return the owner itself if the calendar is published
443
-		foreach (array_unique($users) as $user) {
444
-			$params = [
445
-				'actor' => $event->getAuthor(),
446
-				'addressbook' => [
447
-					'id' => (int) $addressbookData['id'],
448
-					'uri' => $addressbookData['uri'],
449
-					'name' => $addressbookData['{DAV:}displayname'],
450
-				],
451
-				'card' => [
452
-					'id' => $card['id'],
453
-					'name' => $card['name'],
454
-				],
455
-			];
456
-
457
-
458
-			$event->setAffectedUser($user)
459
-				->setSubject(
460
-					$user === $currentUser ? $action . '_self' : $action,
461
-					$params
462
-				);
463
-
464
-			$this->activityManager->publish($event);
465
-		}
466
-	}
467
-
468
-	/**
469
-	 * @param array $cardData
470
-	 * @return string[]
471
-	 */
472
-	protected function getCardNameAndId(array $cardData): array {
473
-		$vObject = Reader::read($cardData['carddata']);
474
-		return ['id' => (string) $vObject->UID, 'name' => (string) ($vObject->FN ?? '')];
475
-	}
476
-
477
-	/**
478
-	 * Get all users that have access to a given calendar
479
-	 *
480
-	 * @param array $shares
481
-	 * @return string[]
482
-	 */
483
-	protected function getUsersForShares(array $shares): array {
484
-		$users = $groups = [];
485
-		foreach ($shares as $share) {
486
-			$principal = explode('/', $share['{http://owncloud.org/ns}principal']);
487
-			if ($principal[1] === 'users') {
488
-				$users[] = $principal[2];
489
-			} elseif ($principal[1] === 'groups') {
490
-				$groups[] = $principal[2];
491
-			}
492
-		}
493
-
494
-		if (!empty($groups)) {
495
-			foreach ($groups as $gid) {
496
-				$group = $this->groupManager->get($gid);
497
-				if ($group instanceof IGroup) {
498
-					foreach ($group->getUsers() as $user) {
499
-						$users[] = $user->getUID();
500
-					}
501
-				}
502
-			}
503
-		}
504
-
505
-		return array_unique($users);
506
-	}
42
+    /** @var IActivityManager */
43
+    protected $activityManager;
44
+
45
+    /** @var IGroupManager */
46
+    protected $groupManager;
47
+
48
+    /** @var IUserSession */
49
+    protected $userSession;
50
+
51
+    /** @var IAppManager */
52
+    protected $appManager;
53
+
54
+    /** @var IUserManager */
55
+    protected $userManager;
56
+
57
+    public function __construct(IActivityManager $activityManager,
58
+                                IGroupManager $groupManager,
59
+                                IUserSession $userSession,
60
+                                IAppManager $appManager,
61
+                                IUserManager $userManager) {
62
+        $this->activityManager = $activityManager;
63
+        $this->groupManager = $groupManager;
64
+        $this->userSession = $userSession;
65
+        $this->appManager = $appManager;
66
+        $this->userManager = $userManager;
67
+    }
68
+
69
+    /**
70
+     * Creates activities when an addressbook was creates
71
+     *
72
+     * @param array $addressbookData
73
+     */
74
+    public function onAddressbookCreate(array $addressbookData): void {
75
+        $this->triggerAddressbookActivity(Addressbook::SUBJECT_ADD, $addressbookData);
76
+    }
77
+
78
+    /**
79
+     * Creates activities when a calendar was updated
80
+     *
81
+     * @param array $addressbookData
82
+     * @param array $shares
83
+     * @param array $properties
84
+     */
85
+    public function onAddressbookUpdate(array $addressbookData, array $shares, array $properties): void {
86
+        $this->triggerAddressbookActivity(Addressbook::SUBJECT_UPDATE, $addressbookData, $shares, $properties);
87
+    }
88
+
89
+    /**
90
+     * Creates activities when a calendar was deleted
91
+     *
92
+     * @param array $addressbookData
93
+     * @param array $shares
94
+     */
95
+    public function onAddressbookDelete(array $addressbookData, array $shares): void {
96
+        $this->triggerAddressbookActivity(Addressbook::SUBJECT_DELETE, $addressbookData, $shares);
97
+    }
98
+
99
+    /**
100
+     * Creates activities for all related users when a calendar was touched
101
+     *
102
+     * @param string $action
103
+     * @param array $addressbookData
104
+     * @param array $shares
105
+     * @param array $changedProperties
106
+     */
107
+    protected function triggerAddressbookActivity(string $action, array $addressbookData, array $shares = [], array $changedProperties = []): void {
108
+        if (!isset($addressbookData['principaluri'])) {
109
+            return;
110
+        }
111
+
112
+        $principalUri = $addressbookData['principaluri'];
113
+
114
+        // We are not interested in changes from the system addressbook
115
+        if ($principalUri === 'principals/system/system') {
116
+            return;
117
+        }
118
+
119
+        $principal = explode('/', $principalUri);
120
+        $owner = array_pop($principal);
121
+
122
+        $currentUser = $this->userSession->getUser();
123
+        if ($currentUser instanceof IUser) {
124
+            $currentUser = $currentUser->getUID();
125
+        } else {
126
+            $currentUser = $owner;
127
+        }
128
+
129
+        $event = $this->activityManager->generateEvent();
130
+        $event->setApp('dav')
131
+            ->setObject('addressbook', (int) $addressbookData['id'])
132
+            ->setType('contacts')
133
+            ->setAuthor($currentUser);
134
+
135
+        $changedVisibleInformation = array_intersect([
136
+            '{DAV:}displayname',
137
+            '{' . Plugin::NS_CARDDAV . '}addressbook-description',
138
+        ], array_keys($changedProperties));
139
+
140
+        if (empty($shares) || ($action === Addressbook::SUBJECT_UPDATE && empty($changedVisibleInformation))) {
141
+            $users = [$owner];
142
+        } else {
143
+            $users = $this->getUsersForShares($shares);
144
+            $users[] = $owner;
145
+        }
146
+
147
+        foreach ($users as $user) {
148
+            if ($action === Addressbook::SUBJECT_DELETE && !$this->userManager->userExists($user)) {
149
+                // Avoid creating addressbook_delete activities for deleted users
150
+                continue;
151
+            }
152
+
153
+            $event->setAffectedUser($user)
154
+                ->setSubject(
155
+                    $user === $currentUser ? $action . '_self' : $action,
156
+                    [
157
+                        'actor' => $currentUser,
158
+                        'addressbook' => [
159
+                            'id' => (int) $addressbookData['id'],
160
+                            'uri' => $addressbookData['uri'],
161
+                            'name' => $addressbookData['{DAV:}displayname'],
162
+                        ],
163
+                    ]
164
+                );
165
+            $this->activityManager->publish($event);
166
+        }
167
+    }
168
+
169
+    /**
170
+     * Creates activities for all related users when an addressbook was (un-)shared
171
+     *
172
+     * @param array $addressbookData
173
+     * @param array $shares
174
+     * @param array $add
175
+     * @param array $remove
176
+     */
177
+    public function onAddressbookUpdateShares(array $addressbookData, array $shares, array $add, array $remove): void {
178
+        $principal = explode('/', $addressbookData['principaluri']);
179
+        $owner = $principal[2];
180
+
181
+        $currentUser = $this->userSession->getUser();
182
+        if ($currentUser instanceof IUser) {
183
+            $currentUser = $currentUser->getUID();
184
+        } else {
185
+            $currentUser = $owner;
186
+        }
187
+
188
+        $event = $this->activityManager->generateEvent();
189
+        $event->setApp('dav')
190
+            ->setObject('addressbook', (int) $addressbookData['id'])
191
+            ->setType('contacts')
192
+            ->setAuthor($currentUser);
193
+
194
+        foreach ($remove as $principal) {
195
+            // principal:principals/users/test
196
+            $parts = explode(':', $principal, 2);
197
+            if ($parts[0] !== 'principal') {
198
+                continue;
199
+            }
200
+            $principal = explode('/', $parts[1]);
201
+
202
+            if ($principal[1] === 'users') {
203
+                $this->triggerActivityUser(
204
+                    $principal[2],
205
+                    $event,
206
+                    $addressbookData,
207
+                    Addressbook::SUBJECT_UNSHARE_USER,
208
+                    Addressbook::SUBJECT_DELETE . '_self'
209
+                );
210
+
211
+                if ($owner !== $principal[2]) {
212
+                    $parameters = [
213
+                        'actor' => $event->getAuthor(),
214
+                        'addressbook' => [
215
+                            'id' => (int) $addressbookData['id'],
216
+                            'uri' => $addressbookData['uri'],
217
+                            'name' => $addressbookData['{DAV:}displayname'],
218
+                        ],
219
+                        'user' => $principal[2],
220
+                    ];
221
+
222
+                    if ($owner === $event->getAuthor()) {
223
+                        $subject = Addressbook::SUBJECT_UNSHARE_USER . '_you';
224
+                    } elseif ($principal[2] === $event->getAuthor()) {
225
+                        $subject = Addressbook::SUBJECT_UNSHARE_USER . '_self';
226
+                    } else {
227
+                        $event->setAffectedUser($event->getAuthor())
228
+                            ->setSubject(Addressbook::SUBJECT_UNSHARE_USER . '_you', $parameters);
229
+                        $this->activityManager->publish($event);
230
+
231
+                        $subject = Addressbook::SUBJECT_UNSHARE_USER . '_by';
232
+                    }
233
+
234
+                    $event->setAffectedUser($owner)
235
+                        ->setSubject($subject, $parameters);
236
+                    $this->activityManager->publish($event);
237
+                }
238
+            } elseif ($principal[1] === 'groups') {
239
+                $this->triggerActivityGroup($principal[2], $event, $addressbookData, Addressbook::SUBJECT_UNSHARE_USER);
240
+
241
+                $parameters = [
242
+                    'actor' => $event->getAuthor(),
243
+                    'addressbook' => [
244
+                        'id' => (int) $addressbookData['id'],
245
+                        'uri' => $addressbookData['uri'],
246
+                        'name' => $addressbookData['{DAV:}displayname'],
247
+                    ],
248
+                    'group' => $principal[2],
249
+                ];
250
+
251
+                if ($owner === $event->getAuthor()) {
252
+                    $subject = Addressbook::SUBJECT_UNSHARE_GROUP . '_you';
253
+                } else {
254
+                    $event->setAffectedUser($event->getAuthor())
255
+                        ->setSubject(Addressbook::SUBJECT_UNSHARE_GROUP . '_you', $parameters);
256
+                    $this->activityManager->publish($event);
257
+
258
+                    $subject = Addressbook::SUBJECT_UNSHARE_GROUP . '_by';
259
+                }
260
+
261
+                $event->setAffectedUser($owner)
262
+                    ->setSubject($subject, $parameters);
263
+                $this->activityManager->publish($event);
264
+            }
265
+        }
266
+
267
+        foreach ($add as $share) {
268
+            if ($this->isAlreadyShared($share['href'], $shares)) {
269
+                continue;
270
+            }
271
+
272
+            // principal:principals/users/test
273
+            $parts = explode(':', $share['href'], 2);
274
+            if ($parts[0] !== 'principal') {
275
+                continue;
276
+            }
277
+            $principal = explode('/', $parts[1]);
278
+
279
+            if ($principal[1] === 'users') {
280
+                $this->triggerActivityUser($principal[2], $event, $addressbookData, Addressbook::SUBJECT_SHARE_USER);
281
+
282
+                if ($owner !== $principal[2]) {
283
+                    $parameters = [
284
+                        'actor' => $event->getAuthor(),
285
+                        'addressbook' => [
286
+                            'id' => (int) $addressbookData['id'],
287
+                            'uri' => $addressbookData['uri'],
288
+                            'name' => $addressbookData['{DAV:}displayname'],
289
+                        ],
290
+                        'user' => $principal[2],
291
+                    ];
292
+
293
+                    if ($owner === $event->getAuthor()) {
294
+                        $subject = Addressbook::SUBJECT_SHARE_USER . '_you';
295
+                    } else {
296
+                        $event->setAffectedUser($event->getAuthor())
297
+                            ->setSubject(Addressbook::SUBJECT_SHARE_USER . '_you', $parameters);
298
+                        $this->activityManager->publish($event);
299
+
300
+                        $subject = Addressbook::SUBJECT_SHARE_USER . '_by';
301
+                    }
302
+
303
+                    $event->setAffectedUser($owner)
304
+                        ->setSubject($subject, $parameters);
305
+                    $this->activityManager->publish($event);
306
+                }
307
+            } elseif ($principal[1] === 'groups') {
308
+                $this->triggerActivityGroup($principal[2], $event, $addressbookData, Addressbook::SUBJECT_SHARE_USER);
309
+
310
+                $parameters = [
311
+                    'actor' => $event->getAuthor(),
312
+                    'addressbook' => [
313
+                        'id' => (int) $addressbookData['id'],
314
+                        'uri' => $addressbookData['uri'],
315
+                        'name' => $addressbookData['{DAV:}displayname'],
316
+                    ],
317
+                    'group' => $principal[2],
318
+                ];
319
+
320
+                if ($owner === $event->getAuthor()) {
321
+                    $subject = Addressbook::SUBJECT_SHARE_GROUP . '_you';
322
+                } else {
323
+                    $event->setAffectedUser($event->getAuthor())
324
+                        ->setSubject(Addressbook::SUBJECT_SHARE_GROUP . '_you', $parameters);
325
+                    $this->activityManager->publish($event);
326
+
327
+                    $subject = Addressbook::SUBJECT_SHARE_GROUP . '_by';
328
+                }
329
+
330
+                $event->setAffectedUser($owner)
331
+                    ->setSubject($subject, $parameters);
332
+                $this->activityManager->publish($event);
333
+            }
334
+        }
335
+    }
336
+
337
+    /**
338
+     * Checks if a calendar is already shared with a principal
339
+     *
340
+     * @param string $principal
341
+     * @param array[] $shares
342
+     * @return bool
343
+     */
344
+    protected function isAlreadyShared(string $principal, array $shares): bool {
345
+        foreach ($shares as $share) {
346
+            if ($principal === $share['href']) {
347
+                return true;
348
+            }
349
+        }
350
+
351
+        return false;
352
+    }
353
+
354
+    /**
355
+     * Creates the given activity for all members of the given group
356
+     *
357
+     * @param string $gid
358
+     * @param IEvent $event
359
+     * @param array $properties
360
+     * @param string $subject
361
+     */
362
+    protected function triggerActivityGroup(string $gid, IEvent $event, array $properties, string $subject): void {
363
+        $group = $this->groupManager->get($gid);
364
+
365
+        if ($group instanceof IGroup) {
366
+            foreach ($group->getUsers() as $user) {
367
+                // Exclude current user
368
+                if ($user->getUID() !== $event->getAuthor()) {
369
+                    $this->triggerActivityUser($user->getUID(), $event, $properties, $subject);
370
+                }
371
+            }
372
+        }
373
+    }
374
+
375
+    /**
376
+     * Creates the given activity for the given user
377
+     *
378
+     * @param string $user
379
+     * @param IEvent $event
380
+     * @param array $properties
381
+     * @param string $subject
382
+     * @param string $subjectSelf
383
+     */
384
+    protected function triggerActivityUser(string $user, IEvent $event, array $properties, string $subject, string $subjectSelf = ''): void {
385
+        $event->setAffectedUser($user)
386
+            ->setSubject(
387
+                $user === $event->getAuthor() && $subjectSelf ? $subjectSelf : $subject,
388
+                [
389
+                    'actor' => $event->getAuthor(),
390
+                    'addressbook' => [
391
+                        'id' => (int) $properties['id'],
392
+                        'uri' => $properties['uri'],
393
+                        'name' => $properties['{DAV:}displayname'],
394
+                    ],
395
+                ]
396
+            );
397
+
398
+        $this->activityManager->publish($event);
399
+    }
400
+
401
+    /**
402
+     * Creates activities when a card was created/updated/deleted
403
+     *
404
+     * @param string $action
405
+     * @param array $addressbookData
406
+     * @param array $shares
407
+     * @param array $cardData
408
+     */
409
+    public function triggerCardActivity(string $action, array $addressbookData, array $shares, array $cardData): void {
410
+        if (!isset($addressbookData['principaluri'])) {
411
+            return;
412
+        }
413
+
414
+        $principalUri = $addressbookData['principaluri'];
415
+
416
+        // We are not interested in changes from the system addressbook
417
+        if ($principalUri === 'principals/system/system') {
418
+            return;
419
+        }
420
+
421
+        $principal = explode('/', $principalUri);
422
+        $owner = array_pop($principal);
423
+
424
+        $currentUser = $this->userSession->getUser();
425
+        if ($currentUser instanceof IUser) {
426
+            $currentUser = $currentUser->getUID();
427
+        } else {
428
+            $currentUser = $owner;
429
+        }
430
+
431
+        $card = $this->getCardNameAndId($cardData);
432
+
433
+        $event = $this->activityManager->generateEvent();
434
+        $event->setApp('dav')
435
+            ->setObject('addressbook', (int) $addressbookData['id'])
436
+            ->setType('contacts')
437
+            ->setAuthor($currentUser);
438
+
439
+        $users = $this->getUsersForShares($shares);
440
+        $users[] = $owner;
441
+
442
+        // Users for share can return the owner itself if the calendar is published
443
+        foreach (array_unique($users) as $user) {
444
+            $params = [
445
+                'actor' => $event->getAuthor(),
446
+                'addressbook' => [
447
+                    'id' => (int) $addressbookData['id'],
448
+                    'uri' => $addressbookData['uri'],
449
+                    'name' => $addressbookData['{DAV:}displayname'],
450
+                ],
451
+                'card' => [
452
+                    'id' => $card['id'],
453
+                    'name' => $card['name'],
454
+                ],
455
+            ];
456
+
457
+
458
+            $event->setAffectedUser($user)
459
+                ->setSubject(
460
+                    $user === $currentUser ? $action . '_self' : $action,
461
+                    $params
462
+                );
463
+
464
+            $this->activityManager->publish($event);
465
+        }
466
+    }
467
+
468
+    /**
469
+     * @param array $cardData
470
+     * @return string[]
471
+     */
472
+    protected function getCardNameAndId(array $cardData): array {
473
+        $vObject = Reader::read($cardData['carddata']);
474
+        return ['id' => (string) $vObject->UID, 'name' => (string) ($vObject->FN ?? '')];
475
+    }
476
+
477
+    /**
478
+     * Get all users that have access to a given calendar
479
+     *
480
+     * @param array $shares
481
+     * @return string[]
482
+     */
483
+    protected function getUsersForShares(array $shares): array {
484
+        $users = $groups = [];
485
+        foreach ($shares as $share) {
486
+            $principal = explode('/', $share['{http://owncloud.org/ns}principal']);
487
+            if ($principal[1] === 'users') {
488
+                $users[] = $principal[2];
489
+            } elseif ($principal[1] === 'groups') {
490
+                $groups[] = $principal[2];
491
+            }
492
+        }
493
+
494
+        if (!empty($groups)) {
495
+            foreach ($groups as $gid) {
496
+                $group = $this->groupManager->get($gid);
497
+                if ($group instanceof IGroup) {
498
+                    foreach ($group->getUsers() as $user) {
499
+                        $users[] = $user->getUID();
500
+                    }
501
+                }
502
+            }
503
+        }
504
+
505
+        return array_unique($users);
506
+    }
507 507
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/Activity/Provider/Card.php 1 patch
Indentation   +105 added lines, -105 removed lines patch added patch discarded remove patch
@@ -36,109 +36,109 @@
 block discarded – undo
36 36
 use OCP\L10N\IFactory;
37 37
 
38 38
 class Card extends Base {
39
-	public const SUBJECT_ADD = 'card_add';
40
-	public const SUBJECT_UPDATE = 'card_update';
41
-	public const SUBJECT_DELETE = 'card_delete';
42
-
43
-	/** @var IFactory */
44
-	protected $languageFactory;
45
-
46
-	/** @var IManager */
47
-	protected $activityManager;
48
-
49
-	/** @var IEventMerger */
50
-	protected $eventMerger;
51
-
52
-	/** @var IAppManager */
53
-	protected $appManager;
54
-
55
-	public function __construct(IFactory $languageFactory,
56
-								IURLGenerator $url,
57
-								IManager $activityManager,
58
-								IUserManager $userManager,
59
-								IGroupManager $groupManager,
60
-								IEventMerger $eventMerger,
61
-								IAppManager $appManager) {
62
-		parent::__construct($userManager, $groupManager, $url);
63
-		$this->languageFactory = $languageFactory;
64
-		$this->activityManager = $activityManager;
65
-		$this->eventMerger = $eventMerger;
66
-		$this->appManager = $appManager;
67
-	}
68
-
69
-	/**
70
-	 * @param string $language
71
-	 * @param IEvent $event
72
-	 * @param IEvent|null $previousEvent
73
-	 * @return IEvent
74
-	 * @throws \InvalidArgumentException
75
-	 */
76
-	public function parse($language, IEvent $event, IEvent $previousEvent = null): IEvent {
77
-		if ($event->getApp() !== 'dav' || $event->getType() !== 'contacts') {
78
-			throw new \InvalidArgumentException();
79
-		}
80
-
81
-		$l = $this->languageFactory->get('dav', $language);
82
-
83
-		if ($this->activityManager->getRequirePNG()) {
84
-			$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/contacts-dark.png')));
85
-		} else {
86
-			$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/contacts.svg')));
87
-		}
88
-
89
-		if ($event->getSubject() === self::SUBJECT_ADD) {
90
-			$subject = $l->t('{actor} created contact {card} in address book {addressbook}');
91
-		} elseif ($event->getSubject() === self::SUBJECT_ADD . '_self') {
92
-			$subject = $l->t('You created contact {card} in address book {addressbook}');
93
-		} elseif ($event->getSubject() === self::SUBJECT_DELETE) {
94
-			$subject = $l->t('{actor} deleted contact {card} from address book {addressbook}');
95
-		} elseif ($event->getSubject() === self::SUBJECT_DELETE . '_self') {
96
-			$subject = $l->t('You deleted contact {card} from address book {addressbook}');
97
-		} elseif ($event->getSubject() === self::SUBJECT_UPDATE) {
98
-			$subject = $l->t('{actor} updated contact {card} in address book {addressbook}');
99
-		} elseif ($event->getSubject() === self::SUBJECT_UPDATE . '_self') {
100
-			$subject = $l->t('You updated contact {card} in address book {addressbook}');
101
-		} else {
102
-			throw new \InvalidArgumentException();
103
-		}
104
-
105
-		$parsedParameters = $this->getParameters($event, $l);
106
-		$this->setSubjects($event, $subject, $parsedParameters);
107
-
108
-		$event = $this->eventMerger->mergeEvents('card', $event, $previousEvent);
109
-		return $event;
110
-	}
111
-
112
-	protected function getParameters(IEvent $event, IL10N $l): array {
113
-		$subject = $event->getSubject();
114
-		$parameters = $event->getSubjectParameters();
115
-
116
-		switch ($subject) {
117
-			case self::SUBJECT_ADD:
118
-			case self::SUBJECT_DELETE:
119
-			case self::SUBJECT_UPDATE:
120
-				return [
121
-					'actor' => $this->generateUserParameter($parameters['actor']),
122
-					'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
123
-					'card' => $this->generateCardParameter($parameters['card']),
124
-				];
125
-			case self::SUBJECT_ADD . '_self':
126
-			case self::SUBJECT_DELETE . '_self':
127
-			case self::SUBJECT_UPDATE . '_self':
128
-				return [
129
-					'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
130
-					'card' => $this->generateCardParameter($parameters['card']),
131
-				];
132
-		}
133
-
134
-		throw new \InvalidArgumentException();
135
-	}
136
-
137
-	private function generateCardParameter(array $cardData): array {
138
-		return [
139
-			'type' => 'addressbook-contact',
140
-			'id' => $cardData['id'],
141
-			'name' => $cardData['name'],
142
-		];
143
-	}
39
+    public const SUBJECT_ADD = 'card_add';
40
+    public const SUBJECT_UPDATE = 'card_update';
41
+    public const SUBJECT_DELETE = 'card_delete';
42
+
43
+    /** @var IFactory */
44
+    protected $languageFactory;
45
+
46
+    /** @var IManager */
47
+    protected $activityManager;
48
+
49
+    /** @var IEventMerger */
50
+    protected $eventMerger;
51
+
52
+    /** @var IAppManager */
53
+    protected $appManager;
54
+
55
+    public function __construct(IFactory $languageFactory,
56
+                                IURLGenerator $url,
57
+                                IManager $activityManager,
58
+                                IUserManager $userManager,
59
+                                IGroupManager $groupManager,
60
+                                IEventMerger $eventMerger,
61
+                                IAppManager $appManager) {
62
+        parent::__construct($userManager, $groupManager, $url);
63
+        $this->languageFactory = $languageFactory;
64
+        $this->activityManager = $activityManager;
65
+        $this->eventMerger = $eventMerger;
66
+        $this->appManager = $appManager;
67
+    }
68
+
69
+    /**
70
+     * @param string $language
71
+     * @param IEvent $event
72
+     * @param IEvent|null $previousEvent
73
+     * @return IEvent
74
+     * @throws \InvalidArgumentException
75
+     */
76
+    public function parse($language, IEvent $event, IEvent $previousEvent = null): IEvent {
77
+        if ($event->getApp() !== 'dav' || $event->getType() !== 'contacts') {
78
+            throw new \InvalidArgumentException();
79
+        }
80
+
81
+        $l = $this->languageFactory->get('dav', $language);
82
+
83
+        if ($this->activityManager->getRequirePNG()) {
84
+            $event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/contacts-dark.png')));
85
+        } else {
86
+            $event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/contacts.svg')));
87
+        }
88
+
89
+        if ($event->getSubject() === self::SUBJECT_ADD) {
90
+            $subject = $l->t('{actor} created contact {card} in address book {addressbook}');
91
+        } elseif ($event->getSubject() === self::SUBJECT_ADD . '_self') {
92
+            $subject = $l->t('You created contact {card} in address book {addressbook}');
93
+        } elseif ($event->getSubject() === self::SUBJECT_DELETE) {
94
+            $subject = $l->t('{actor} deleted contact {card} from address book {addressbook}');
95
+        } elseif ($event->getSubject() === self::SUBJECT_DELETE . '_self') {
96
+            $subject = $l->t('You deleted contact {card} from address book {addressbook}');
97
+        } elseif ($event->getSubject() === self::SUBJECT_UPDATE) {
98
+            $subject = $l->t('{actor} updated contact {card} in address book {addressbook}');
99
+        } elseif ($event->getSubject() === self::SUBJECT_UPDATE . '_self') {
100
+            $subject = $l->t('You updated contact {card} in address book {addressbook}');
101
+        } else {
102
+            throw new \InvalidArgumentException();
103
+        }
104
+
105
+        $parsedParameters = $this->getParameters($event, $l);
106
+        $this->setSubjects($event, $subject, $parsedParameters);
107
+
108
+        $event = $this->eventMerger->mergeEvents('card', $event, $previousEvent);
109
+        return $event;
110
+    }
111
+
112
+    protected function getParameters(IEvent $event, IL10N $l): array {
113
+        $subject = $event->getSubject();
114
+        $parameters = $event->getSubjectParameters();
115
+
116
+        switch ($subject) {
117
+            case self::SUBJECT_ADD:
118
+            case self::SUBJECT_DELETE:
119
+            case self::SUBJECT_UPDATE:
120
+                return [
121
+                    'actor' => $this->generateUserParameter($parameters['actor']),
122
+                    'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
123
+                    'card' => $this->generateCardParameter($parameters['card']),
124
+                ];
125
+            case self::SUBJECT_ADD . '_self':
126
+            case self::SUBJECT_DELETE . '_self':
127
+            case self::SUBJECT_UPDATE . '_self':
128
+                return [
129
+                    'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
130
+                    'card' => $this->generateCardParameter($parameters['card']),
131
+                ];
132
+        }
133
+
134
+        throw new \InvalidArgumentException();
135
+    }
136
+
137
+    private function generateCardParameter(array $cardData): array {
138
+        return [
139
+            'type' => 'addressbook-contact',
140
+            'id' => $cardData['id'],
141
+            'name' => $cardData['name'],
142
+        ];
143
+    }
144 144
 }
Please login to merge, or discard this patch.
apps/dav/lib/CardDAV/Activity/Provider/Addressbook.php 1 patch
Indentation   +153 added lines, -153 removed lines patch added patch discarded remove patch
@@ -35,157 +35,157 @@
 block discarded – undo
35 35
 use OCP\L10N\IFactory;
36 36
 
37 37
 class Addressbook extends Base {
38
-	public const SUBJECT_ADD = 'addressbook_add';
39
-	public const SUBJECT_UPDATE = 'addressbook_update';
40
-	public const SUBJECT_DELETE = 'addressbook_delete';
41
-	public const SUBJECT_SHARE_USER = 'addressbook_user_share';
42
-	public const SUBJECT_SHARE_GROUP = 'addressbook_group_share';
43
-	public const SUBJECT_UNSHARE_USER = 'addressbook_user_unshare';
44
-	public const SUBJECT_UNSHARE_GROUP = 'addressbook_group_unshare';
45
-
46
-	/** @var IFactory */
47
-	protected $languageFactory;
48
-
49
-	/** @var IManager */
50
-	protected $activityManager;
51
-
52
-	/** @var IEventMerger */
53
-	protected $eventMerger;
54
-
55
-	public function __construct(IFactory $languageFactory,
56
-								IURLGenerator $url,
57
-								IManager $activityManager,
58
-								IUserManager $userManager,
59
-								IGroupManager $groupManager,
60
-								IEventMerger $eventMerger) {
61
-		parent::__construct($userManager, $groupManager, $url);
62
-		$this->languageFactory = $languageFactory;
63
-		$this->activityManager = $activityManager;
64
-		$this->eventMerger = $eventMerger;
65
-	}
66
-
67
-	/**
68
-	 * @param string $language
69
-	 * @param IEvent $event
70
-	 * @param IEvent|null $previousEvent
71
-	 * @return IEvent
72
-	 * @throws \InvalidArgumentException
73
-	 */
74
-	public function parse($language, IEvent $event, IEvent $previousEvent = null): IEvent {
75
-		if ($event->getApp() !== 'dav' || $event->getType() !== 'contacts') {
76
-			throw new \InvalidArgumentException();
77
-		}
78
-
79
-		$l = $this->languageFactory->get('dav', $language);
80
-
81
-		if ($this->activityManager->getRequirePNG()) {
82
-			$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/contacts-dark.png')));
83
-		} else {
84
-			$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/contacts.svg')));
85
-		}
86
-
87
-		if ($event->getSubject() === self::SUBJECT_ADD) {
88
-			$subject = $l->t('{actor} created address book {addressbook}');
89
-		} elseif ($event->getSubject() === self::SUBJECT_ADD . '_self') {
90
-			$subject = $l->t('You created address book {addressbook}');
91
-		} elseif ($event->getSubject() === self::SUBJECT_DELETE) {
92
-			$subject = $l->t('{actor} deleted address book {addressbook}');
93
-		} elseif ($event->getSubject() === self::SUBJECT_DELETE . '_self') {
94
-			$subject = $l->t('You deleted address book {addressbook}');
95
-		} elseif ($event->getSubject() === self::SUBJECT_UPDATE) {
96
-			$subject = $l->t('{actor} updated address book {addressbook}');
97
-		} elseif ($event->getSubject() === self::SUBJECT_UPDATE . '_self') {
98
-			$subject = $l->t('You updated address book {addressbook}');
99
-		} elseif ($event->getSubject() === self::SUBJECT_SHARE_USER) {
100
-			$subject = $l->t('{actor} shared address book {addressbook} with you');
101
-		} elseif ($event->getSubject() === self::SUBJECT_SHARE_USER . '_you') {
102
-			$subject = $l->t('You shared address book {addressbook} with {user}');
103
-		} elseif ($event->getSubject() === self::SUBJECT_SHARE_USER . '_by') {
104
-			$subject = $l->t('{actor} shared address book {addressbook} with {user}');
105
-		} elseif ($event->getSubject() === self::SUBJECT_UNSHARE_USER) {
106
-			$subject = $l->t('{actor} unshared address book {addressbook} from you');
107
-		} elseif ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_you') {
108
-			$subject = $l->t('You unshared address book {addressbook} from {user}');
109
-		} elseif ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_by') {
110
-			$subject = $l->t('{actor} unshared address book {addressbook} from {user}');
111
-		} elseif ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_self') {
112
-			$subject = $l->t('{actor} unshared address book {addressbook} from themselves');
113
-		} elseif ($event->getSubject() === self::SUBJECT_SHARE_GROUP . '_you') {
114
-			$subject = $l->t('You shared address book {addressbook} with group {group}');
115
-		} elseif ($event->getSubject() === self::SUBJECT_SHARE_GROUP . '_by') {
116
-			$subject = $l->t('{actor} shared address book {addressbook} with group {group}');
117
-		} elseif ($event->getSubject() === self::SUBJECT_UNSHARE_GROUP . '_you') {
118
-			$subject = $l->t('You unshared address book {addressbook} from group {group}');
119
-		} elseif ($event->getSubject() === self::SUBJECT_UNSHARE_GROUP . '_by') {
120
-			$subject = $l->t('{actor} unshared address book {addressbook} from group {group}');
121
-		} else {
122
-			throw new \InvalidArgumentException();
123
-		}
124
-
125
-		$parsedParameters = $this->getParameters($event, $l);
126
-		$this->setSubjects($event, $subject, $parsedParameters);
127
-
128
-		$event = $this->eventMerger->mergeEvents('addressbook', $event, $previousEvent);
129
-
130
-		if ($event->getChildEvent() === null) {
131
-			if (isset($parsedParameters['user'])) {
132
-				// Couldn't group by calendar, maybe we can group by users
133
-				$event = $this->eventMerger->mergeEvents('user', $event, $previousEvent);
134
-			} elseif (isset($parsedParameters['group'])) {
135
-				// Couldn't group by calendar, maybe we can group by groups
136
-				$event = $this->eventMerger->mergeEvents('group', $event, $previousEvent);
137
-			}
138
-		}
139
-
140
-		return $event;
141
-	}
142
-
143
-	protected function getParameters(IEvent $event, IL10N $l): array {
144
-		$subject = $event->getSubject();
145
-		$parameters = $event->getSubjectParameters();
146
-
147
-		switch ($subject) {
148
-			case self::SUBJECT_ADD:
149
-			case self::SUBJECT_ADD . '_self':
150
-			case self::SUBJECT_DELETE:
151
-			case self::SUBJECT_DELETE . '_self':
152
-			case self::SUBJECT_UPDATE:
153
-			case self::SUBJECT_UPDATE . '_self':
154
-			case self::SUBJECT_SHARE_USER:
155
-			case self::SUBJECT_UNSHARE_USER:
156
-			case self::SUBJECT_UNSHARE_USER . '_self':
157
-				return [
158
-					'actor' => $this->generateUserParameter($parameters['actor']),
159
-					'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
160
-				];
161
-			case self::SUBJECT_SHARE_USER . '_you':
162
-			case self::SUBJECT_UNSHARE_USER . '_you':
163
-				return [
164
-					'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
165
-					'user' => $this->generateUserParameter($parameters['user']),
166
-				];
167
-			case self::SUBJECT_SHARE_USER . '_by':
168
-			case self::SUBJECT_UNSHARE_USER . '_by':
169
-				return [
170
-					'actor' => $this->generateUserParameter($parameters['actor']),
171
-					'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
172
-					'user' => $this->generateUserParameter($parameters['user']),
173
-				];
174
-			case self::SUBJECT_SHARE_GROUP . '_you':
175
-			case self::SUBJECT_UNSHARE_GROUP . '_you':
176
-				return [
177
-					'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
178
-					'group' => $this->generateGroupParameter($parameters['group']),
179
-				];
180
-			case self::SUBJECT_SHARE_GROUP . '_by':
181
-			case self::SUBJECT_UNSHARE_GROUP . '_by':
182
-				return [
183
-					'actor' => $this->generateUserParameter($parameters['actor']),
184
-					'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
185
-					'group' => $this->generateGroupParameter($parameters['group']),
186
-				];
187
-		}
188
-
189
-		throw new \InvalidArgumentException();
190
-	}
38
+    public const SUBJECT_ADD = 'addressbook_add';
39
+    public const SUBJECT_UPDATE = 'addressbook_update';
40
+    public const SUBJECT_DELETE = 'addressbook_delete';
41
+    public const SUBJECT_SHARE_USER = 'addressbook_user_share';
42
+    public const SUBJECT_SHARE_GROUP = 'addressbook_group_share';
43
+    public const SUBJECT_UNSHARE_USER = 'addressbook_user_unshare';
44
+    public const SUBJECT_UNSHARE_GROUP = 'addressbook_group_unshare';
45
+
46
+    /** @var IFactory */
47
+    protected $languageFactory;
48
+
49
+    /** @var IManager */
50
+    protected $activityManager;
51
+
52
+    /** @var IEventMerger */
53
+    protected $eventMerger;
54
+
55
+    public function __construct(IFactory $languageFactory,
56
+                                IURLGenerator $url,
57
+                                IManager $activityManager,
58
+                                IUserManager $userManager,
59
+                                IGroupManager $groupManager,
60
+                                IEventMerger $eventMerger) {
61
+        parent::__construct($userManager, $groupManager, $url);
62
+        $this->languageFactory = $languageFactory;
63
+        $this->activityManager = $activityManager;
64
+        $this->eventMerger = $eventMerger;
65
+    }
66
+
67
+    /**
68
+     * @param string $language
69
+     * @param IEvent $event
70
+     * @param IEvent|null $previousEvent
71
+     * @return IEvent
72
+     * @throws \InvalidArgumentException
73
+     */
74
+    public function parse($language, IEvent $event, IEvent $previousEvent = null): IEvent {
75
+        if ($event->getApp() !== 'dav' || $event->getType() !== 'contacts') {
76
+            throw new \InvalidArgumentException();
77
+        }
78
+
79
+        $l = $this->languageFactory->get('dav', $language);
80
+
81
+        if ($this->activityManager->getRequirePNG()) {
82
+            $event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/contacts-dark.png')));
83
+        } else {
84
+            $event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/contacts.svg')));
85
+        }
86
+
87
+        if ($event->getSubject() === self::SUBJECT_ADD) {
88
+            $subject = $l->t('{actor} created address book {addressbook}');
89
+        } elseif ($event->getSubject() === self::SUBJECT_ADD . '_self') {
90
+            $subject = $l->t('You created address book {addressbook}');
91
+        } elseif ($event->getSubject() === self::SUBJECT_DELETE) {
92
+            $subject = $l->t('{actor} deleted address book {addressbook}');
93
+        } elseif ($event->getSubject() === self::SUBJECT_DELETE . '_self') {
94
+            $subject = $l->t('You deleted address book {addressbook}');
95
+        } elseif ($event->getSubject() === self::SUBJECT_UPDATE) {
96
+            $subject = $l->t('{actor} updated address book {addressbook}');
97
+        } elseif ($event->getSubject() === self::SUBJECT_UPDATE . '_self') {
98
+            $subject = $l->t('You updated address book {addressbook}');
99
+        } elseif ($event->getSubject() === self::SUBJECT_SHARE_USER) {
100
+            $subject = $l->t('{actor} shared address book {addressbook} with you');
101
+        } elseif ($event->getSubject() === self::SUBJECT_SHARE_USER . '_you') {
102
+            $subject = $l->t('You shared address book {addressbook} with {user}');
103
+        } elseif ($event->getSubject() === self::SUBJECT_SHARE_USER . '_by') {
104
+            $subject = $l->t('{actor} shared address book {addressbook} with {user}');
105
+        } elseif ($event->getSubject() === self::SUBJECT_UNSHARE_USER) {
106
+            $subject = $l->t('{actor} unshared address book {addressbook} from you');
107
+        } elseif ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_you') {
108
+            $subject = $l->t('You unshared address book {addressbook} from {user}');
109
+        } elseif ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_by') {
110
+            $subject = $l->t('{actor} unshared address book {addressbook} from {user}');
111
+        } elseif ($event->getSubject() === self::SUBJECT_UNSHARE_USER . '_self') {
112
+            $subject = $l->t('{actor} unshared address book {addressbook} from themselves');
113
+        } elseif ($event->getSubject() === self::SUBJECT_SHARE_GROUP . '_you') {
114
+            $subject = $l->t('You shared address book {addressbook} with group {group}');
115
+        } elseif ($event->getSubject() === self::SUBJECT_SHARE_GROUP . '_by') {
116
+            $subject = $l->t('{actor} shared address book {addressbook} with group {group}');
117
+        } elseif ($event->getSubject() === self::SUBJECT_UNSHARE_GROUP . '_you') {
118
+            $subject = $l->t('You unshared address book {addressbook} from group {group}');
119
+        } elseif ($event->getSubject() === self::SUBJECT_UNSHARE_GROUP . '_by') {
120
+            $subject = $l->t('{actor} unshared address book {addressbook} from group {group}');
121
+        } else {
122
+            throw new \InvalidArgumentException();
123
+        }
124
+
125
+        $parsedParameters = $this->getParameters($event, $l);
126
+        $this->setSubjects($event, $subject, $parsedParameters);
127
+
128
+        $event = $this->eventMerger->mergeEvents('addressbook', $event, $previousEvent);
129
+
130
+        if ($event->getChildEvent() === null) {
131
+            if (isset($parsedParameters['user'])) {
132
+                // Couldn't group by calendar, maybe we can group by users
133
+                $event = $this->eventMerger->mergeEvents('user', $event, $previousEvent);
134
+            } elseif (isset($parsedParameters['group'])) {
135
+                // Couldn't group by calendar, maybe we can group by groups
136
+                $event = $this->eventMerger->mergeEvents('group', $event, $previousEvent);
137
+            }
138
+        }
139
+
140
+        return $event;
141
+    }
142
+
143
+    protected function getParameters(IEvent $event, IL10N $l): array {
144
+        $subject = $event->getSubject();
145
+        $parameters = $event->getSubjectParameters();
146
+
147
+        switch ($subject) {
148
+            case self::SUBJECT_ADD:
149
+            case self::SUBJECT_ADD . '_self':
150
+            case self::SUBJECT_DELETE:
151
+            case self::SUBJECT_DELETE . '_self':
152
+            case self::SUBJECT_UPDATE:
153
+            case self::SUBJECT_UPDATE . '_self':
154
+            case self::SUBJECT_SHARE_USER:
155
+            case self::SUBJECT_UNSHARE_USER:
156
+            case self::SUBJECT_UNSHARE_USER . '_self':
157
+                return [
158
+                    'actor' => $this->generateUserParameter($parameters['actor']),
159
+                    'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
160
+                ];
161
+            case self::SUBJECT_SHARE_USER . '_you':
162
+            case self::SUBJECT_UNSHARE_USER . '_you':
163
+                return [
164
+                    'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
165
+                    'user' => $this->generateUserParameter($parameters['user']),
166
+                ];
167
+            case self::SUBJECT_SHARE_USER . '_by':
168
+            case self::SUBJECT_UNSHARE_USER . '_by':
169
+                return [
170
+                    'actor' => $this->generateUserParameter($parameters['actor']),
171
+                    'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
172
+                    'user' => $this->generateUserParameter($parameters['user']),
173
+                ];
174
+            case self::SUBJECT_SHARE_GROUP . '_you':
175
+            case self::SUBJECT_UNSHARE_GROUP . '_you':
176
+                return [
177
+                    'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
178
+                    'group' => $this->generateGroupParameter($parameters['group']),
179
+                ];
180
+            case self::SUBJECT_SHARE_GROUP . '_by':
181
+            case self::SUBJECT_UNSHARE_GROUP . '_by':
182
+                return [
183
+                    'actor' => $this->generateUserParameter($parameters['actor']),
184
+                    'addressbook' => $this->generateAddressbookParameter($parameters['addressbook'], $l),
185
+                    'group' => $this->generateGroupParameter($parameters['group']),
186
+                ];
187
+        }
188
+
189
+        throw new \InvalidArgumentException();
190
+    }
191 191
 }
Please login to merge, or discard this patch.