Completed
Pull Request — master (#8856)
by John
18:16
created
apps/provisioning_api/lib/Controller/UsersController.php 2 patches
Indentation   +861 added lines, -861 removed lines patch added patch discarded remove patch
@@ -54,865 +54,865 @@
 block discarded – undo
54 54
 
55 55
 class UsersController extends OCSController {
56 56
 
57
-	/** @var IUserManager */
58
-	private $userManager;
59
-	/** @var IConfig */
60
-	private $config;
61
-	/** @var IAppManager */
62
-	private $appManager;
63
-	/** @var IGroupManager|\OC\Group\Manager */ // FIXME Requires a method that is not on the interface
64
-	private $groupManager;
65
-	/** @var IUserSession */
66
-	private $userSession;
67
-	/** @var AccountManager */
68
-	private $accountManager;
69
-	/** @var ILogger */
70
-	private $logger;
71
-	/** @var IFactory */
72
-	private $l10nFactory;
73
-	/** @var NewUserMailHelper */
74
-	private $newUserMailHelper;
75
-	/** @var FederatedFileSharingFactory */
76
-	private $federatedFileSharingFactory;
77
-	/** @var ISecureRandom */
78
-	private $secureRandom;
79
-
80
-	/**
81
-	 * @param string $appName
82
-	 * @param IRequest $request
83
-	 * @param IUserManager $userManager
84
-	 * @param IConfig $config
85
-	 * @param IAppManager $appManager
86
-	 * @param IGroupManager $groupManager
87
-	 * @param IUserSession $userSession
88
-	 * @param AccountManager $accountManager
89
-	 * @param ILogger $logger
90
-	 * @param IFactory $l10nFactory
91
-	 * @param NewUserMailHelper $newUserMailHelper
92
-	 * @param FederatedFileSharingFactory $federatedFileSharingFactory
93
-	 * @param ISecureRandom $secureRandom
94
-	 */
95
-	public function __construct(string $appName,
96
-								IRequest $request,
97
-								IUserManager $userManager,
98
-								IConfig $config,
99
-								IAppManager $appManager,
100
-								IGroupManager $groupManager,
101
-								IUserSession $userSession,
102
-								AccountManager $accountManager,
103
-								ILogger $logger,
104
-								IFactory $l10nFactory,
105
-								NewUserMailHelper $newUserMailHelper,
106
-								FederatedFileSharingFactory $federatedFileSharingFactory,
107
-								ISecureRandom $secureRandom) {
108
-		parent::__construct($appName, $request);
109
-
110
-		$this->userManager = $userManager;
111
-		$this->config = $config;
112
-		$this->appManager = $appManager;
113
-		$this->groupManager = $groupManager;
114
-		$this->userSession = $userSession;
115
-		$this->accountManager = $accountManager;
116
-		$this->logger = $logger;
117
-		$this->l10nFactory = $l10nFactory;
118
-		$this->newUserMailHelper = $newUserMailHelper;
119
-		$this->federatedFileSharingFactory = $federatedFileSharingFactory;
120
-		$this->secureRandom = $secureRandom;
121
-	}
122
-
123
-	/**
124
-	 * @NoAdminRequired
125
-	 *
126
-	 * returns a list of users
127
-	 *
128
-	 * @param string $search
129
-	 * @param int $limit
130
-	 * @param int $offset
131
-	 * @return DataResponse
132
-	 */
133
-	public function getUsers(string $search = '', $limit = null, $offset = null): DataResponse {
134
-		$user = $this->userSession->getUser();
135
-		$users = [];
136
-
137
-		// Admin? Or SubAdmin?
138
-		$uid = $user->getUID();
139
-		$subAdminManager = $this->groupManager->getSubAdmin();
140
-		if($this->groupManager->isAdmin($uid)){
141
-			$users = $this->userManager->search($search, $limit, $offset);
142
-		} else if ($subAdminManager->isSubAdmin($user)) {
143
-			$subAdminOfGroups = $subAdminManager->getSubAdminsGroups($user);
144
-			foreach ($subAdminOfGroups as $key => $group) {
145
-				$subAdminOfGroups[$key] = $group->getGID();
146
-			}
147
-
148
-			if($offset === null) {
149
-				$offset = 0;
150
-			}
151
-
152
-			$users = [];
153
-			foreach ($subAdminOfGroups as $group) {
154
-				$users = array_merge($users, $this->groupManager->displayNamesInGroup($group, $search));
155
-			}
156
-
157
-			$users = array_slice($users, $offset, $limit);
158
-		}
159
-
160
-		$users = array_keys($users);
161
-
162
-		return new DataResponse([
163
-			'users' => $users
164
-		]);
165
-	}
166
-
167
-	/**
168
-	 * @PasswordConfirmationRequired
169
-	 * @NoAdminRequired
170
-	 *
171
-	 * @param string $userid
172
-	 * @param string $password
173
-	 * @param string $email
174
-	 * @param array $groups
175
-	 * @return DataResponse
176
-	 * @throws OCSException
177
-	 */
178
-	public function addUser(string $userid, string $password = '', $email='', array $groups = []): DataResponse {
179
-		$user = $this->userSession->getUser();
180
-		$isAdmin = $this->groupManager->isAdmin($user->getUID());
181
-		$subAdminManager = $this->groupManager->getSubAdmin();
182
-
183
-		if($this->userManager->userExists($userid)) {
184
-			$this->logger->error('Failed addUser attempt: User already exists.', ['app' => 'ocs_api']);
185
-			throw new OCSException('User already exists', 102);
186
-		}
187
-
188
-		if($groups !== []) {
189
-			foreach ($groups as $group) {
190
-				if(!$this->groupManager->groupExists($group)) {
191
-					throw new OCSException('group '.$group.' does not exist', 104);
192
-				}
193
-				if(!$isAdmin && !$subAdminManager->isSubAdminofGroup($user, $this->groupManager->get($group))) {
194
-					throw new OCSException('insufficient privileges for group '. $group, 105);
195
-				}
196
-			}
197
-		} else {
198
-			if(!$isAdmin) {
199
-				throw new OCSException('no group specified (required for subadmins)', 106);
200
-			}
201
-		}
202
-
203
-		$generatePasswordResetToken = false;
204
-		if ($password === '') {
205
-			if ($email === '') {
206
-				throw new OCSException('To send a password link to the user an email address is required.', 108);
207
-			}
208
-
209
-			$password = $this->secureRandom->generate(30);
210
-			// Make sure we pass the password_policy
211
-			$password .= $this->secureRandom->generate(2, '$!.,;:-~+*[]{}()');
212
-			$generatePasswordResetToken = true;
213
-		}
214
-
215
-		try {
216
-			$newUser = $this->userManager->createUser($userid, $password);
217
-			$this->logger->info('Successful addUser call with userid: ' . $userid, ['app' => 'ocs_api']);
218
-
219
-			foreach ($groups as $group) {
220
-				$this->groupManager->get($group)->addUser($newUser);
221
-				$this->logger->info('Added userid ' . $userid . ' to group ' . $group, ['app' => 'ocs_api']);
222
-			}
223
-
224
-			// Send new user mail only if a mail is set
225
-			if ($email !== '') {
226
-				$newUser->setEMailAddress($email);
227
-				try {
228
-					$emailTemplate = $this->newUserMailHelper->generateTemplate($newUser, $generatePasswordResetToken);
229
-					$this->newUserMailHelper->sendMail($newUser, $emailTemplate);
230
-				} catch (\Exception $e) {
231
-					$this->logger->logException($e, [
232
-						'message' => "Can't send new user mail to $email",
233
-						'level' => \OCP\Util::ERROR,
234
-						'app' => 'ocs_api',
235
-					]);
236
-					throw new OCSException('Unable to send the invitation mail', 109);
237
-				}
238
-			}
239
-
240
-			return new DataResponse();
241
-
242
-		} catch (HintException $e ) {
243
-			$this->logger->logException($e, [
244
-				'message' => 'Failed addUser attempt with hint exception.',
245
-				'level' => \OCP\Util::WARN,
246
-				'app' => 'ocs_api',
247
-			]);
248
-			throw new OCSException($e->getHint(), 107);
249
-		} catch (\Exception $e) {
250
-			$this->logger->logException($e, [
251
-				'message' => 'Failed addUser attempt with exception.',
252
-				'level' => \OCP\Util::ERROR,
253
-				'app' => 'ocs_api',
254
-			]);
255
-			throw new OCSException('Bad request', 101);
256
-		}
257
-	}
258
-
259
-	/**
260
-	 * @NoAdminRequired
261
-	 * @NoSubAdminRequired
262
-	 *
263
-	 * gets user info
264
-	 *
265
-	 * @param string $userId
266
-	 * @return DataResponse
267
-	 * @throws OCSException
268
-	 */
269
-	public function getUser(string $userId): DataResponse {
270
-		$data = $this->getUserData($userId);
271
-		return new DataResponse($data);
272
-	}
273
-
274
-	/**
275
-	 * @NoAdminRequired
276
-	 * @NoSubAdminRequired
277
-	 *
278
-	 * gets user info from the currently logged in user
279
-	 *
280
-	 * @return DataResponse
281
-	 * @throws OCSException
282
-	 */
283
-	public function getCurrentUser(): DataResponse {
284
-		$user = $this->userSession->getUser();
285
-		if ($user) {
286
-			$data =  $this->getUserData($user->getUID());
287
-			// rename "displayname" to "display-name" only for this call to keep
288
-			// the API stable.
289
-			$data['display-name'] = $data['displayname'];
290
-			unset($data['displayname']);
291
-			return new DataResponse($data);
292
-
293
-		}
294
-
295
-		throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
296
-	}
297
-
298
-	/**
299
-	 * creates a array with all user data
300
-	 *
301
-	 * @param $userId
302
-	 * @return array
303
-	 * @throws OCSException
304
-	 */
305
-	protected function getUserData(string $userId): array {
306
-		$currentLoggedInUser = $this->userSession->getUser();
307
-
308
-		$data = [];
309
-
310
-		// Check if the target user exists
311
-		$targetUserObject = $this->userManager->get($userId);
312
-		if($targetUserObject === null) {
313
-			throw new OCSException('The requested user could not be found', \OCP\API::RESPOND_NOT_FOUND);
314
-		}
315
-
316
-		// Admin? Or SubAdmin?
317
-		if($this->groupManager->isAdmin($currentLoggedInUser->getUID())
318
-			|| $this->groupManager->getSubAdmin()->isUserAccessible($currentLoggedInUser, $targetUserObject)) {
319
-			$data['enabled'] = $this->config->getUserValue($targetUserObject->getUID(), 'core', 'enabled', 'true');
320
-		} else {
321
-			// Check they are looking up themselves
322
-			if($currentLoggedInUser->getUID() !== $targetUserObject->getUID()) {
323
-				throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
324
-			}
325
-		}
326
-
327
-		$userAccount = $this->accountManager->getUser($targetUserObject);
328
-		$groups = $this->groupManager->getUserGroups($targetUserObject);
329
-		$gids = [];
330
-		foreach ($groups as $group) {
331
-			$gids[] = $group->getDisplayName();
332
-		}
333
-
334
-		// Find the data
335
-		$data['id'] = $targetUserObject->getUID();
336
-		$data['quota'] = $this->fillStorageInfo($targetUserObject->getUID());
337
-		$data[AccountManager::PROPERTY_EMAIL] = $targetUserObject->getEMailAddress();
338
-		$data[AccountManager::PROPERTY_DISPLAYNAME] = $targetUserObject->getDisplayName();
339
-		$data[AccountManager::PROPERTY_PHONE] = $userAccount[AccountManager::PROPERTY_PHONE]['value'];
340
-		$data[AccountManager::PROPERTY_ADDRESS] = $userAccount[AccountManager::PROPERTY_ADDRESS]['value'];
341
-		$data[AccountManager::PROPERTY_WEBSITE] = $userAccount[AccountManager::PROPERTY_WEBSITE]['value'];
342
-		$data[AccountManager::PROPERTY_TWITTER] = $userAccount[AccountManager::PROPERTY_TWITTER]['value'];
343
-		$data['groups'] = $gids;
344
-		$data['language'] = $this->config->getUserValue($targetUserObject->getUID(), 'core', 'lang');
345
-
346
-		return $data;
347
-	}
348
-
349
-	/**
350
-	 * @NoAdminRequired
351
-	 * @NoSubAdminRequired
352
-	 */
353
-	public function getEditableFields(): DataResponse {
354
-		$permittedFields = [];
355
-
356
-		// Editing self (display, email)
357
-		if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
358
-			$permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME;
359
-			$permittedFields[] = AccountManager::PROPERTY_EMAIL;
360
-		}
361
-
362
-		if ($this->appManager->isEnabledForUser('federatedfilesharing')) {
363
-			$federatedFileSharing = $this->federatedFileSharingFactory->get();
364
-			$shareProvider = $federatedFileSharing->getFederatedShareProvider();
365
-			if ($shareProvider->isLookupServerUploadEnabled()) {
366
-				$permittedFields[] = AccountManager::PROPERTY_PHONE;
367
-				$permittedFields[] = AccountManager::PROPERTY_ADDRESS;
368
-				$permittedFields[] = AccountManager::PROPERTY_WEBSITE;
369
-				$permittedFields[] = AccountManager::PROPERTY_TWITTER;
370
-			}
371
-		}
372
-
373
-		return new DataResponse($permittedFields);
374
-	}
375
-
376
-	/**
377
-	 * @NoAdminRequired
378
-	 * @NoSubAdminRequired
379
-	 * @PasswordConfirmationRequired
380
-	 *
381
-	 * edit users
382
-	 *
383
-	 * @param string $userId
384
-	 * @param string $key
385
-	 * @param string $value
386
-	 * @return DataResponse
387
-	 * @throws OCSException
388
-	 */
389
-	public function editUser(string $userId, string $key, string $value): DataResponse {
390
-		$currentLoggedInUser = $this->userSession->getUser();
391
-
392
-		$targetUser = $this->userManager->get($userId);
393
-		if($targetUser === null) {
394
-			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
395
-		}
396
-
397
-		$permittedFields = [];
398
-		if($targetUser->getUID() === $currentLoggedInUser->getUID()) {
399
-			// Editing self (display, email)
400
-			if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
401
-				$permittedFields[] = 'display';
402
-				$permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME;
403
-				$permittedFields[] = AccountManager::PROPERTY_EMAIL;
404
-			}
405
-
406
-			$permittedFields[] = 'password';
407
-			if ($this->config->getSystemValue('force_language', false) === false ||
408
-				$this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
409
-				$permittedFields[] = 'language';
410
-			}
411
-
412
-			if ($this->appManager->isEnabledForUser('federatedfilesharing')) {
413
-				$federatedFileSharing = new \OCA\FederatedFileSharing\AppInfo\Application();
414
-				$shareProvider = $federatedFileSharing->getFederatedShareProvider();
415
-				if ($shareProvider->isLookupServerUploadEnabled()) {
416
-					$permittedFields[] = AccountManager::PROPERTY_PHONE;
417
-					$permittedFields[] = AccountManager::PROPERTY_ADDRESS;
418
-					$permittedFields[] = AccountManager::PROPERTY_WEBSITE;
419
-					$permittedFields[] = AccountManager::PROPERTY_TWITTER;
420
-				}
421
-			}
422
-
423
-			// If admin they can edit their own quota
424
-			if($this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
425
-				$permittedFields[] = 'quota';
426
-			}
427
-		} else {
428
-			// Check if admin / subadmin
429
-			$subAdminManager = $this->groupManager->getSubAdmin();
430
-			if($subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)
431
-			|| $this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
432
-				// They have permissions over the user
433
-				$permittedFields[] = 'display';
434
-				$permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME;
435
-				$permittedFields[] = AccountManager::PROPERTY_EMAIL;
436
-				$permittedFields[] = 'password';
437
-				$permittedFields[] = 'language';
438
-				$permittedFields[] = AccountManager::PROPERTY_PHONE;
439
-				$permittedFields[] = AccountManager::PROPERTY_ADDRESS;
440
-				$permittedFields[] = AccountManager::PROPERTY_WEBSITE;
441
-				$permittedFields[] = AccountManager::PROPERTY_TWITTER;
442
-				$permittedFields[] = 'quota';
443
-			} else {
444
-				// No rights
445
-				throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
446
-			}
447
-		}
448
-		// Check if permitted to edit this field
449
-		if(!in_array($key, $permittedFields)) {
450
-			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
451
-		}
452
-		// Process the edit
453
-		switch($key) {
454
-			case 'display':
455
-			case AccountManager::PROPERTY_DISPLAYNAME:
456
-				$targetUser->setDisplayName($value);
457
-				break;
458
-			case 'quota':
459
-				$quota = $value;
460
-				if($quota !== 'none' && $quota !== 'default') {
461
-					if (is_numeric($quota)) {
462
-						$quota = (float) $quota;
463
-					} else {
464
-						$quota = \OCP\Util::computerFileSize($quota);
465
-					}
466
-					if ($quota === false) {
467
-						throw new OCSException('Invalid quota value '.$value, 103);
468
-					}
469
-					if($quota === 0) {
470
-						$quota = 'default';
471
-					}else if($quota === -1) {
472
-						$quota = 'none';
473
-					} else {
474
-						$quota = \OCP\Util::humanFileSize($quota);
475
-					}
476
-				}
477
-				$targetUser->setQuota($quota);
478
-				break;
479
-			case 'password':
480
-				$targetUser->setPassword($value);
481
-				break;
482
-			case 'language':
483
-				$languagesCodes = $this->l10nFactory->findAvailableLanguages();
484
-				if (!in_array($value, $languagesCodes, true) && $value !== 'en') {
485
-					throw new OCSException('Invalid language', 102);
486
-				}
487
-				$this->config->setUserValue($targetUser->getUID(), 'core', 'lang', $value);
488
-				break;
489
-			case AccountManager::PROPERTY_EMAIL:
490
-				if(filter_var($value, FILTER_VALIDATE_EMAIL)) {
491
-					$targetUser->setEMailAddress($value);
492
-				} else {
493
-					throw new OCSException('', 102);
494
-				}
495
-				break;
496
-			case AccountManager::PROPERTY_PHONE:
497
-			case AccountManager::PROPERTY_ADDRESS:
498
-			case AccountManager::PROPERTY_WEBSITE:
499
-			case AccountManager::PROPERTY_TWITTER:
500
-				$userAccount = $this->accountManager->getUser($targetUser);
501
-				if ($userAccount[$key]['value'] !== $value) {
502
-					$userAccount[$key]['value'] = $value;
503
-					$this->accountManager->updateUser($targetUser, $userAccount);
504
-				}
505
-				break;
506
-			default:
507
-				throw new OCSException('', 103);
508
-		}
509
-		return new DataResponse();
510
-	}
511
-
512
-	/**
513
-	 * @PasswordConfirmationRequired
514
-	 * @NoAdminRequired
515
-	 *
516
-	 * @param string $userId
517
-	 * @return DataResponse
518
-	 * @throws OCSException
519
-	 */
520
-	public function deleteUser(string $userId): DataResponse {
521
-		$currentLoggedInUser = $this->userSession->getUser();
522
-
523
-		$targetUser = $this->userManager->get($userId);
524
-
525
-		if($targetUser === null || $targetUser->getUID() === $currentLoggedInUser->getUID()) {
526
-			throw new OCSException('', 101);
527
-		}
528
-
529
-		// If not permitted
530
-		$subAdminManager = $this->groupManager->getSubAdmin();
531
-		if(!$this->groupManager->isAdmin($currentLoggedInUser->getUID()) && !$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)) {
532
-			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
533
-		}
534
-
535
-		// Go ahead with the delete
536
-		if($targetUser->delete()) {
537
-			return new DataResponse();
538
-		} else {
539
-			throw new OCSException('', 101);
540
-		}
541
-	}
542
-
543
-	/**
544
-	 * @PasswordConfirmationRequired
545
-	 * @NoAdminRequired
546
-	 *
547
-	 * @param string $userId
548
-	 * @return DataResponse
549
-	 * @throws OCSException
550
-	 * @throws OCSForbiddenException
551
-	 */
552
-	public function disableUser(string $userId): DataResponse {
553
-		return $this->setEnabled($userId, false);
554
-	}
555
-
556
-	/**
557
-	 * @PasswordConfirmationRequired
558
-	 * @NoAdminRequired
559
-	 *
560
-	 * @param string $userId
561
-	 * @return DataResponse
562
-	 * @throws OCSException
563
-	 * @throws OCSForbiddenException
564
-	 */
565
-	public function enableUser(string $userId): DataResponse {
566
-		return $this->setEnabled($userId, true);
567
-	}
568
-
569
-	/**
570
-	 * @param string $userId
571
-	 * @param bool $value
572
-	 * @return DataResponse
573
-	 * @throws OCSException
574
-	 */
575
-	private function setEnabled(string $userId, bool $value): DataResponse {
576
-		$currentLoggedInUser = $this->userSession->getUser();
577
-
578
-		$targetUser = $this->userManager->get($userId);
579
-		if($targetUser === null || $targetUser->getUID() === $currentLoggedInUser->getUID()) {
580
-			throw new OCSException('', 101);
581
-		}
582
-
583
-		// If not permitted
584
-		$subAdminManager = $this->groupManager->getSubAdmin();
585
-		if(!$this->groupManager->isAdmin($currentLoggedInUser->getUID()) && !$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)) {
586
-			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
587
-		}
588
-
589
-		// enable/disable the user now
590
-		$targetUser->setEnabled($value);
591
-		return new DataResponse();
592
-	}
593
-
594
-	/**
595
-	 * @NoAdminRequired
596
-	 * @NoSubAdminRequired
597
-	 *
598
-	 * @param string $userId
599
-	 * @return DataResponse
600
-	 * @throws OCSException
601
-	 */
602
-	public function getUsersGroups(string $userId): DataResponse {
603
-		$loggedInUser = $this->userSession->getUser();
604
-
605
-		$targetUser = $this->userManager->get($userId);
606
-		if($targetUser === null) {
607
-			throw new OCSException('', \OCP\API::RESPOND_NOT_FOUND);
608
-		}
609
-
610
-		if($targetUser->getUID() === $loggedInUser->getUID() || $this->groupManager->isAdmin($loggedInUser->getUID())) {
611
-			// Self lookup or admin lookup
612
-			return new DataResponse([
613
-				'groups' => $this->groupManager->getUserGroupIds($targetUser)
614
-			]);
615
-		} else {
616
-			$subAdminManager = $this->groupManager->getSubAdmin();
617
-
618
-			// Looking up someone else
619
-			if($subAdminManager->isUserAccessible($loggedInUser, $targetUser)) {
620
-				// Return the group that the method caller is subadmin of for the user in question
621
-				/** @var IGroup[] $getSubAdminsGroups */
622
-				$getSubAdminsGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
623
-				foreach ($getSubAdminsGroups as $key => $group) {
624
-					$getSubAdminsGroups[$key] = $group->getGID();
625
-				}
626
-				$groups = array_intersect(
627
-					$getSubAdminsGroups,
628
-					$this->groupManager->getUserGroupIds($targetUser)
629
-				);
630
-				return new DataResponse(['groups' => $groups]);
631
-			} else {
632
-				// Not permitted
633
-				throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
634
-			}
635
-		}
636
-
637
-	}
638
-
639
-	/**
640
-	 * @PasswordConfirmationRequired
641
-	 * @NoAdminRequired
642
-	 *
643
-	 * @param string $userId
644
-	 * @param string $groupid
645
-	 * @return DataResponse
646
-	 * @throws OCSException
647
-	 */
648
-	public function addToGroup(string $userId, string $groupid = ''): DataResponse {
649
-		if($groupid === '') {
650
-			throw new OCSException('', 101);
651
-		}
652
-
653
-		$group = $this->groupManager->get($groupid);
654
-		$targetUser = $this->userManager->get($userId);
655
-		if($group === null) {
656
-			throw new OCSException('', 102);
657
-		}
658
-		if($targetUser === null) {
659
-			throw new OCSException('', 103);
660
-		}
661
-
662
-		// If they're not an admin, check they are a subadmin of the group in question
663
-		$loggedInUser = $this->userSession->getUser();
664
-		$subAdminManager = $this->groupManager->getSubAdmin();
665
-		if (!$this->groupManager->isAdmin($loggedInUser->getUID()) && !$subAdminManager->isSubAdminOfGroup($loggedInUser, $group)) {
666
-			throw new OCSException('', 104);
667
-		}
668
-
669
-		// Add user to group
670
-		$group->addUser($targetUser);
671
-		return new DataResponse();
672
-	}
673
-
674
-	/**
675
-	 * @PasswordConfirmationRequired
676
-	 * @NoAdminRequired
677
-	 *
678
-	 * @param string $userId
679
-	 * @param string $groupid
680
-	 * @return DataResponse
681
-	 * @throws OCSException
682
-	 */
683
-	public function removeFromGroup(string $userId, string $groupid): DataResponse {
684
-		$loggedInUser = $this->userSession->getUser();
685
-
686
-		if($groupid === null || trim($groupid) === '') {
687
-			throw new OCSException('', 101);
688
-		}
689
-
690
-		$group = $this->groupManager->get($groupid);
691
-		if($group === null) {
692
-			throw new OCSException('', 102);
693
-		}
694
-
695
-		$targetUser = $this->userManager->get($userId);
696
-		if($targetUser === null) {
697
-			throw new OCSException('', 103);
698
-		}
699
-
700
-		// If they're not an admin, check they are a subadmin of the group in question
701
-		$subAdminManager = $this->groupManager->getSubAdmin();
702
-		if (!$this->groupManager->isAdmin($loggedInUser->getUID()) && !$subAdminManager->isSubAdminOfGroup($loggedInUser, $group)) {
703
-			throw new OCSException('', 104);
704
-		}
705
-
706
-		// Check they aren't removing themselves from 'admin' or their 'subadmin; group
707
-		if ($targetUser->getUID() === $loggedInUser->getUID()) {
708
-			if ($this->groupManager->isAdmin($loggedInUser->getUID())) {
709
-				if ($group->getGID() === 'admin') {
710
-					throw new OCSException('Cannot remove yourself from the admin group', 105);
711
-				}
712
-			} else {
713
-				// Not an admin, so the user must be a subadmin of this group, but that is not allowed.
714
-				throw new OCSException('Cannot remove yourself from this group as you are a SubAdmin', 105);
715
-			}
716
-
717
-		} else if (!$this->groupManager->isAdmin($loggedInUser->getUID())) {
718
-			/** @var IGroup[] $subAdminGroups */
719
-			$subAdminGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
720
-			$subAdminGroups = array_map(function (IGroup $subAdminGroup) {
721
-				return $subAdminGroup->getGID();
722
-			}, $subAdminGroups);
723
-			$userGroups = $this->groupManager->getUserGroupIds($targetUser);
724
-			$userSubAdminGroups = array_intersect($subAdminGroups, $userGroups);
725
-
726
-			if (count($userSubAdminGroups) <= 1) {
727
-				// Subadmin must not be able to remove a user from all their subadmin groups.
728
-				throw new OCSException('Cannot remove user from this group as this is the only remaining group you are a SubAdmin of', 105);
729
-			}
730
-		}
731
-
732
-		// Remove user from group
733
-		$group->removeUser($targetUser);
734
-		return new DataResponse();
735
-	}
736
-
737
-	/**
738
-	 * Creates a subadmin
739
-	 *
740
-	 * @PasswordConfirmationRequired
741
-	 *
742
-	 * @param string $userId
743
-	 * @param string $groupid
744
-	 * @return DataResponse
745
-	 * @throws OCSException
746
-	 */
747
-	public function addSubAdmin(string $userId, string $groupid): DataResponse {
748
-		$group = $this->groupManager->get($groupid);
749
-		$user = $this->userManager->get($userId);
750
-
751
-		// Check if the user exists
752
-		if($user === null) {
753
-			throw new OCSException('User does not exist', 101);
754
-		}
755
-		// Check if group exists
756
-		if($group === null) {
757
-			throw new OCSException('Group does not exist',  102);
758
-		}
759
-		// Check if trying to make subadmin of admin group
760
-		if($group->getGID() === 'admin') {
761
-			throw new OCSException('Cannot create subadmins for admin group', 103);
762
-		}
763
-
764
-		$subAdminManager = $this->groupManager->getSubAdmin();
765
-
766
-		// We cannot be subadmin twice
767
-		if ($subAdminManager->isSubAdminofGroup($user, $group)) {
768
-			return new DataResponse();
769
-		}
770
-		// Go
771
-		if($subAdminManager->createSubAdmin($user, $group)) {
772
-			return new DataResponse();
773
-		} else {
774
-			throw new OCSException('Unknown error occurred', 103);
775
-		}
776
-	}
777
-
778
-	/**
779
-	 * Removes a subadmin from a group
780
-	 *
781
-	 * @PasswordConfirmationRequired
782
-	 *
783
-	 * @param string $userId
784
-	 * @param string $groupid
785
-	 * @return DataResponse
786
-	 * @throws OCSException
787
-	 */
788
-	public function removeSubAdmin(string $userId, string $groupid): DataResponse {
789
-		$group = $this->groupManager->get($groupid);
790
-		$user = $this->userManager->get($userId);
791
-		$subAdminManager = $this->groupManager->getSubAdmin();
792
-
793
-		// Check if the user exists
794
-		if($user === null) {
795
-			throw new OCSException('User does not exist', 101);
796
-		}
797
-		// Check if the group exists
798
-		if($group === null) {
799
-			throw new OCSException('Group does not exist', 101);
800
-		}
801
-		// Check if they are a subadmin of this said group
802
-		if(!$subAdminManager->isSubAdminOfGroup($user, $group)) {
803
-			throw new OCSException('User is not a subadmin of this group', 102);
804
-		}
805
-
806
-		// Go
807
-		if($subAdminManager->deleteSubAdmin($user, $group)) {
808
-			return new DataResponse();
809
-		} else {
810
-			throw new OCSException('Unknown error occurred', 103);
811
-		}
812
-	}
813
-
814
-	/**
815
-	 * Get the groups a user is a subadmin of
816
-	 *
817
-	 * @param string $userId
818
-	 * @return DataResponse
819
-	 * @throws OCSException
820
-	 */
821
-	public function getUserSubAdminGroups(string $userId): DataResponse {
822
-		$user = $this->userManager->get($userId);
823
-		// Check if the user exists
824
-		if($user === null) {
825
-			throw new OCSException('User does not exist', 101);
826
-		}
827
-
828
-		// Get the subadmin groups
829
-		$subAdminGroups = $this->groupManager->getSubAdmin()->getSubAdminsGroups($user);
830
-		$groups = [];
831
-		foreach ($subAdminGroups as $key => $group) {
832
-			$groups[] = $group->getGID();
833
-		}
834
-
835
-		if(!$groups) {
836
-			throw new OCSException('Unknown error occurred', 102);
837
-		} else {
838
-			return new DataResponse($groups);
839
-		}
840
-	}
841
-
842
-	/**
843
-	 * @param string $userId
844
-	 * @return array
845
-	 * @throws \OCP\Files\NotFoundException
846
-	 */
847
-	protected function fillStorageInfo(string $userId): array {
848
-		try {
849
-			\OC_Util::tearDownFS();
850
-			\OC_Util::setupFS($userId);
851
-			$storage = OC_Helper::getStorageInfo('/');
852
-			$data = [
853
-				'free' => $storage['free'],
854
-				'used' => $storage['used'],
855
-				'total' => $storage['total'],
856
-				'relative' => $storage['relative'],
857
-				'quota' => $storage['quota'],
858
-			];
859
-		} catch (NotFoundException $ex) {
860
-			$data = [];
861
-		}
862
-		return $data;
863
-	}
864
-
865
-	/**
866
-	 * @NoAdminRequired
867
-	 * @PasswordConfirmationRequired
868
-	 *
869
-	 * resend welcome message
870
-	 *
871
-	 * @param string $userId
872
-	 * @return DataResponse
873
-	 * @throws OCSException
874
-	 */
875
-	public function resendWelcomeMessage(string $userId): DataResponse {
876
-		$currentLoggedInUser = $this->userSession->getUser();
877
-
878
-		$targetUser = $this->userManager->get($userId);
879
-		if($targetUser === null) {
880
-			throw new OCSException('', \OCP\API::RESPOND_NOT_FOUND);
881
-		}
882
-
883
-		// Check if admin / subadmin
884
-		$subAdminManager = $this->groupManager->getSubAdmin();
885
-		if(!$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)
886
-			&& !$this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
887
-			// No rights
888
-			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
889
-		}
890
-
891
-		$email = $targetUser->getEMailAddress();
892
-		if ($email === '' || $email === null) {
893
-			throw new OCSException('Email address not available', 101);
894
-		}
895
-		$username = $targetUser->getUID();
896
-		$lang = $this->config->getUserValue($username, 'core', 'lang', 'en');
897
-		if (!$this->l10nFactory->languageExists('settings', $lang)) {
898
-			$lang = 'en';
899
-		}
900
-
901
-		$l10n = $this->l10nFactory->get('settings', $lang);
902
-
903
-		try {
904
-			$this->newUserMailHelper->setL10N($l10n);
905
-			$emailTemplate = $this->newUserMailHelper->generateTemplate($targetUser, false);
906
-			$this->newUserMailHelper->sendMail($targetUser, $emailTemplate);
907
-		} catch(\Exception $e) {
908
-			$this->logger->logException($e, [
909
-				'message' => "Can't send new user mail to $email",
910
-				'level' => \OCP\Util::ERROR,
911
-				'app' => 'settings',
912
-			]);
913
-			throw new OCSException('Sending email failed', 102);
914
-		}
915
-
916
-		return new DataResponse();
917
-	}
57
+    /** @var IUserManager */
58
+    private $userManager;
59
+    /** @var IConfig */
60
+    private $config;
61
+    /** @var IAppManager */
62
+    private $appManager;
63
+    /** @var IGroupManager|\OC\Group\Manager */ // FIXME Requires a method that is not on the interface
64
+    private $groupManager;
65
+    /** @var IUserSession */
66
+    private $userSession;
67
+    /** @var AccountManager */
68
+    private $accountManager;
69
+    /** @var ILogger */
70
+    private $logger;
71
+    /** @var IFactory */
72
+    private $l10nFactory;
73
+    /** @var NewUserMailHelper */
74
+    private $newUserMailHelper;
75
+    /** @var FederatedFileSharingFactory */
76
+    private $federatedFileSharingFactory;
77
+    /** @var ISecureRandom */
78
+    private $secureRandom;
79
+
80
+    /**
81
+     * @param string $appName
82
+     * @param IRequest $request
83
+     * @param IUserManager $userManager
84
+     * @param IConfig $config
85
+     * @param IAppManager $appManager
86
+     * @param IGroupManager $groupManager
87
+     * @param IUserSession $userSession
88
+     * @param AccountManager $accountManager
89
+     * @param ILogger $logger
90
+     * @param IFactory $l10nFactory
91
+     * @param NewUserMailHelper $newUserMailHelper
92
+     * @param FederatedFileSharingFactory $federatedFileSharingFactory
93
+     * @param ISecureRandom $secureRandom
94
+     */
95
+    public function __construct(string $appName,
96
+                                IRequest $request,
97
+                                IUserManager $userManager,
98
+                                IConfig $config,
99
+                                IAppManager $appManager,
100
+                                IGroupManager $groupManager,
101
+                                IUserSession $userSession,
102
+                                AccountManager $accountManager,
103
+                                ILogger $logger,
104
+                                IFactory $l10nFactory,
105
+                                NewUserMailHelper $newUserMailHelper,
106
+                                FederatedFileSharingFactory $federatedFileSharingFactory,
107
+                                ISecureRandom $secureRandom) {
108
+        parent::__construct($appName, $request);
109
+
110
+        $this->userManager = $userManager;
111
+        $this->config = $config;
112
+        $this->appManager = $appManager;
113
+        $this->groupManager = $groupManager;
114
+        $this->userSession = $userSession;
115
+        $this->accountManager = $accountManager;
116
+        $this->logger = $logger;
117
+        $this->l10nFactory = $l10nFactory;
118
+        $this->newUserMailHelper = $newUserMailHelper;
119
+        $this->federatedFileSharingFactory = $federatedFileSharingFactory;
120
+        $this->secureRandom = $secureRandom;
121
+    }
122
+
123
+    /**
124
+     * @NoAdminRequired
125
+     *
126
+     * returns a list of users
127
+     *
128
+     * @param string $search
129
+     * @param int $limit
130
+     * @param int $offset
131
+     * @return DataResponse
132
+     */
133
+    public function getUsers(string $search = '', $limit = null, $offset = null): DataResponse {
134
+        $user = $this->userSession->getUser();
135
+        $users = [];
136
+
137
+        // Admin? Or SubAdmin?
138
+        $uid = $user->getUID();
139
+        $subAdminManager = $this->groupManager->getSubAdmin();
140
+        if($this->groupManager->isAdmin($uid)){
141
+            $users = $this->userManager->search($search, $limit, $offset);
142
+        } else if ($subAdminManager->isSubAdmin($user)) {
143
+            $subAdminOfGroups = $subAdminManager->getSubAdminsGroups($user);
144
+            foreach ($subAdminOfGroups as $key => $group) {
145
+                $subAdminOfGroups[$key] = $group->getGID();
146
+            }
147
+
148
+            if($offset === null) {
149
+                $offset = 0;
150
+            }
151
+
152
+            $users = [];
153
+            foreach ($subAdminOfGroups as $group) {
154
+                $users = array_merge($users, $this->groupManager->displayNamesInGroup($group, $search));
155
+            }
156
+
157
+            $users = array_slice($users, $offset, $limit);
158
+        }
159
+
160
+        $users = array_keys($users);
161
+
162
+        return new DataResponse([
163
+            'users' => $users
164
+        ]);
165
+    }
166
+
167
+    /**
168
+     * @PasswordConfirmationRequired
169
+     * @NoAdminRequired
170
+     *
171
+     * @param string $userid
172
+     * @param string $password
173
+     * @param string $email
174
+     * @param array $groups
175
+     * @return DataResponse
176
+     * @throws OCSException
177
+     */
178
+    public function addUser(string $userid, string $password = '', $email='', array $groups = []): DataResponse {
179
+        $user = $this->userSession->getUser();
180
+        $isAdmin = $this->groupManager->isAdmin($user->getUID());
181
+        $subAdminManager = $this->groupManager->getSubAdmin();
182
+
183
+        if($this->userManager->userExists($userid)) {
184
+            $this->logger->error('Failed addUser attempt: User already exists.', ['app' => 'ocs_api']);
185
+            throw new OCSException('User already exists', 102);
186
+        }
187
+
188
+        if($groups !== []) {
189
+            foreach ($groups as $group) {
190
+                if(!$this->groupManager->groupExists($group)) {
191
+                    throw new OCSException('group '.$group.' does not exist', 104);
192
+                }
193
+                if(!$isAdmin && !$subAdminManager->isSubAdminofGroup($user, $this->groupManager->get($group))) {
194
+                    throw new OCSException('insufficient privileges for group '. $group, 105);
195
+                }
196
+            }
197
+        } else {
198
+            if(!$isAdmin) {
199
+                throw new OCSException('no group specified (required for subadmins)', 106);
200
+            }
201
+        }
202
+
203
+        $generatePasswordResetToken = false;
204
+        if ($password === '') {
205
+            if ($email === '') {
206
+                throw new OCSException('To send a password link to the user an email address is required.', 108);
207
+            }
208
+
209
+            $password = $this->secureRandom->generate(30);
210
+            // Make sure we pass the password_policy
211
+            $password .= $this->secureRandom->generate(2, '$!.,;:-~+*[]{}()');
212
+            $generatePasswordResetToken = true;
213
+        }
214
+
215
+        try {
216
+            $newUser = $this->userManager->createUser($userid, $password);
217
+            $this->logger->info('Successful addUser call with userid: ' . $userid, ['app' => 'ocs_api']);
218
+
219
+            foreach ($groups as $group) {
220
+                $this->groupManager->get($group)->addUser($newUser);
221
+                $this->logger->info('Added userid ' . $userid . ' to group ' . $group, ['app' => 'ocs_api']);
222
+            }
223
+
224
+            // Send new user mail only if a mail is set
225
+            if ($email !== '') {
226
+                $newUser->setEMailAddress($email);
227
+                try {
228
+                    $emailTemplate = $this->newUserMailHelper->generateTemplate($newUser, $generatePasswordResetToken);
229
+                    $this->newUserMailHelper->sendMail($newUser, $emailTemplate);
230
+                } catch (\Exception $e) {
231
+                    $this->logger->logException($e, [
232
+                        'message' => "Can't send new user mail to $email",
233
+                        'level' => \OCP\Util::ERROR,
234
+                        'app' => 'ocs_api',
235
+                    ]);
236
+                    throw new OCSException('Unable to send the invitation mail', 109);
237
+                }
238
+            }
239
+
240
+            return new DataResponse();
241
+
242
+        } catch (HintException $e ) {
243
+            $this->logger->logException($e, [
244
+                'message' => 'Failed addUser attempt with hint exception.',
245
+                'level' => \OCP\Util::WARN,
246
+                'app' => 'ocs_api',
247
+            ]);
248
+            throw new OCSException($e->getHint(), 107);
249
+        } catch (\Exception $e) {
250
+            $this->logger->logException($e, [
251
+                'message' => 'Failed addUser attempt with exception.',
252
+                'level' => \OCP\Util::ERROR,
253
+                'app' => 'ocs_api',
254
+            ]);
255
+            throw new OCSException('Bad request', 101);
256
+        }
257
+    }
258
+
259
+    /**
260
+     * @NoAdminRequired
261
+     * @NoSubAdminRequired
262
+     *
263
+     * gets user info
264
+     *
265
+     * @param string $userId
266
+     * @return DataResponse
267
+     * @throws OCSException
268
+     */
269
+    public function getUser(string $userId): DataResponse {
270
+        $data = $this->getUserData($userId);
271
+        return new DataResponse($data);
272
+    }
273
+
274
+    /**
275
+     * @NoAdminRequired
276
+     * @NoSubAdminRequired
277
+     *
278
+     * gets user info from the currently logged in user
279
+     *
280
+     * @return DataResponse
281
+     * @throws OCSException
282
+     */
283
+    public function getCurrentUser(): DataResponse {
284
+        $user = $this->userSession->getUser();
285
+        if ($user) {
286
+            $data =  $this->getUserData($user->getUID());
287
+            // rename "displayname" to "display-name" only for this call to keep
288
+            // the API stable.
289
+            $data['display-name'] = $data['displayname'];
290
+            unset($data['displayname']);
291
+            return new DataResponse($data);
292
+
293
+        }
294
+
295
+        throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
296
+    }
297
+
298
+    /**
299
+     * creates a array with all user data
300
+     *
301
+     * @param $userId
302
+     * @return array
303
+     * @throws OCSException
304
+     */
305
+    protected function getUserData(string $userId): array {
306
+        $currentLoggedInUser = $this->userSession->getUser();
307
+
308
+        $data = [];
309
+
310
+        // Check if the target user exists
311
+        $targetUserObject = $this->userManager->get($userId);
312
+        if($targetUserObject === null) {
313
+            throw new OCSException('The requested user could not be found', \OCP\API::RESPOND_NOT_FOUND);
314
+        }
315
+
316
+        // Admin? Or SubAdmin?
317
+        if($this->groupManager->isAdmin($currentLoggedInUser->getUID())
318
+            || $this->groupManager->getSubAdmin()->isUserAccessible($currentLoggedInUser, $targetUserObject)) {
319
+            $data['enabled'] = $this->config->getUserValue($targetUserObject->getUID(), 'core', 'enabled', 'true');
320
+        } else {
321
+            // Check they are looking up themselves
322
+            if($currentLoggedInUser->getUID() !== $targetUserObject->getUID()) {
323
+                throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
324
+            }
325
+        }
326
+
327
+        $userAccount = $this->accountManager->getUser($targetUserObject);
328
+        $groups = $this->groupManager->getUserGroups($targetUserObject);
329
+        $gids = [];
330
+        foreach ($groups as $group) {
331
+            $gids[] = $group->getDisplayName();
332
+        }
333
+
334
+        // Find the data
335
+        $data['id'] = $targetUserObject->getUID();
336
+        $data['quota'] = $this->fillStorageInfo($targetUserObject->getUID());
337
+        $data[AccountManager::PROPERTY_EMAIL] = $targetUserObject->getEMailAddress();
338
+        $data[AccountManager::PROPERTY_DISPLAYNAME] = $targetUserObject->getDisplayName();
339
+        $data[AccountManager::PROPERTY_PHONE] = $userAccount[AccountManager::PROPERTY_PHONE]['value'];
340
+        $data[AccountManager::PROPERTY_ADDRESS] = $userAccount[AccountManager::PROPERTY_ADDRESS]['value'];
341
+        $data[AccountManager::PROPERTY_WEBSITE] = $userAccount[AccountManager::PROPERTY_WEBSITE]['value'];
342
+        $data[AccountManager::PROPERTY_TWITTER] = $userAccount[AccountManager::PROPERTY_TWITTER]['value'];
343
+        $data['groups'] = $gids;
344
+        $data['language'] = $this->config->getUserValue($targetUserObject->getUID(), 'core', 'lang');
345
+
346
+        return $data;
347
+    }
348
+
349
+    /**
350
+     * @NoAdminRequired
351
+     * @NoSubAdminRequired
352
+     */
353
+    public function getEditableFields(): DataResponse {
354
+        $permittedFields = [];
355
+
356
+        // Editing self (display, email)
357
+        if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
358
+            $permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME;
359
+            $permittedFields[] = AccountManager::PROPERTY_EMAIL;
360
+        }
361
+
362
+        if ($this->appManager->isEnabledForUser('federatedfilesharing')) {
363
+            $federatedFileSharing = $this->federatedFileSharingFactory->get();
364
+            $shareProvider = $federatedFileSharing->getFederatedShareProvider();
365
+            if ($shareProvider->isLookupServerUploadEnabled()) {
366
+                $permittedFields[] = AccountManager::PROPERTY_PHONE;
367
+                $permittedFields[] = AccountManager::PROPERTY_ADDRESS;
368
+                $permittedFields[] = AccountManager::PROPERTY_WEBSITE;
369
+                $permittedFields[] = AccountManager::PROPERTY_TWITTER;
370
+            }
371
+        }
372
+
373
+        return new DataResponse($permittedFields);
374
+    }
375
+
376
+    /**
377
+     * @NoAdminRequired
378
+     * @NoSubAdminRequired
379
+     * @PasswordConfirmationRequired
380
+     *
381
+     * edit users
382
+     *
383
+     * @param string $userId
384
+     * @param string $key
385
+     * @param string $value
386
+     * @return DataResponse
387
+     * @throws OCSException
388
+     */
389
+    public function editUser(string $userId, string $key, string $value): DataResponse {
390
+        $currentLoggedInUser = $this->userSession->getUser();
391
+
392
+        $targetUser = $this->userManager->get($userId);
393
+        if($targetUser === null) {
394
+            throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
395
+        }
396
+
397
+        $permittedFields = [];
398
+        if($targetUser->getUID() === $currentLoggedInUser->getUID()) {
399
+            // Editing self (display, email)
400
+            if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
401
+                $permittedFields[] = 'display';
402
+                $permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME;
403
+                $permittedFields[] = AccountManager::PROPERTY_EMAIL;
404
+            }
405
+
406
+            $permittedFields[] = 'password';
407
+            if ($this->config->getSystemValue('force_language', false) === false ||
408
+                $this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
409
+                $permittedFields[] = 'language';
410
+            }
411
+
412
+            if ($this->appManager->isEnabledForUser('federatedfilesharing')) {
413
+                $federatedFileSharing = new \OCA\FederatedFileSharing\AppInfo\Application();
414
+                $shareProvider = $federatedFileSharing->getFederatedShareProvider();
415
+                if ($shareProvider->isLookupServerUploadEnabled()) {
416
+                    $permittedFields[] = AccountManager::PROPERTY_PHONE;
417
+                    $permittedFields[] = AccountManager::PROPERTY_ADDRESS;
418
+                    $permittedFields[] = AccountManager::PROPERTY_WEBSITE;
419
+                    $permittedFields[] = AccountManager::PROPERTY_TWITTER;
420
+                }
421
+            }
422
+
423
+            // If admin they can edit their own quota
424
+            if($this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
425
+                $permittedFields[] = 'quota';
426
+            }
427
+        } else {
428
+            // Check if admin / subadmin
429
+            $subAdminManager = $this->groupManager->getSubAdmin();
430
+            if($subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)
431
+            || $this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
432
+                // They have permissions over the user
433
+                $permittedFields[] = 'display';
434
+                $permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME;
435
+                $permittedFields[] = AccountManager::PROPERTY_EMAIL;
436
+                $permittedFields[] = 'password';
437
+                $permittedFields[] = 'language';
438
+                $permittedFields[] = AccountManager::PROPERTY_PHONE;
439
+                $permittedFields[] = AccountManager::PROPERTY_ADDRESS;
440
+                $permittedFields[] = AccountManager::PROPERTY_WEBSITE;
441
+                $permittedFields[] = AccountManager::PROPERTY_TWITTER;
442
+                $permittedFields[] = 'quota';
443
+            } else {
444
+                // No rights
445
+                throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
446
+            }
447
+        }
448
+        // Check if permitted to edit this field
449
+        if(!in_array($key, $permittedFields)) {
450
+            throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
451
+        }
452
+        // Process the edit
453
+        switch($key) {
454
+            case 'display':
455
+            case AccountManager::PROPERTY_DISPLAYNAME:
456
+                $targetUser->setDisplayName($value);
457
+                break;
458
+            case 'quota':
459
+                $quota = $value;
460
+                if($quota !== 'none' && $quota !== 'default') {
461
+                    if (is_numeric($quota)) {
462
+                        $quota = (float) $quota;
463
+                    } else {
464
+                        $quota = \OCP\Util::computerFileSize($quota);
465
+                    }
466
+                    if ($quota === false) {
467
+                        throw new OCSException('Invalid quota value '.$value, 103);
468
+                    }
469
+                    if($quota === 0) {
470
+                        $quota = 'default';
471
+                    }else if($quota === -1) {
472
+                        $quota = 'none';
473
+                    } else {
474
+                        $quota = \OCP\Util::humanFileSize($quota);
475
+                    }
476
+                }
477
+                $targetUser->setQuota($quota);
478
+                break;
479
+            case 'password':
480
+                $targetUser->setPassword($value);
481
+                break;
482
+            case 'language':
483
+                $languagesCodes = $this->l10nFactory->findAvailableLanguages();
484
+                if (!in_array($value, $languagesCodes, true) && $value !== 'en') {
485
+                    throw new OCSException('Invalid language', 102);
486
+                }
487
+                $this->config->setUserValue($targetUser->getUID(), 'core', 'lang', $value);
488
+                break;
489
+            case AccountManager::PROPERTY_EMAIL:
490
+                if(filter_var($value, FILTER_VALIDATE_EMAIL)) {
491
+                    $targetUser->setEMailAddress($value);
492
+                } else {
493
+                    throw new OCSException('', 102);
494
+                }
495
+                break;
496
+            case AccountManager::PROPERTY_PHONE:
497
+            case AccountManager::PROPERTY_ADDRESS:
498
+            case AccountManager::PROPERTY_WEBSITE:
499
+            case AccountManager::PROPERTY_TWITTER:
500
+                $userAccount = $this->accountManager->getUser($targetUser);
501
+                if ($userAccount[$key]['value'] !== $value) {
502
+                    $userAccount[$key]['value'] = $value;
503
+                    $this->accountManager->updateUser($targetUser, $userAccount);
504
+                }
505
+                break;
506
+            default:
507
+                throw new OCSException('', 103);
508
+        }
509
+        return new DataResponse();
510
+    }
511
+
512
+    /**
513
+     * @PasswordConfirmationRequired
514
+     * @NoAdminRequired
515
+     *
516
+     * @param string $userId
517
+     * @return DataResponse
518
+     * @throws OCSException
519
+     */
520
+    public function deleteUser(string $userId): DataResponse {
521
+        $currentLoggedInUser = $this->userSession->getUser();
522
+
523
+        $targetUser = $this->userManager->get($userId);
524
+
525
+        if($targetUser === null || $targetUser->getUID() === $currentLoggedInUser->getUID()) {
526
+            throw new OCSException('', 101);
527
+        }
528
+
529
+        // If not permitted
530
+        $subAdminManager = $this->groupManager->getSubAdmin();
531
+        if(!$this->groupManager->isAdmin($currentLoggedInUser->getUID()) && !$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)) {
532
+            throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
533
+        }
534
+
535
+        // Go ahead with the delete
536
+        if($targetUser->delete()) {
537
+            return new DataResponse();
538
+        } else {
539
+            throw new OCSException('', 101);
540
+        }
541
+    }
542
+
543
+    /**
544
+     * @PasswordConfirmationRequired
545
+     * @NoAdminRequired
546
+     *
547
+     * @param string $userId
548
+     * @return DataResponse
549
+     * @throws OCSException
550
+     * @throws OCSForbiddenException
551
+     */
552
+    public function disableUser(string $userId): DataResponse {
553
+        return $this->setEnabled($userId, false);
554
+    }
555
+
556
+    /**
557
+     * @PasswordConfirmationRequired
558
+     * @NoAdminRequired
559
+     *
560
+     * @param string $userId
561
+     * @return DataResponse
562
+     * @throws OCSException
563
+     * @throws OCSForbiddenException
564
+     */
565
+    public function enableUser(string $userId): DataResponse {
566
+        return $this->setEnabled($userId, true);
567
+    }
568
+
569
+    /**
570
+     * @param string $userId
571
+     * @param bool $value
572
+     * @return DataResponse
573
+     * @throws OCSException
574
+     */
575
+    private function setEnabled(string $userId, bool $value): DataResponse {
576
+        $currentLoggedInUser = $this->userSession->getUser();
577
+
578
+        $targetUser = $this->userManager->get($userId);
579
+        if($targetUser === null || $targetUser->getUID() === $currentLoggedInUser->getUID()) {
580
+            throw new OCSException('', 101);
581
+        }
582
+
583
+        // If not permitted
584
+        $subAdminManager = $this->groupManager->getSubAdmin();
585
+        if(!$this->groupManager->isAdmin($currentLoggedInUser->getUID()) && !$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)) {
586
+            throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
587
+        }
588
+
589
+        // enable/disable the user now
590
+        $targetUser->setEnabled($value);
591
+        return new DataResponse();
592
+    }
593
+
594
+    /**
595
+     * @NoAdminRequired
596
+     * @NoSubAdminRequired
597
+     *
598
+     * @param string $userId
599
+     * @return DataResponse
600
+     * @throws OCSException
601
+     */
602
+    public function getUsersGroups(string $userId): DataResponse {
603
+        $loggedInUser = $this->userSession->getUser();
604
+
605
+        $targetUser = $this->userManager->get($userId);
606
+        if($targetUser === null) {
607
+            throw new OCSException('', \OCP\API::RESPOND_NOT_FOUND);
608
+        }
609
+
610
+        if($targetUser->getUID() === $loggedInUser->getUID() || $this->groupManager->isAdmin($loggedInUser->getUID())) {
611
+            // Self lookup or admin lookup
612
+            return new DataResponse([
613
+                'groups' => $this->groupManager->getUserGroupIds($targetUser)
614
+            ]);
615
+        } else {
616
+            $subAdminManager = $this->groupManager->getSubAdmin();
617
+
618
+            // Looking up someone else
619
+            if($subAdminManager->isUserAccessible($loggedInUser, $targetUser)) {
620
+                // Return the group that the method caller is subadmin of for the user in question
621
+                /** @var IGroup[] $getSubAdminsGroups */
622
+                $getSubAdminsGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
623
+                foreach ($getSubAdminsGroups as $key => $group) {
624
+                    $getSubAdminsGroups[$key] = $group->getGID();
625
+                }
626
+                $groups = array_intersect(
627
+                    $getSubAdminsGroups,
628
+                    $this->groupManager->getUserGroupIds($targetUser)
629
+                );
630
+                return new DataResponse(['groups' => $groups]);
631
+            } else {
632
+                // Not permitted
633
+                throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
634
+            }
635
+        }
636
+
637
+    }
638
+
639
+    /**
640
+     * @PasswordConfirmationRequired
641
+     * @NoAdminRequired
642
+     *
643
+     * @param string $userId
644
+     * @param string $groupid
645
+     * @return DataResponse
646
+     * @throws OCSException
647
+     */
648
+    public function addToGroup(string $userId, string $groupid = ''): DataResponse {
649
+        if($groupid === '') {
650
+            throw new OCSException('', 101);
651
+        }
652
+
653
+        $group = $this->groupManager->get($groupid);
654
+        $targetUser = $this->userManager->get($userId);
655
+        if($group === null) {
656
+            throw new OCSException('', 102);
657
+        }
658
+        if($targetUser === null) {
659
+            throw new OCSException('', 103);
660
+        }
661
+
662
+        // If they're not an admin, check they are a subadmin of the group in question
663
+        $loggedInUser = $this->userSession->getUser();
664
+        $subAdminManager = $this->groupManager->getSubAdmin();
665
+        if (!$this->groupManager->isAdmin($loggedInUser->getUID()) && !$subAdminManager->isSubAdminOfGroup($loggedInUser, $group)) {
666
+            throw new OCSException('', 104);
667
+        }
668
+
669
+        // Add user to group
670
+        $group->addUser($targetUser);
671
+        return new DataResponse();
672
+    }
673
+
674
+    /**
675
+     * @PasswordConfirmationRequired
676
+     * @NoAdminRequired
677
+     *
678
+     * @param string $userId
679
+     * @param string $groupid
680
+     * @return DataResponse
681
+     * @throws OCSException
682
+     */
683
+    public function removeFromGroup(string $userId, string $groupid): DataResponse {
684
+        $loggedInUser = $this->userSession->getUser();
685
+
686
+        if($groupid === null || trim($groupid) === '') {
687
+            throw new OCSException('', 101);
688
+        }
689
+
690
+        $group = $this->groupManager->get($groupid);
691
+        if($group === null) {
692
+            throw new OCSException('', 102);
693
+        }
694
+
695
+        $targetUser = $this->userManager->get($userId);
696
+        if($targetUser === null) {
697
+            throw new OCSException('', 103);
698
+        }
699
+
700
+        // If they're not an admin, check they are a subadmin of the group in question
701
+        $subAdminManager = $this->groupManager->getSubAdmin();
702
+        if (!$this->groupManager->isAdmin($loggedInUser->getUID()) && !$subAdminManager->isSubAdminOfGroup($loggedInUser, $group)) {
703
+            throw new OCSException('', 104);
704
+        }
705
+
706
+        // Check they aren't removing themselves from 'admin' or their 'subadmin; group
707
+        if ($targetUser->getUID() === $loggedInUser->getUID()) {
708
+            if ($this->groupManager->isAdmin($loggedInUser->getUID())) {
709
+                if ($group->getGID() === 'admin') {
710
+                    throw new OCSException('Cannot remove yourself from the admin group', 105);
711
+                }
712
+            } else {
713
+                // Not an admin, so the user must be a subadmin of this group, but that is not allowed.
714
+                throw new OCSException('Cannot remove yourself from this group as you are a SubAdmin', 105);
715
+            }
716
+
717
+        } else if (!$this->groupManager->isAdmin($loggedInUser->getUID())) {
718
+            /** @var IGroup[] $subAdminGroups */
719
+            $subAdminGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
720
+            $subAdminGroups = array_map(function (IGroup $subAdminGroup) {
721
+                return $subAdminGroup->getGID();
722
+            }, $subAdminGroups);
723
+            $userGroups = $this->groupManager->getUserGroupIds($targetUser);
724
+            $userSubAdminGroups = array_intersect($subAdminGroups, $userGroups);
725
+
726
+            if (count($userSubAdminGroups) <= 1) {
727
+                // Subadmin must not be able to remove a user from all their subadmin groups.
728
+                throw new OCSException('Cannot remove user from this group as this is the only remaining group you are a SubAdmin of', 105);
729
+            }
730
+        }
731
+
732
+        // Remove user from group
733
+        $group->removeUser($targetUser);
734
+        return new DataResponse();
735
+    }
736
+
737
+    /**
738
+     * Creates a subadmin
739
+     *
740
+     * @PasswordConfirmationRequired
741
+     *
742
+     * @param string $userId
743
+     * @param string $groupid
744
+     * @return DataResponse
745
+     * @throws OCSException
746
+     */
747
+    public function addSubAdmin(string $userId, string $groupid): DataResponse {
748
+        $group = $this->groupManager->get($groupid);
749
+        $user = $this->userManager->get($userId);
750
+
751
+        // Check if the user exists
752
+        if($user === null) {
753
+            throw new OCSException('User does not exist', 101);
754
+        }
755
+        // Check if group exists
756
+        if($group === null) {
757
+            throw new OCSException('Group does not exist',  102);
758
+        }
759
+        // Check if trying to make subadmin of admin group
760
+        if($group->getGID() === 'admin') {
761
+            throw new OCSException('Cannot create subadmins for admin group', 103);
762
+        }
763
+
764
+        $subAdminManager = $this->groupManager->getSubAdmin();
765
+
766
+        // We cannot be subadmin twice
767
+        if ($subAdminManager->isSubAdminofGroup($user, $group)) {
768
+            return new DataResponse();
769
+        }
770
+        // Go
771
+        if($subAdminManager->createSubAdmin($user, $group)) {
772
+            return new DataResponse();
773
+        } else {
774
+            throw new OCSException('Unknown error occurred', 103);
775
+        }
776
+    }
777
+
778
+    /**
779
+     * Removes a subadmin from a group
780
+     *
781
+     * @PasswordConfirmationRequired
782
+     *
783
+     * @param string $userId
784
+     * @param string $groupid
785
+     * @return DataResponse
786
+     * @throws OCSException
787
+     */
788
+    public function removeSubAdmin(string $userId, string $groupid): DataResponse {
789
+        $group = $this->groupManager->get($groupid);
790
+        $user = $this->userManager->get($userId);
791
+        $subAdminManager = $this->groupManager->getSubAdmin();
792
+
793
+        // Check if the user exists
794
+        if($user === null) {
795
+            throw new OCSException('User does not exist', 101);
796
+        }
797
+        // Check if the group exists
798
+        if($group === null) {
799
+            throw new OCSException('Group does not exist', 101);
800
+        }
801
+        // Check if they are a subadmin of this said group
802
+        if(!$subAdminManager->isSubAdminOfGroup($user, $group)) {
803
+            throw new OCSException('User is not a subadmin of this group', 102);
804
+        }
805
+
806
+        // Go
807
+        if($subAdminManager->deleteSubAdmin($user, $group)) {
808
+            return new DataResponse();
809
+        } else {
810
+            throw new OCSException('Unknown error occurred', 103);
811
+        }
812
+    }
813
+
814
+    /**
815
+     * Get the groups a user is a subadmin of
816
+     *
817
+     * @param string $userId
818
+     * @return DataResponse
819
+     * @throws OCSException
820
+     */
821
+    public function getUserSubAdminGroups(string $userId): DataResponse {
822
+        $user = $this->userManager->get($userId);
823
+        // Check if the user exists
824
+        if($user === null) {
825
+            throw new OCSException('User does not exist', 101);
826
+        }
827
+
828
+        // Get the subadmin groups
829
+        $subAdminGroups = $this->groupManager->getSubAdmin()->getSubAdminsGroups($user);
830
+        $groups = [];
831
+        foreach ($subAdminGroups as $key => $group) {
832
+            $groups[] = $group->getGID();
833
+        }
834
+
835
+        if(!$groups) {
836
+            throw new OCSException('Unknown error occurred', 102);
837
+        } else {
838
+            return new DataResponse($groups);
839
+        }
840
+    }
841
+
842
+    /**
843
+     * @param string $userId
844
+     * @return array
845
+     * @throws \OCP\Files\NotFoundException
846
+     */
847
+    protected function fillStorageInfo(string $userId): array {
848
+        try {
849
+            \OC_Util::tearDownFS();
850
+            \OC_Util::setupFS($userId);
851
+            $storage = OC_Helper::getStorageInfo('/');
852
+            $data = [
853
+                'free' => $storage['free'],
854
+                'used' => $storage['used'],
855
+                'total' => $storage['total'],
856
+                'relative' => $storage['relative'],
857
+                'quota' => $storage['quota'],
858
+            ];
859
+        } catch (NotFoundException $ex) {
860
+            $data = [];
861
+        }
862
+        return $data;
863
+    }
864
+
865
+    /**
866
+     * @NoAdminRequired
867
+     * @PasswordConfirmationRequired
868
+     *
869
+     * resend welcome message
870
+     *
871
+     * @param string $userId
872
+     * @return DataResponse
873
+     * @throws OCSException
874
+     */
875
+    public function resendWelcomeMessage(string $userId): DataResponse {
876
+        $currentLoggedInUser = $this->userSession->getUser();
877
+
878
+        $targetUser = $this->userManager->get($userId);
879
+        if($targetUser === null) {
880
+            throw new OCSException('', \OCP\API::RESPOND_NOT_FOUND);
881
+        }
882
+
883
+        // Check if admin / subadmin
884
+        $subAdminManager = $this->groupManager->getSubAdmin();
885
+        if(!$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)
886
+            && !$this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
887
+            // No rights
888
+            throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
889
+        }
890
+
891
+        $email = $targetUser->getEMailAddress();
892
+        if ($email === '' || $email === null) {
893
+            throw new OCSException('Email address not available', 101);
894
+        }
895
+        $username = $targetUser->getUID();
896
+        $lang = $this->config->getUserValue($username, 'core', 'lang', 'en');
897
+        if (!$this->l10nFactory->languageExists('settings', $lang)) {
898
+            $lang = 'en';
899
+        }
900
+
901
+        $l10n = $this->l10nFactory->get('settings', $lang);
902
+
903
+        try {
904
+            $this->newUserMailHelper->setL10N($l10n);
905
+            $emailTemplate = $this->newUserMailHelper->generateTemplate($targetUser, false);
906
+            $this->newUserMailHelper->sendMail($targetUser, $emailTemplate);
907
+        } catch(\Exception $e) {
908
+            $this->logger->logException($e, [
909
+                'message' => "Can't send new user mail to $email",
910
+                'level' => \OCP\Util::ERROR,
911
+                'app' => 'settings',
912
+            ]);
913
+            throw new OCSException('Sending email failed', 102);
914
+        }
915
+
916
+        return new DataResponse();
917
+    }
918 918
 }
