%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/InterfaceService.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\Service; use OCA\Circles\AppInfo\Application; use OCA\Circles\Db\RemoteRequest; use OCA\Circles\Exceptions\RemoteNotFoundException; use OCA\Circles\Exceptions\UnknownInterfaceException; use OCA\Circles\Tools\Traits\TArrayTools; use OCA\Circles\Tools\Traits\TNCLogger; use OCA\Circles\Tools\Traits\TStringTools; use OCP\IRequest; use OCP\IURLGenerator; /** * Class InterfaceService * * @package OCA\Circles\Service */ class InterfaceService { public const IFACE0 = 1; public const IFACE1 = 2; public const IFACE2 = 3; public const IFACE3 = 4; public const IFACE4 = 5; public const IFACE_INTERNAL = 6; public const IFACE_FRONTAL = 7; public const IFACE_TEST = 99; public static $LIST_IFACE = [ self::IFACE_INTERNAL => 'internal', self::IFACE_FRONTAL => 'frontal', self::IFACE0 => 'iface0', self::IFACE1 => 'iface1', self::IFACE2 => 'iface2', self::IFACE3 => 'iface3', self::IFACE4 => 'iface4', ]; use TStringTools; use TArrayTools; use TNCLogger; /** @var IURLGenerator */ private $urlGenerator; /** @var RemoteRequest */ private $remoteRequest; /** @var ConfigService */ private $configService; /** @var int */ private $currentInterface = 0; /** @var int */ private $outgoingInterface = 0; /** * InterfaceService constructor. * * @param IURLGenerator $urlGenerator * @param RemoteRequest $remoteRequest * @param ConfigService $configService */ public function __construct( IURLGenerator $urlGenerator, RemoteRequest $remoteRequest, ConfigService $configService ) { $this->urlGenerator = $urlGenerator; $this->remoteRequest = $remoteRequest; $this->configService = $configService; $this->setup('app', Application::APP_ID); } /** * @param int $interface */ public function setCurrentInterface(int $interface): void { $this->currentInterface = $interface; } /** * @return int * @throws UnknownInterfaceException */ public function getCurrentInterface(): int { if ($this->currentInterface === 0) { throw new UnknownInterfaceException('interface not initialized'); } return $this->currentInterface; } /** * @return bool */ public function hasCurrentInterface(): bool { return ($this->currentInterface !== 0); } /** * @return bool * @throws UnknownInterfaceException */ public function isCurrentInterfaceInternal(): bool { return $this->isInterfaceInternal($this->getCurrentInterface()); } /** * @param int $interface * * @return bool */ public function isInterfaceInternal(int $interface): bool { if ($interface === self::IFACE_INTERNAL) { return true; } switch ($interface) { case self::IFACE0: return $this->configService->getAppValueBool(ConfigService::IFACE0_INTERNAL); case self::IFACE1: return $this->configService->getAppValueBool(ConfigService::IFACE1_INTERNAL); case self::IFACE2: return $this->configService->getAppValueBool(ConfigService::IFACE2_INTERNAL); case self::IFACE3: return $this->configService->getAppValueBool(ConfigService::IFACE3_INTERNAL); case self::IFACE4: return $this->configService->getAppValueBool(ConfigService::IFACE4_INTERNAL); } return false; } /** * @param IRequest $request * @param string $testToken */ public function setCurrentInterfaceFromRequest(IRequest $request, string $testToken = ''): void { $testing = [ self::IFACE_INTERNAL => $this->configService->getInternalInstance(), self::IFACE_FRONTAL => $this->configService->getFrontalInstance(), self::IFACE0 => $this->configService->getIfaceInstance(self::IFACE0), self::IFACE1 => $this->configService->getIfaceInstance(self::IFACE1), self::IFACE2 => $this->configService->getIfaceInstance(self::IFACE2), self::IFACE3 => $this->configService->getIfaceInstance(self::IFACE3), self::IFACE4 => $this->configService->getIfaceInstance(self::IFACE4), ]; if ($testToken !== '' && $testToken === $this->configService->getAppValue(ConfigService::IFACE_TEST_TOKEN)) { $testing[self::IFACE_TEST] = $this->getTestingInstance(); } $serverHost = strtolower($request->getServerHost()); if ($serverHost === '') { return; } foreach ($testing as $iface => $instance) { if ($serverHost === strtolower($instance)) { $this->setCurrentInterface($iface); return; } } } /** * @param string $instance * * @return int * @throws RemoteNotFoundException */ public function getInterfaceFromInstance(string $instance): int { $remoteInstance = $this->remoteRequest->getFromInstance($instance); return $remoteInstance->getInterface(); } /** * */ public function setCurrentInterfaceFromInstance(string $instance): void { try { $this->setCurrentInterface($this->getInterfaceFromInstance($instance)); } catch (RemoteNotFoundException $e) { } } /** * @param int $interface * * @return bool */ public function isInterfaceConfigured(int $interface): bool { try { $config = $this->getCloudIdConfigKey($interface); } catch (UnknownInterfaceException $e) { return false; } return ($this->configService->getAppValue($config) !== ''); } /** * @param int $interface * * @return string * @throws UnknownInterfaceException */ private function getCloudIdConfigKey(int $interface): string { switch ($interface) { case self::IFACE_INTERNAL: return ConfigService::INTERNAL_CLOUD_ID; case self::IFACE_FRONTAL: return ConfigService::FRONTAL_CLOUD_ID; case self::IFACE0: return ConfigService::IFACE0_CLOUD_ID; case self::IFACE1: return ConfigService::IFACE1_CLOUD_ID; case self::IFACE2: return ConfigService::IFACE2_CLOUD_ID; case self::IFACE3: return ConfigService::IFACE3_CLOUD_ID; case self::IFACE4: return ConfigService::IFACE4_CLOUD_ID; } throw new UnknownInterfaceException('unknown interface'); } /** * @param bool $useString * * @return array */ public function getInterfaces(bool $useString = false): array { $interfaces = [ self::IFACE_INTERNAL => $this->configService->getInternalInstance(), self::IFACE_FRONTAL => $this->configService->getFrontalInstance(), self::IFACE0 => $this->configService->getIfaceInstance(InterfaceService::IFACE0), self::IFACE1 => $this->configService->getIfaceInstance(InterfaceService::IFACE1), self::IFACE2 => $this->configService->getIfaceInstance(InterfaceService::IFACE2), self::IFACE3 => $this->configService->getIfaceInstance(InterfaceService::IFACE3), self::IFACE4 => $this->configService->getIfaceInstance(InterfaceService::IFACE4) ]; if (!$useString) { return $interfaces; } $detailed = []; foreach ($interfaces as $id => $iface) { $detailed[self::$LIST_IFACE[$id]] = $iface; } return $detailed; } /** * @param bool $useString * * @return array */ public function getInternalInterfaces(bool $useString = false): array { $interfaces = $this->getInterfaces(false); $internalInterfaces = []; foreach ($interfaces as $id => $iface) { if (!$this->isInterfaceInternal($id)) { continue; } $internalInterfaces[$id] = $iface; } if (!$useString) { return $internalInterfaces; } $detailed = []; foreach ($internalInterfaces as $id => $iface) { $detailed[self::$LIST_IFACE[$id]] = $iface; } return $detailed; } /** * use this only if interface must be defined. If not, use getLocalInstance() * * @throws UnknownInterfaceException */ public function getCloudInstance(int $interface = 0): string { if ($interface === 0) { $interface = $this->getCurrentInterface(); } switch ($interface) { case self::IFACE_INTERNAL: return $this->configService->getInternalInstance(); case self::IFACE_FRONTAL: return $this->configService->getFrontalInstance(); case self::IFACE0: case self::IFACE1: case self::IFACE2: case self::IFACE3: case self::IFACE4: return $this->configService->getIfaceInstance($interface); case self::IFACE_TEST: return $this->getTestingInstance(); } throw new UnknownInterfaceException('unknown configured interface'); } /** * @throws UnknownInterfaceException */ public function getCloudPath(string $route = '', array $args = [], int $interface = 0): string { if ($interface === 0) { $interface = $this->getCurrentInterface(); } $scheme = $path = ''; switch ($interface) { case self::IFACE_INTERNAL: $scheme = $this->configService->getAppValue(ConfigService::INTERNAL_CLOUD_SCHEME); $path = $this->configService->getAppValue(ConfigService::INTERNAL_CLOUD_PATH); break; case self::IFACE_FRONTAL: $scheme = $this->configService->getAppValue(ConfigService::FRONTAL_CLOUD_SCHEME); $path = $this->configService->getAppValue(ConfigService::FRONTAL_CLOUD_PATH); break; case self::IFACE0: $scheme = $this->configService->getAppValue(ConfigService::IFACE0_CLOUD_SCHEME); $path = $this->configService->getAppValue(ConfigService::IFACE0_CLOUD_PATH); break; case self::IFACE1: $scheme = $this->configService->getAppValue(ConfigService::IFACE1_CLOUD_SCHEME); $path = $this->configService->getAppValue(ConfigService::IFACE1_CLOUD_PATH); break; case self::IFACE2: $scheme = $this->configService->getAppValue(ConfigService::IFACE2_CLOUD_SCHEME); $path = $this->configService->getAppValue(ConfigService::IFACE2_CLOUD_PATH); break; case self::IFACE3: $scheme = $this->configService->getAppValue(ConfigService::IFACE3_CLOUD_SCHEME); $path = $this->configService->getAppValue(ConfigService::IFACE3_CLOUD_PATH); break; case self::IFACE4: $scheme = $this->configService->getAppValue(ConfigService::IFACE4_CLOUD_SCHEME); $path = $this->configService->getAppValue(ConfigService::IFACE4_CLOUD_PATH); break; case self::IFACE_TEST: $scheme = $this->configService->getAppValue(ConfigService::IFACE_TEST_SCHEME); $path = $this->configService->getAppValue(ConfigService::IFACE_TEST_PATH); break; } if ($scheme === '') { throw new UnknownInterfaceException('misconfigured scheme'); } $base = $scheme . '://' . $this->getCloudInstance($interface) . $path; if ($route === '') { return $base; } return $base . $this->configService->linkToRoute($route, $args); } /** * should be used when unsure about the used Interface * * @return string */ public function getLocalInstance(): string { if ($this->hasCurrentInterface()) { try { return $this->getCloudInstance(); } catch (UnknownInterfaceException $e) { } } return $this->configService->getLoopbackInstance(); } /** * @param string $route * @param array $args * * @return string */ public function getLocalPath(string $route, array $args): string { $base = $this->configService->getAppValue(ConfigService::FRONTAL_CLOUD_BASE); if ($base === '') { return $this->configService->getLoopbackPath($route, $args); } return rtrim($base, '/') . $this->configService->linkToRoute($route, $args); } /** * should be used when trying to generate an address * * @param string $route * @param array $args * * @return string */ public function getFrontalPath(string $route, array $args): string { $frontalBase = $this->configService->getAppValue(ConfigService::FRONTAL_CLOUD_BASE); if ($frontalBase !== '') { return $this->getLocalPath($route, $args); } if ($this->isInterfaceConfigured(self::IFACE_FRONTAL)) { try { return $this->getCloudPath($route, $args, self::IFACE_FRONTAL); } catch (UnknownInterfaceException $e) { } } $ifaces = [self::IFACE0, self::IFACE1, self::IFACE2, self::IFACE3, self::IFACE4]; foreach ($ifaces as $iface) { if ($this->isInterfaceConfigured($iface) && !$this->isInterfaceInternal($iface)) { try { return $this->getCloudPath($route, $args, $iface); } catch (UnknownInterfaceException $e) { } } } if ($this->isInterfaceConfigured(self::IFACE_INTERNAL)) { try { return $this->getCloudPath($route, $args, self::IFACE_INTERNAL); } catch (UnknownInterfaceException $e) { } } foreach ($ifaces as $iface) { if ($this->isInterfaceConfigured($iface) && $this->isInterfaceInternal($iface)) { try { return $this->getCloudPath($route, $args, $iface); } catch (UnknownInterfaceException $e) { } } } try { return $this->getCloudPath($route, $args); } catch (UnknownInterfaceException $e) { } return $this->getLocalPath($route, $args); } /** * @return string */ private function getTestingInstance(): string { return $this->configService->getAppValue(ConfigService::IFACE_TEST_ID); } }