migrate therinaldos.com data
Build & Deploy to DigitalOcean Space / build (push) Failing after 2m38s

This commit is contained in:
2024-05-05 15:50:45 -04:00
commit ef1ff240d4
23182 changed files with 3801898 additions and 0 deletions
@@ -0,0 +1,234 @@
<?php
declare(strict_types=1);
/**
* @copyright 2023, Maxence Lange <maxence@artificial-owl.com>
*
* @author Maxence Lange <maxence@artificial-owl.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\OCM\Model;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\OCM\Events\ResourceTypeRegisterEvent;
use OCP\OCM\Exceptions\OCMArgumentException;
use OCP\OCM\Exceptions\OCMProviderException;
use OCP\OCM\IOCMProvider;
use OCP\OCM\IOCMResource;
/**
* @since 28.0.0
*/
class OCMProvider implements IOCMProvider {
private bool $enabled = false;
private string $apiVersion = '';
private string $endPoint = '';
/** @var IOCMResource[] */
private array $resourceTypes = [];
private bool $emittedEvent = false;
public function __construct(
protected IEventDispatcher $dispatcher,
) {
}
/**
* @param bool $enabled
*
* @return $this
*/
public function setEnabled(bool $enabled): static {
$this->enabled = $enabled;
return $this;
}
/**
* @return bool
*/
public function isEnabled(): bool {
return $this->enabled;
}
/**
* @param string $apiVersion
*
* @return $this
*/
public function setApiVersion(string $apiVersion): static {
$this->apiVersion = $apiVersion;
return $this;
}
/**
* @return string
*/
public function getApiVersion(): string {
return $this->apiVersion;
}
/**
* @param string $endPoint
*
* @return $this
*/
public function setEndPoint(string $endPoint): static {
$this->endPoint = $endPoint;
return $this;
}
/**
* @return string
*/
public function getEndPoint(): string {
return $this->endPoint;
}
/**
* create a new resource to later add it with {@see IOCMProvider::addResourceType()}
* @return IOCMResource
*/
public function createNewResourceType(): IOCMResource {
return new OCMResource();
}
/**
* @param IOCMResource $resource
*
* @return $this
*/
public function addResourceType(IOCMResource $resource): static {
$this->resourceTypes[] = $resource;
return $this;
}
/**
* @param IOCMResource[] $resourceTypes
*
* @return $this
*/
public function setResourceTypes(array $resourceTypes): static {
$this->resourceTypes = $resourceTypes;
return $this;
}
/**
* @return IOCMResource[]
*/
public function getResourceTypes(): array {
if (!$this->emittedEvent) {
$this->emittedEvent = true;
$event = new ResourceTypeRegisterEvent($this);
$this->dispatcher->dispatchTyped($event);
}
return $this->resourceTypes;
}
/**
* @param string $resourceName
* @param string $protocol
*
* @return string
* @throws OCMArgumentException
*/
public function extractProtocolEntry(string $resourceName, string $protocol): string {
foreach ($this->getResourceTypes() as $resource) {
if ($resource->getName() === $resourceName) {
$entry = $resource->getProtocols()[$protocol] ?? null;
if (is_null($entry)) {
throw new OCMArgumentException('protocol not found');
}
return (string)$entry;
}
}
throw new OCMArgumentException('resource not found');
}
/**
* import data from an array
*
* @param array $data
*
* @return $this
* @throws OCMProviderException in case a descent provider cannot be generated from data
* @see self::jsonSerialize()
*/
public function import(array $data): static {
$this->setEnabled(is_bool($data['enabled'] ?? '') ? $data['enabled'] : false)
->setApiVersion((string)($data['apiVersion'] ?? ''))
->setEndPoint($data['endPoint'] ?? '');
$resources = [];
foreach (($data['resourceTypes'] ?? []) as $resourceData) {
$resource = new OCMResource();
$resources[] = $resource->import($resourceData);
}
$this->setResourceTypes($resources);
if (!$this->looksValid()) {
throw new OCMProviderException('remote provider does not look valid');
}
return $this;
}
/**
* @return bool
*/
private function looksValid(): bool {
return ($this->getApiVersion() !== '' && $this->getEndPoint() !== '');
}
/**
* @return array{
* enabled: bool,
* apiVersion: string,
* endPoint: string,
* resourceTypes: array{
* name: string,
* shareTypes: string[],
* protocols: array<string, string>
* }[]
* }
*/
public function jsonSerialize(): array {
$resourceTypes = [];
foreach ($this->getResourceTypes() as $res) {
$resourceTypes[] = $res->jsonSerialize();
}
return [
'enabled' => $this->isEnabled(),
'apiVersion' => $this->getApiVersion(),
'endPoint' => $this->getEndPoint(),
'resourceTypes' => $resourceTypes
];
}
}
@@ -0,0 +1,123 @@
<?php
declare(strict_types=1);
/**
* @copyright 2023, Maxence Lange <maxence@artificial-owl.com>
*
* @author Maxence Lange <maxence@artificial-owl.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\OCM\Model;
use OCP\OCM\IOCMResource;
/**
* @since 28.0.0
*/
class OCMResource implements IOCMResource {
private string $name = '';
/** @var string[] */
private array $shareTypes = [];
/** @var array<string, string> */
private array $protocols = [];
/**
* @param string $name
*
* @return $this
*/
public function setName(string $name): static {
$this->name = $name;
return $this;
}
/**
* @return string
*/
public function getName(): string {
return $this->name;
}
/**
* @param string[] $shareTypes
*
* @return $this
*/
public function setShareTypes(array $shareTypes): static {
$this->shareTypes = $shareTypes;
return $this;
}
/**
* @return string[]
*/
public function getShareTypes(): array {
return $this->shareTypes;
}
/**
* @param array<string, string> $protocols
*
* @return $this
*/
public function setProtocols(array $protocols): static {
$this->protocols = $protocols;
return $this;
}
/**
* @return array<string, string>
*/
public function getProtocols(): array {
return $this->protocols;
}
/**
* import data from an array
*
* @param array $data
*
* @return $this
* @see self::jsonSerialize()
*/
public function import(array $data): static {
return $this->setName((string)($data['name'] ?? ''))
->setShareTypes($data['shareTypes'] ?? [])
->setProtocols($data['protocols'] ?? []);
}
/**
* @return array{
* name: string,
* shareTypes: string[],
* protocols: array<string, string>
* }
*/
public function jsonSerialize(): array {
return [
'name' => $this->getName(),
'shareTypes' => $this->getShareTypes(),
'protocols' => $this->getProtocols()
];
}
}
@@ -0,0 +1,137 @@
<?php
declare(strict_types=1);
/**
* @copyright 2023, Maxence Lange <maxence@artificial-owl.com>
*
* @author Maxence Lange <maxence@artificial-owl.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\OCM;
use JsonException;
use OCP\AppFramework\Http;
use OCP\Http\Client\IClientService;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\OCM\Exceptions\OCMProviderException;
use OCP\OCM\IOCMDiscoveryService;
use OCP\OCM\IOCMProvider;
use Psr\Log\LoggerInterface;
/**
* @since 28.0.0
*/
class OCMDiscoveryService implements IOCMDiscoveryService {
private ICache $cache;
private array $supportedAPIVersion =
[
'1.0-proposal1',
'1.0',
'1.1'
];
public function __construct(
ICacheFactory $cacheFactory,
private IClientService $clientService,
private IConfig $config,
private IOCMProvider $provider,
private LoggerInterface $logger,
) {
$this->cache = $cacheFactory->createDistributed('ocm-discovery');
}
/**
* @param string $remote
* @param bool $skipCache
*
* @return IOCMProvider
* @throws OCMProviderException
*/
public function discover(string $remote, bool $skipCache = false): IOCMProvider {
$remote = rtrim($remote, '/');
if (!$skipCache) {
try {
$this->provider->import(json_decode($this->cache->get($remote) ?? '', true, 8, JSON_THROW_ON_ERROR) ?? []);
if ($this->supportedAPIVersion($this->provider->getApiVersion())) {
return $this->provider; // if cache looks valid, we use it
}
} catch (JsonException|OCMProviderException $e) {
// we ignore cache on issues
}
}
$client = $this->clientService->newClient();
try {
$response = $client->get(
$remote . '/ocm-provider/',
[
'timeout' => 10,
'verify' => !$this->config->getSystemValueBool('sharing.federation.allowSelfSignedCertificates'),
'connect_timeout' => 10,
]
);
if ($response->getStatusCode() === Http::STATUS_OK) {
$body = $response->getBody();
// update provider with data returned by the request
$this->provider->import(json_decode($body, true, 8, JSON_THROW_ON_ERROR) ?? []);
$this->cache->set($remote, $body, 60 * 60 * 24);
}
} catch (JsonException|OCMProviderException $e) {
throw new OCMProviderException('data returned by remote seems invalid - ' . ($body ?? ''));
} catch (\Exception $e) {
$this->logger->warning('error while discovering ocm provider', [
'exception' => $e,
'remote' => $remote
]);
throw new OCMProviderException('error while requesting remote ocm provider');
}
if (!$this->supportedAPIVersion($this->provider->getApiVersion())) {
throw new OCMProviderException('API version not supported');
}
return $this->provider;
}
/**
* Check the version from remote is supported.
* The minor version of the API will be ignored:
* 1.0.1 is identified as 1.0
*
* @param string $version
*
* @return bool
*/
private function supportedAPIVersion(string $version): bool {
$dot1 = strpos($version, '.');
$dot2 = strpos($version, '.', $dot1 + 1);
if ($dot2 > 0) {
$version = substr($version, 0, $dot2);
}
return (in_array($version, $this->supportedAPIVersion));
}
}