Please login to merge, or discard this patch.
Spacing   +56 added lines, -56 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php
2
-declare(strict_types=1);
2
+declare(strict_types = 1);
3 3
 /**
4 4
  * @copyright Copyright (c) 2016, ownCloud, Inc.
5 5
  *
@@ -137,7 +137,7 @@  discard block
 block discarded – undo
137 137
 		// Admin? Or SubAdmin?
138 138
 		$uid = $user->getUID();
139 139
 		$subAdminManager = $this->groupManager->getSubAdmin();
140
-		if($this->groupManager->isAdmin($uid)){
140
+		if ($this->groupManager->isAdmin($uid)) {
141 141
 			$users = $this->userManager->search($search, $limit, $offset);
142 142
 		} else if ($subAdminManager->isSubAdmin($user)) {
143 143
 			$subAdminOfGroups = $subAdminManager->getSubAdminsGroups($user);
@@ -145,7 +145,7 @@  discard block
 block discarded – undo
145 145
 				$subAdminOfGroups[$key] = $group->getGID();
146 146
 			}
147 147
 
148
-			if($offset === null) {
148
+			if ($offset === null) {
149 149
 				$offset = 0;
150 150
 			}
151 151
 
@@ -175,27 +175,27 @@  discard block
 block discarded – undo
175 175
 	 * @return DataResponse
176 176
 	 * @throws OCSException
177 177
 	 */
