From 36ee37ec0af53b9b01612b2ce335e5aa9590d024 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Tue, 7 Jul 2020 21:17:25 +0200 Subject: Migrate OC_Group post_removeFromGroup hook to actual event object Ref #14552 This adds a BeforeUserRemovedEvent to the LDAP backend because it was missing. It's not really before, but we don't have the before state. Signed-off-by: Morris Jobke --- apps/user_ldap/lib/Jobs/UpdateGroups.php | 11 ++++++++++- lib/base.php | 6 +++--- lib/private/Share20/Hooks.php | 4 ---- lib/private/User/User.php | 12 ++++++++++-- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/apps/user_ldap/lib/Jobs/UpdateGroups.php b/apps/user_ldap/lib/Jobs/UpdateGroups.php index 58254bf41e9..035caf0c33c 100644 --- a/apps/user_ldap/lib/Jobs/UpdateGroups.php +++ b/apps/user_ldap/lib/Jobs/UpdateGroups.php @@ -44,6 +44,8 @@ use OCA\User_LDAP\LogWrapper; use OCA\User_LDAP\Mapping\GroupMapping; use OCA\User_LDAP\Mapping\UserMapping; use OCA\User_LDAP\User\Manager; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\Group\Events\UserRemovedEvent; use OCP\ILogger; class UpdateGroups extends \OC\BackgroundJob\TimedJob { @@ -94,6 +96,10 @@ class UpdateGroups extends \OC\BackgroundJob\TimedJob { * @param string[] $groups */ private static function handleKnownGroups($groups) { + $dispatcher = \OC::$server->query(IEventDispatcher::class); + $groupManager = \OC::$server->getGroupManager(); + $userManager = \OC::$server->getUserManager(); + \OCP\Util::writeLog('user_ldap', 'bgJ "updateGroups" – Dealing with known Groups.', ILogger::DEBUG); $query = \OC_DB::prepare(' UPDATE `*PREFIX*ldap_group_members` @@ -105,8 +111,11 @@ class UpdateGroups extends \OC\BackgroundJob\TimedJob { $knownUsers = unserialize(self::$groupsFromDB[$group]['owncloudusers']); $actualUsers = self::getGroupBE()->usersInGroup($group); $hasChanged = false; + + $groupObject = $groupManager->get($group); foreach (array_diff($knownUsers, $actualUsers) as $removedUser) { - \OCP\Util::emitHook('OC_User', 'post_removeFromGroup', ['uid' => $removedUser, 'gid' => $group]); + $userObject = $userManager->get($removedUser); + $dispatcher->dispatchTyped(new UserRemovedEvent($groupObject, $userObject)); \OCP\Util::writeLog('user_ldap', 'bgJ "updateGroups" – "'.$removedUser.'" removed from "'.$group.'".', ILogger::INFO); diff --git a/lib/base.php b/lib/base.php index a491cb11c80..8b8e8e5fe32 100644 --- a/lib/base.php +++ b/lib/base.php @@ -61,6 +61,7 @@ * */ +use OCP\EventDispatcher\IEventDispatcher; use OCP\Group\Events\UserRemovedEvent; use OCP\ILogger; use OCP\Share; @@ -898,11 +899,10 @@ class OC { public static function registerShareHooks() { if (\OC::$server->getSystemConfig()->getValue('installed')) { OC_Hook::connect('OC_User', 'post_deleteUser', Hooks::class, 'post_deleteUser'); - OC_Hook::connect('OC_User', 'post_removeFromGroup', Hooks::class, 'post_removeFromGroupLDAP'); OC_Hook::connect('OC_User', 'post_deleteGroup', Hooks::class, 'post_deleteGroup'); - /** @var \OCP\EventDispatcher\IEventDispatcher $dispatcher */ - $dispatcher = \OC::$server->get(\OCP\EventDispatcher\IEventDispatcher::class); + /** @var IEventDispatcher $dispatcher */ + $dispatcher = \OC::$server->get(IEventDispatcher::class); $dispatcher->addServiceListener(UserRemovedEvent::class, \OC\Share20\UserRemovedListener::class); } } diff --git a/lib/private/Share20/Hooks.php b/lib/private/Share20/Hooks.php index 0e41e20a2cd..b596123bbe0 100644 --- a/lib/private/Share20/Hooks.php +++ b/lib/private/Share20/Hooks.php @@ -30,8 +30,4 @@ class Hooks { public static function post_deleteGroup($arguments) { \OC::$server->getShareManager()->groupDeleted($arguments['gid']); } - - public static function post_removeFromGroupLDAP($arguments) { - \OC::$server->getShareManager()->userDeletedFromGroup($arguments['uid'], $arguments['gid']); - } } diff --git a/lib/private/User/User.php b/lib/private/User/User.php index 08bbce4701b..199ddb569dd 100644 --- a/lib/private/User/User.php +++ b/lib/private/User/User.php @@ -41,6 +41,9 @@ use OC\Avatar\AvatarManager; use OC\Files\Cache\Storage; use OC\Hooks\Emitter; use OC_Helper; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\Group\Events\BeforeUserRemovedEvent; +use OCP\Group\Events\UserRemovedEvent; use OCP\IAvatarManager; use OCP\IConfig; use OCP\IImage; @@ -63,6 +66,9 @@ class User implements IUser { /** @var EventDispatcherInterface */ private $dispatcher; + /** @var IEventDispatcher */ + private $newDispatcher; + /** @var bool */ private $enabled; @@ -100,6 +106,8 @@ class User implements IUser { if (is_null($this->urlGenerator)) { $this->urlGenerator = \OC::$server->getURLGenerator(); } + // TODO: inject + $this->newDispatcher = \OC::$server->query(IEventDispatcher::class); } /** @@ -219,9 +227,9 @@ class User implements IUser { foreach ($groupManager->getUserGroupIds($this) as $groupId) { $group = $groupManager->get($groupId); if ($group) { - \OC_Hook::emit("OC_Group", "pre_removeFromGroup", ["run" => true, "uid" => $this->uid, "gid" => $groupId]); + $this->newDispatcher->dispatchTyped(new BeforeUserRemovedEvent($group, $this)); $group->removeUser($this); - \OC_Hook::emit("OC_User", "post_removeFromGroup", ["uid" => $this->uid, "gid" => $groupId]); + $this->newDispatcher->dispatchTyped(new UserRemovedEvent($group, $this)); } } // Delete the user's keys in preferences -- cgit v1.2.3 From 4a7d7e446f8598b07fde4db787abc4cf432e9413 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 30 Jul 2020 10:14:12 +0200 Subject: User.php: rename of old dispatcher to legacyDispatcher Signed-off-by: Morris Jobke --- lib/private/User/User.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/private/User/User.php b/lib/private/User/User.php index 199ddb569dd..2d27b204d09 100644 --- a/lib/private/User/User.php +++ b/lib/private/User/User.php @@ -64,10 +64,10 @@ class User implements IUser { /** @var UserInterface|null */ private $backend; /** @var EventDispatcherInterface */ - private $dispatcher; + private $legacyDispatcher; /** @var IEventDispatcher */ - private $newDispatcher; + private $dispatcher; /** @var bool */ private $enabled; @@ -93,7 +93,7 @@ class User implements IUser { public function __construct(string $uid, ?UserInterface $backend, EventDispatcherInterface $dispatcher, $emitter = null, IConfig $config = null, $urlGenerator = null) { $this->uid = $uid; $this->backend = $backend; - $this->dispatcher = $dispatcher; + $this->legacyDispatcher = $dispatcher; $this->emitter = $emitter; if (is_null($config)) { $config = \OC::$server->getConfig(); @@ -107,7 +107,7 @@ class User implements IUser { $this->urlGenerator = \OC::$server->getURLGenerator(); } // TODO: inject - $this->newDispatcher = \OC::$server->query(IEventDispatcher::class); + $this->dispatcher = \OC::$server->query(IEventDispatcher::class); } /** @@ -211,7 +211,7 @@ class User implements IUser { * @return bool */ public function delete() { - $this->dispatcher->dispatch(IUser::class . '::preDelete', new GenericEvent($this)); + $this->legacyDispatcher->dispatch(IUser::class . '::preDelete', new GenericEvent($this)); if ($this->emitter) { $this->emitter->emit('\OC\User', 'preDelete', [$this]); } @@ -227,9 +227,9 @@ class User implements IUser { foreach ($groupManager->getUserGroupIds($this) as $groupId) { $group = $groupManager->get($groupId); if ($group) { - $this->newDispatcher->dispatchTyped(new BeforeUserRemovedEvent($group, $this)); + $this->dispatcher->dispatchTyped(new BeforeUserRemovedEvent($group, $this)); $group->removeUser($this); - $this->newDispatcher->dispatchTyped(new UserRemovedEvent($group, $this)); + $this->dispatcher->dispatchTyped(new UserRemovedEvent($group, $this)); } } // Delete the user's keys in preferences @@ -260,7 +260,7 @@ class User implements IUser { $accountManager = \OC::$server->query(AccountManager::class); $accountManager->deleteUser($this); - $this->dispatcher->dispatch(IUser::class . '::postDelete', new GenericEvent($this)); + $this->legacyDispatcher->dispatch(IUser::class . '::postDelete', new GenericEvent($this)); if ($this->emitter) { $this->emitter->emit('\OC\User', 'postDelete', [$this]); } @@ -276,7 +276,7 @@ class User implements IUser { * @return bool */ public function setPassword($password, $recoveryPassword = null) { - $this->dispatcher->dispatch(IUser::class . '::preSetPassword', new GenericEvent($this, [ + $this->legacyDispatcher->dispatch(IUser::class . '::preSetPassword', new GenericEvent($this, [ 'password' => $password, 'recoveryPassword' => $recoveryPassword, ])); @@ -285,7 +285,7 @@ class User implements IUser { } if ($this->backend->implementsActions(Backend::SET_PASSWORD)) { $result = $this->backend->setPassword($this->uid, $password); - $this->dispatcher->dispatch(IUser::class . '::postSetPassword', new GenericEvent($this, [ + $this->legacyDispatcher->dispatch(IUser::class . '::postSetPassword', new GenericEvent($this, [ 'password' => $password, 'recoveryPassword' => $recoveryPassword, ])); @@ -482,7 +482,7 @@ class User implements IUser { } public function triggerChange($feature, $value = null, $oldValue = null) { - $this->dispatcher->dispatch(IUser::class . '::changeUser', new GenericEvent($this, [ + $this->legacyDispatcher->dispatch(IUser::class . '::changeUser', new GenericEvent($this, [ 'feature' => $feature, 'value' => $value, 'oldValue' => $oldValue, -- cgit v1.2.3 From 084f5063f2437ae087f4df092b5bb60019354e81 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 30 Jul 2020 10:21:03 +0200 Subject: Deprecate BeforeUserRemovedEvent because it can't be triggered in all cases Signed-off-by: Morris Jobke --- lib/public/Group/Events/BeforeUserRemovedEvent.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/public/Group/Events/BeforeUserRemovedEvent.php b/lib/public/Group/Events/BeforeUserRemovedEvent.php index cc657f952e6..0690cfbdc26 100644 --- a/lib/public/Group/Events/BeforeUserRemovedEvent.php +++ b/lib/public/Group/Events/BeforeUserRemovedEvent.php @@ -32,6 +32,7 @@ use OCP\IUser; /** * @since 18.0.0 + * @deprecated 20.0.0 */ class BeforeUserRemovedEvent extends Event { @@ -43,6 +44,7 @@ class BeforeUserRemovedEvent extends Event { /** * @since 18.0.0 + * @deprecated 20.0.0 */ public function __construct(IGroup $group, IUser $user) { parent::__construct(); @@ -53,6 +55,7 @@ class BeforeUserRemovedEvent extends Event { /** * @return IGroup * @since 18.0.0 + * @deprecated 20.0.0 */ public function getGroup(): IGroup { return $this->group; @@ -61,6 +64,7 @@ class BeforeUserRemovedEvent extends Event { /** * @return IUser * @since 18.0.0 + * @deprecated 20.0.0 */ public function getUser(): IUser { return $this->user; -- cgit v1.2.3 From 96d418b37950369924b4566d8702e3237b7b187e Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Fri, 7 Aug 2020 17:45:45 +0200 Subject: Add proper deprecation message Signed-off-by: Morris Jobke --- lib/public/Group/Events/BeforeUserRemovedEvent.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/public/Group/Events/BeforeUserRemovedEvent.php b/lib/public/Group/Events/BeforeUserRemovedEvent.php index 0690cfbdc26..fb0f7f45191 100644 --- a/lib/public/Group/Events/BeforeUserRemovedEvent.php +++ b/lib/public/Group/Events/BeforeUserRemovedEvent.php @@ -32,7 +32,10 @@ use OCP\IUser; /** * @since 18.0.0 - * @deprecated 20.0.0 + * @deprecated 20.0.0 - it can't be guaranteed that this event is triggered in + * all case (e.g. for LDAP users this isn't possible) - if there is a valid use + * case please reach out in the issue tracker at + * https://github.com/nextcloud/server/issues */ class BeforeUserRemovedEvent extends Event { -- cgit v1.2.3