* @author Joas Schilling * @author Lukas Reschke * @author Robin Appelman * @author Roeland Jago Douma * * @license AGPL-3.0 * * This code is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * 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, version 3, * along with this program. If not, see * */ namespace OCA\Files_Sharing\Controller; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\Http\Client\IClientService; use OCP\IConfig; use OCP\IRequest; /** * Class ExternalSharesController * * @package OCA\Files_Sharing\Controller */ class ExternalSharesController extends Controller { public function __construct( string $appName, IRequest $request, private \OCA\Files_Sharing\External\Manager $externalManager, private IClientService $clientService, private IConfig $config, ) { parent::__construct($appName, $request); } /** * @NoAdminRequired * @NoOutgoingFederatedSharingRequired * * @return JSONResponse */ public function index() { return new JSONResponse($this->externalManager->getOpenShares()); } /** * @NoAdminRequired * @NoOutgoingFederatedSharingRequired * * @param int $id * @return JSONResponse */ public function create($id) { $this->externalManager->acceptShare($id); return new JSONResponse(); } /** * @NoAdminRequired * @NoOutgoingFederatedSharingRequired * * @param integer $id * @return JSONResponse */ public function destroy($id) { $this->externalManager->declineShare($id); return new JSONResponse(); } /** * Test whether the specified remote is accessible * * @param string $remote * @param bool $checkVersion * @return bool */ protected function testUrl($remote, $checkVersion = false) { try { $client = $this->clientService->newClient(); $response = json_decode($client->get( $remote, [ 'timeout' => 3, 'connect_timeout' => 3, 'verify' => !$this->config->getSystemValueBool('sharing.federation.allowSelfSignedCertificates', false), ] )->getBody()); if ($checkVersion) { return !empty($response->version) && version_compare($response->version, '7.0.0', '>='); } else { return is_object($response); } } catch (\Exception $e) { return false; } } /** * @PublicPage * @NoOutgoingFederatedSharingRequired * @NoIncomingFederatedSharingRequired * * @param string $remote * @return DataResponse */ public function testRemote($remote) { if (str_contains($remote, '#') || str_contains($remote, '?') || str_contains($remote, ';')) { return new DataResponse(false); } if ( $this->testUrl('https://' . $remote . '/ocm-provider/') || $this->testUrl('https://' . $remote . '/ocm-provider/index.php') || $this->testUrl('https://' . $remote . '/status.php', true) ) { return new DataResponse('https'); } elseif ( $this->testUrl('http://' . $remote . '/ocm-provider/') || $this->testUrl('http://' . $remote . '/ocm-provider/index.php') || $this->testUrl('http://' . $remote . '/status.php', true) ) { return new DataResponse('http'); } else { return new DataResponse(false); } } }