%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Model/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Model/FederatedLink.php |
<?php /** * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Circles\Model; use OCA\Circles\Exceptions\FederatedCircleStatusUpdateException; class FederatedLink implements \JsonSerializable { public const STATUS_ERROR = -1; public const STATUS_LINK_REMOVE = 0; public const STATUS_LINK_DOWN = 1; public const STATUS_LINK_SETUP = 2; public const STATUS_REQUEST_DECLINED = 4; public const STATUS_REQUEST_SENT = 5; public const STATUS_LINK_REQUESTED = 6; public const STATUS_LINK_UP = 9; public const SHORT_UNIQUE_ID_LENGTH = 12; /** @var int */ private $id; /** @var string */ private $token; /** @var string */ private $address; /** @var string */ private $localAddress; /** @var int */ private $status; /** @var int */ private $creation; /** @var int */ private $circleUniqueId; /** @var string */ private $uniqueId = ''; /** @var string */ private $remoteCircleName; /** @var string */ private $localCircleName; /** @var bool */ private $fullJson = false; public function __construct() { } /** * @param int $id * * @return FederatedLink */ public function setId($id) { $this->id = (int)$id; return $this; } /** * @return int */ public function getId() { return $this->id; } /** * @param $token * * @return $this */ public function setToken($token) { $this->token = (string)$token; return $this; } /** * @param bool $full * * @return string */ public function getToken($full = false) { if ($full) { return $this->token; } return substr($this->token, 0, FederatedLink::SHORT_UNIQUE_ID_LENGTH); } /** * @return string */ public function generateToken() { $token = bin2hex(openssl_random_pseudo_bytes(24)); $this->setToken($token); return $token; } /** * @param string $address * * @return FederatedLink */ public function setAddress($address) { $this->address = (string)$address; return $this; } /** * @return string */ public function getAddress() { return $this->address; } /** * @param string $address * * @return FederatedLink */ public function setLocalAddress($address) { $this->localAddress = (string)$address; return $this; } /** * @return string */ public function getLocalAddress() { return $this->localAddress; } /** * @param string $circleUniqueId * * @return FederatedLink */ public function setCircleId($circleUniqueId) { $this->circleUniqueId = $circleUniqueId; return $this; } /** * @param bool $full * * @return string */ public function getCircleId($full = false) { if ($full) { return $this->circleUniqueId; } return substr($this->circleUniqueId, 0, DeprecatedCircle::SHORT_UNIQUE_ID_LENGTH); } /** * @param string $uniqueId * * @return FederatedLink */ public function setUniqueId($uniqueId) { $this->uniqueId = (string)$uniqueId; return $this; } /** * @param bool $full * * @return string */ public function getUniqueId($full = false) { if ($full) { return $this->uniqueId; } return substr($this->uniqueId, 0, FederatedLink::SHORT_UNIQUE_ID_LENGTH); } /** * @param string $circleName * * @return FederatedLink */ public function setRemoteCircleName($circleName) { $this->remoteCircleName = (string)$circleName; return $this; } /** * @return string */ public function getRemoteCircleName() { return $this->remoteCircleName; } /** * @param string $circleName * * @return FederatedLink */ public function setCircleName($circleName) { $this->localCircleName = (string)$circleName; return $this; } /** * @return string */ public function getCircleName() { return $this->localCircleName; } /** * @param int $status * * @return FederatedLink */ public function setStatus($status) { $this->status = (int)$status; return $this; } /** * @return int */ public function getStatus() { return $this->status; } /** * @param int $creation * * @return FederatedLink */ public function setCreation($creation) { if ($creation === null) { return $this; } $this->creation = $creation; return $this; } /** * @return int */ public function getCreation() { return $this->creation; } public function hasToBeValidStatusUpdate($status) { try { $this->hasToBeValidStatusUpdateWhileLinkDown($status); $this->hasToBeValidStatusUpdateWhileRequestDeclined($status); $this->hasToBeValidStatusUpdateWhileLinkRequested($status); $this->hasToBeValidStatusUpdateWhileRequestSent($status); } catch (FederatedCircleStatusUpdateException $e) { throw new FederatedCircleStatusUpdateException('The status could not be updated'); } } /** * @param $status * * @throws FederatedCircleStatusUpdateException */ private function hasToBeValidStatusUpdateWhileLinkDown($status) { if ($this->getStatus() === self::STATUS_LINK_DOWN) { return; } if ($status !== self::STATUS_LINK_REMOVE) { throw new FederatedCircleStatusUpdateException(); } } /** * @param $status * * @throws FederatedCircleStatusUpdateException */ private function hasToBeValidStatusUpdateWhileRequestDeclined($status) { if ($this->getStatus() !== self::STATUS_REQUEST_DECLINED && $this->getStatus() !== self::STATUS_LINK_SETUP) { return; } if ($status !== self::STATUS_LINK_REMOVE) { throw new FederatedCircleStatusUpdateException(); } } /** * @param $status * * @throws FederatedCircleStatusUpdateException */ private function hasToBeValidStatusUpdateWhileLinkRequested($status) { if ($this->getStatus() !== self::STATUS_LINK_REQUESTED) { return; } if ($status !== self::STATUS_LINK_REMOVE && $status !== self::STATUS_LINK_UP) { throw new FederatedCircleStatusUpdateException(); } } /** * @param $status * * @throws FederatedCircleStatusUpdateException */ private function hasToBeValidStatusUpdateWhileRequestSent($status) { if ($this->getStatus() !== self::STATUS_REQUEST_SENT && $this->getStatus() !== self::STATUS_LINK_UP ) { return; } if ($status !== self::STATUS_LINK_REMOVE) { throw new FederatedCircleStatusUpdateException(); } } public function jsonSerialize(): array { return [ 'id' => $this->getId(), 'token' => $this->getToken($this->fullJson), 'address' => $this->getAddress(), 'status' => $this->getStatus(), 'circle_id' => $this->getCircleId(), 'unique_id' => $this->getUniqueId($this->fullJson), 'creation' => $this->getCreation() ]; } public function getJson($full = false) { $this->fullJson = $full; $json = json_encode($this); $this->fullJson = false; return $json; } public static function fromArray($arr) { if ($arr === null) { return null; } $link = new FederatedLink(); $link->setId($arr['id']); $link->setToken($arr['token']); $link->setAddress($arr['address']); $link->setStatus($arr['status']); $link->setCircleId($arr['circle_id']); $link->setUniqueId($arr['unique_id']); $link->setCreation($arr['creation']); return $link; } public static function fromJSON($json) { return self::fromArray(json_decode($json, true)); } }