%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/FederatedItems/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/FederatedItems/CircleConfig.php |
<?php declare(strict_types=1); /** * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Circles\FederatedItems; use OCA\Circles\Db\CircleRequest; use OCA\Circles\Exceptions\FederatedItemBadRequestException; use OCA\Circles\Exceptions\FederatedItemException; use OCA\Circles\Exceptions\RequestBuilderException; use OCA\Circles\IFederatedItem; use OCA\Circles\Model\Circle; use OCA\Circles\Model\Federated\FederatedEvent; use OCA\Circles\Model\Helpers\MemberHelper; use OCA\Circles\Service\ConfigService; use OCA\Circles\Service\PermissionService; use OCA\Circles\Tools\Traits\TDeserialize; /** * Class CircleConfig * * @package OCA\Circles\FederatedItems */ class CircleConfig implements IFederatedItem { use TDeserialize; /** @var CircleRequest */ private $circleRequest; /** @var PermissionService */ private $permissionService; /** @var ConfigService */ private $configService; /** * CircleConfig constructor. * * @param CircleRequest $circleRequest * @param PermissionService $permissionService * @param ConfigService $configService */ public function __construct( CircleRequest $circleRequest, PermissionService $permissionService, ConfigService $configService ) { $this->circleRequest = $circleRequest; $this->permissionService = $permissionService; $this->configService = $configService; } /** * @param FederatedEvent $event * * @throws FederatedItemException * @throws RequestBuilderException */ public function verify(FederatedEvent $event): void { $circle = $event->getCircle(); $config = $event->getParams()->gInt('config'); $initiatorHelper = new MemberHelper($circle->getInitiator()); $initiatorHelper->mustBeAdmin(); $listing = Circle::$DEF_CFG_CORE_FILTER; if (!$circle->isConfig(Circle::CFG_SYSTEM)) { $listing = array_merge($listing, Circle::$DEF_CFG_SYSTEM_FILTER); } // filtering config values when not using Super Session if (!$event->getParams()->gBool('superSession')) { if ($circle->isConfig(Circle::CFG_APP)) { $config |= Circle::CFG_APP; } else { $config &= ~Circle::CFG_APP; } } $confirmed = true; foreach ($listing as $item) { if ($circle->isConfig($item, $config)) { $confirmed = false; } } if ($circle->isConfig(Circle::CFG_LOCAL, $config) && !$circle->isConfig(Circle::CFG_LOCAL)) { $config -= Circle::CFG_LOCAL; } if (!$circle->isConfig(Circle::CFG_LOCAL, $config) && $circle->isConfig(Circle::CFG_LOCAL)) { $config += Circle::CFG_LOCAL; } if (!$circle->isConfig(Circle::CFG_OPEN, $config) && $circle->isConfig(Circle::CFG_OPEN) && $circle->isConfig(Circle::CFG_REQUEST, $config) ) { $config -= Circle::CFG_REQUEST; } if ($circle->isConfig(Circle::CFG_REQUEST, $config) && !$circle->isConfig(Circle::CFG_REQUEST) && !$circle->isConfig(Circle::CFG_OPEN, $config)) { $config += Circle::CFG_OPEN; } if (!$circle->isConfig(Circle::CFG_ROOT, $config) && $circle->isConfig(Circle::CFG_ROOT) && $circle->isConfig(Circle::CFG_FEDERATED, $config)) { $config -= Circle::CFG_FEDERATED; // TODO: Broadcast message to other instances about loosing federated tag. } if ($circle->isConfig(Circle::CFG_FEDERATED, $config) && !$circle->isConfig(Circle::CFG_FEDERATED) && !$circle->isConfig(Circle::CFG_ROOT, $config)) { $config += Circle::CFG_ROOT; // TODO: Check locally that circle is not a member of another circle. // TODO in that case, remove the membership (and update the memberships) $event->getData()->sBool('_broadcastAsFederated', true); } if (!$confirmed || $config > Circle::$DEF_CFG_MAX) { throw new FederatedItemBadRequestException('Configuration value is not valid'); } $new = clone $circle; $new->setConfig($config); $this->permissionService->confirmAllowedCircleTypes($new, $circle); $event->getData()->sInt('config', $new->getConfig()); $event->setOutcome($this->serialize($new)); } /** * @param FederatedEvent $event */ public function manage(FederatedEvent $event): void { $circle = clone $event->getCircle(); $config = $event->getData()->gInt('config'); $circle->setConfig($config); // TODO: Check locally that circle is not un-federated during the process // TODO: if the circle is managed remotely, remove the circle locally // TODO: if the circle is managed locally, remove non-local users // TODO: Check locally that circle is not federated during the process // TODO: sync if it is to broadcast to Trusted RemoteInstance $this->circleRequest->updateConfig($circle); } /** * @param FederatedEvent $event * @param array $results */ public function result(FederatedEvent $event, array $results): void { } }