%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Service/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Service/PermissionService.php |
<?php declare(strict_types=1); /** * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Circles\Service; use OCA\Circles\Exceptions\InitiatorNotFoundException; use OCA\Circles\Exceptions\InsufficientPermissionException; use OCA\Circles\Exceptions\MembershipNotFoundException; use OCA\Circles\Exceptions\RequestBuilderException; use OCA\Circles\Model\Circle; use OCP\IL10N; class PermissionService { /** @var IL10N */ private $l10n; /** @var FederatedUserService */ private $federatedUserService; /** @var ConfigService */ private $configService; /** * @param IL10N $l10n * @param FederatedUserService $federatedUserService * @param ConfigService $configService */ public function __construct( IL10N $l10n, FederatedUserService $federatedUserService, ConfigService $configService ) { $this->l10n = $l10n; $this->federatedUserService = $federatedUserService; $this->configService = $configService; } /** * @throws RequestBuilderException * @throws InitiatorNotFoundException * @throws InsufficientPermissionException */ public function confirmCircleCreation(): void { try { $this->confirm(ConfigService::LIMIT_CIRCLE_CREATION); } catch (InsufficientPermissionException $e) { throw new InsufficientPermissionException( $this->l10n->t('You have no permission to create a new team') ); } } /** * @param string $config * * @throws InsufficientPermissionException * @throws RequestBuilderException * @throws InitiatorNotFoundException */ private function confirm(string $config): void { $singleId = $this->configService->getAppValue($config); if ($singleId === '') { return; } $this->federatedUserService->mustHaveCurrentUser(); $federatedUser = $this->federatedUserService->getCurrentUser(); try { $federatedUser->getLink($singleId); } catch (MembershipNotFoundException $e) { throw new InsufficientPermissionException(); } } /** * @param Circle $circle * * @return bool * @throws RequestBuilderException */ private function canBypassCircleTypes(Circle $circle): bool { try { if (!$circle->hasInitiator()) { throw new MembershipNotFoundException(); } $circle->getInitiator()->getLink( $this->configService->getAppValue(ConfigService::BYPASS_CIRCLE_TYPES) ); return true; } catch (MembershipNotFoundException $e) { } return false; } /** * Enforce or Block circle's config/type * * @param Circle $circle * @param Circle|null $previous * * @throws RequestBuilderException */ public function confirmAllowedCircleTypes(Circle $circle, ?Circle $previous = null): void { if ($this->canBypassCircleTypes($circle)) { return; } $config = $circle->getConfig(); $force = $this->configService->getAppValueInt(ConfigService::CIRCLE_TYPES_FORCE); $block = $this->configService->getAppValueInt(ConfigService::CIRCLE_TYPES_BLOCK); if (is_null($previous)) { $config |= $force; $config &= ~$block; } else { // if we have a previous entry, we compare old and new config. foreach (array_merge($this->extractBitwise($force), $this->extractBitwise($block)) as $bit) { if ($previous->isConfig($bit)) { $config |= $bit; } else { $config &= ~$bit; } } } $circle->setConfig($config); } /** * @return int[] */ private function extractBitwise(int $bitwise): array { $values = []; $b = 1; while ($b <= $bitwise) { if (($bitwise & $b) !== 0) { $values[] = $b; } $b = $b << 1; } return $values; } }