Skip to content

Commit

Permalink
Migrate OC_Group post_removeFromGroup hook to actual event object
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
MorrisJobke committed Jul 7, 2020
1 parent 09b9f94 commit 75def24
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 8 deletions.
13 changes: 12 additions & 1 deletion apps/user_ldap/lib/Jobs/UpdateGroups.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@
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\BeforeUserRemovedEvent;
use OCP\Group\Events\UserRemovedEvent;
use OCP\ILogger;

class UpdateGroups extends \OC\BackgroundJob\TimedJob {
Expand Down Expand Up @@ -93,6 +96,10 @@ private static function getRefreshInterval() {
* @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`
Expand All @@ -104,8 +111,12 @@ private static function handleKnownGroups($groups) {
$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 BeforeUserRemovedEvent($groupObject, $userObject)); // fake the before event
$dispatcher->dispatchTyped(new UserRemovedEvent($groupObject, $userObject));
\OCP\Util::writeLog('user_ldap',
'bgJ "updateGroups" – "'.$removedUser.'" removed from "'.$group.'".',
ILogger::INFO);
Expand Down
9 changes: 8 additions & 1 deletion lib/base.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@
*
*/

use OCP\EventDispatcher\IEventDispatcher;
use OCP\Group\Events\UserRemovedEvent;
use OCP\ILogger;
use OCP\Share;
use OC\Encryption\HookManager;
Expand Down Expand Up @@ -902,8 +904,13 @@ public static function registerFilesystemHooks() {
*/
public static function registerShareHooks() {
if (\OC::$server->getSystemConfig()->getValue('installed')) {
/* @var IEventDispatcher $eventDispatcher */
$dispatcher = \OC::$server->query(IEventDispatcher::class);

OC_Hook::connect('OC_User', 'post_deleteUser', Hooks::class, 'post_deleteUser');
OC_Hook::connect('OC_User', 'post_removeFromGroup', Hooks::class, 'post_removeFromGroup');
$dispatcher->addListener(UserRemovedEvent::class, function(UserRemovedEvent $event) {
\OC::$server->getShareManager()->userDeletedFromGroup($event->getUser()->getUID(), $event->getGroup()->getGID());
});
OC_Hook::connect('OC_User', 'post_deleteGroup', Hooks::class, 'post_deleteGroup');
}
}
Expand Down
4 changes: 0 additions & 4 deletions lib/private/Share20/Hooks.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,4 @@ public static function post_deleteUser($arguments) {
public static function post_deleteGroup($arguments) {
\OC::$server->getShareManager()->groupDeleted($arguments['gid']);
}

public static function post_removeFromGroup($arguments) {
\OC::$server->getShareManager()->userDeletedFromGroup($arguments['uid'], $arguments['gid']);
}
}
12 changes: 10 additions & 2 deletions lib/private/User/User.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@
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;
Expand All @@ -63,6 +66,9 @@ class User implements IUser {
/** @var EventDispatcherInterface */
private $dispatcher;

/** @var IEventDispatcher */
private $newDispatcher;

/** @var bool */
private $enabled;

Expand Down Expand Up @@ -100,6 +106,8 @@ public function __construct(string $uid, ?UserInterface $backend, EventDispatche
if (is_null($this->urlGenerator)) {
$this->urlGenerator = \OC::$server->getURLGenerator();
}
// TODO: inject
$this->newDispatcher = \OC::$server->query(IEventDispatcher::class);
}

/**
Expand Down Expand Up @@ -219,9 +227,9 @@ public function delete() {
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
Expand Down

0 comments on commit 75def24

Please sign in to comment.