From 73f2012e7d26d3716daa6dec2e8bc0cbbe8a9416 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Thu, 31 Oct 2019 16:07:31 +0300 Subject: [PATCH] federated key --- appinfo/application.php | 3 +- appinfo/routes.php | 3 + controller/editorcontroller.php | 7 +- controller/federationcontroller.php | 125 ++++++++++++++++++++++++++++ lib/fileutility.php | 35 +++++++- 5 files changed, 168 insertions(+), 5 deletions(-) create mode 100644 controller/federationcontroller.php diff --git a/appinfo/application.php b/appinfo/application.php index 850ca6e5..4aac65e5 100644 --- a/appinfo/application.php +++ b/appinfo/application.php @@ -137,7 +137,8 @@ class Application extends App { $this->appConfig, $this->crypt, $c->query("IManager"), - $c->query("Session") + $c->query("Session"), + $c->query("ClientService") ); }); diff --git a/appinfo/routes.php b/appinfo/routes.php index 80f769c4..5a8a894d 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -43,5 +43,8 @@ return [ ["name" => "settings#save_common", "url" => "/ajax/settings/common", "verb" => "PUT"], ["name" => "settings#save_watermark", "url" => "/ajax/settings/watermark", "verb" => "PUT"], ["name" => "settings#get_settings", "url" => "/ajax/settings", "verb" => "GET"], + ], + "ocs" => [ + ["name" => "federation#key", "url" => "/api/v1/key", "verb" => "POST"] ] ]; \ No newline at end of file diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index 81af5e2d..e7bad4ff 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -336,7 +336,7 @@ class EditorController extends Controller { try { $newData = $documentService->Request($newFileUri); } catch (\Exception $e) { - $this->logger->error("Failed to download converted file: $newFileUri" . " " . $e->getMessage(), array("app" => $this->appName)); + $this->logger->error("Failed to download converted file: $newFileUri " . $e->getMessage(), array("app" => $this->appName)); return ["error" => $this->trans->t("Failed to download converted file")]; } @@ -577,12 +577,13 @@ class EditorController extends Controller { } $fileUrl = $this->getUrl($file, $shareToken); - $key = $this->fileUtility->getKey($file); + $key = $this->fileUtility->getKey($file, true); + $key = DocumentService::GenerateRevisionId($key); $params = [ "document" => [ "fileType" => $ext, - "key" => DocumentService::GenerateRevisionId($key), + "key" => $key, "permissions" => [], "title" => $fileName, "url" => $fileUrl, diff --git a/controller/federationcontroller.php b/controller/federationcontroller.php new file mode 100644 index 00000000..88bd03ef --- /dev/null +++ b/controller/federationcontroller.php @@ -0,0 +1,125 @@ +logger = $logger; + $this->shareManager = $shareManager; + + $this->config = new AppConfig($this->appName); + $this->fileUtility = new FileUtility($AppName, $trans, $logger, $this->config, $shareManager, $session); + } + + /** + * Returns the origin document key for editor + * + * @param string $shareToken - access token + * + * @return DataResponse + * + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + */ + public function key($shareToken) { + list ($file, $error, $share) = $this->fileUtility->getFileByToken(null, $shareToken); + + if (isset($error)) { + $this->logger->error("Federated getFileByToken: $error", array("app" => $this->appName)); + return new DataResponse(["error" => $error]); + } + + $key = $this->fileUtility->getKey($file, true); + + $this->logger->debug("Federated request get for " . $file->getId() . " key $key", array("app" => $this->appName)); + + return new DataResponse(["key" => $key]); + } +} \ No newline at end of file diff --git a/lib/fileutility.php b/lib/fileutility.php index 9bf6b72a..b76cead7 100644 --- a/lib/fileutility.php +++ b/lib/fileutility.php @@ -37,6 +37,8 @@ use OCP\ILogger; use OCP\ISession; use OCP\Share\IManager; +use OCA\Files_Sharing\External\Storage as SharingExternalStorage; + use OCA\Onlyoffice\AppConfig; /** @@ -210,10 +212,41 @@ class FileUtility { * Generate unique document identifier * * @param File $file - file + * @param bool $origin - request from federated store * * @return string */ - public function getKey($file) { + public function getKey($file, $origin = false) { + if ($origin + && $file->getStorage()->instanceOfStorage(SharingExternalStorage::class)) { + $remote = $file->getStorage()->getRemote(); + $shareToken = $file->getStorage()->getToken(); + + try { + $httpClientService = \OC::$server->getHTTPClientService(); + $client = $httpClientService->newClient(); + $response = $client->post($remote . "ocs/v2.php/apps/" . $this->appName . "/api/v1/key?format=json", [ + "timeout" => 5, + "body" => [ + "shareToken" => $shareToken + ] + ]); + $body = \json_decode($response->getBody(), true); + + $data = $body["ocs"]["data"]; + if (!empty($data["error"])) { + $this->logger->error("Error federated key " . $data["error"], array("app" => $this->appName)); + } else { + $key = $data["key"]; + $this->logger->debug("Federated key: $key", array("app" => $this->appName)); + + return $key; + } + } catch (\Exception $e) { + $this->logger->error("Failed to request federated key " . $file->getId() . " " . $e->getMessage(), array("app" => $this->appName)); + } + } + $instanceId = $this->config->GetSystemValue("instanceid", true); $fileId = $file->getId();