diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php index 580a3bb163d04..0ace0eab2d237 100644 --- a/apps/files_sharing/lib/AppInfo/Application.php +++ b/apps/files_sharing/lib/AppInfo/Application.php @@ -8,8 +8,6 @@ namespace OCA\Files_Sharing\AppInfo; -use OC\Group\DisplayNameCache as GroupDisplayNameCache; -use OC\User\DisplayNameCache; use OCA\Files\Event\LoadAdditionalScriptsEvent; use OCA\Files\Event\LoadSidebar; use OCA\Files_Sharing\Capabilities; @@ -50,7 +48,6 @@ use OCP\Files\Events\Node\BeforeNodeReadEvent; use OCP\Files\Events\UserHomeSetupEvent; use OCP\Group\Events\BeforeGroupDeletedEvent; -use OCP\Group\Events\GroupChangedEvent; use OCP\Group\Events\GroupDeletedEvent; use OCP\Group\Events\UserAddedEvent; use OCP\Group\Events\UserRemovedEvent; @@ -62,8 +59,6 @@ use OCP\Share\Events\ShareCreatedEvent; use OCP\Share\Events\ShareMovedEvent; use OCP\Share\Events\ShareTransferredEvent; -use OCP\User\Events\UserChangedEvent; -use OCP\User\Events\UserDeletedEvent; use OCP\Util; use Psr\Container\ContainerInterface; use Symfony\Component\EventDispatcher\GenericEvent as OldGenericEvent; @@ -98,10 +93,6 @@ function () use ($c) { $context->registerCapability(Capabilities::class); $context->registerNotifierService(Notifier::class); - $context->registerEventListener(UserChangedEvent::class, DisplayNameCache::class); - $context->registerEventListener(UserDeletedEvent::class, DisplayNameCache::class); - $context->registerEventListener(GroupChangedEvent::class, GroupDisplayNameCache::class); - $context->registerEventListener(GroupDeletedEvent::class, GroupDisplayNameCache::class); // Sidebar and files scripts $context->registerEventListener(LoadAdditionalScriptsEvent::class, LoadAdditionalListener::class); diff --git a/apps/settings/lib/Controller/UsersController.php b/apps/settings/lib/Controller/UsersController.php index 19da07e854b49..557ba049f64b5 100644 --- a/apps/settings/lib/Controller/UsersController.php +++ b/apps/settings/lib/Controller/UsersController.php @@ -129,7 +129,7 @@ public function usersList(INavigationManager $navigationManager, ISubAdmin $subA } else { if ($this->appManager->isEnabledForUser('user_ldap')) { $isLDAPUsed - = $this->groupManager->isBackendUsed('\OCA\User_LDAP\Group_Proxy'); + = $this->groupManager->isBackendUsed(\OCA\User_LDAP\Group_Proxy::class); if ($isLDAPUsed) { // LDAP user count can be slow, so we sort by group name here $sortGroupsBy = MetaData::SORT_GROUPNAME; diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml index 7e59e0d212c8e..4e79af94656dd 100644 --- a/build/psalm-baseline.xml +++ b/build/psalm-baseline.xml @@ -2879,6 +2879,11 @@ + + + + + diff --git a/core/AppInfo/Application.php b/core/AppInfo/Application.php index 51425946a2536..27693730134af 100644 --- a/core/AppInfo/Application.php +++ b/core/AppInfo/Application.php @@ -37,9 +37,13 @@ use OC\Core\Sharing\Recipient\TeamShareRecipientType; use OC\Core\Sharing\Recipient\TokenShareRecipientType; use OC\Core\Sharing\Recipient\UserShareRecipientType; +use OC\Group\DisplayNameCache as GroupDisplayNameCache; +use OC\Group\Manager as GroupManager; use OC\OCM\OCMDiscoveryHandler; use OC\OCM\OCMJwksHandler; +use OC\SubAdmin; use OC\TagManager; +use OC\User\DisplayNameCache; use OCP\AppFramework\App; use OCP\AppFramework\Bootstrap\IBootContext; use OCP\AppFramework\Bootstrap\IBootstrap; @@ -48,6 +52,11 @@ use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; use OCP\DB\Events\AddMissingIndicesEvent; use OCP\DB\Events\AddMissingPrimaryKeyEvent; +use OCP\Group\Events\BeforeGroupDeletedEvent; +use OCP\Group\Events\BeforeUserAddedEvent; +use OCP\Group\Events\BeforeUserRemovedEvent; +use OCP\Group\Events\GroupChangedEvent; +use OCP\Group\Events\GroupDeletedEvent; use OCP\IAppConfig; use OCP\Interaction\RestrictInteractionEvent; use OCP\Navigation\Events\LoadAdditionalEntriesEvent; @@ -55,6 +64,7 @@ use OCP\Sharing\ISharingRegistry; use OCP\User\Events\BeforeUserDeletedEvent; use OCP\User\Events\PasswordUpdatedEvent; +use OCP\User\Events\UserChangedEvent; use OCP\User\Events\UserDeletedEvent; use OCP\Util; @@ -103,6 +113,17 @@ public function register(IRegistrationContext $context): void { $context->registerEventListener(UserDeletedEvent::class, UserDeletedWebAuthnCleanupListener::class); $context->registerEventListener(PasswordUpdatedEvent::class, PasswordUpdatedListener::class); + $context->registerEventListener(UserChangedEvent::class, DisplayNameCache::class); + $context->registerEventListener(UserDeletedEvent::class, DisplayNameCache::class); + $context->registerEventListener(GroupChangedEvent::class, GroupDisplayNameCache::class); + $context->registerEventListener(GroupDeletedEvent::class, GroupDisplayNameCache::class); + $context->registerEventListener(BeforeGroupDeletedEvent::class, GroupManager::class); + $context->registerEventListener(BeforeUserAddedEvent::class, GroupManager::class); + $context->registerEventListener(BeforeUserRemovedEvent::class, GroupManager::class); + $context->registerEventListener(GroupDeletedEvent::class, GroupManager::class); + $context->registerEventListener(GroupDeletedEvent::class, SubAdmin::class); + $context->registerEventListener(UserDeletedEvent::class, SubAdmin::class); + // Tags $context->registerEventListener(UserDeletedEvent::class, TagManager::class); diff --git a/lib/OC.php b/lib/OC.php index 5b72d243ded14..a1404c6d52e68 100644 --- a/lib/OC.php +++ b/lib/OC.php @@ -884,7 +884,6 @@ public static function init(): void { self::registerResourceCollectionHooks(); self::registerFileReferenceEventListener(); self::registerRenderReferenceEventListener(); - self::registerAppRestrictionsHooks(); // Make sure that the application class is not loaded before the database is setup if ($systemConfig->getValue('installed', false)) { @@ -1061,29 +1060,6 @@ private static function registerAccountHooks(): void { $dispatcher->addServiceListener(UserChangedEvent::class, \OC\Accounts\Hooks::class); } - private static function registerAppRestrictionsHooks(): void { - /** @var \OC\Group\Manager $groupManager */ - $groupManager = Server::get(\OCP\IGroupManager::class); - $groupManager->listen('\OC\Group', 'postDelete', function (\OCP\IGroup $group) { - $appManager = Server::get(\OCP\App\IAppManager::class); - $apps = $appManager->getEnabledAppsForGroup($group); - foreach ($apps as $appId) { - $restrictions = $appManager->getAppRestriction($appId); - if (empty($restrictions)) { - continue; - } - $key = array_search($group->getGID(), $restrictions, true); - unset($restrictions[$key]); - $restrictions = array_values($restrictions); - if (empty($restrictions)) { - $appManager->disableApp($appId); - } else { - $appManager->enableAppForGroups($appId, $restrictions); - } - } - }); - } - private static function registerResourceCollectionHooks(): void { \OC\Collaboration\Resources\Listener::register(Server::get(IEventDispatcher::class)); } diff --git a/lib/private/Group/Group.php b/lib/private/Group/Group.php index 4061e464635b1..2bfb122f9052b 100644 --- a/lib/private/Group/Group.php +++ b/lib/private/Group/Group.php @@ -8,7 +8,6 @@ namespace OC\Group; -use OC\Hooks\PublicEmitter; use OC\User\LazyUser; use OC\User\User; use OCP\EventDispatcher\IEventDispatcher; @@ -48,7 +47,6 @@ public function __construct( private array $backends, private IEventDispatcher $dispatcher, private IUserManager $userManager, - private ?PublicEmitter $emitter = null, /** @var ?non-empty-string $displayName */ protected ?string $displayName = null, ) { @@ -154,9 +152,6 @@ public function addUser(IUser $user): void { $this->dispatcher->dispatchTyped(new BeforeUserAddedEvent($this, $user)); - if ($this->emitter) { - $this->emitter->emit('\OC\Group', 'preAddUser', [$this, $user]); - } foreach ($this->backends as $backend) { if ($backend->implementsActions(\OC\Group\Backend::ADD_TO_GROUP)) { /** @var IAddToGroupBackend $backend */ @@ -164,10 +159,6 @@ public function addUser(IUser $user): void { $this->users[$user->getUID()] = $user; $this->dispatcher->dispatchTyped(new UserAddedEvent($this, $user)); - - if ($this->emitter) { - $this->emitter->emit('\OC\Group', 'postAddUser', [$this, $user]); - } return; } } @@ -180,9 +171,6 @@ public function addUser(IUser $user): void { public function removeUser(IUser $user): void { $result = false; $this->dispatcher->dispatchTyped(new BeforeUserRemovedEvent($this, $user)); - if ($this->emitter) { - $this->emitter->emit('\OC\Group', 'preRemoveUser', [$this, $user]); - } foreach ($this->backends as $backend) { if ($backend->implementsActions(\OC\Group\Backend::REMOVE_FROM_GOUP) && $backend->inGroup($user->getUID(), $this->gid)) { /** @var IRemoveFromGroupBackend $backend */ @@ -192,9 +180,6 @@ public function removeUser(IUser $user): void { } if ($result) { $this->dispatcher->dispatchTyped(new UserRemovedEvent($this, $user)); - if ($this->emitter) { - $this->emitter->emit('\OC\Group', 'postRemoveUser', [$this, $user]); - } if ($this->users) { foreach ($this->users as $index => $groupUser) { if ($groupUser->getUID() === $user->getUID()) { @@ -323,9 +308,6 @@ public function delete(): bool { $result = false; $this->dispatcher->dispatchTyped(new BeforeGroupDeletedEvent($this)); - if ($this->emitter) { - $this->emitter->emit('\OC\Group', 'preDelete', [$this]); - } foreach ($this->backends as $backend) { if ($backend->implementsActions(\OC\Group\Backend::DELETE_GROUP)) { /** @var IDeleteGroupBackend $backend */ @@ -334,9 +316,6 @@ public function delete(): bool { } if ($result) { $this->dispatcher->dispatchTyped(new GroupDeletedEvent($this)); - if ($this->emitter) { - $this->emitter->emit('\OC\Group', 'postDelete', [$this]); - } } return $result; } diff --git a/lib/private/Group/Manager.php b/lib/private/Group/Manager.php index 43f08333b2d8f..a4542c9d31fa8 100644 --- a/lib/private/Group/Manager.php +++ b/lib/private/Group/Manager.php @@ -8,17 +8,24 @@ namespace OC\Group; -use OC\Hooks\PublicEmitter; use OC\Settings\AuthorizedGroupMapper; use OC\SubAdmin; use OCA\Settings\Settings\Admin\Users; +use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventDispatcher; +use OCP\EventDispatcher\IEventListener; use OCP\Group\Backend\IBatchMethodsBackend; use OCP\Group\Backend\ICreateNamedGroupBackend; use OCP\Group\Backend\IGroupDetailsBackend; use OCP\Group\Events\BeforeGroupCreatedEvent; +use OCP\Group\Events\BeforeGroupDeletedEvent; +use OCP\Group\Events\BeforeUserAddedEvent; +use OCP\Group\Events\BeforeUserRemovedEvent; use OCP\Group\Events\GroupCreatedEvent; +use OCP\Group\Events\GroupDeletedEvent; +use OCP\Group\ISubAdmin; use OCP\GroupInterface; +use OCP\ICache; use OCP\ICacheFactory; use OCP\IDBConnection; use OCP\IGroup; @@ -26,31 +33,20 @@ use OCP\IUser; use OCP\Security\Ip\IRemoteAddress; use OCP\Server; -use Psr\Log\LoggerInterface; -use function is_string; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\NotFoundExceptionInterface; /** - * Class Manager - * - * Hooks available in scope \OC\Group: - * - preAddUser(\OC\Group\Group $group, \OC\User\User $user) - * - postAddUser(\OC\Group\Group $group, \OC\User\User $user) - * - preRemoveUser(\OC\Group\Group $group, \OC\User\User $user) - * - postRemoveUser(\OC\Group\Group $group, \OC\User\User $user) - * - preDelete(\OC\Group\Group $group) - * - postDelete(\OC\Group\Group $group) - * - preCreate(string $groupId) - * - postCreate(\OC\Group\Group $group) - * - * @package OC\Group + * @template-implements IEventListener */ -class Manager extends PublicEmitter implements IGroupManager { - /** @var GroupInterface[] */ +class Manager implements IGroupManager, IEventListener { + /** @var list */ private array $backends = []; /** @var array */ private array $cachedGroups = []; /** @var array> */ - private array $cachedUserGroups = []; + private array $cachedUserGroupsLocal = []; + private ICache $cachedUserGroups; private ?SubAdmin $subAdmin = null; private DisplayNameCache $displayNameCache; private const MAX_GROUP_LENGTH = 255; @@ -58,48 +54,20 @@ class Manager extends PublicEmitter implements IGroupManager { public function __construct( private \OC\User\Manager $userManager, private IEventDispatcher $dispatcher, - private LoggerInterface $logger, ICacheFactory $cacheFactory, private IRemoteAddress $remoteAddress, ) { $this->displayNameCache = new DisplayNameCache($cacheFactory, $this); - - $this->listen('\OC\Group', 'preDelete', function (IGroup $group): void { - unset($this->cachedGroups[$group->getGID()]); - $this->cachedUserGroups = []; - }); - $this->listen('\OC\Group', 'preAddUser', function (IGroup $group): void { - $this->cachedUserGroups = []; - }); - $this->listen('\OC\Group', 'preRemoveUser', function (IGroup $group): void { - $this->cachedUserGroups = []; - }); + $this->cachedUserGroups = $cacheFactory->createDistributed('user_groups_membership'); } - /** - * Checks whether a given backend is used - * - * @param string $backendClass Full classname including complete namespace - * @return bool - */ #[\Override] - public function isBackendUsed($backendClass) { - $backendClass = strtolower(ltrim($backendClass, '\\')); - - foreach ($this->backends as $backend) { - if (strtolower(get_class($backend)) === $backendClass) { - return true; - } - } - - return false; + public function isBackendUsed(string $backendClass): bool { + return array_any($this->backends, fn (GroupInterface $backend): bool => $backend::class === $backendClass); } - /** - * @param GroupInterface $backend - */ #[\Override] - public function addBackend($backend) { + public function addBackend(GroupInterface $backend): void { $this->backends[] = $backend; $this->clearCaches(); } @@ -113,44 +81,31 @@ public function removeBackend(GroupInterface $backend): void { } #[\Override] - public function clearBackends() { + public function clearBackends(): void { $this->backends = []; $this->clearCaches(); } - /** - * Get the active backends - * - * @return GroupInterface[] - */ #[\Override] - public function getBackends() { + public function getBackends(): array { return $this->backends; } - protected function clearCaches() { + protected function clearCaches(): void { $this->cachedGroups = []; - $this->cachedUserGroups = []; + $this->cachedUserGroups->clear(); + $this->cachedUserGroupsLocal = []; } - /** - * @param string $gid - * @return IGroup|null - */ #[\Override] - public function get($gid) { + public function get(string $gid): ?IGroup { if (isset($this->cachedGroups[$gid])) { return $this->cachedGroups[$gid]; } return $this->getGroupObject($gid); } - /** - * @param string $gid - * @param string $displayName - * @return IGroup|null - */ - protected function getGroupObject($gid, $displayName = null) { + protected function getGroupObject(string $gid, ?string $displayName = null): ?IGroup { $backends = []; foreach ($this->backends as $backend) { if ($backend->implementsActions(Backend::GROUP_DETAILS)) { @@ -170,7 +125,7 @@ protected function getGroupObject($gid, $displayName = null) { return null; } /** @var GroupInterface[] $backends */ - $this->cachedGroups[$gid] = new Group($gid, $backends, $this->dispatcher, $this->userManager, $this, $displayName); + $this->cachedGroups[$gid] = new Group($gid, $backends, $this->dispatcher, $this->userManager, $displayName); return $this->cachedGroups[$gid]; } @@ -225,28 +180,20 @@ public function getGroupsObjects(array $gids, array $displayNames = []): array { if (count($backends[$gid]) === 0) { continue; } - $this->cachedGroups[$gid] = new Group($gid, $backends[$gid], $this->dispatcher, $this->userManager, $this, $displayNames[$gid]); + $this->cachedGroups[$gid] = new Group($gid, $backends[$gid], $this->dispatcher, $this->userManager, $displayNames[$gid]); $groups[$gid] = $this->cachedGroups[$gid]; } return $groups; } - /** - * @param string $gid - * @return bool - */ #[\Override] - public function groupExists($gid) { + public function groupExists(string $gid): bool { return $this->get($gid) instanceof IGroup; } - /** - * @param string $gid - * @return IGroup|null - */ #[\Override] - public function createGroup($gid) { - if ($gid === '' || $gid === null) { + public function createGroup(string $gid): ?IGroup { + if ($gid === '') { return null; } elseif ($group = $this->get($gid)) { return $group; @@ -254,7 +201,6 @@ public function createGroup($gid) { throw new \Exception('Group name is limited to ' . self::MAX_GROUP_LENGTH . ' characters'); } else { $this->dispatcher->dispatchTyped(new BeforeGroupCreatedEvent($gid)); - $this->emit('\OC\Group', 'preCreate', [$gid]); foreach ($this->backends as $backend) { if ($backend->implementsActions(Backend::CREATE_GROUP)) { if ($backend instanceof ICreateNamedGroupBackend) { @@ -262,13 +208,11 @@ public function createGroup($gid) { if (($gid = $backend->createGroup($groupName)) !== null) { $group = $this->getGroupObject($gid); $this->dispatcher->dispatchTyped(new GroupCreatedEvent($group)); - $this->emit('\OC\Group', 'postCreate', [$group]); return $group; } } elseif ($backend->createGroup($gid)) { $group = $this->getGroupObject($gid); $this->dispatcher->dispatchTyped(new GroupCreatedEvent($group)); - $this->emit('\OC\Group', 'postCreate', [$group]); return $group; } } @@ -278,7 +222,7 @@ public function createGroup($gid) { } #[\Override] - public function search(string $search, ?int $limit = null, ?int $offset = 0) { + public function search(string $search, ?int $limit = null, ?int $offset = 0): array { $groups = []; foreach ($this->backends as $backend) { $groupIds = $backend->getGroups($search, $limit ?? -1, $offset ?? 0); @@ -293,10 +237,6 @@ public function search(string $search, ?int $limit = null, ?int $offset = 0) { return array_values($groups); } - /** - * @param IUser|null $user - * @return array - */ #[\Override] public function getUserGroups(?IUser $user = null): array { if (!$user instanceof IUser) { @@ -316,18 +256,15 @@ public function getUserIdGroups(string $uid): array { /** * Checks if a userId is in the admin group - * - * @param string $userId - * @return bool if admin */ #[\Override] - public function isAdmin($userId) { + public function isAdmin(string $userId): bool { if (!$this->remoteAddress->allowsAdminActions()) { return false; } foreach ($this->backends as $backend) { - if (is_string($userId) && $backend->implementsActions(Backend::IS_ADMIN) && $backend->isAdmin($userId)) { + if ($backend->implementsActions(Backend::IS_ADMIN) && $backend->isAdmin($userId)) { return true; } } @@ -347,15 +284,8 @@ public function isDelegatedAdmin(string $userId): bool { return in_array(Users::class, $authorizedClasses, true); } - /** - * Checks if a userId is in a group - * - * @param string $userId - * @param string $group - * @return bool if in group - */ #[\Override] - public function isInGroup($userId, $group) { + public function isInGroup(string $userId, string $group): bool { return in_array($group, $this->getUserIdGroupIds($userId)); } @@ -369,42 +299,31 @@ public function getUserGroupIds(IUser $user): array { * @return list */ private function getUserIdGroupIds(string $uid): array { - if (!isset($this->cachedUserGroups[$uid])) { + if (isset($this->cachedUserGroupsLocal[$uid])) { + return $this->cachedUserGroupsLocal[$uid]; + } + $groups = $this->cachedUserGroups->get($uid); + if ($groups === null) { $groups = []; foreach ($this->backends as $backend) { if ($groupIds = $backend->getUserGroups($uid)) { $groups = array_merge($groups, $groupIds); } } - $this->cachedUserGroups[$uid] = $groups; + $this->cachedUserGroups->set($uid, $groups, 60 * 2); // 2min + $this->cachedUserGroupsLocal[$uid] = $groups; } - return $this->cachedUserGroups[$uid]; + return $groups; } - /** - * @param string $groupId - * @return ?string - */ #[\Override] public function getDisplayName(string $groupId): ?string { return $this->displayNameCache->getDisplayName($groupId); } - /** - * get an array of groupid and displayName for a user - * - * @param IUser $user - * @return array ['displayName' => displayname] - */ - public function getUserGroupNames(IUser $user) { - return array_map(function ($group) { - return ['displayName' => $this->displayNameCache->getDisplayName($group->getGID())]; - }, $this->getUserGroups($user)); - } - #[\Override] - public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0) { + public function displayNamesInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array { $group = $this->get($gid); if (is_null($group)) { return []; @@ -448,9 +367,10 @@ public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0 } /** - * @return SubAdmin + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface */ - public function getSubAdmin() { + public function getSubAdmin(): ISubAdmin { if (!$this->subAdmin) { $this->subAdmin = new SubAdmin( $this->userManager, @@ -462,4 +382,38 @@ public function getSubAdmin() { return $this->subAdmin; } + + #[\Override] + public function handle(Event $event): void { + if ($event instanceof BeforeGroupDeletedEvent) { + unset($this->cachedGroups[$event->getGroup()->getGID()]); + $this->cachedUserGroups->clear(); + $this->cachedUserGroupsLocal = []; + } + + if ($event instanceof BeforeUserAddedEvent || $event instanceof BeforeUserRemovedEvent) { + $this->cachedUserGroups->remove($event->getUser()->getUID()); + unset($this->cachedUserGroupsLocal[$event->getUser()->getUID()]); + } + + if ($event instanceof GroupDeletedEvent) { + $group = $event->getGroup(); + $appManager = Server::get(\OCP\App\IAppManager::class); + $apps = $appManager->getEnabledAppsForGroup($group); + foreach ($apps as $appId) { + $restrictions = $appManager->getAppRestriction($appId); + if (empty($restrictions)) { + continue; + } + $key = array_search($group->getGID(), $restrictions, true); + unset($restrictions[$key]); + $restrictions = array_values($restrictions); + if (empty($restrictions)) { + $appManager->disableApp($appId); + } else { + $appManager->enableAppForGroups($appId, $restrictions); + } + } + } + } } diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php index 74199ff5ca362..e741dfff17730 100644 --- a/lib/private/Share20/Manager.php +++ b/lib/private/Share20/Manager.php @@ -168,7 +168,8 @@ protected function generalChecks(IShare $share): void { } } elseif ($share->getShareType() === IShare::TYPE_GROUP) { // We expect a valid group as sharedWith for group shares - if (!$this->groupManager->groupExists($share->getSharedWith())) { + $sharedWith = $share->getSharedWith(); + if ($sharedWith === null || !$this->groupManager->groupExists($sharedWith)) { throw new \InvalidArgumentException($this->l->t('Share recipient is not a valid group')); } } elseif ($share->getShareType() === IShare::TYPE_LINK) { diff --git a/lib/private/SubAdmin.php b/lib/private/SubAdmin.php index 5e4c62c91173c..33593d4e3109b 100644 --- a/lib/private/SubAdmin.php +++ b/lib/private/SubAdmin.php @@ -9,7 +9,10 @@ namespace OC; use OC\Hooks\PublicEmitter; +use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventDispatcher; +use OCP\EventDispatcher\IEventListener; +use OCP\Group\Events\GroupDeletedEvent; use OCP\Group\Events\SubAdminAddedEvent; use OCP\Group\Events\SubAdminRemovedEvent; use OCP\Group\ISubAdmin; @@ -18,27 +21,21 @@ use OCP\IGroupManager; use OCP\IUser; use OCP\IUserManager; +use OCP\User\Events\UserDeletedEvent; +use Override; -class SubAdmin extends PublicEmitter implements ISubAdmin { +/** + * @template-implements IEventListener + */ +class SubAdmin extends PublicEmitter implements ISubAdmin, IEventListener { public function __construct( - private IUserManager $userManager, - private IGroupManager $groupManager, - private IDBConnection $dbConn, - private IEventDispatcher $eventDispatcher, + private readonly IUserManager $userManager, + private readonly IGroupManager $groupManager, + private readonly IDBConnection $dbConn, + private readonly IEventDispatcher $eventDispatcher, ) { - $this->userManager->listen('\OC\User', 'postDelete', function ($user): void { - $this->post_deleteUser($user); - }); - $this->groupManager->listen('\OC\Group', 'postDelete', function ($group): void { - $this->post_deleteGroup($group); - }); } - /** - * add a SubAdmin - * @param IUser $user user to be SubAdmin - * @param IGroup $group group $user becomes subadmin of - */ #[\Override] public function createSubAdmin(IUser $user, IGroup $group): void { $qb = $this->dbConn->getQueryBuilder(); @@ -56,11 +53,6 @@ public function createSubAdmin(IUser $user, IGroup $group): void { $this->eventDispatcher->dispatchTyped($event); } - /** - * delete a SubAdmin - * @param IUser $user the user that is the SubAdmin - * @param IGroup $group the group - */ #[\Override] public function deleteSubAdmin(IUser $user, IGroup $group): void { $qb = $this->dbConn->getQueryBuilder(); @@ -76,11 +68,6 @@ public function deleteSubAdmin(IUser $user, IGroup $group): void { $this->eventDispatcher->dispatchTyped($event); } - /** - * get groups of a SubAdmin - * @param IUser $user the SubAdmin - * @return IGroup[] - */ #[\Override] public function getSubAdminsGroups(IUser $user): array { $groupIds = $this->getSubAdminsGroupIds($user); @@ -129,11 +116,6 @@ public function getSubAdminsGroupsName(IUser $user): array { }, $this->getSubAdminsGroups($user)); } - /** - * get SubAdmins of a group - * @param IGroup $group the group - * @return IUser[] - */ #[\Override] public function getGroupsSubAdmins(IGroup $group): array { $qb = $this->dbConn->getQueryBuilder(); @@ -182,12 +164,6 @@ public function getAllSubAdmins(): array { return $subadmins; } - /** - * checks if a user is a SubAdmin of a group - * @param IUser $user - * @param IGroup $group - * @return bool - */ #[\Override] public function isSubAdminOfGroup(IUser $user, IGroup $group): bool { $qb = $this->dbConn->getQueryBuilder(); @@ -208,11 +184,6 @@ public function isSubAdminOfGroup(IUser $user, IGroup $group): bool { return $result; } - /** - * checks if a user is a SubAdmin - * @param IUser $user - * @return bool - */ #[\Override] public function isSubAdmin(IUser $user): bool { // Check if the user is already an admin @@ -239,12 +210,6 @@ public function isSubAdmin(IUser $user): bool { return $isSubAdmin !== false; } - /** - * checks if a user is a accessible by a subadmin - * @param IUser $subadmin - * @param IUser $user - * @return bool - */ #[\Override] public function isUserAccessible(IUser $subadmin, IUser $user): bool { if ($subadmin->getUID() === $user->getUID()) { @@ -267,10 +232,9 @@ public function isUserAccessible(IUser $subadmin, IUser $user): bool { } /** - * delete all SubAdmins by $user - * @param IUser $user + * Delete all SubAdmins by $user */ - private function post_deleteUser(IUser $user) { + private function postDeleteUser(IUser $user): void { $qb = $this->dbConn->getQueryBuilder(); $qb->delete('group_admin') @@ -279,14 +243,24 @@ private function post_deleteUser(IUser $user) { } /** - * delete all SubAdmins by $group - * @param IGroup $group + * Delete all SubAdmins by $group */ - private function post_deleteGroup(IGroup $group) { + private function postDeleteGroup(IGroup $group): void { $qb = $this->dbConn->getQueryBuilder(); $qb->delete('group_admin') ->where($qb->expr()->eq('gid', $qb->createNamedParameter($group->getGID()))) ->executeStatement(); } + + #[Override] + public function handle(Event $event): void { + if ($event instanceof GroupDeletedEvent) { + $this->postDeleteGroup($event->getGroup()); + } + + if ($event instanceof UserDeletedEvent) { + $this->postDeleteUser($event->getUser()); + } + } } diff --git a/lib/public/Group/Backend/IAddToGroupBackend.php b/lib/public/Group/Backend/IAddToGroupBackend.php index eab757f313dcb..36bd541b7e35a 100644 --- a/lib/public/Group/Backend/IAddToGroupBackend.php +++ b/lib/public/Group/Backend/IAddToGroupBackend.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 14.0.0 */ +#[Implementable(since: '14.0.0')] interface IAddToGroupBackend { /** * @since 14.0.0 diff --git a/lib/public/Group/Backend/IBatchMethodsBackend.php b/lib/public/Group/Backend/IBatchMethodsBackend.php index 9ed8248d5698b..2155800d5c69d 100644 --- a/lib/public/Group/Backend/IBatchMethodsBackend.php +++ b/lib/public/Group/Backend/IBatchMethodsBackend.php @@ -9,10 +9,13 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @brief Optional interface for group backends * @since 28.0.0 */ +#[Implementable(since: '28.0.0')] interface IBatchMethodsBackend { /** * @brief Batch method to check if a list of groups exists diff --git a/lib/public/Group/Backend/ICountDisabledInGroup.php b/lib/public/Group/Backend/ICountDisabledInGroup.php index cb1316c21a711..3ac206ab8279d 100644 --- a/lib/public/Group/Backend/ICountDisabledInGroup.php +++ b/lib/public/Group/Backend/ICountDisabledInGroup.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 14.0.0 */ +#[Implementable(since: '14.0.0')] interface ICountDisabledInGroup { /** * @since 14.0.0 diff --git a/lib/public/Group/Backend/ICountUsersBackend.php b/lib/public/Group/Backend/ICountUsersBackend.php index d6001eaca1bcb..7e063347ed191 100644 --- a/lib/public/Group/Backend/ICountUsersBackend.php +++ b/lib/public/Group/Backend/ICountUsersBackend.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 14.0.0 */ +#[Implementable(since: '14.0.0')] interface ICountUsersBackend { /** * @since 14.0.0 diff --git a/lib/public/Group/Backend/ICreateGroupBackend.php b/lib/public/Group/Backend/ICreateGroupBackend.php index e7412c8418c40..9006ee8b2af09 100644 --- a/lib/public/Group/Backend/ICreateGroupBackend.php +++ b/lib/public/Group/Backend/ICreateGroupBackend.php @@ -9,10 +9,13 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 14.0.0 * @deprecated 30.0.0 Use ICreateNamedGroupBackend instead */ +#[Implementable(since: '14.0.0')] interface ICreateGroupBackend { /** * @since 14.0.0 diff --git a/lib/public/Group/Backend/ICreateNamedGroupBackend.php b/lib/public/Group/Backend/ICreateNamedGroupBackend.php index d2bfd80596d59..dea270b27ed14 100644 --- a/lib/public/Group/Backend/ICreateNamedGroupBackend.php +++ b/lib/public/Group/Backend/ICreateNamedGroupBackend.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 30.0.0 */ +#[Implementable(since: '30.0.0')] interface ICreateNamedGroupBackend { /** * Tries to create a group from its name. diff --git a/lib/public/Group/Backend/IDeleteGroupBackend.php b/lib/public/Group/Backend/IDeleteGroupBackend.php index 59fe5b629b571..9a14230e427f3 100644 --- a/lib/public/Group/Backend/IDeleteGroupBackend.php +++ b/lib/public/Group/Backend/IDeleteGroupBackend.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 14.0.0 */ +#[Implementable(since: '14.0.0')] interface IDeleteGroupBackend { /** * @since 14.0.0 diff --git a/lib/public/Group/Backend/IGetDisplayNameBackend.php b/lib/public/Group/Backend/IGetDisplayNameBackend.php index 6a5daefcc0785..2d6ad1cbea7cd 100644 --- a/lib/public/Group/Backend/IGetDisplayNameBackend.php +++ b/lib/public/Group/Backend/IGetDisplayNameBackend.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 17.0.0 */ +#[Implementable(since: '17.0.0')] interface IGetDisplayNameBackend { /** * @param string $gid diff --git a/lib/public/Group/Backend/IGroupDetailsBackend.php b/lib/public/Group/Backend/IGroupDetailsBackend.php index ae78cec16cef2..e24fe849ea7b6 100644 --- a/lib/public/Group/Backend/IGroupDetailsBackend.php +++ b/lib/public/Group/Backend/IGroupDetailsBackend.php @@ -9,10 +9,13 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @brief Optional interface for group backends * @since 14.0.0 */ +#[Implementable(since: '14.0.0')] interface IGroupDetailsBackend { /** * @brief Get additional details for a group, for example the display name. diff --git a/lib/public/Group/Backend/IHideFromCollaborationBackend.php b/lib/public/Group/Backend/IHideFromCollaborationBackend.php index 28e3572da7fea..cdafb6776b1ce 100644 --- a/lib/public/Group/Backend/IHideFromCollaborationBackend.php +++ b/lib/public/Group/Backend/IHideFromCollaborationBackend.php @@ -9,11 +9,14 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 16.0.0 * * Allow the backend to mark groups to be excluded from being shown in search dialogs */ +#[Implementable(since: '16.0.0')] interface IHideFromCollaborationBackend { /** * Check if a group should be hidden from search dialogs diff --git a/lib/public/Group/Backend/IIsAdminBackend.php b/lib/public/Group/Backend/IIsAdminBackend.php index 1044e9d404a56..9e5af6e1a6e74 100644 --- a/lib/public/Group/Backend/IIsAdminBackend.php +++ b/lib/public/Group/Backend/IIsAdminBackend.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 14.0.0 */ +#[Implementable(since: '14.0.0')] interface IIsAdminBackend { /** * @since 14.0.0 diff --git a/lib/public/Group/Backend/INamedBackend.php b/lib/public/Group/Backend/INamedBackend.php index d7ab0828e0acb..391276cc2f048 100644 --- a/lib/public/Group/Backend/INamedBackend.php +++ b/lib/public/Group/Backend/INamedBackend.php @@ -7,9 +7,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 22.0.0 */ +#[Implementable(since: '22.0.0')] interface INamedBackend { /** * Backend name to be shown in group management diff --git a/lib/public/Group/Backend/IRemoveFromGroupBackend.php b/lib/public/Group/Backend/IRemoveFromGroupBackend.php index 0bc6ac76c2899..7bb262cb05b2c 100644 --- a/lib/public/Group/Backend/IRemoveFromGroupBackend.php +++ b/lib/public/Group/Backend/IRemoveFromGroupBackend.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 14.0.0 */ +#[Implementable(since: '14.0.0')] interface IRemoveFromGroupBackend { /** * @since 14.0.0 diff --git a/lib/public/Group/Backend/ISearchableGroupBackend.php b/lib/public/Group/Backend/ISearchableGroupBackend.php index 9fecf7e41f0f2..bc8e1cb76b2a5 100644 --- a/lib/public/Group/Backend/ISearchableGroupBackend.php +++ b/lib/public/Group/Backend/ISearchableGroupBackend.php @@ -9,11 +9,13 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; use OCP\IUser; /** * @since 27.0.0 */ +#[Implementable(since: '27.0.0')] interface ISearchableGroupBackend { /** * @brief Get a list of users matching the given search parameters. diff --git a/lib/public/Group/Backend/ISetDisplayNameBackend.php b/lib/public/Group/Backend/ISetDisplayNameBackend.php index 70deb49b65dd8..859676351a69e 100644 --- a/lib/public/Group/Backend/ISetDisplayNameBackend.php +++ b/lib/public/Group/Backend/ISetDisplayNameBackend.php @@ -9,9 +9,12 @@ namespace OCP\Group\Backend; +use OCP\AppFramework\Attribute\Implementable; + /** * @since 18.0.0 */ +#[Implementable(since: '18.0.0')] interface ISetDisplayNameBackend { /** * @param string $gid diff --git a/lib/public/Group/Events/BeforeGroupChangedEvent.php b/lib/public/Group/Events/BeforeGroupChangedEvent.php index 6ddcd42d0e3ee..3df3c00c50bf1 100644 --- a/lib/public/Group/Events/BeforeGroupChangedEvent.php +++ b/lib/public/Group/Events/BeforeGroupChangedEvent.php @@ -9,49 +9,37 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; /** * @since 26.0.0 */ +#[Implementable(since: '26.0.0')] class BeforeGroupChangedEvent extends Event { - private IGroup $group; - private string $feature; - /** @var mixed */ - private $value; - /** @var mixed */ - private $oldValue; /** * @since 26.0.0 */ - public function __construct(IGroup $group, - string $feature, - $value, - $oldValue = null) { + public function __construct( + private readonly IGroup $group, + private readonly string $feature, + private readonly mixed $value, + private readonly mixed $oldValue = null, + ) { parent::__construct(); - $this->group = $group; - $this->feature = $feature; - $this->value = $value; - $this->oldValue = $oldValue; } /** - * * @since 26.0.0 - * - * @return IGroup */ public function getGroup(): IGroup { return $this->group; } /** - * * @since 26.0.0 - * - * @return string */ public function getFeature(): string { return $this->feature; @@ -59,20 +47,15 @@ public function getFeature(): string { /** * @since 26.0.0 - * - * @return mixed */ - public function getValue() { + public function getValue(): mixed { return $this->value; } /** - * * @since 26.0.0 - * - * @return mixed */ - public function getOldValue() { + public function getOldValue(): mixed { return $this->oldValue; } } diff --git a/lib/public/Group/Events/BeforeGroupCreatedEvent.php b/lib/public/Group/Events/BeforeGroupCreatedEvent.php index eb43304df82ce..13ba1de411662 100644 --- a/lib/public/Group/Events/BeforeGroupCreatedEvent.php +++ b/lib/public/Group/Events/BeforeGroupCreatedEvent.php @@ -9,21 +9,21 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; /** * @since 18.0.0 */ +#[Implementable(since: '18.0.0')] class BeforeGroupCreatedEvent extends Event { - /** @var string */ - private $name; - /** * @since 18.0.0 */ - public function __construct(string $name) { + public function __construct( + private readonly string $name, + ) { parent::__construct(); - $this->name = $name; } /** diff --git a/lib/public/Group/Events/BeforeGroupDeletedEvent.php b/lib/public/Group/Events/BeforeGroupDeletedEvent.php index 48fbb629a6279..1f2429110b863 100644 --- a/lib/public/Group/Events/BeforeGroupDeletedEvent.php +++ b/lib/public/Group/Events/BeforeGroupDeletedEvent.php @@ -9,26 +9,25 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; /** * @since 18.0.0 */ +#[Implementable(since: '18.0.0')] class BeforeGroupDeletedEvent extends Event { - /** @var IGroup */ - private $group; - /** * @since 18.0.0 */ - public function __construct(IGroup $group) { + public function __construct( + private readonly IGroup $group, + ) { parent::__construct(); - $this->group = $group; } /** - * @return IGroup * @since 18.0.0 */ public function getGroup(): IGroup { diff --git a/lib/public/Group/Events/BeforeUserAddedEvent.php b/lib/public/Group/Events/BeforeUserAddedEvent.php index 1bac10bb5dd82..f237d571e60e9 100644 --- a/lib/public/Group/Events/BeforeUserAddedEvent.php +++ b/lib/public/Group/Events/BeforeUserAddedEvent.php @@ -9,6 +9,7 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Listenable; use OCP\EventDispatcher\Event; use OCP\IGroup; use OCP\IUser; @@ -16,24 +17,19 @@ /** * @since 18.0.0 */ +#[Listenable(since: '18.0.0')] class BeforeUserAddedEvent extends Event { - /** @var IGroup */ - private $group; - - /*** @var IUser */ - private $user; - /** * @since 18.0.0 */ - public function __construct(IGroup $group, IUser $user) { + public function __construct( + private readonly IGroup $group, + private readonly IUser $user, + ) { parent::__construct(); - $this->group = $group; - $this->user = $user; } /** - * @return IGroup * @since 18.0.0 */ public function getGroup(): IGroup { diff --git a/lib/public/Group/Events/BeforeUserRemovedEvent.php b/lib/public/Group/Events/BeforeUserRemovedEvent.php index 3c661f1285e6f..c059a751fab40 100644 --- a/lib/public/Group/Events/BeforeUserRemovedEvent.php +++ b/lib/public/Group/Events/BeforeUserRemovedEvent.php @@ -9,6 +9,7 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; use OCP\IUser; @@ -20,25 +21,20 @@ * case please reach out in the issue tracker at * https://github.com/nextcloud/server/issues */ +#[Implementable(since: '18.0.0')] class BeforeUserRemovedEvent extends Event { - /** @var IGroup */ - private $group; - - /*** @var IUser */ - private $user; - /** * @since 18.0.0 * @deprecated 20.0.0 */ - public function __construct(IGroup $group, IUser $user) { + public function __construct( + private readonly IGroup $group, + private readonly IUser $user, + ) { parent::__construct(); - $this->group = $group; - $this->user = $user; } /** - * @return IGroup * @since 18.0.0 * @deprecated 20.0.0 */ @@ -47,7 +43,6 @@ public function getGroup(): IGroup { } /** - * @return IUser * @since 18.0.0 * @deprecated 20.0.0 */ diff --git a/lib/public/Group/Events/GroupChangedEvent.php b/lib/public/Group/Events/GroupChangedEvent.php index b8206f9d943aa..3f417c0f98ded 100644 --- a/lib/public/Group/Events/GroupChangedEvent.php +++ b/lib/public/Group/Events/GroupChangedEvent.php @@ -9,49 +9,36 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; /** * @since 26.0.0 */ +#[Implementable(since: '21.0.0')] class GroupChangedEvent extends Event { - private IGroup $group; - private string $feature; - /** @var mixed */ - private $value; - /** @var mixed */ - private $oldValue; - /** * @since 26.0.0 */ - public function __construct(IGroup $group, - string $feature, - $value, - $oldValue = null) { + public function __construct( + private readonly IGroup $group, + private readonly string $feature, + private readonly mixed $value, + private readonly mixed $oldValue = null, + ) { parent::__construct(); - $this->group = $group; - $this->feature = $feature; - $this->value = $value; - $this->oldValue = $oldValue; } /** - * * @since 26.0.0 - * - * @return IGroup */ public function getGroup(): IGroup { return $this->group; } /** - * * @since 26.0.0 - * - * @return string */ public function getFeature(): string { return $this->feature; @@ -59,20 +46,15 @@ public function getFeature(): string { /** * @since 26.0.0 - * - * @return mixed */ - public function getValue() { + public function getValue(): mixed { return $this->value; } /** - * * @since 26.0.0 - * - * @return mixed */ - public function getOldValue() { + public function getOldValue(): mixed { return $this->oldValue; } } diff --git a/lib/public/Group/Events/GroupCreatedEvent.php b/lib/public/Group/Events/GroupCreatedEvent.php index 44293f5a63a48..1e373acece439 100644 --- a/lib/public/Group/Events/GroupCreatedEvent.php +++ b/lib/public/Group/Events/GroupCreatedEvent.php @@ -9,26 +9,25 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; /** * @since 18.0.0 */ +#[Implementable(since: '21.0.0')] class GroupCreatedEvent extends Event { - /** @var IGroup */ - private $group; - /** * @since 18.0.0 */ - public function __construct(IGroup $group) { + public function __construct( + private readonly IGroup $group, + ) { parent::__construct(); - $this->group = $group; } /** - * @return IGroup * @since 18.0.0 */ public function getGroup(): IGroup { diff --git a/lib/public/Group/Events/GroupDeletedEvent.php b/lib/public/Group/Events/GroupDeletedEvent.php index 5f6ddfcd731b7..071a16db6c7d3 100644 --- a/lib/public/Group/Events/GroupDeletedEvent.php +++ b/lib/public/Group/Events/GroupDeletedEvent.php @@ -9,26 +9,25 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Listenable; use OCP\EventDispatcher\Event; use OCP\IGroup; /** * @since 18.0.0 */ +#[Listenable(since: '18.0.0')] class GroupDeletedEvent extends Event { - /** @var IGroup */ - private $group; - /** * @since 18.0.0 */ - public function __construct(IGroup $group) { + public function __construct( + private readonly IGroup $group, + ) { parent::__construct(); - $this->group = $group; } /** - * @return IGroup * @since 18.0.0 */ public function getGroup(): IGroup { diff --git a/lib/public/Group/Events/SubAdminAddedEvent.php b/lib/public/Group/Events/SubAdminAddedEvent.php index 5eb4131afcdee..bd299fdd0900f 100644 --- a/lib/public/Group/Events/SubAdminAddedEvent.php +++ b/lib/public/Group/Events/SubAdminAddedEvent.php @@ -9,6 +9,7 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; use OCP\IUser; @@ -16,20 +17,16 @@ /** * @since 21.0.0 */ +#[Implementable(since: '21.0.0')] class SubAdminAddedEvent extends Event { - /** @var IGroup */ - private $group; - - /*** @var IUser */ - private $user; - /** * @since 21.0.0 */ - public function __construct(IGroup $group, IUser $user) { + public function __construct( + private readonly IGroup $group, + private readonly IUser $user, + ) { parent::__construct(); - $this->group = $group; - $this->user = $user; } /** diff --git a/lib/public/Group/Events/SubAdminRemovedEvent.php b/lib/public/Group/Events/SubAdminRemovedEvent.php index c8b8ea5627c68..6eab775ce12b9 100644 --- a/lib/public/Group/Events/SubAdminRemovedEvent.php +++ b/lib/public/Group/Events/SubAdminRemovedEvent.php @@ -9,6 +9,7 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; use OCP\IUser; @@ -16,20 +17,16 @@ /** * @since 21.0.0 */ +#[Implementable(since: '21.0.0')] class SubAdminRemovedEvent extends Event { - /** @var IGroup */ - private $group; - - /*** @var IUser */ - private $user; - /** * @since 21.0.0 */ - public function __construct(IGroup $group, IUser $user) { + public function __construct( + private readonly IGroup $group, + private readonly IUser $user, + ) { parent::__construct(); - $this->group = $group; - $this->user = $user; } /** diff --git a/lib/public/Group/Events/UserAddedEvent.php b/lib/public/Group/Events/UserAddedEvent.php index 367e168b8d098..1309f67c00f4e 100644 --- a/lib/public/Group/Events/UserAddedEvent.php +++ b/lib/public/Group/Events/UserAddedEvent.php @@ -9,6 +9,7 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; use OCP\IUser; @@ -16,24 +17,19 @@ /** * @since 18.0.0 */ +#[Implementable(since: '18.0.0')] class UserAddedEvent extends Event { - /** @var IGroup */ - private $group; - - /*** @var IUser */ - private $user; - /** * @since 18.0.0 */ - public function __construct(IGroup $group, IUser $user) { + public function __construct( + private readonly IGroup $group, + private readonly IUser $user, + ) { parent::__construct(); - $this->group = $group; - $this->user = $user; } /** - * @return IGroup * @since 18.0.0 */ public function getGroup(): IGroup { @@ -41,7 +37,6 @@ public function getGroup(): IGroup { } /** - * @return IUser * @since 18.0.0 */ public function getUser(): IUser { diff --git a/lib/public/Group/Events/UserRemovedEvent.php b/lib/public/Group/Events/UserRemovedEvent.php index 7b88f31f95cd6..9ef23b6c26f1a 100644 --- a/lib/public/Group/Events/UserRemovedEvent.php +++ b/lib/public/Group/Events/UserRemovedEvent.php @@ -9,6 +9,7 @@ namespace OCP\Group\Events; +use OCP\AppFramework\Attribute\Implementable; use OCP\EventDispatcher\Event; use OCP\IGroup; use OCP\IUser; @@ -16,24 +17,19 @@ /** * @since 18.0.0 */ +#[Implementable(since: '18.0.0')] class UserRemovedEvent extends Event { - /** @var IGroup */ - private $group; - - /*** @var IUser */ - private $user; - /** * @since 18.0.0 */ - public function __construct(IGroup $group, IUser $user) { + public function __construct( + private readonly IGroup $group, + private readonly IUser $user, + ) { parent::__construct(); - $this->group = $group; - $this->user = $user; } /** - * @return IGroup * @since 18.0.0 */ public function getGroup(): IGroup { @@ -41,7 +37,6 @@ public function getGroup(): IGroup { } /** - * @return IUser * @since 18.0.0 */ public function getUser(): IUser { diff --git a/lib/public/Group/ISubAdmin.php b/lib/public/Group/ISubAdmin.php index e70ed3b31d615..81511ce10104f 100644 --- a/lib/public/Group/ISubAdmin.php +++ b/lib/public/Group/ISubAdmin.php @@ -9,12 +9,14 @@ namespace OCP\Group; +use OCP\AppFramework\Attribute\Consumable; use OCP\IGroup; use OCP\IUser; /** * @since 16.0.0 */ +#[Consumable(since: '16.0.0')] interface ISubAdmin { /** * add a SubAdmin diff --git a/lib/public/IGroupManager.php b/lib/public/IGroupManager.php index 5f2fd33475909..7b1308c9c81aa 100644 --- a/lib/public/IGroupManager.php +++ b/lib/public/IGroupManager.php @@ -8,36 +8,27 @@ namespace OCP; +use OCP\AppFramework\Attribute\Consumable; + /** - * Class Manager - * - * Hooks available in scope \OC\Group: - * - preAddUser(\OC\Group\Group $group, \OC\User\User $user) - * - postAddUser(\OC\Group\Group $group, \OC\User\User $user) - * - preRemoveUser(\OC\Group\Group $group, \OC\User\User $user) - * - postRemoveUser(\OC\Group\Group $group, \OC\User\User $user) - * - preDelete(\OC\Group\Group $group) - * - postDelete(\OC\Group\Group $group) - * - preCreate(string $groupId) - * - postCreate(\OC\Group\Group $group) + * Group manager interface. * * @since 8.0.0 */ +#[Consumable(since: '8.0.0')] interface IGroupManager { /** * Checks whether a given backend is used * - * @param string $backendClass Full classname including complete namespace - * @return bool + * @param class-string $backendClass Full classname including complete namespace * @since 8.1.0 */ - public function isBackendUsed($backendClass); + public function isBackendUsed(string $backendClass): bool; /** - * @param \OCP\GroupInterface $backend * @since 8.0.0 */ - public function addBackend($backend); + public function addBackend(GroupInterface $backend): void; /** * @since 34.0.0 @@ -47,35 +38,35 @@ public function removeBackend(GroupInterface $backend): void; /** * @since 8.0.0 */ - public function clearBackends(); + public function clearBackends(): void; /** * Get the active backends - * @return \OCP\GroupInterface[] + * @return list<\OCP\GroupInterface> * @since 13.0.0 */ - public function getBackends(); + public function getBackends(): array; /** * @param string $gid * @return \OCP\IGroup|null * @since 8.0.0 */ - public function get($gid); + public function get(string $gid): ?IGroup; /** * @param string $gid * @return bool * @since 8.0.0 */ - public function groupExists($gid); + public function groupExists(string $gid): bool; /** * @param string $gid * @return \OCP\IGroup|null * @since 8.0.0 */ - public function createGroup($gid); + public function createGroup(string $gid): ?IGroup; /** * @param string $search @@ -84,14 +75,14 @@ public function createGroup($gid); * @return list * @since 8.0.0 */ - public function search(string $search, ?int $limit = null, ?int $offset = 0); + public function search(string $search, ?int $limit = null, ?int $offset = 0): array; /** * @param \OCP\IUser|null $user * @return \OCP\IGroup[] * @since 8.0.0 */ - public function getUserGroups(?IUser $user = null); + public function getUserGroups(?IUser $user = null): array; /** * @param \OCP\IUser $user @@ -110,7 +101,7 @@ public function getUserGroupIds(IUser $user): array; * @return array ['user id' => 'display name'] * @since 8.0.0 */ - public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0); + public function displayNamesInGroup(string $gid, string $search = '', int $limit = -1, int $offset = 0): array; /** * Checks if a userId is in the admin group @@ -118,7 +109,7 @@ public function displayNamesInGroup($gid, $search = '', $limit = -1, $offset = 0 * @return bool if admin * @since 8.0.0 */ - public function isAdmin($userId); + public function isAdmin(string $userId): bool; /** * Checks if a userId is eligible to users administration delegation @@ -135,7 +126,7 @@ public function isDelegatedAdmin(string $userId): bool; * @return bool if in group * @since 8.0.0 */ - public function isInGroup($userId, $group); + public function isInGroup(string $userId, string $group): bool; /** * Get the display name of a Nextcloud group diff --git a/lib/public/User/Events/UserDeletedEvent.php b/lib/public/User/Events/UserDeletedEvent.php index 37aad2e83c3f5..5c7ae1e6977b2 100644 --- a/lib/public/User/Events/UserDeletedEvent.php +++ b/lib/public/User/Events/UserDeletedEvent.php @@ -9,27 +9,25 @@ namespace OCP\User\Events; +use OCP\AppFramework\Attribute\Listenable; use OCP\EventDispatcher\Event; use OCP\IUser; /** * @since 18.0.0 */ +#[Listenable(since: '18.0.0')] class UserDeletedEvent extends Event { - /** @var IUser */ - private $user; - /** - * @param IUser $user * @since 18.0.0 */ - public function __construct(IUser $user) { + public function __construct( + private readonly IUser $user, + ) { parent::__construct(); - $this->user = $user; } /** - * @return IUser * @since 18.0.0 */ public function getUser(): IUser { diff --git a/tests/lib/Group/GroupTest.php b/tests/lib/Group/GroupTest.php index 50181a3ea2a31..1bd9137a486b3 100644 --- a/tests/lib/Group/GroupTest.php +++ b/tests/lib/Group/GroupTest.php @@ -491,7 +491,7 @@ public function testSetDisplayNameDispatchesOldValue(): void { ->with('group1', 'New Name') ->willReturn(true); - $group = new Group('group1', [$backend], $dispatcher, $userManager, null, 'Old Name'); + $group = new Group('group1', [$backend], $dispatcher, $userManager, 'Old Name'); $this->assertTrue($group->setDisplayName('New Name')); } diff --git a/tests/lib/Group/ManagerTest.php b/tests/lib/Group/ManagerTest.php index 6d369be102b11..32e3872cc7ee4 100644 --- a/tests/lib/Group/ManagerTest.php +++ b/tests/lib/Group/ManagerTest.php @@ -19,11 +19,11 @@ use OCP\Group\Backend\IRemoveFromGroupBackend; use OCP\Group\Backend\ISearchableGroupBackend; use OCP\GroupInterface; +use OCP\ICache; use OCP\ICacheFactory; use OCP\IUser; use OCP\Security\Ip\IRemoteAddress; use PHPUnit\Framework\MockObject\MockObject; -use Psr\Log\LoggerInterface; use Test\TestCase; abstract class TestBackend extends ABackend implements ISearchableGroupBackend, IAddToGroupBackend, ICreateGroupBackend, IGroupDetailsBackend, IRemoveFromGroupBackend, GroupInterface { @@ -31,16 +31,11 @@ abstract class TestBackend extends ABackend implements ISearchableGroupBackend, } class ManagerTest extends TestCase { - /** @var Manager|MockObject */ - protected $userManager; - /** @var IEventDispatcher|MockObject */ - protected $dispatcher; - /** @var LoggerInterface|MockObject */ - protected $logger; - /** @var ICacheFactory|MockObject */ - private $cache; - /** @var IRemoteAddress|MockObject */ - private $remoteIpAddress; + protected Manager&MockObject $userManager; + protected IEventDispatcher&MockObject $dispatcher; + private ICacheFactory&MockObject $cache; + private ICache&MockObject $userGroupsCache; + private IRemoteAddress&MockObject $remoteIpAddress; #[\Override] protected function setUp(): void { @@ -48,14 +43,25 @@ protected function setUp(): void { $this->userManager = $this->createMock(Manager::class); $this->dispatcher = $this->createMock(IEventDispatcher::class); - $this->logger = $this->createMock(LoggerInterface::class); $this->cache = $this->createMock(ICacheFactory::class); + $this->userGroupsCache = $this->createMock(ICache::class); + $this->cache->method('createDistributed') + ->willReturnCallback(fn (string $prefix): ICache => $prefix === 'user_groups_membership' + ? $this->userGroupsCache + : $this->createMock(ICache::class)); $this->remoteIpAddress = $this->createMock(IRemoteAddress::class); $this->remoteIpAddress->method('allowsAdminActions')->willReturn(true); } - private function getTestUser($userId) { + private function wireCacheInvalidation(\OC\Group\Manager $manager): void { + $this->dispatcher->method('dispatchTyped') + ->willReturnCallback(function ($event) use ($manager): void { + $manager->handle($event); + }); + } + + private function getTestUser(string $userId): IUser&MockObject { $mockUser = $this->createMock(IUser::class); $mockUser->expects($this->any()) ->method('getUID') @@ -66,11 +72,7 @@ private function getTestUser($userId) { return $mockUser; } - /** - * @param null|int $implementedActions - * @return \PHPUnit\Framework\MockObject\MockObject - */ - private function getTestBackend($implementedActions = null) { + private function getTestBackend(?int $implementedActions = null): TestBackend&MockObject { if ($implementedActions === null) { $implementedActions = GroupInterface::ADD_TO_GROUP @@ -107,16 +109,13 @@ private function getTestBackend($implementedActions = null) { } public function testGet(): void { - /** - * @var \PHPUnit\Framework\MockObject\MockObject | \OC\Group\Backend $backend - */ $backend = $this->getTestBackend(); $backend->expects($this->any()) ->method('groupExists') ->with('group1') ->willReturn(true); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $group = $manager->get('group1'); @@ -125,22 +124,19 @@ public function testGet(): void { } public function testGetNoBackend(): void { - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $this->assertNull($manager->get('group1')); } public function testGetNotExists(): void { - /** - * @var \PHPUnit\Framework\MockObject\MockObject | \OC\Group\Backend $backend - */ $backend = $this->getTestBackend(); $backend->expects($this->once()) ->method('groupExists') ->with('group1') ->willReturn(false); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $this->assertNull($manager->get('group1')); @@ -150,8 +146,9 @@ public function testGetDeleted(): void { $backend = new \Test\Util\Group\Dummy(); $backend->createGroup('group1'); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); + $this->wireCacheInvalidation($manager); $group = $manager->get('group1'); $group->delete(); @@ -159,25 +156,19 @@ public function testGetDeleted(): void { } public function testGetMultipleBackends(): void { - /** - * @var \PHPUnit\Framework\MockObject\MockObject | \OC\Group\Backend $backend1 - */ $backend1 = $this->getTestBackend(); $backend1->expects($this->any()) ->method('groupExists') ->with('group1') ->willReturn(false); - /** - * @var \PHPUnit\Framework\MockObject\MockObject | \OC\Group\Backend $backend2 - */ $backend2 = $this->getTestBackend(); $backend2->expects($this->any()) ->method('groupExists') ->with('group1') ->willReturn(true); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend1); $manager->addBackend($backend2); @@ -187,7 +178,6 @@ public function testGetMultipleBackends(): void { } public function testCreate(): void { - /** @var \PHPUnit\Framework\MockObject\MockObject|\OC\Group\Backend $backend */ $backendGroupCreated = false; $backend = $this->getTestBackend(); $backend->expects($this->any()) @@ -203,7 +193,7 @@ public function testCreate(): void { return true; }); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $group = $manager->createGroup('group1'); @@ -211,7 +201,6 @@ public function testCreate(): void { } public function testCreateFailure(): void { - /** @var \PHPUnit\Framework\MockObject\MockObject|\OC\Group\Backend $backend */ $backendGroupCreated = false; $backend = $this->getTestBackend( GroupInterface::ADD_TO_GROUP @@ -232,7 +221,7 @@ public function testCreateFailure(): void { ->method('getGroupDetails') ->willReturn([]); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $group = $manager->createGroup('group1'); @@ -240,8 +229,6 @@ public function testCreateFailure(): void { } public function testCreateTooLong(): void { - /** @var \PHPUnit\Framework\MockObject\MockObject|\OC\Group\Backend $backend */ - $backendGroupCreated = false; $backend = $this->getTestBackend( GroupInterface::ADD_TO_GROUP | GroupInterface::REMOVE_FROM_GOUP @@ -256,7 +243,7 @@ public function testCreateTooLong(): void { ->with($groupName) ->willReturn(false); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $this->expectException(\Exception::class); @@ -264,7 +251,6 @@ public function testCreateTooLong(): void { } public function testCreateExists(): void { - /** @var \PHPUnit\Framework\MockObject\MockObject|\OC\Group\Backend $backend */ $backend = $this->getTestBackend(); $backend->expects($this->any()) ->method('groupExists') @@ -273,7 +259,7 @@ public function testCreateExists(): void { $backend->expects($this->never()) ->method('createGroup'); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $group = $manager->createGroup('group1'); @@ -281,9 +267,6 @@ public function testCreateExists(): void { } public function testSearch(): void { - /** - * @var \PHPUnit\Framework\MockObject\MockObject | \OC\Group\Backend $backend - */ $backend = $this->getTestBackend(); $backend->expects($this->once()) ->method('getGroups') @@ -295,7 +278,7 @@ public function testSearch(): void { ['group1', ['displayName' => 'group1']], ]); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $groups = $manager->search('1'); @@ -305,9 +288,6 @@ public function testSearch(): void { } public function testSearchMultipleBackends(): void { - /** - * @var \PHPUnit\Framework\MockObject\MockObject | \OC\Group\Backend $backend1 - */ $backend1 = $this->getTestBackend(); $backend1->expects($this->once()) ->method('getGroups') @@ -320,9 +300,6 @@ public function testSearchMultipleBackends(): void { ['group12', []], ]); - /** - * @var \PHPUnit\Framework\MockObject\MockObject | \OC\Group\Backend $backend2 - */ $backend2 = $this->getTestBackend(); $backend2->expects($this->once()) ->method('getGroups') @@ -335,7 +312,7 @@ public function testSearchMultipleBackends(): void { ['group1', ['displayName' => 'group1']], ]); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend1); $manager->addBackend($backend2); @@ -382,7 +359,7 @@ public function testSearchMultipleBackendsLimitAndOffset(): void { ['group12', ['displayName' => 'group12']], ]); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend1); $manager->addBackend($backend2); @@ -411,7 +388,7 @@ public function testSearchResultExistsButGroupDoesNot(): void { /** @var \OC\User\Manager $userManager */ $userManager = $this->createMock(Manager::class); - $manager = new \OC\Group\Manager($userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $groups = $manager->search('1'); @@ -432,7 +409,7 @@ public function testGetUserGroups(): void { ->with('group1') ->willReturn(['displayName' => 'group1']); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $groups = $manager->getUserGroups($this->getTestUser('user1')); @@ -450,7 +427,7 @@ public function testGetUserGroupIds(): void { ->with('myUID') ->willReturn(['123', 'abc']); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); /** @var User|\PHPUnit\Framework\MockObject\MockObject $user */ @@ -480,7 +457,7 @@ public function testGetUserGroupsWithDeletedGroup(): void { ->with(['group1']) ->willReturn(['group1' => []]); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); /** @var User|\PHPUnit\Framework\MockObject\MockObject $user */ @@ -506,7 +483,7 @@ public function testInGroup(): void { ->method('groupExists') ->willReturn(true); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $this->assertTrue($manager->isInGroup('user1', 'group1')); @@ -525,7 +502,7 @@ public function testIsAdmin(): void { ->method('groupExists') ->willReturn(true); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $this->assertTrue($manager->isAdmin('user1')); @@ -544,7 +521,7 @@ public function testNotAdmin(): void { ->method('groupExists') ->willReturn(true); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $this->assertFalse($manager->isAdmin('user1')); @@ -575,7 +552,7 @@ public function testGetUserGroupsMultipleBackends(): void { ->method('getGroupDetails') ->willReturnCallback(fn ($gid) => ['displayName' => $gid]); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend1); $manager->addBackend($backend2); @@ -634,7 +611,7 @@ public function testDisplayNamesInGroupWithOneUserBackend(): void { } }); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $users = $manager->displayNamesInGroup('testgroup', 'user3'); @@ -694,7 +671,7 @@ public function testDisplayNamesInGroupWithOneUserBackendWithLimitSpecified(): v } }); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $users = $manager->displayNamesInGroup('testgroup', 'user3', 1); @@ -758,7 +735,7 @@ public function testDisplayNamesInGroupWithOneUserBackendWithLimitAndOffsetSpeci } }); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $users = $manager->displayNamesInGroup('testgroup', 'user3', 1, 1); @@ -787,7 +764,7 @@ public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmpty(): void $this->userManager->expects($this->never())->method('get'); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $users = $manager->displayNamesInGroup('testgroup', ''); @@ -815,7 +792,7 @@ public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmptyAndLimitS $this->userManager->expects($this->never())->method('get'); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $users = $manager->displayNamesInGroup('testgroup', '', 1); @@ -843,7 +820,7 @@ public function testDisplayNamesInGroupWithOneUserBackendAndSearchEmptyAndLimitA $this->userManager->expects($this->never())->method('get'); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $users = $manager->displayNamesInGroup('testgroup', '', 1, 1); @@ -875,8 +852,9 @@ public function testGetUserGroupsWithAddUser(): void { ->with('group1') ->willReturn(['displayName' => 'group1']); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); + $this->wireCacheInvalidation($manager); // prime cache $user1 = $this->getTestUser('user1'); @@ -918,8 +896,9 @@ public function testGetUserGroupsWithRemoveUser(): void { ->method('removeFromGroup') ->willReturn(true); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); + $this->wireCacheInvalidation($manager); // prime cache $user1 = $this->getTestUser('user1'); @@ -948,7 +927,7 @@ public function testGetUserIdGroups(): void { ->with('user1') ->willReturn(null); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); $groups = $manager->getUserIdGroups('user1'); @@ -973,7 +952,7 @@ public function testGroupDisplayName(): void { ['group1', ['gid' => 'group1', 'displayName' => 'Group One']], ['group2', ['gid' => 'group2']], ]); - $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->logger, $this->cache, $this->remoteIpAddress); + $manager = new \OC\Group\Manager($this->userManager, $this->dispatcher, $this->cache, $this->remoteIpAddress); $manager->addBackend($backend); // group with display name diff --git a/tests/lib/Share20/ManagerTest.php b/tests/lib/Share20/ManagerTest.php index 886be86eb4c0f..ffa7e3265e762 100644 --- a/tests/lib/Share20/ManagerTest.php +++ b/tests/lib/Share20/ManagerTest.php @@ -1205,9 +1205,8 @@ public function testGeneralChecks(array $shareParams, ?string $exceptionMessage, ['user1', $this->createMock(IUser::class)], ]); - $this->groupManager->method('groupExists')->willReturnMap([ - ['group0', true], - ]); + $this->groupManager->method('groupExists') + ->willReturnCallback(fn (string $group): bool => $group === 'group0'); $userFolder = $this->createMock(Folder::class); diff --git a/tests/lib/SystemTag/SystemTagManagerTest.php b/tests/lib/SystemTag/SystemTagManagerTest.php index 80f327fafb9ba..b241ea0885a15 100644 --- a/tests/lib/SystemTag/SystemTagManagerTest.php +++ b/tests/lib/SystemTag/SystemTagManagerTest.php @@ -502,8 +502,8 @@ public function testEmptyTagGroup(): void { public static function allowedToCreateProvider(): array { return [ - [true, null, true], - [true, null, false], + [true, false, true], + [true, false, false], [false, true, true], [false, true, false], [false, false, false], @@ -511,7 +511,7 @@ public static function allowedToCreateProvider(): array { } #[\PHPUnit\Framework\Attributes\DataProvider('allowedToCreateProvider')] - public function testAllowedToCreateTag(bool $isCli, ?bool $isAdmin, bool $isRestricted): void { + public function testAllowedToCreateTag(bool $isCli, bool $isAdmin, bool $isRestricted): void { $oldCli = \OC::$CLI; \OC::$CLI = $isCli; @@ -539,15 +539,7 @@ public function testAllowedToCreateTag(bool $isCli, ?bool $isAdmin, bool $isRest \OC::$CLI = $oldCli; } - public static function disallowedToCreateProvider(): array { - return [ - [false], - [null], - ]; - } - - #[\PHPUnit\Framework\Attributes\DataProvider('disallowedToCreateProvider')] - public function testDisallowedToCreateTag(?bool $isAdmin): void { + public function testDisallowedToCreateTag(): void { $oldCli = \OC::$CLI; \OC::$CLI = false; @@ -557,11 +549,11 @@ public function testDisallowedToCreateTag(?bool $isAdmin): void { ->willReturn('test'); $this->userSession->expects($this->any()) ->method('getUser') - ->willReturn($isAdmin === null ? null : $user); + ->willReturn($user); $this->groupManager->expects($this->any()) ->method('isAdmin') ->with('test') - ->willReturn($isAdmin); + ->willReturn(false); $this->appConfig->expects($this->any()) ->method('getValueBool') ->with('systemtags', 'restrict_creation_to_admin') @@ -573,11 +565,7 @@ public function testDisallowedToCreateTag(?bool $isAdmin): void { \OC::$CLI = $oldCli; } - /** - * @param ISystemTag $tag1 - * @param ISystemTag $tag2 - */ - private function assertSameTag($tag1, $tag2) { + private function assertSameTag(ISystemTag $tag1, ISystemTag $tag2): void { $this->assertEquals($tag1->getId(), $tag2->getId()); $this->assertEquals($tag1->getName(), $tag2->getName()); $this->assertEquals($tag1->isUserVisible(), $tag2->isUserVisible());