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());