From 523390ec5179bfe1a85136945a2bd22703690e0f Mon Sep 17 00:00:00 2001 From: Richard Steinmetz Date: Mon, 6 Jan 2025 17:03:10 +0100 Subject: [PATCH 1/2] fix: propagate group name changes Signed-off-by: Richard Steinmetz Signed-off-by: Maxence Lange --- lib/AppInfo/Application.php | 3 ++ lib/Listeners/GroupChanged.php | 55 ++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 lib/Listeners/GroupChanged.php diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index b8b539f90..58cf03421 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -33,6 +33,7 @@ use OCA\Circles\Listeners\Files\PreparingShareSendMail as ListenerFilesPreparingShareSendMail; use OCA\Circles\Listeners\Files\RemovingMember as ListenerFilesRemovingMember; use OCA\Circles\Listeners\Files\ShareCreatedSendMail as ListenerFilesShareCreatedSendMail; +use OCA\Circles\Listeners\GroupChanged; use OCA\Circles\Listeners\GroupCreated; use OCA\Circles\Listeners\GroupDeleted; use OCA\Circles\Listeners\GroupMemberAdded; @@ -50,6 +51,7 @@ use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\Files\Config\IMountProviderCollection; +use OCP\Group\Events\GroupChangedEvent; use OCP\Group\Events\GroupCreatedEvent; use OCP\Group\Events\GroupDeletedEvent; use OCP\Group\Events\UserAddedEvent; @@ -96,6 +98,7 @@ public function register(IRegistrationContext $context): void { // Group Events $context->registerEventListener(GroupCreatedEvent::class, GroupCreated::class); + $context->registerEventListener(GroupChangedEvent::class, GroupChanged::class); $context->registerEventListener(GroupDeletedEvent::class, GroupDeleted::class); $context->registerEventListener(UserAddedEvent::class, GroupMemberAdded::class); $context->registerEventListener(UserRemovedEvent::class, GroupMemberRemoved::class); diff --git a/lib/Listeners/GroupChanged.php b/lib/Listeners/GroupChanged.php new file mode 100644 index 000000000..b75dfaaf1 --- /dev/null +++ b/lib/Listeners/GroupChanged.php @@ -0,0 +1,55 @@ + */ +class GroupChanged implements IEventListener { + public function __construct( + private readonly IUserSession $userSession, + private readonly FederatedUserService $federatedUserService, + private readonly CircleService $circleService, + private readonly LoggerInterface $logger, + ) { + } + + public function handle(Event $event): void { + if (!($event instanceof GroupChangedEvent)) { + return; + } + + if ($event->getFeature() !== 'displayName') { + return; + } + + $user = $this->userSession->getUser(); + $this->federatedUserService->setLocalCurrentUser($user); + + $groupId = $event->getGroup()->getGID(); + try { + $this->circleService->updateName("group:$groupId", $event->getValue()); + } catch (CircleNotFoundException $e) { + // Silently ignore (there is no circle for the group yet) + } catch (\Exception $e) { + $this->logger->warning("Failed to update display name of circle of group $groupId: " . $e->getMessage(), [ + 'exception' => $e, + 'groupId' => $groupId, + ]); + } + } +} From 528129ba53855d59ae66d4fcb352bbfe03b52dc8 Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Tue, 11 Feb 2025 03:19:25 -0100 Subject: [PATCH 2/2] broadcast event on group name change Signed-off-by: Maxence Lange --- lib/FederatedItems/CircleEdit.php | 9 +++++++ lib/Listeners/GroupChanged.php | 43 ++++++++++++++++++++----------- lib/Service/CircleService.php | 11 ++++++++ 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/lib/FederatedItems/CircleEdit.php b/lib/FederatedItems/CircleEdit.php index 7c963b786..6553e3799 100644 --- a/lib/FederatedItems/CircleEdit.php +++ b/lib/FederatedItems/CircleEdit.php @@ -88,6 +88,11 @@ public function verify(FederatedEvent $event): void { $event->getData()->s('name', $new->getName()); } + if ($data->hasKey('displayName')) { + $new->setDisplayName($data->g('displayName')); + $event->getData()->s('displayName', $new->getDisplayName()); + } + if ($data->hasKey('description')) { $new->setDescription($data->g('description')); $event->getData()->s('description', $new->getDescription()); @@ -114,6 +119,10 @@ public function manage(FederatedEvent $event): void { $circle->setName($data->g('name')); } + if ($data->hasKey('displayName')) { + $circle->setDisplayName($data->g('displayName')); + } + $this->circleService->confirmName($circle); if ($data->hasKey('description')) { diff --git a/lib/Listeners/GroupChanged.php b/lib/Listeners/GroupChanged.php index b75dfaaf1..a3cd5c30b 100644 --- a/lib/Listeners/GroupChanged.php +++ b/lib/Listeners/GroupChanged.php @@ -9,22 +9,23 @@ namespace OCA\Circles\Listeners; +use OCA\Circles\AppInfo\Application; +use OCA\Circles\Db\CircleRequest; use OCA\Circles\Exceptions\CircleNotFoundException; +use OCA\Circles\Model\Circle; +use OCA\Circles\Model\Member; use OCA\Circles\Service\CircleService; use OCA\Circles\Service\FederatedUserService; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; use OCP\Group\Events\GroupChangedEvent; -use OCP\IUserSession; -use Psr\Log\LoggerInterface; /** @template-implements IEventListener */ class GroupChanged implements IEventListener { public function __construct( - private readonly IUserSession $userSession, private readonly FederatedUserService $federatedUserService, private readonly CircleService $circleService, - private readonly LoggerInterface $logger, + private readonly CircleRequest $circleRequest, ) { } @@ -37,19 +38,31 @@ public function handle(Event $event): void { return; } - $user = $this->userSession->getUser(); - $this->federatedUserService->setLocalCurrentUser($user); - $groupId = $event->getGroup()->getGID(); + + $circle = new Circle(); + $circle->setName('group:' . $groupId) + ->setConfig(Circle::CFG_SYSTEM | Circle::CFG_NO_OWNER | Circle::CFG_HIDDEN) + ->setSource(Member::TYPE_GROUP); + + $owner = $this->federatedUserService->getAppInitiator( + Application::APP_ID, + Member::APP_CIRCLES, + Application::APP_NAME + ); + $member = new Member(); + $member->importFromIFederatedUser($owner); + $member->setLevel(Member::LEVEL_OWNER) + ->setStatus(Member::STATUS_MEMBER); + $circle->setOwner($member); + try { - $this->circleService->updateName("group:$groupId", $event->getValue()); - } catch (CircleNotFoundException $e) { - // Silently ignore (there is no circle for the group yet) - } catch (\Exception $e) { - $this->logger->warning("Failed to update display name of circle of group $groupId: " . $e->getMessage(), [ - 'exception' => $e, - 'groupId' => $groupId, - ]); + $this->federatedUserService->setCurrentUser($owner); + $circle = $this->circleRequest->searchCircle($circle); + } catch (CircleNotFoundException) { + return; } + + $this->circleService->updateDisplayName($circle->getSingleId(), $event->getValue()); } } diff --git a/lib/Service/CircleService.php b/lib/Service/CircleService.php index a0a40f00c..1854262f4 100644 --- a/lib/Service/CircleService.php +++ b/lib/Service/CircleService.php @@ -363,6 +363,17 @@ public function updateName(string $circleId, string $name): array { return $event->getOutcome(); } + public function updateDisplayName(string $circleId, string $displayName): array { + $circle = $this->getCircle($circleId); + + $event = new FederatedEvent(CircleEdit::class); + $event->setCircle($circle); + $event->setParams(new SimpleDataStore(['displayName' => $displayName])); + $this->federatedEventService->newEvent($event); + + return $event->getOutcome(); + } + /** * @param string $circleId * @param string $description