178
-	public function addUser(string $userid, string $password = '', $email='', array $groups = []): DataResponse {
178
+	public function addUser(string $userid, string $password = '', $email = '', array $groups = []): DataResponse {
179 179
 		$user = $this->userSession->getUser();
180 180
 		$isAdmin = $this->groupManager->isAdmin($user->getUID());
181 181
 		$subAdminManager = $this->groupManager->getSubAdmin();
182 182
 
183
-		if($this->userManager->userExists($userid)) {
183
+		if ($this->userManager->userExists($userid)) {
184 184
 			$this->logger->error('Failed addUser attempt: User already exists.', ['app' => 'ocs_api']);
185 185
 			throw new OCSException('User already exists', 102);
186 186
 		}
187 187
 
188
-		if($groups !== []) {
188
+		if ($groups !== []) {
189 189
 			foreach ($groups as $group) {
190
-				if(!$this->groupManager->groupExists($group)) {
190
+				if (!$this->groupManager->groupExists($group)) {
191 191
 					throw new OCSException('group '.$group.' does not exist', 104);
192 192
 				}
193
-				if(!$isAdmin && !$subAdminManager->isSubAdminofGroup($user, $this->groupManager->get($group))) {
194
-					throw new OCSException('insufficient privileges for group '. $group, 105);
193
+				if (!$isAdmin && !$subAdminManager->isSubAdminofGroup($user, $this->groupManager->get($group))) {
194
+					throw new OCSException('insufficient privileges for group '.$group, 105);
195 195
 				}
196 196
 			}
197 197
 		} else {
198
-			if(!$isAdmin) {
198
+			if (!$isAdmin) {
199 199
 				throw new OCSException('no group specified (required for subadmins)', 106);
200 200
 			}
201 201
 		}
@@ -214,11 +214,11 @@  discard block
 block discarded – undo
214 214
 
215 215
 		try {
216 216
 			$newUser = $this->userManager->createUser($userid, $password);
217
-			$this->logger->info('Successful addUser call with userid: ' . $userid, ['app' => 'ocs_api']);
217
+			$this->logger->info('Successful addUser call with userid: '.$userid, ['app' => 'ocs_api']);
218 218
 
219 219
 			foreach ($groups as $group) {
220 220
 				$this->groupManager->get($group)->addUser($newUser);
221
-				$this->logger->info('Added userid ' . $userid . ' to group ' . $group, ['app' => 'ocs_api']);
221
+				$this->logger->info('Added userid '.$userid.' to group '.$group, ['app' => 'ocs_api']);
222 222
 			}
223 223
 
224 224
 			// Send new user mail only if a mail is set
@@ -239,7 +239,7 @@  discard block
 block discarded – undo
239 239
 
240 240
 			return new DataResponse();
241 241
 
242
-		} catch (HintException $e ) {
242
+		} catch (HintException $e) {
243 243
 			$this->logger->logException($e, [
244 244
 				'message' => 'Failed addUser attempt with hint exception.',
245 245
 				'level' => \OCP\Util::WARN,
@@ -283,7 +283,7 @@  discard block
 block discarded – undo
283 283
 	public function getCurrentUser(): DataResponse {
284 284
 		$user = $this->userSession->getUser();
285 285
 		if ($user) {
286
-			$data =  $this->getUserData($user->getUID());
286
+			$data = $this->getUserData($user->getUID());
287 287
 			// rename "displayname" to "display-name" only for this call to keep
288 288
 			// the API stable.
289 289
 			$data['display-name'] = $data['displayname'];
@@ -309,17 +309,17 @@  discard block
 block discarded – undo
309 309
 
310 310
 		// Check if the target user exists
311 311
 		$targetUserObject = $this->userManager->get($userId);
312
-		if($targetUserObject === null) {
312
+		if ($targetUserObject === null) {
313 313
 			throw new OCSException('The requested user could not be found', \OCP\API::RESPOND_NOT_FOUND);
314 314
 		}
315 315
 
316 316
 		// Admin? Or SubAdmin?
317
-		if($this->groupManager->isAdmin($currentLoggedInUser->getUID())
317
+		if ($this->groupManager->isAdmin($currentLoggedInUser->getUID())
318 318
 			|| $this->groupManager->getSubAdmin()->isUserAccessible($currentLoggedInUser, $targetUserObject)) {
319 319
 			$data['enabled'] = $this->config->getUserValue($targetUserObject->getUID(), 'core', 'enabled', 'true');
320 320
 		} else {
321 321
 			// Check they are looking up themselves
322
-			if($currentLoggedInUser->getUID() !== $targetUserObject->getUID()) {
322
+			if ($currentLoggedInUser->getUID() !== $targetUserObject->getUID()) {
323 323
 				throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
324 324
 			}
325 325
 		}
@@ -390,12 +390,12 @@  discard block
 block discarded – undo
390 390
 		$currentLoggedInUser = $this->userSession->getUser();
391 391
 
392 392
 		$targetUser = $this->userManager->get($userId);
393
-		if($targetUser === null) {
393
+		if ($targetUser === null) {
394 394
 			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
395 395
 		}
396 396
 
397 397
 		$permittedFields = [];
398
-		if($targetUser->getUID() === $currentLoggedInUser->getUID()) {
398
+		if ($targetUser->getUID() === $currentLoggedInUser->getUID()) {
399 399
 			// Editing self (display, email)
400 400
 			if ($this->config->getSystemValue('allow_user_to_change_display_name', true) !== false) {
401 401
 				$permittedFields[] = 'display';
@@ -421,13 +421,13 @@  discard block
 block discarded – undo
421 421
 			}
422 422
 
423 423
 			// If admin they can edit their own quota
424
-			if($this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
424
+			if ($this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
425 425
 				$permittedFields[] = 'quota';
426 426
 			}
427 427
 		} else {
428 428
 			// Check if admin / subadmin
429 429
 			$subAdminManager = $this->groupManager->getSubAdmin();
430
-			if($subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)
430
+			if ($subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)
431 431
 			|| $this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
432 432
 				// They have permissions over the user
433 433
 				$permittedFields[] = 'display';
@@ -446,18 +446,18 @@  discard block
 block discarded – undo
446 446
 			}
447 447
 		}
448 448
 		// Check if permitted to edit this field
449
-		if(!in_array($key, $permittedFields)) {
449
+		if (!in_array($key, $permittedFields)) {
450 450
 			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
451 451
 		}
452 452
 		// Process the edit
453
-		switch($key) {
453
+		switch ($key) {
454 454
 			case 'display':
455 455
 			case AccountManager::PROPERTY_DISPLAYNAME:
456 456
 				$targetUser->setDisplayName($value);
457 457
 				break;
458 458
 			case 'quota':
459 459
 				$quota = $value;
460
-				if($quota !== 'none' && $quota !== 'default') {
460
+				if ($quota !== 'none' && $quota !== 'default') {
461 461
 					if (is_numeric($quota)) {
462 462
 						$quota = (float) $quota;
463 463
 					} else {
@@ -466,9 +466,9 @@  discard block
 block discarded – undo
466 466
 					if ($quota === false) {
467 467
 						throw new OCSException('Invalid quota value '.$value, 103);
468 468
 					}
469
-					if($quota === 0) {
469
+					if ($quota === 0) {
470 470
 						$quota = 'default';
471
-					}else if($quota === -1) {
471
+					} else if ($quota === -1) {
472 472
 						$quota = 'none';
473 473
 					} else {
474 474
 						$quota = \OCP\Util::humanFileSize($quota);
@@ -487,7 +487,7 @@  discard block
 block discarded – undo
487 487
 				$this->config->setUserValue($targetUser->getUID(), 'core', 'lang', $value);
488 488
 				break;
489 489
 			case AccountManager::PROPERTY_EMAIL:
490
-				if(filter_var($value, FILTER_VALIDATE_EMAIL)) {
490
+				if (filter_var($value, FILTER_VALIDATE_EMAIL)) {
491 491
 					$targetUser->setEMailAddress($value);
492 492
 				} else {
493 493
 					throw new OCSException('', 102);
@@ -522,18 +522,18 @@  discard block
 block discarded – undo
522 522
 
523 523
 		$targetUser = $this->userManager->get($userId);
524 524
 
525
-		if($targetUser === null || $targetUser->getUID() === $currentLoggedInUser->getUID()) {
525
+		if ($targetUser === null || $targetUser->getUID() === $currentLoggedInUser->getUID()) {
526 526
 			throw new OCSException('', 101);
527 527
 		}
528 528
 
529 529
 		// If not permitted
530 530
 		$subAdminManager = $this->groupManager->getSubAdmin();
531
-		if(!$this->groupManager->isAdmin($currentLoggedInUser->getUID()) && !$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)) {
531
+		if (!$this->groupManager->isAdmin($currentLoggedInUser->getUID()) && !$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)) {
532 532
 			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
533 533
 		}
534 534
 
535 535
 		// Go ahead with the delete
536
-		if($targetUser->delete()) {
536
+		if ($targetUser->delete()) {
537 537
 			return new DataResponse();
538 538
 		} else {
539 539
 			throw new OCSException('', 101);
@@ -576,13 +576,13 @@  discard block
 block discarded – undo
576 576
 		$currentLoggedInUser = $this->userSession->getUser();
577 577
 
578 578
 		$targetUser = $this->userManager->get($userId);
579
-		if($targetUser === null || $targetUser->getUID() === $currentLoggedInUser->getUID()) {
579
+		if ($targetUser === null || $targetUser->getUID() === $currentLoggedInUser->getUID()) {
580 580
 			throw new OCSException('', 101);
581 581
 		}
582 582
 
583 583
 		// If not permitted
584 584
 		$subAdminManager = $this->groupManager->getSubAdmin();
585
-		if(!$this->groupManager->isAdmin($currentLoggedInUser->getUID()) && !$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)) {
585
+		if (!$this->groupManager->isAdmin($currentLoggedInUser->getUID()) && !$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)) {
586 586
 			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
587 587
 		}
588 588
 
@@ -603,11 +603,11 @@  discard block
 block discarded – undo
603 603
 		$loggedInUser = $this->userSession->getUser();
604 604
 
605 605
 		$targetUser = $this->userManager->get($userId);
606
-		if($targetUser === null) {
606
+		if ($targetUser === null) {
607 607
 			throw new OCSException('', \OCP\API::RESPOND_NOT_FOUND);
608 608
 		}
609 609
 
610
-		if($targetUser->getUID() === $loggedInUser->getUID() || $this->groupManager->isAdmin($loggedInUser->getUID())) {
610
+		if ($targetUser->getUID() === $loggedInUser->getUID() || $this->groupManager->isAdmin($loggedInUser->getUID())) {
611 611
 			// Self lookup or admin lookup
612 612
 			return new DataResponse([
613 613
 				'groups' => $this->groupManager->getUserGroupIds($targetUser)
@@ -616,7 +616,7 @@  discard block
 block discarded – undo
616 616
 			$subAdminManager = $this->groupManager->getSubAdmin();
617 617
 
618 618
 			// Looking up someone else
619
-			if($subAdminManager->isUserAccessible($loggedInUser, $targetUser)) {
619
+			if ($subAdminManager->isUserAccessible($loggedInUser, $targetUser)) {
620 620
 				// Return the group that the method caller is subadmin of for the user in question
621 621
 				/** @var IGroup[] $getSubAdminsGroups */
622 622
 				$getSubAdminsGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
@@ -646,16 +646,16 @@  discard block
 block discarded – undo
646 646
 	 * @throws OCSException
647 647
 	 */
648 648
 	public function addToGroup(string $userId, string $groupid = ''): DataResponse {
649
-		if($groupid === '') {
649
+		if ($groupid === '') {
650 650
 			throw new OCSException('', 101);
651 651
 		}
652 652
 
653 653
 		$group = $this->groupManager->get($groupid);
654 654
 		$targetUser = $this->userManager->get($userId);
655
-		if($group === null) {
655
+		if ($group === null) {
656 656
 			throw new OCSException('', 102);
657 657
 		}
658
-		if($targetUser === null) {
658
+		if ($targetUser === null) {
659 659
 			throw new OCSException('', 103);
660 660
 		}
661 661
 
@@ -683,17 +683,17 @@  discard block
 block discarded – undo
683 683
 	public function removeFromGroup(string $userId, string $groupid): DataResponse {
684 684
 		$loggedInUser = $this->userSession->getUser();
685 685
 
686
-		if($groupid === null || trim($groupid) === '') {
686
+		if ($groupid === null || trim($groupid) === '') {
687 687
 			throw new OCSException('', 101);
688 688
 		}
689 689
 
690 690
 		$group = $this->groupManager->get($groupid);
691
-		if($group === null) {
691
+		if ($group === null) {
692 692
 			throw new OCSException('', 102);
693 693
 		}
694 694
 
695 695
 		$targetUser = $this->userManager->get($userId);
696
-		if($targetUser === null) {
696
+		if ($targetUser === null) {
697 697
 			throw new OCSException('', 103);
698 698
 		}
699 699
 
@@ -717,7 +717,7 @@  discard block
 block discarded – undo
717 717
 		} else if (!$this->groupManager->isAdmin($loggedInUser->getUID())) {
718 718
 			/** @var IGroup[] $subAdminGroups */
719 719
 			$subAdminGroups = $subAdminManager->getSubAdminsGroups($loggedInUser);
720
-			$subAdminGroups = array_map(function (IGroup $subAdminGroup) {
720
+			$subAdminGroups = array_map(function(IGroup $subAdminGroup) {
721 721
 				return $subAdminGroup->getGID();
722 722
 			}, $subAdminGroups);
723 723
 			$userGroups = $this->groupManager->getUserGroupIds($targetUser);
@@ -749,15 +749,15 @@  discard block
 block discarded – undo
749 749
 		$user = $this->userManager->get($userId);
750 750
 
751 751
 		// Check if the user exists
752
-		if($user === null) {
752
+		if ($user === null) {
753 753
 			throw new OCSException('User does not exist', 101);
754 754
 		}
755 755
 		// Check if group exists
756
-		if($group === null) {
757
-			throw new OCSException('Group does not exist',  102);
756
+		if ($group === null) {
757
+			throw new OCSException('Group does not exist', 102);
758 758
 		}
759 759
 		// Check if trying to make subadmin of admin group
760
-		if($group->getGID() === 'admin') {
760
+		if ($group->getGID() === 'admin') {
761 761
 			throw new OCSException('Cannot create subadmins for admin group', 103);
762 762
 		}
763 763
 
@@ -768,7 +768,7 @@  discard block
 block discarded – undo
768 768
 			return new DataResponse();
769 769
 		}
770 770
 		// Go
771
-		if($subAdminManager->createSubAdmin($user, $group)) {
771
+		if ($subAdminManager->createSubAdmin($user, $group)) {
772 772
 			return new DataResponse();
773 773
 		} else {
774 774
 			throw new OCSException('Unknown error occurred', 103);
@@ -791,20 +791,20 @@  discard block
 block discarded – undo
791 791
 		$subAdminManager = $this->groupManager->getSubAdmin();
792 792
 
793 793
 		// Check if the user exists
794
-		if($user === null) {
794
+		if ($user === null) {
795 795
 			throw new OCSException('User does not exist', 101);
796 796
 		}
797 797
 		// Check if the group exists
798
-		if($group === null) {
798
+		if ($group === null) {
799 799
 			throw new OCSException('Group does not exist', 101);
800 800
 		}
801 801
 		// Check if they are a subadmin of this said group
802
-		if(!$subAdminManager->isSubAdminOfGroup($user, $group)) {
802
+		if (!$subAdminManager->isSubAdminOfGroup($user, $group)) {
803 803
 			throw new OCSException('User is not a subadmin of this group', 102);
804 804
 		}
805 805
 
806 806
 		// Go
807
-		if($subAdminManager->deleteSubAdmin($user, $group)) {
807
+		if ($subAdminManager->deleteSubAdmin($user, $group)) {
808 808
 			return new DataResponse();
809 809
 		} else {
810 810
 			throw new OCSException('Unknown error occurred', 103);
@@ -821,7 +821,7 @@  discard block
 block discarded – undo
821 821
 	public function getUserSubAdminGroups(string $userId): DataResponse {
822 822
 		$user = $this->userManager->get($userId);
823 823
 		// Check if the user exists
824
-		if($user === null) {
824
+		if ($user === null) {
825 825
 			throw new OCSException('User does not exist', 101);
826 826
 		}
827 827
 
@@ -832,7 +832,7 @@  discard block
 block discarded – undo
832 832
 			$groups[] = $group->getGID();
833 833
 		}
834 834
 
835
-		if(!$groups) {
835
+		if (!$groups) {
836 836
 			throw new OCSException('Unknown error occurred', 102);
837 837
 		} else {
838 838
 			return new DataResponse($groups);
@@ -876,13 +876,13 @@  discard block
 block discarded – undo
876 876
 		$currentLoggedInUser = $this->userSession->getUser();
877 877
 
878 878
 		$targetUser = $this->userManager->get($userId);
879
-		if($targetUser === null) {
879
+		if ($targetUser === null) {
880 880
 			throw new OCSException('', \OCP\API::RESPOND_NOT_FOUND);
881 881
 		}
882 882
 
883 883
 		// Check if admin / subadmin
884 884
 		$subAdminManager = $this->groupManager->getSubAdmin();
885
-		if(!$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)
885
+		if (!$subAdminManager->isUserAccessible($currentLoggedInUser, $targetUser)
886 886
 			&& !$this->groupManager->isAdmin($currentLoggedInUser->getUID())) {
887 887
 			// No rights
888 888
 			throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED);
@@ -904,7 +904,7 @@  discard block
 block discarded – undo
904 904
 			$this->newUserMailHelper->setL10N($l10n);
905 905
 			$emailTemplate = $this->newUserMailHelper->generateTemplate($targetUser, false);
906 906
 			$this->newUserMailHelper->sendMail($targetUser, $emailTemplate);
907
-		} catch(\Exception $e) {
907
+		} catch (\Exception $e) {
908 908
 			$this->logger->logException($e, [
909 909
 				'message' => "Can't send new user mail to $email",
910 910
 				'level' => \OCP\Util::ERROR,
Please login to merge, or discard this patch.