From 09aa42eb653597fa02fdf69012ec57ecce1126fd Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 6 Mar 2017 11:03:41 +0300 Subject: [PATCH 01/28] Document Server v4.2 (Issue #13) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f00249ee..de82948e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ The app will create an item in the `new` (+) menu to create **Document**, **Spre ## Installing ONLYOFFICE Document Server -You will need an instance of ONLYOFFICE Document Server that is resolvable and connectable both from ownCloud/Nextcloud and any end clients (version 3.0 and later are supported for use with the app). If that is not the case, use the official ONLYOFFICE Document Server documetnations page: [Document Server for Linux](http://helpcenter.onlyoffice.com/server/linux/document/linux-installation.aspx). ONLYOFFICE Document Server must also be able to POST to ownCloud directly. +You will need an instance of ONLYOFFICE Document Server that is resolvable and connectable both from ownCloud/Nextcloud and any end clients (version 4.2 and later are supported for use with the app). If that is not the case, use the official ONLYOFFICE Document Server documetnations page: [Document Server for Linux](http://helpcenter.onlyoffice.com/server/linux/document/linux-installation.aspx). ONLYOFFICE Document Server must also be able to POST to ownCloud/Nextcloud directly. The easiest way to start an instance of ONLYOFFICE Document Server is to use [Docker](https://github.com/ONLYOFFICE/Docker-DocumentServer). From 6c3f7b188f56c1aa68ff9190020adde59255de1d Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 6 Mar 2017 11:04:22 +0300 Subject: [PATCH 02/28] Check REQUEST_URI (Issue #12) --- appinfo/application.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/appinfo/application.php b/appinfo/application.php index ffb400ac..9aab16d6 100644 --- a/appinfo/application.php +++ b/appinfo/application.php @@ -60,7 +60,8 @@ public function __construct(array $urlParams = []) { $this->crypt = new Crypt($this->appConfig); // Default script and style if configured - if (!empty($this->appConfig->GetDocumentServerUrl())) + if (!empty($this->appConfig->GetDocumentServerUrl()) + && array_key_exists("REQUEST_URI", \OC::$server->getRequest()->server)) { $url = \OC::$server->getRequest()->server["REQUEST_URI"]; From feb642a5f7619c139da64c24145f96f9f9171f6d Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 27 Mar 2017 15:56:32 +0300 Subject: [PATCH 03/28] Nextcloud categories --- appinfo/info.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/appinfo/info.xml b/appinfo/info.xml index 212e1c1d..e0b350e2 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -15,6 +15,11 @@ https://api.onlyoffice.com/editors/owncloud + files + integration + office + organization + tools tool https://www.onlyoffice.com https://github.com/ONLYOFFICE/onlyoffice-owncloud/issues From f232414d9e56090f6a09ba7ed43c976cf468c137 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 27 Mar 2017 16:00:55 +0300 Subject: [PATCH 04/28] author attribute not supported in ownCloud 9.1.4 --- appinfo/info.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index e0b350e2..02a45474 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -6,7 +6,7 @@ ownCloud ONLYOFFICE integration app ONLYOFFICE integration app enables users to edit Office documents within ONLYOFFICE from OwnCloud. This will create a new Open in ONLYOFFICE action within the document library for Office documents. This allows multiple users to collaborate in real time and to save back those changes to OwnCloud. AGPL - Ascensio System SIA + Ascensio System SIA 1.0.1 Onlyoffice From d7354780345b99c089c70ef51a92a7679cfc685a Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 28 Mar 2017 18:42:22 +0300 Subject: [PATCH 05/28] logging config --- lib/appconfig.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/appconfig.php b/lib/appconfig.php index b97cfc9f..d58da9e5 100644 --- a/lib/appconfig.php +++ b/lib/appconfig.php @@ -27,6 +27,7 @@ namespace OCA\Onlyoffice; use OCP\IConfig; +use OCP\ILogger; /** * Application configutarion @@ -49,6 +50,13 @@ class AppConfig { */ private $config; + /** + * Logger + * + * @var OCP\ILogger + */ + private $logger; + /** * The config key for the document server address * @@ -67,9 +75,11 @@ class AppConfig { * @param string $AppName application name */ public function __construct($AppName) { - + $this->appName = $AppName; + $this->config = \OC::$server->getConfig(); + $this->logger = \OC::$server->getLogger(); } /** @@ -82,6 +92,9 @@ public function SetDocumentServerUrl($documentServer) { if (strlen($documentServer) > 0 && !preg_match("/^https?:\/\//i", $documentServer)) { $documentServer = "http://" . $documentServer; } + + $this->logger->info("SetDocumentServerUrl: " . $documentServer, array("app" => $this->appName)); + $this->config->setAppValue($this->appName, $this->_documentserver, $documentServer); $this->DropSKey(); } From 133c19729caace2dbe79687a49c7c1eff7cda5d3 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 28 Mar 2017 18:43:06 +0300 Subject: [PATCH 06/28] logging editor page --- appinfo/application.php | 5 +++++ controller/editorcontroller.php | 32 +++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/appinfo/application.php b/appinfo/application.php index 9aab16d6..241b1a35 100644 --- a/appinfo/application.php +++ b/appinfo/application.php @@ -87,6 +87,10 @@ public function __construct(array $urlParams = []) { return $c->query("ServerContainer")->getUserSession(); }); + $container->registerService("Logger", function($c) { + return $c->query("ServerContainer")->getLogger(); + }); + // Controllers $container->registerService("SettingsController", function($c) { @@ -105,6 +109,7 @@ public function __construct(array $urlParams = []) { $c->query("UserSession")->getUser(), $c->query("ServerContainer")->getURLGenerator(), $c->query("L10N"), + $c->query("Logger"), $this->appConfig, $this->crypt ); diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index 5828e6dd..b0e894e6 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -34,6 +34,7 @@ use OCP\Files\FileInfo; use OCP\Files\IRootFolder; use OCP\IL10N; +use OCP\ILogger; use OCP\IRequest; use OCP\IURLGenerator; use OCP\IUser; @@ -82,6 +83,13 @@ class EditorController extends Controller { */ private $trans; + /** + * Logger + * + * @var OCP\ILogger + */ + private $logger; + /** * Application configuration * @@ -102,7 +110,8 @@ class EditorController extends Controller { * @param IRootFolder $root root folder * @param IUser $user current user * @param IURLGenerator $urlGenerator url generator service - * @param IL10N $l10n l10n service + * @param IL10N $trans l10n service + * @param ILogger $logger logger * @param OCA\Onlyoffice\AppConfig $config application configuration * @param OCA\Onlyoffice\Crypt $crypt hash generator */ @@ -112,6 +121,7 @@ public function __construct($AppName, IUser $user, IURLGenerator $urlGenerator, IL10N $trans, + ILogger $logger, AppConfig $config, Crypt $crypt ) { @@ -121,6 +131,7 @@ public function __construct($AppName, $this->root = $root; $this->urlGenerator = $urlGenerator; $this->trans = $trans; + $this->logger = $logger; $this->config = $config; $this->crypt = $crypt; } @@ -142,9 +153,11 @@ public function create($name, $dir) { $folder = $userFolder->get($dir); if ($folder === NULL) { + $this->logger->info("Folder for file creation was not found: " . $dir, array("app" => $this->appName)); return ["error" => $this->trans->t("The required folder was not found")]; } if (!$folder->isCreatable()) { + $this->logger->info("Folder for file creation without permission: " . $dir, array("app" => $this->appName)); return ["error" => $this->trans->t("You don't have enough permission to create")]; } @@ -155,17 +168,20 @@ public function create($name, $dir) { $template = file_get_contents($templatePath); if (!$template) { + $this->logger->info("Template for file creation not found: " . $templatePath, array("app" => $this->appName)); return ["error" => $this->trans->t("Template not found")]; } $view = Filesystem::getView(); if (!$view->file_put_contents($filePath, $template)) { + $this->logger->error("Can't create file: " . $filePath, array("app" => $this->appName)); return ["error" => $this->trans->t("Can't create file")]; } $fileInfo = $view->getFileInfo($filePath); if ($fileInfo === false) { + $this->logger->info("File not found: " . $filePath, array("app" => $this->appName)); return ["error" => $this->trans->t("File not found")]; } @@ -186,6 +202,7 @@ public function convert($fileId) { list ($file, $error) = $this->getFile($fileId); if (isset($error)) { + $this->logger->error("Convertion: " . $fileId . " " . $error, array("app" => $this->appName)); return ["error" => $error]; } @@ -193,10 +210,12 @@ public function convert($fileId) { $ext = pathinfo($fileName, PATHINFO_EXTENSION); $format = $this->config->formats[$ext]; if (!isset($format)) { + $this->logger->info("Format for convertion not supported: " . $fileName, array("app" => $this->appName)); return ["error" => $this->trans->t("Format do not supported")]; } - if(!isset($format["conv"]) || $format["conv"] !== TRUE) { + if (!isset($format["conv"]) || $format["conv"] !== TRUE) { + $this->logger->debug("Conversion not required: " . $fileName, array("app" => $this->appName)); return ["error" => $this->trans->t("Conversion not required")]; } @@ -217,6 +236,7 @@ public function convert($fileId) { try { $documentService->GetConvertedUri($fileUrl, $ext, $internalExtension, $key, FALSE, $newFileUri); } catch (\Exception $e) { + $this->logger->error("GetConvertedUri: " . $fileId . " " . $e->getMessage(), array("app" => $this->appName)); return ["error" => $e->getMessage()]; } @@ -234,17 +254,20 @@ public function convert($fileId) { $newFilePath = $newFolderPath . DIRECTORY_SEPARATOR . $newFileName; if (($newData = file_get_contents($newFileUri)) === FALSE){ + $this->logger->error("Failed download converted file: " . $newFileUri, array("app" => $this->appName)); return ["error" => $this->trans->t("Failed download converted file")]; } $view = Filesystem::getView(); if (!$view->file_put_contents($newFilePath, $newData)) { + $this->logger->error("Can't create file after convertion: " . $newFilePath, array("app" => $this->appName)); return ["error" => $this->trans->t("Can't create file")]; } $fileInfo = $view->getFileInfo($newFilePath); if ($fileInfo === false) { + $this->logger->info("File not found: " . $newFilePath, array("app" => $this->appName)); return ["error" => $this->trans->t("File not found")]; } @@ -291,6 +314,7 @@ private function getParam($fileId) { list ($file, $error) = $this->getFile($fileId); if (isset($error)) { + $this->logger->error("Convertion: " . $fileId . " " . $error, array("app" => $this->appName)); return ["error" => $error]; } @@ -298,12 +322,14 @@ private function getParam($fileId) { $ext = pathinfo($fileName, PATHINFO_EXTENSION); $format = $this->config->formats[$ext]; if (!isset($format)) { + $this->logger->info("Format do not supported for editing: " . $fileName, array("app" => $this->appName)); return ["error" => $this->trans->t("Format do not supported")]; } $documentServerUrl = $this->config->GetDocumentServerUrl(); if (empty($documentServerUrl)) { + $this->logger->error("documentServerUrl is empty", array("app" => $this->appName)); return ["error" => $this->trans->t("ONLYOFFICE app not configured. Please contact admin")]; } @@ -350,7 +376,7 @@ private function getFile($fileId) { } $files = $this->root->getById($fileId); - if(empty($files)) { + if (empty($files)) { return [NULL, $this->trans->t("File not found")]; } $file = $files[0]; From 54f8cbccfa1adbf621c6ccc4404f0d2825011d7a Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 28 Mar 2017 19:24:41 +0300 Subject: [PATCH 07/28] logging callback --- appinfo/application.php | 1 + controller/callbackcontroller.php | 28 +++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/appinfo/application.php b/appinfo/application.php index 241b1a35..18702790 100644 --- a/appinfo/application.php +++ b/appinfo/application.php @@ -123,6 +123,7 @@ public function __construct(array $urlParams = []) { $c->query("UserSession"), $c->query("ServerContainer")->getUserManager(), $c->query("L10N"), + $c->query("Logger"), $this->appConfig, $this->crypt ); diff --git a/controller/callbackcontroller.php b/controller/callbackcontroller.php index 0eeeb3c0..4c3e182f 100644 --- a/controller/callbackcontroller.php +++ b/controller/callbackcontroller.php @@ -31,6 +31,7 @@ use OCP\Files\File; use OCP\Files\IRootFolder; use OCP\IL10N; +use OCP\ILogger; use OCP\IRequest; use OCP\IUserManager; use OCP\IUserSession; @@ -76,6 +77,13 @@ class CallbackController extends Controller { */ private $trans; + /** + * Logger + * + * @var OCP\ILogger + */ + private $logger; + /** * Application configuration * @@ -109,7 +117,9 @@ class CallbackController extends Controller { * @param IRootFolder $root root folder * @param IUserSession $userSession user session * @param IUserManager $userManager user manager - * @param IL10N $l10n l10n service + * @param IL10N $trans l10n service + * @param ILogger $logger logger + * @param OCA\Onlyoffice\AppConfig $config application configuration * @param OCA\Onlyoffice\Crypt $crypt hash generator */ public function __construct($AppName, @@ -118,6 +128,7 @@ public function __construct($AppName, IUserSession $userSession, IUserManager $userManager, IL10N $trans, + ILogger $logger, AppConfig $config, Crypt $crypt ) { @@ -127,6 +138,7 @@ public function __construct($AppName, $this->userSession = $userSession; $this->userManager = $userManager; $this->trans = $trans; + $this->logger = $logger; $this->config = $config; $this->crypt = $crypt; } @@ -148,9 +160,11 @@ public function download($doc) { $hashData = $this->crypt->ReadHash($doc); if ($hashData === NULL) { + $this->logger->info("Download with empty or not correct hash", array("app" => $this->appName)); return new ErrorResponse(Http::STATUS_FORBIDDEN, $this->trans->t("Access deny")); } if ($hashData->action !== "download") { + $this->logger->info("Download with other action", array("app" => $this->appName)); return new ErrorResponse(Http::STATUS_BAD_REQUEST, $this->trans->t("Invalid request")); } @@ -158,18 +172,21 @@ public function download($doc) { $ownerId = $hashData->ownerId; $files = $this->root->getUserFolder($ownerId)->getById($fileId); - if(empty($files)) { + if (empty($files)) { + $this->logger->info("Files for download not found: " . $fileId, array("app" => $this->appName)); return new ErrorResponse(Http::STATUS_NOT_FOUND, $this->trans->t("Files not found")); } $file = $files[0]; if (! $file instanceof File) { + $this->logger->info("File for download not found: " . $fileId, array("app" => $this->appName)); return new ErrorResponse(Http::STATUS_NOT_FOUND, $this->trans->t("File not found")); } try { return new DownloadResponse($file); } catch(\OCP\Files\NotPermittedException $e) { + $this->logger->info("Download Not permitted: " . $fileId . " " . $e->getMessage(), array("app" => $this->appName)); return new ErrorResponse(Http::STATUS_FORBIDDEN, $this->trans->t("Not permitted")); } return new ErrorResponse(Http::STATUS_INTERNAL_SERVER_ERROR, $this->trans->t("Download failed")); @@ -194,9 +211,11 @@ public function track($doc, $users, $key, $status, $url) { $hashData = $this->crypt->ReadHash($doc); if ($hashData === NULL) { + $this->logger->info("Track with empty or not correct hash", array("app" => $this->appName)); return ["message" => $this->trans->t("Access deny")]; } if ($hashData->action !== "track") { + $this->logger->info("Track with other action", array("app" => $this->appName)); return ["message" => $this->trans->t("Invalid request")]; } @@ -211,12 +230,14 @@ public function track($doc, $users, $key, $status, $url) { $ownerId = $hashData->ownerId; $files = $this->root->getUserFolder($ownerId)->getById($fileId); - if(empty($files)) { + if (empty($files)) { + $this->logger->info("Files for track not found: " . $fileId, array("app" => $this->appName)); return ["message" => $this->trans->t("Files not found")]; } $file = $files[0]; if (! $file instanceof File) { + $this->logger->info("File for track not found: " . $fileId, array("app" => $this->appName)); return ["message" => $this->trans->t("File not found")]; } @@ -233,6 +254,7 @@ public function track($doc, $users, $key, $status, $url) { $documentService->GetConvertedUri($url, $downloadExt, $curExt, $key, FALSE, $newFileUri); $url = $newFileUri; } catch (\Exception $e) { + $this->logger->error("GetConvertedUri in track: " . $url . " " . $e->getMessage(), array("app" => $this->appName)); return ["message" => $e->getMessage()]; } } From 3a43c15848abfa039471a78cbc318262fc95b6a7 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Wed, 29 Mar 2017 17:46:13 +0300 Subject: [PATCH 08/28] Change controller arguments (Issue #24) --- appinfo/application.php | 2 +- controller/editorcontroller.php | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/appinfo/application.php b/appinfo/application.php index 18702790..6dd4a399 100644 --- a/appinfo/application.php +++ b/appinfo/application.php @@ -106,7 +106,7 @@ public function __construct(array $urlParams = []) { $c->query("AppName"), $c->query("Request"), $c->query("RootStorage"), - $c->query("UserSession")->getUser(), + $c->query("UserSession"), $c->query("ServerContainer")->getURLGenerator(), $c->query("L10N"), $c->query("Logger"), diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index b0e894e6..0f48326e 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -37,7 +37,7 @@ use OCP\ILogger; use OCP\IRequest; use OCP\IURLGenerator; -use OCP\IUser; +use OCP\IUserSession; use OC\Files\Filesystem; use OC\Files\View; @@ -56,11 +56,11 @@ class EditorController extends Controller { /** - * Current user + * Current user session * - * @var IUser + * @var IUserSession */ - private $user; + private $userSession; /** * Root folder @@ -86,7 +86,7 @@ class EditorController extends Controller { /** * Logger * - * @var OCP\ILogger + * @var ILogger */ private $logger; @@ -108,7 +108,7 @@ class EditorController extends Controller { * @param string $AppName application name * @param IRequest $request request object * @param IRootFolder $root root folder - * @param IUser $user current user + * @param IUserSession $userSession current user session * @param IURLGenerator $urlGenerator url generator service * @param IL10N $trans l10n service * @param ILogger $logger logger @@ -118,7 +118,7 @@ class EditorController extends Controller { public function __construct($AppName, IRequest $request, IRootFolder $root, - IUser $user, + IUserSession $userSession, IURLGenerator $urlGenerator, IL10N $trans, ILogger $logger, @@ -127,7 +127,7 @@ public function __construct($AppName, ) { parent::__construct($AppName, $request); - $this->user = $user; + $this->userSession = $userSession; $this->root = $root; $this->urlGenerator = $urlGenerator; $this->trans = $trans; @@ -148,7 +148,7 @@ public function __construct($AppName, */ public function create($name, $dir) { - $userId = $this->user->getUID(); + $userId = $this->userSession->getUser()->getUID(); $userFolder = $this->root->getUserFolder($userId); $folder = $userFolder->get($dir); @@ -240,7 +240,7 @@ public function convert($fileId) { return ["error" => $e->getMessage()]; } - $userId = $this->user->getUID(); + $userId = $this->userSession->getUser()->getUID(); $folder = $file->getParent(); if (!$folder->isCreatable()) { $folder = $this->root->getUserFolder($userId); @@ -333,7 +333,7 @@ private function getParam($fileId) { return ["error" => $this->trans->t("ONLYOFFICE app not configured. Please contact admin")]; } - $userId = $this->user->getUID(); + $userId = $this->userSession->getUser()->getUID(); $ownerId = $file->getOwner()->getUID(); try { $this->root->getUserFolder($ownerId); @@ -356,7 +356,7 @@ private function getParam($fileId) { "key" => DocumentService::GenerateRevisionId($key), "url" => $fileUrl, "userId" => $userId, - "userName" => $this->user->getDisplayName(), + "userName" => $this->userSession->getUser()->getDisplayName(), "documentType" => $format["type"] ]; @@ -401,7 +401,7 @@ private function getKey($file) { try { $this->root->getUserFolder($ownerId); } catch (NoUserException $e) { - $ownerId = $this->user->getUID(); + $ownerId = $this->userSession->getUser()->getUID(); } $key = $fileId . $file->getMtime(); From b19d022f6c4f533efa1f30270e04a47dba3cb6db Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 3 Apr 2017 14:02:59 +0300 Subject: [PATCH 09/28] checking document service address on save (CommandRequest) --- appinfo/application.php | 4 +- controller/settingscontroller.php | 66 +++++++++++++++-- js/settings.js | 7 +- lib/documentservice.php | 115 +++++++++++++++++++++--------- 4 files changed, 148 insertions(+), 44 deletions(-) diff --git a/appinfo/application.php b/appinfo/application.php index 6dd4a399..568bbb7a 100644 --- a/appinfo/application.php +++ b/appinfo/application.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice\AppInfo; @@ -97,6 +97,8 @@ public function __construct(array $urlParams = []) { return new SettingsController( $c->query("AppName"), $c->query("Request"), + $c->query("L10N"), + $c->query("Logger"), $this->appConfig ); }); diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php index 84a70e9b..5e048135 100644 --- a/controller/settingscontroller.php +++ b/controller/settingscontroller.php @@ -22,21 +22,38 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice\Controller; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; +use OCP\IL10N; +use OCP\ILogger; use OCP\IRequest; use OCA\Onlyoffice\AppConfig; +use OCA\Onlyoffice\DocumentService; /** * Settings controller for the administration page */ class SettingsController extends Controller { + /** + * l10n service + * + * @var IL10N + */ + private $trans; + + /** + * Logger + * + * @var ILogger + */ + private $logger; + /** * Application configuration * @@ -45,16 +62,22 @@ class SettingsController extends Controller { private $config; /** - * @param string $AppName application name - * @param IRequest $request request object - * @param OCA\Onlyoffice\AppConfig $config application configuration + * @param string $AppName - application name + * @param IRequest $request - request object + * @param IL10N $trans - l10n service + * @param ILogger $logger - logger + * @param OCA\Onlyoffice\AppConfig $config - application configuration */ - public function __construct($AppName, + public function __construct($AppName, IRequest $request, + IL10N $trans, + ILogger $logger, AppConfig $config ) { parent::__construct($AppName, $request); + $this->trans = $trans; + $this->logger = $logger; $this->config = $config; } @@ -71,13 +94,19 @@ public function index() { /** * Save the document server address * - * @param string $documentserver application name + * @param string $documentserver - document service address * * @return array */ public function settings($documentserver) { $this->config->SetDocumentServerUrl($documentserver); - return ["documentserver" => $this->config->GetDocumentServerUrl()]; + + $error = $this->сheckDocServiceUrl(); + + return [ + "documentserver" => $this->config->GetDocumentServerUrl(), + "error" => $error + ]; } /** @@ -90,4 +119,27 @@ public function settings($documentserver) { public function formats(){ return $this->config->formats; } + + + /** + * Checking document service location + * + * @param string $documentServer - document service address + * + * @return string + */ + private function сheckDocServiceUrl() { + + $documentService = new DocumentService($this->trans, $this->config); + + try { + $response = $documentService->CommandRequest("version"); + $this->logger->debug("CommandRequest on check: " . $response->error, array("app" => $this->appName)); + } catch (\Exception $e) { + $this->logger->error("CommandRequest on check: " . $e->getMessage(), array("app" => $this->appName)); + return $e->getMessage(); + } + + return ""; + } } diff --git a/js/settings.js b/js/settings.js index 47c8bf14..40312b76 100644 --- a/js/settings.js +++ b/js/settings.js @@ -43,7 +43,12 @@ success: function onSuccess(response) { if (response && response.documentserver != null) { $("#docServiceUrlApi").val(response.documentserver); - var row = OC.Notification.show(t(OCA.Onlyoffice.AppName, "Settings have been successfully updated")); + + var message = + response.error + ? (t(OCA.Onlyoffice.AppName, "Error when trying to connect") + " (" + response.error + ")") + : t(OCA.Onlyoffice.AppName, "Settings have been successfully updated"); + var row = OC.Notification.show(message); setTimeout(function () { OC.Notification.hide(row); }, 3000); diff --git a/lib/documentservice.php b/lib/documentservice.php index e3b07031..4a177278 100644 --- a/lib/documentservice.php +++ b/lib/documentservice.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice; @@ -52,7 +52,8 @@ class DocumentService { private $config; /** - * @param OCA\Onlyoffice\AppConfig $config application configutarion + * @param IL10N $trans - l10n service + * @param OCA\Onlyoffice\AppConfig $config - application configutarion */ public function __construct(IL10N $trans, AppConfig $appConfig) { $this->trans = $trans; @@ -60,12 +61,12 @@ public function __construct(IL10N $trans, AppConfig $appConfig) { } /** - * Translation key to a supported form. - * - * @param string $expected_key Expected key - * - * @return Supported key - */ + * Translation key to a supported form. + * + * @param string $expected_key - Expected key + * + * @return string + */ public static function GenerateRevisionId($expected_key) { if (strlen($expected_key) > 20) { $expected_key = crc32( $expected_key); @@ -76,17 +77,17 @@ public static function GenerateRevisionId($expected_key) { } /** - * The method is to convert the file to the required format - * - * @param string $document_uri - Uri for the document to convert - * @param string $from_extension - Document extension - * @param string $to_extension - Extension to which to convert - * @param string $document_revision_id - Key for caching on service - * @param bool $is_async - Perform conversions asynchronously - * @param string $converted_document_uri - Uri to the converted document - * - * @return The percentage of completion of conversion - */ + * The method is to convert the file to the required format and return the percentage of completion + * + * @param string $document_uri - Uri for the document to convert + * @param string $from_extension - Document extension + * @param string $to_extension - Extension to which to convert + * @param string $document_revision_id - Key for caching on service + * @param bool $is_async - Perform conversions asynchronously + * @param string $converted_document_uri - Uri to the converted document + * + * @return int + */ function GetConvertedUri($document_uri, $from_extension, $to_extension, $document_revision_id, $is_async, &$converted_document_uri) { $converted_document_uri = ""; $responceFromConvertService = $this->SendRequestToConvertService($document_uri, $from_extension, $to_extension, $document_revision_id, $is_async); @@ -110,16 +111,16 @@ function GetConvertedUri($document_uri, $from_extension, $to_extension, $documen } /** - * Request for conversion to a service - * - * @param string $document_uri - Uri for the document to convert - * @param string $from_extension - Document extension - * @param string $to_extension - Extension to which to convert - * @param string $document_revision_id - Key for caching on service - * @param bool - $is_async - Perform conversions asynchronously - * - * @return Xml document request result of conversion - */ + * Request for conversion to a service + * + * @param string $document_uri - Uri for the document to convert + * @param string $from_extension - Document extension + * @param string $to_extension - Extension to which to convert + * @param string $document_revision_id - Key for caching on service + * @param bool - $is_async - Perform conversions asynchronously + * + * @return array + */ function SendRequestToConvertService($document_uri, $from_extension, $to_extension, $document_revision_id, $is_async) { if (empty($from_extension)) { $path_parts = pathinfo($document_uri); @@ -200,12 +201,12 @@ function SendRequestToConvertService($document_uri, $from_extension, $to_extensi } /** - * Generate an error code table - * - * @param string $errorCode - Error code - * - * @return null - */ + * Generate an error code table + * + * @param string $errorCode - Error code + * + * @return null + */ function ProcessConvServResponceError($errorCode) { $errorMessageTemplate = $this->trans->t("Error occurred in the document service: "); $errorMessage = ""; @@ -244,4 +245,48 @@ function ProcessConvServResponceError($errorCode) { throw new \Exception($errorMessage); } + + /** + * Send command + * + * @param string $method - type of command + * + * @return array + */ + function CommandRequest($method) { + + $documentServerUrl = $this->config->GetDocumentServerUrl(); + + if (empty($documentServerUrl)) { + throw new \Exception($this->trans->t("ONLYOFFICE app not configured. Please contact admin")); + } + + $urlCommand = $documentServerUrl . "/coauthoring/CommandService.ashx"; + + $data = json_encode( + array( + "c" => $method + ) + ); + + $opts = array("http" => array( + "method" => "POST", + "timeout" => "120000", + "header"=> "Content-type: application/json\r\n", + "content" => $data + ) + ); + + if (substr($urlCommand, 0, strlen("https")) === "https") { + $opts["ssl"] = array( "verify_peer" => FALSE ); + } + + $context = stream_context_create($opts); + + if (($response = file_get_contents($urlCommand, FALSE, $context)) === FALSE){ + throw new \Exception ($this->trans->t("Bad Request or timeout error")); + } + + return json_decode($response); + } } From 013282e8c8af8c15a19c80abb484969d33a82064 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 3 Apr 2017 15:05:08 +0300 Subject: [PATCH 10/28] checking version of onlyoffice (Issue #30) --- controller/settingscontroller.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php index 5e048135..85d993a6 100644 --- a/controller/settingscontroller.php +++ b/controller/settingscontroller.php @@ -133,8 +133,14 @@ private function сheckDocServiceUrl() { $documentService = new DocumentService($this->trans, $this->config); try { - $response = $documentService->CommandRequest("version"); - $this->logger->debug("CommandRequest on check: " . $response->error, array("app" => $this->appName)); + $commandResponse = $documentService->CommandRequest("version"); + + $this->logger->debug("CommandRequest on check: " . $commandResponse->error . " version: " . $commandResponse->version, array("app" => $this->appName)); + + $version = floatval($commandResponse->version); + if ($version < 4.2) { + throw new \Exception($this->trans->t("Not supported version")); + } } catch (\Exception $e) { $this->logger->error("CommandRequest on check: " . $e->getMessage(), array("app" => $this->appName)); return $e->getMessage(); From 47489c80298883e1a6da5df807d3641c7879f5d6 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 3 Apr 2017 16:08:06 +0300 Subject: [PATCH 11/28] replace ErrorResponse to JSONResponse --- controller/callbackcontroller.php | 46 +++++++++++------------ lib/errorresponse.php | 61 ------------------------------- 2 files changed, 23 insertions(+), 84 deletions(-) delete mode 100644 lib/errorresponse.php diff --git a/controller/callbackcontroller.php b/controller/callbackcontroller.php index 4c3e182f..0c163006 100644 --- a/controller/callbackcontroller.php +++ b/controller/callbackcontroller.php @@ -22,12 +22,13 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice\Controller; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\JSONResponse; use OCP\Files\File; use OCP\Files\IRootFolder; use OCP\IL10N; @@ -40,7 +41,6 @@ use OCA\Onlyoffice\Crypt; use OCA\Onlyoffice\DocumentService; use OCA\Onlyoffice\DownloadResponse; -use OCA\Onlyoffice\ErrorResponse; /** * Callback handler for the document server. @@ -112,15 +112,15 @@ class CallbackController extends Controller { ); /** - * @param string $AppName application name - * @param IRequest $request request object - * @param IRootFolder $root root folder - * @param IUserSession $userSession user session - * @param IUserManager $userManager user manager - * @param IL10N $trans l10n service - * @param ILogger $logger logger - * @param OCA\Onlyoffice\AppConfig $config application configuration - * @param OCA\Onlyoffice\Crypt $crypt hash generator + * @param string $AppName - application name + * @param IRequest $request - request object + * @param IRootFolder $root - root folder + * @param IUserSession $userSession - user session + * @param IUserManager $userManager - user manager + * @param IL10N $trans - l10n service + * @param ILogger $logger - logger + * @param OCA\Onlyoffice\AppConfig $config - application configuration + * @param OCA\Onlyoffice\Crypt $crypt - hash generator */ public function __construct($AppName, IRequest $request, @@ -161,11 +161,11 @@ public function download($doc) { $hashData = $this->crypt->ReadHash($doc); if ($hashData === NULL) { $this->logger->info("Download with empty or not correct hash", array("app" => $this->appName)); - return new ErrorResponse(Http::STATUS_FORBIDDEN, $this->trans->t("Access deny")); + return new JSONResponse(["message" => $this->trans->t("Access deny")], Http::STATUS_FORBIDDEN); } if ($hashData->action !== "download") { $this->logger->info("Download with other action", array("app" => $this->appName)); - return new ErrorResponse(Http::STATUS_BAD_REQUEST, $this->trans->t("Invalid request")); + return new JSONResponse(["message" => $this->trans->t("Invalid request")], Http::STATUS_BAD_REQUEST); } $fileId = $hashData->fileId; @@ -174,22 +174,22 @@ public function download($doc) { $files = $this->root->getUserFolder($ownerId)->getById($fileId); if (empty($files)) { $this->logger->info("Files for download not found: " . $fileId, array("app" => $this->appName)); - return new ErrorResponse(Http::STATUS_NOT_FOUND, $this->trans->t("Files not found")); + return new JSONResponse(["message" => $this->trans->t("Files not found")], Http::STATUS_NOT_FOUND); } $file = $files[0]; if (! $file instanceof File) { $this->logger->info("File for download not found: " . $fileId, array("app" => $this->appName)); - return new ErrorResponse(Http::STATUS_NOT_FOUND, $this->trans->t("File not found")); + return new JSONResponse(["message" => $this->trans->t("File not found")], Http::STATUS_NOT_FOUND); } try { return new DownloadResponse($file); } catch(\OCP\Files\NotPermittedException $e) { $this->logger->info("Download Not permitted: " . $fileId . " " . $e->getMessage(), array("app" => $this->appName)); - return new ErrorResponse(Http::STATUS_FORBIDDEN, $this->trans->t("Not permitted")); + return new JSONResponse(["message" => $this->trans->t("Not permitted")], Http::STATUS_FORBIDDEN); } - return new ErrorResponse(Http::STATUS_INTERNAL_SERVER_ERROR, $this->trans->t("Download failed")); + return new JSONResponse(["message" => $this->trans->t("Download failed")], Http::STATUS_INTERNAL_SERVER_ERROR); } /** @@ -212,11 +212,11 @@ public function track($doc, $users, $key, $status, $url) { $hashData = $this->crypt->ReadHash($doc); if ($hashData === NULL) { $this->logger->info("Track with empty or not correct hash", array("app" => $this->appName)); - return ["message" => $this->trans->t("Access deny")]; + return new JSONResponse(["message" => $this->trans->t("Access deny")], Http::STATUS_FORBIDDEN); } if ($hashData->action !== "track") { $this->logger->info("Track with other action", array("app" => $this->appName)); - return ["message" => $this->trans->t("Invalid request")]; + return new JSONResponse(["message" => $this->trans->t("Invalid request")], Http::STATUS_BAD_REQUEST); } $trackerStatus = $this->_trackerStatus[$status]; @@ -232,13 +232,13 @@ public function track($doc, $users, $key, $status, $url) { $files = $this->root->getUserFolder($ownerId)->getById($fileId); if (empty($files)) { $this->logger->info("Files for track not found: " . $fileId, array("app" => $this->appName)); - return ["message" => $this->trans->t("Files not found")]; + return new JSONResponse(["message" => $this->trans->t("Files not found")], Http::STATUS_NOT_FOUND); } $file = $files[0]; if (! $file instanceof File) { $this->logger->info("File for track not found: " . $fileId, array("app" => $this->appName)); - return ["message" => $this->trans->t("File not found")]; + return new JSONResponse(["message" => $this->trans->t("File not found")], Http::STATUS_NOT_FOUND); } $fileName = $file->getName(); @@ -255,7 +255,7 @@ public function track($doc, $users, $key, $status, $url) { $url = $newFileUri; } catch (\Exception $e) { $this->logger->error("GetConvertedUri in track: " . $url . " " . $e->getMessage(), array("app" => $this->appName)); - return ["message" => $e->getMessage()]; + return new JSONResponse(["message" => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR); } } @@ -273,6 +273,6 @@ public function track($doc, $users, $key, $status, $url) { break; } - return ["error" => $error]; + return new JSONResponse(["error" => $error], ($error === 0 ? Http::STATUS_OK : Http::STATUS_BAD_REQUEST)); } } \ No newline at end of file diff --git a/lib/errorresponse.php b/lib/errorresponse.php deleted file mode 100644 index 512257a2..00000000 --- a/lib/errorresponse.php +++ /dev/null @@ -1,61 +0,0 @@ -setStatus($statusCode); - $this->message = $message; - } - - /** - * Returns the rendered file - * - * @return string the file - */ - public function render() { - return $this->message; - } -} \ No newline at end of file From e5a347fc9cfd5b0bcbac673d7c2e63f3c57c3adb Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 3 Apr 2017 16:13:02 +0300 Subject: [PATCH 12/28] replace DownloadResponse to DataDownloadResponse --- controller/callbackcontroller.php | 6 +-- lib/downloadresponse.php | 64 ------------------------------- 2 files changed, 3 insertions(+), 67 deletions(-) delete mode 100644 lib/downloadresponse.php diff --git a/controller/callbackcontroller.php b/controller/callbackcontroller.php index 0c163006..f69901fa 100644 --- a/controller/callbackcontroller.php +++ b/controller/callbackcontroller.php @@ -28,6 +28,7 @@ use OCP\AppFramework\Controller; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataDownloadResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\Files\File; use OCP\Files\IRootFolder; @@ -40,7 +41,6 @@ use OCA\Onlyoffice\AppConfig; use OCA\Onlyoffice\Crypt; use OCA\Onlyoffice\DocumentService; -use OCA\Onlyoffice\DownloadResponse; /** * Callback handler for the document server. @@ -149,7 +149,7 @@ public function __construct($AppName, * * @param string $doc - verification token with the file identifier * - * @return OCA\Onlyoffice\DownloadResponse + * @return DataDownloadResponse * * @NoAdminRequired * @NoCSRFRequired @@ -184,7 +184,7 @@ public function download($doc) { } try { - return new DownloadResponse($file); + return new DataDownloadResponse($file->getContent(), $file->getName(), $file->getMimeType()); } catch(\OCP\Files\NotPermittedException $e) { $this->logger->info("Download Not permitted: " . $fileId . " " . $e->getMessage(), array("app" => $this->appName)); return new JSONResponse(["message" => $this->trans->t("Not permitted")], Http::STATUS_FORBIDDEN); diff --git a/lib/downloadresponse.php b/lib/downloadresponse.php deleted file mode 100644 index c37bd595..00000000 --- a/lib/downloadresponse.php +++ /dev/null @@ -1,64 +0,0 @@ -setStatus(Http::STATUS_OK); - $this->content = $file->getContent(); - - $this->addHeader("Content-type", $file->getMimeType() . "; charset=utf-8"); - $this->addHeader("Content-Disposition", "attachment; filename*=UTF-8''" . rawurlencode($file->getName()) . "; filename=\"" . rawurlencode($file->getName()) . "\""); - } - - /** - * Returns the rendered file - * - * @return string the file - */ - public function render() { - return $this->content; - } -} From f3e625d2593ff73c9a39c5dfab01ab7ba87ae77b Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 3 Apr 2017 16:58:06 +0300 Subject: [PATCH 13/28] simplify dropping skey --- lib/appconfig.php | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/lib/appconfig.php b/lib/appconfig.php index d58da9e5..0af209e8 100644 --- a/lib/appconfig.php +++ b/lib/appconfig.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice; @@ -72,7 +72,7 @@ class AppConfig { private $_cryptSecret = "skey"; /** - * @param string $AppName application name + * @param string $AppName - application name */ public function __construct($AppName) { @@ -115,7 +115,7 @@ public function GetDocumentServerUrl() { */ public function GetSKey() { $skey = $this->config->getAppValue($this->appName, $this->_cryptSecret, ""); - if (empty($skey)) { + if (empty($skey) || $skey === "") { $skey = number_format(round(microtime(true) * 1000), 0, ".", ""); $this->config->setAppValue($this->appName, $this->_cryptSecret, $skey); } @@ -124,15 +124,9 @@ public function GetSKey() { /** * Regenerate the secret key - * - * @return string */ private function DropSKey() { - $skey = $this->config->getAppValue($this->appName, $this->_cryptSecret, ""); - if (!empty($skey)) { - $skey = number_format(round(microtime(true) * 1000), 0, ".", ""); - $this->config->setAppValue($this->appName, $this->_cryptSecret, $skey); - } + $this->config->setAppValue($this->appName, $this->_cryptSecret, ""); } From d7c0e65ec7aa436f92b5d567ff0ab13ea42e91b7 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 3 Apr 2017 17:23:09 +0300 Subject: [PATCH 14/28] possibility preset Document Server url --- lib/appconfig.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/appconfig.php b/lib/appconfig.php index 0af209e8..a9b42f90 100644 --- a/lib/appconfig.php +++ b/lib/appconfig.php @@ -36,6 +36,14 @@ */ class AppConfig { + /** + * Definition url on server + * + * @var string + */ + private $predefDocumentServerUrl = ""; + + /** * Application name * @@ -105,7 +113,11 @@ public function SetDocumentServerUrl($documentServer) { * @return string */ public function GetDocumentServerUrl() { - return $this->config->getAppValue($this->appName, $this->_documentserver, ""); + $url = $this->config->getAppValue($this->appName, $this->_documentserver, ""); + if (empty($url) || $url === "") { + $url = $this->predefDocumentServerUrl; + } + return $url; } /** From 091c732163d6325e4ad45edebc0039b6c8a253d9 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Mon, 3 Apr 2017 17:25:27 +0300 Subject: [PATCH 15/28] ajax request editor config --- appinfo/routes.php | 3 +- controller/editorcontroller.php | 70 +++++++++++++++++++-------------- js/editor.js | 55 +++++++++++++------------- templates/editor.php | 14 +------ 4 files changed, 71 insertions(+), 71 deletions(-) diff --git a/appinfo/routes.php b/appinfo/routes.php index cfd973a6..e81b5d8f 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -22,13 +22,14 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ return [ "routes" => [ ["name" => "callback#download", "url" => "/download", "verb" => "GET"], ["name" => "callback#track", "url" => "/track", "verb" => "POST"], ["name" => "editor#index", "url" => "/{fileId}", "verb" => "GET"], + ["name" => "editor#config", "url" => "/ajax/config/{fileId}", "verb" => "GET"], ["name" => "editor#create", "url" => "/ajax/new", "verb" => "POST"], ["name" => "editor#convert", "url" => "/ajax/convert", "verb" => "POST"], ["name" => "settings#settings", "url" => "/ajax/settings", "verb" => "PUT"], diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index 0f48326e..a5d418eb 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice\Controller; @@ -105,15 +105,15 @@ class EditorController extends Controller { private $crypt; /** - * @param string $AppName application name - * @param IRequest $request request object - * @param IRootFolder $root root folder - * @param IUserSession $userSession current user session - * @param IURLGenerator $urlGenerator url generator service - * @param IL10N $trans l10n service - * @param ILogger $logger logger - * @param OCA\Onlyoffice\AppConfig $config application configuration - * @param OCA\Onlyoffice\Crypt $crypt hash generator + * @param string $AppName - application name + * @param IRequest $request - request object + * @param IRootFolder $root - root folder + * @param IUserSession $userSession - current user session + * @param IURLGenerator $urlGenerator - url generator service + * @param IL10N $trans - l10n service + * @param ILogger $logger - logger + * @param OCA\Onlyoffice\AppConfig $config - application configuration + * @param OCA\Onlyoffice\Crypt $crypt - hash generator */ public function __construct($AppName, IRequest $request, @@ -252,7 +252,7 @@ public function convert($fileId) { $newFileName = $folder->getNonExistingName($fileNameWithoutExt . "." . $internalExtension); $newFilePath = $newFolderPath . DIRECTORY_SEPARATOR . $newFileName; - + if (($newData = file_get_contents($newFileUri)) === FALSE){ $this->logger->error("Failed download converted file: " . $newFileUri, array("app" => $this->appName)); return ["error" => $this->trans->t("Failed download converted file")]; @@ -286,14 +286,23 @@ public function convert($fileId) { * @NoCSRFRequired */ public function index($fileId) { - $params = $this->getParam($fileId); + $documentServerUrl = $this->config->GetDocumentServerUrl(); + + if (empty($documentServerUrl)) { + $this->logger->error("documentServerUrl is empty", array("app" => $this->appName)); + return ["error" => $this->trans->t("ONLYOFFICE app not configured. Please contact admin")]; + } + + $params = [ + "documentServerUrl" => $documentServerUrl, + "fileId" => $fileId + ]; $response = new TemplateResponse($this->appName, "editor", $params); $csp = new ContentSecurityPolicy(); $csp->allowInlineScript(true); - $documentServerUrl = $params["documentServerUrl"]; if (isset($documentServerUrl) && !empty($documentServerUrl)) { $csp->addAllowedScriptDomain($documentServerUrl); $csp->addAllowedFrameDomain($documentServerUrl); @@ -309,8 +318,10 @@ public function index($fileId) { * @param integer $fileId - file identifier * * @return array + * + * @NoAdminRequired */ - private function getParam($fileId) { + public function config($fileId) { list ($file, $error) = $this->getFile($fileId); if (isset($error)) { @@ -326,13 +337,6 @@ private function getParam($fileId) { return ["error" => $this->trans->t("Format do not supported")]; } - $documentServerUrl = $this->config->GetDocumentServerUrl(); - - if (empty($documentServerUrl)) { - $this->logger->error("documentServerUrl is empty", array("app" => $this->appName)); - return ["error" => $this->trans->t("ONLYOFFICE app not configured. Please contact admin")]; - } - $userId = $this->userSession->getUser()->getUID(); $ownerId = $file->getOwner()->getUID(); try { @@ -347,17 +351,23 @@ private function getParam($fileId) { $key = $this->getKey($file); $canEdit = isset($format["edit"]) && $format["edit"]; + $callback = ($file->isUpdateable() && $canEdit ? $this->urlGenerator->linkToRouteAbsolute($this->appName . ".callback.track", ["doc" => $hashCallback]) : NULL); $params = [ - "documentServerUrl" => $documentServerUrl, - - "callback" => ($file->isUpdateable() && $canEdit ? $this->urlGenerator->linkToRouteAbsolute($this->appName . ".callback.track", ["doc" => $hashCallback]) : NULL), - "fileName" => $fileName, - "key" => DocumentService::GenerateRevisionId($key), - "url" => $fileUrl, - "userId" => $userId, - "userName" => $this->userSession->getUser()->getDisplayName(), - "documentType" => $format["type"] + "document" => [ + "key" => DocumentService::GenerateRevisionId($key), + "title" => $fileName, + "url" => $fileUrl, + ], + "documentType" => $format["type"], + "editorConfig" => [ + "callbackUrl" => $callback, + "mode" => ($callback === NULL ? "view" : "edit"), + "user" => [ + "id" => $userId, + "name" => $this->userSession->getUser()->getDisplayName() + ] + ] ]; return $params; diff --git a/js/editor.js b/js/editor.js index 2a7851d3..949744aa 100644 --- a/js/editor.js +++ b/js/editor.js @@ -32,41 +32,40 @@ }; } - OCA.Onlyoffice.OpenEditor = function (data) { - if (typeof DocsAPI === "undefined" && !data.error.length) { - data.error = t(OCA.Onlyoffice.AppName, "ONLYOFFICE app not configured. Please contact admin"); + OCA.Onlyoffice.OpenEditor = function (fileId, error) { + + var displayError = function (error) { + $("#iframeEditor").text(error).addClass("error"); + }; + + if (error.length) { + displayError(error) + return; } - if (data.error.length) { - $("#iframeEditor").text(data.error).addClass("error"); + if (!fileId.length) { + displayError(t(OCA.Onlyoffice.AppName, "FileId is empty")); return; } - var ext = (data.title || "").toLowerCase().split(".").pop(); + if (typeof DocsAPI === "undefined" && !error.length) { + displayError(t(OCA.Onlyoffice.AppName, "ONLYOFFICE not reached. Please contact admin")); + return; + } - var config = { - "document": { - "fileType": ext, - "key": data.key, - "title": data.title, - "url": data.url - }, - "documentType": data.documentType, - "editorConfig": { - "callbackUrl": (data.callbackUrl ? data.callbackUrl : null), - "lang": "en-US", - "mode": (data.callbackUrl ? "edit" : "view"), - "user": { - "id": data.userId, - "name": data.userName - } - }, - "height": "100%", - "type": "desktop", - "width": "100%" - }; + $.ajax({ + url: OC.generateUrl("apps/onlyoffice/ajax/config/" + fileId), + success: function onSuccess(config) { + if (config) { + if (config.error != null) { + displayError(config.error); + return; + } - var docEditor = new DocsAPI.DocEditor("iframeEditor", config); + var docEditor = new DocsAPI.DocEditor("iframeEditor", config); + } + } + }); }; })(jQuery, OCA); \ No newline at end of file diff --git a/templates/editor.php b/templates/editor.php index 371cf55a..724f745a 100644 --- a/templates/editor.php +++ b/templates/editor.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ style("onlyoffice", "editor"); script("onlyoffice", "editor"); @@ -39,17 +39,7 @@ } ?> From ad6d2f62b3d59d38733219b8921acad659c6f9db Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 4 Apr 2017 12:47:00 +0300 Subject: [PATCH 16/28] editor language as user language --- controller/editorcontroller.php | 1 + 1 file changed, 1 insertion(+) diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index a5d418eb..92be023f 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -362,6 +362,7 @@ public function config($fileId) { "documentType" => $format["type"], "editorConfig" => [ "callbackUrl" => $callback, + "lang" => \OC::$server->getL10NFactory()->get()->getLanguageCode(), "mode" => ($callback === NULL ? "view" : "edit"), "user" => [ "id" => $userId, From 5b6d9c0d033eacbc53382fdaef2deb7f66938d6e Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 4 Apr 2017 14:58:21 +0300 Subject: [PATCH 17/28] Set secret key on admin page --- controller/settingscontroller.php | 9 +++++++-- css/settings.css | 3 +++ js/settings.js | 20 +++++++++++++++----- lib/adminsettings.php | 2 +- lib/appconfig.php | 31 +++++++++++++++++++++++++++++++ templates/settings.php | 9 +++++++-- 6 files changed, 64 insertions(+), 10 deletions(-) diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php index 85d993a6..3496ac87 100644 --- a/controller/settingscontroller.php +++ b/controller/settingscontroller.php @@ -87,7 +87,10 @@ public function __construct($AppName, * @return TemplateResponse */ public function index() { - $data = ["documentserver" => $this->config->GetDocumentServerUrl()]; + $data = [ + "documentserver" => $this->config->GetDocumentServerUrl(), + "secret" => $this->config->GetDocumentServerSecret() + ]; return new TemplateResponse($this->appName, "settings", $data, "blank"); } @@ -95,11 +98,13 @@ public function index() { * Save the document server address * * @param string $documentserver - document service address + * @param string $secret - secret key for signature * * @return array */ - public function settings($documentserver) { + public function settings($documentserver, $secret) { $this->config->SetDocumentServerUrl($documentserver); + $this->config->SetDocumentServerSecret($secret); $error = $this->сheckDocServiceUrl(); diff --git a/css/settings.css b/css/settings.css index 8c455623..4be07de6 100644 --- a/css/settings.css +++ b/css/settings.css @@ -34,3 +34,6 @@ margin: 6px 0 4px; width: 250px; } +.onlyoffice-hide { + display: none; +} diff --git a/js/settings.js b/js/settings.js index 40312b76..69c4174d 100644 --- a/js/settings.js +++ b/js/settings.js @@ -34,15 +34,25 @@ } $("#onlyofficeSave").click(function () { - var docServiceUrlApi = $("#docServiceUrlApi").val().trim(); + var onlyofficeUrl = $("#onlyofficeUrl").val().trim(); + + if (!onlyofficeUrl.length) { + $("#onlyofficeSecret").val(""); + } + var onlyofficeSecret = $("#onlyofficeSecret").val(); $.ajax({ method: "PUT", url: OC.generateUrl("apps/onlyoffice/ajax/settings"), - data: { documentserver: docServiceUrlApi }, + data: { + documentserver: onlyofficeUrl, + secret: onlyofficeSecret + }, success: function onSuccess(response) { if (response && response.documentserver != null) { - $("#docServiceUrlApi").val(response.documentserver); + $("#onlyofficeUrl").val(response.documentserver); + + $("#onlyofficeSecretPanel").toggleClass("onlyoffice-hide", !response.documentserver.length); var message = response.error @@ -57,7 +67,7 @@ }); }); - $("#docServiceUrlApi").keypress(function (e) { + $("#onlyofficeUrl, #onlyofficeSecret").keypress(function (e) { var code = e.keyCode || e.which; if (code === 13) { $("#onlyofficeSave").click(); @@ -65,4 +75,4 @@ }); }); -})(jQuery, OC); \ No newline at end of file +})(jQuery, OC); diff --git a/lib/adminsettings.php b/lib/adminsettings.php index 7497e757..11c0f55a 100644 --- a/lib/adminsettings.php +++ b/lib/adminsettings.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice; diff --git a/lib/appconfig.php b/lib/appconfig.php index a9b42f90..72f811e7 100644 --- a/lib/appconfig.php +++ b/lib/appconfig.php @@ -72,6 +72,13 @@ class AppConfig { */ private $_documentserver = "DocumentServerUrl"; + /** + * The config key for the secret key in jwt + * + * @var string + */ + private $_secret = "DocumentServerSecret"; + /** * The config key for the secret key * @@ -120,6 +127,30 @@ public function GetDocumentServerUrl() { return $url; } + /** + * Save the document service secret key to the application configuration + * + * @param string $secret - secret key + */ + public function SetDocumentServerSecret($secret) { + if (empty($secret)) { + $this->logger->info("Clear secret key", array("app" => $this->appName)); + } else { + $this->logger->info("Set secret key", array("app" => $this->appName)); + } + + $this->config->setAppValue($this->appName, $this->_secret, $secret); + } + + /** + * Get the document service secret key from the application configuration + * + * @return string + */ + public function GetDocumentServerSecret() { + return $this->config->getAppValue($this->appName, $this->_secret, ""); + } + /** * Get the secret key from the application configuration * diff --git a/templates/settings.php b/templates/settings.php index b721ba48..c34368c0 100644 --- a/templates/settings.php +++ b/templates/settings.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ style("onlyoffice", "settings"); script("onlyoffice", "settings"); @@ -34,7 +34,12 @@

t("ONLYOFFICE Document Service Location specifies the address of the server with the document services installed. Please change the '' for the server address in the below line.")) ?>

t("Document Editing Service Address")) ?>

- " placeholder="https://" type="text"> + " placeholder="https://" type="text"> + +
"> +

t("Secret key (leave blank to disable)")) ?>

+ " placeholder="secret" type="text"> +

t("Save")) ?> From 49a9478a387f9039d9bbeed9983a40d456036c9a Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 4 Apr 2017 15:19:34 +0300 Subject: [PATCH 18/28] jwt for config --- 3rdparty/jwt/BeforeValidException.php | 7 + 3rdparty/jwt/ExpiredException.php | 7 + 3rdparty/jwt/JWT.php | 370 +++++++++++++++++++++ 3rdparty/jwt/LICENSE | 30 ++ 3rdparty/jwt/SignatureInvalidException.php | 7 + appinfo/application.php | 2 + controller/editorcontroller.php | 5 + 7 files changed, 428 insertions(+) create mode 100644 3rdparty/jwt/BeforeValidException.php create mode 100644 3rdparty/jwt/ExpiredException.php create mode 100644 3rdparty/jwt/JWT.php create mode 100644 3rdparty/jwt/LICENSE create mode 100644 3rdparty/jwt/SignatureInvalidException.php diff --git a/3rdparty/jwt/BeforeValidException.php b/3rdparty/jwt/BeforeValidException.php new file mode 100644 index 00000000..a6ee2f7c --- /dev/null +++ b/3rdparty/jwt/BeforeValidException.php @@ -0,0 +1,7 @@ + + * @author Anant Narayanan + * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD + * @link https://github.com/firebase/php-jwt + */ +class JWT +{ + + /** + * When checking nbf, iat or expiration times, + * we want to provide some extra leeway time to + * account for clock skew. + */ + public static $leeway = 0; + + /** + * Allow the current timestamp to be specified. + * Useful for fixing a value within unit testing. + * + * Will default to PHP time() value if null. + */ + public static $timestamp = null; + + public static $supported_algs = array( + 'HS256' => array('hash_hmac', 'SHA256'), + 'HS512' => array('hash_hmac', 'SHA512'), + 'HS384' => array('hash_hmac', 'SHA384'), + 'RS256' => array('openssl', 'SHA256'), + ); + + /** + * Decodes a JWT string into a PHP object. + * + * @param string $jwt The JWT + * @param string|array $key The key, or map of keys. + * If the algorithm used is asymmetric, this is the public key + * @param array $allowed_algs List of supported verification algorithms + * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' + * + * @return object The JWT's payload as a PHP object + * + * @throws UnexpectedValueException Provided JWT was invalid + * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed + * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' + * @throws BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat' + * @throws ExpiredException Provided JWT has since expired, as defined by the 'exp' claim + * + * @uses jsonDecode + * @uses urlsafeB64Decode + */ + public static function decode($jwt, $key, $allowed_algs = array()) + { + $timestamp = is_null(static::$timestamp) ? time() : static::$timestamp; + + if (empty($key)) { + throw new InvalidArgumentException('Key may not be empty'); + } + if (!is_array($allowed_algs)) { + throw new InvalidArgumentException('Algorithm not allowed'); + } + $tks = explode('.', $jwt); + if (count($tks) != 3) { + throw new UnexpectedValueException('Wrong number of segments'); + } + list($headb64, $bodyb64, $cryptob64) = $tks; + if (null === ($header = static::jsonDecode(static::urlsafeB64Decode($headb64)))) { + throw new UnexpectedValueException('Invalid header encoding'); + } + if (null === $payload = static::jsonDecode(static::urlsafeB64Decode($bodyb64))) { + throw new UnexpectedValueException('Invalid claims encoding'); + } + $sig = static::urlsafeB64Decode($cryptob64); + + if (empty($header->alg)) { + throw new UnexpectedValueException('Empty algorithm'); + } + if (empty(static::$supported_algs[$header->alg])) { + throw new UnexpectedValueException('Algorithm not supported'); + } + if (!in_array($header->alg, $allowed_algs)) { + throw new UnexpectedValueException('Algorithm not allowed'); + } + if (is_array($key) || $key instanceof \ArrayAccess) { + if (isset($header->kid)) { + $key = $key[$header->kid]; + } else { + throw new UnexpectedValueException('"kid" empty, unable to lookup correct key'); + } + } + + // Check the signature + if (!static::verify("$headb64.$bodyb64", $sig, $key, $header->alg)) { + throw new SignatureInvalidException('Signature verification failed'); + } + + // Check if the nbf if it is defined. This is the time that the + // token can actually be used. If it's not yet that time, abort. + if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) { + throw new BeforeValidException( + 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->nbf) + ); + } + + // Check that this token has been created before 'now'. This prevents + // using tokens that have been created for later use (and haven't + // correctly used the nbf claim). + if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) { + throw new BeforeValidException( + 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->iat) + ); + } + + // Check if this token has expired. + if (isset($payload->exp) && ($timestamp - static::$leeway) >= $payload->exp) { + throw new ExpiredException('Expired token'); + } + + return $payload; + } + + /** + * Converts and signs a PHP object or array into a JWT string. + * + * @param object|array $payload PHP object or array + * @param string $key The secret key. + * If the algorithm used is asymmetric, this is the private key + * @param string $alg The signing algorithm. + * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' + * @param mixed $keyId + * @param array $head An array with header elements to attach + * + * @return string A signed JWT + * + * @uses jsonEncode + * @uses urlsafeB64Encode + */ + public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null) + { + $header = array('typ' => 'JWT', 'alg' => $alg); + if ($keyId !== null) { + $header['kid'] = $keyId; + } + if ( isset($head) && is_array($head) ) { + $header = array_merge($head, $header); + } + $segments = array(); + $segments[] = static::urlsafeB64Encode(static::jsonEncode($header)); + $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload)); + $signing_input = implode('.', $segments); + + $signature = static::sign($signing_input, $key, $alg); + $segments[] = static::urlsafeB64Encode($signature); + + return implode('.', $segments); + } + + /** + * Sign a string with a given key and algorithm. + * + * @param string $msg The message to sign + * @param string|resource $key The secret key + * @param string $alg The signing algorithm. + * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' + * + * @return string An encrypted message + * + * @throws DomainException Unsupported algorithm was specified + */ + public static function sign($msg, $key, $alg = 'HS256') + { + if (empty(static::$supported_algs[$alg])) { + throw new DomainException('Algorithm not supported'); + } + list($function, $algorithm) = static::$supported_algs[$alg]; + switch($function) { + case 'hash_hmac': + return hash_hmac($algorithm, $msg, $key, true); + case 'openssl': + $signature = ''; + $success = openssl_sign($msg, $signature, $key, $algorithm); + if (!$success) { + throw new DomainException("OpenSSL unable to sign data"); + } else { + return $signature; + } + } + } + + /** + * Verify a signature with the message, key and method. Not all methods + * are symmetric, so we must have a separate verify and sign method. + * + * @param string $msg The original message (header and body) + * @param string $signature The original signature + * @param string|resource $key For HS*, a string key works. for RS*, must be a resource of an openssl public key + * @param string $alg The algorithm + * + * @return bool + * + * @throws DomainException Invalid Algorithm or OpenSSL failure + */ + private static function verify($msg, $signature, $key, $alg) + { + if (empty(static::$supported_algs[$alg])) { + throw new DomainException('Algorithm not supported'); + } + + list($function, $algorithm) = static::$supported_algs[$alg]; + switch($function) { + case 'openssl': + $success = openssl_verify($msg, $signature, $key, $algorithm); + if (!$success) { + throw new DomainException("OpenSSL unable to verify data: " . openssl_error_string()); + } else { + return $signature; + } + case 'hash_hmac': + default: + $hash = hash_hmac($algorithm, $msg, $key, true); + if (function_exists('hash_equals')) { + return hash_equals($signature, $hash); + } + $len = min(static::safeStrlen($signature), static::safeStrlen($hash)); + + $status = 0; + for ($i = 0; $i < $len; $i++) { + $status |= (ord($signature[$i]) ^ ord($hash[$i])); + } + $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash)); + + return ($status === 0); + } + } + + /** + * Decode a JSON string into a PHP object. + * + * @param string $input JSON string + * + * @return object Object representation of JSON string + * + * @throws DomainException Provided string was invalid JSON + */ + public static function jsonDecode($input) + { + if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) { + /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you + * to specify that large ints (like Steam Transaction IDs) should be treated as + * strings, rather than the PHP default behaviour of converting them to floats. + */ + $obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING); + } else { + /** Not all servers will support that, however, so for older versions we must + * manually detect large ints in the JSON string and quote them (thus converting + *them to strings) before decoding, hence the preg_replace() call. + */ + $max_int_length = strlen((string) PHP_INT_MAX) - 1; + $json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input); + $obj = json_decode($json_without_bigints); + } + + if (function_exists('json_last_error') && $errno = json_last_error()) { + static::handleJsonError($errno); + } elseif ($obj === null && $input !== 'null') { + throw new DomainException('Null result with non-null input'); + } + return $obj; + } + + /** + * Encode a PHP object into a JSON string. + * + * @param object|array $input A PHP object or array + * + * @return string JSON representation of the PHP object or array + * + * @throws DomainException Provided object could not be encoded to valid JSON + */ + public static function jsonEncode($input) + { + $json = json_encode($input); + if (function_exists('json_last_error') && $errno = json_last_error()) { + static::handleJsonError($errno); + } elseif ($json === 'null' && $input !== null) { + throw new DomainException('Null result with non-null input'); + } + return $json; + } + + /** + * Decode a string with URL-safe Base64. + * + * @param string $input A Base64 encoded string + * + * @return string A decoded string + */ + public static function urlsafeB64Decode($input) + { + $remainder = strlen($input) % 4; + if ($remainder) { + $padlen = 4 - $remainder; + $input .= str_repeat('=', $padlen); + } + return base64_decode(strtr($input, '-_', '+/')); + } + + /** + * Encode a string with URL-safe Base64. + * + * @param string $input The string you want encoded + * + * @return string The base64 encode of what you passed in + */ + public static function urlsafeB64Encode($input) + { + return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); + } + + /** + * Helper method to create a JSON error. + * + * @param int $errno An error number from json_last_error() + * + * @return void + */ + private static function handleJsonError($errno) + { + $messages = array( + JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', + JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', + JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON' + ); + throw new DomainException( + isset($messages[$errno]) + ? $messages[$errno] + : 'Unknown JSON error: ' . $errno + ); + } + + /** + * Get the number of bytes in cryptographic strings. + * + * @param string + * + * @return int + */ + private static function safeStrlen($str) + { + if (function_exists('mb_strlen')) { + return mb_strlen($str, '8bit'); + } + return strlen($str); + } +} diff --git a/3rdparty/jwt/LICENSE b/3rdparty/jwt/LICENSE new file mode 100644 index 00000000..cb0c49b3 --- /dev/null +++ b/3rdparty/jwt/LICENSE @@ -0,0 +1,30 @@ +Copyright (c) 2011, Neuman Vong + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Neuman Vong nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/3rdparty/jwt/SignatureInvalidException.php b/3rdparty/jwt/SignatureInvalidException.php new file mode 100644 index 00000000..27332b21 --- /dev/null +++ b/3rdparty/jwt/SignatureInvalidException.php @@ -0,0 +1,7 @@ +getContainer(); diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index 92be023f..c561cb3c 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -371,6 +371,11 @@ public function config($fileId) { ] ]; + if (!empty($this->config->GetDocumentServerSecret())) { + $token = \Firebase\JWT\JWT::encode($params, $this->config->GetDocumentServerSecret()); + $params->token = $token; + } + return $params; } From 7f08626dfb7bc0fc96888332aca06e312ab4ed03 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 4 Apr 2017 16:21:05 +0300 Subject: [PATCH 19/28] parsing error on command request --- controller/settingscontroller.php | 8 ++--- lib/documentservice.php | 54 ++++++++++++++++++++++++++----- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php index 3496ac87..7caf8146 100644 --- a/controller/settingscontroller.php +++ b/controller/settingscontroller.php @@ -106,7 +106,7 @@ public function settings($documentserver, $secret) { $this->config->SetDocumentServerUrl($documentserver); $this->config->SetDocumentServerSecret($secret); - $error = $this->сheckDocServiceUrl(); + $error = $this->checkDocServiceUrl(); return [ "documentserver" => $this->config->GetDocumentServerUrl(), @@ -133,21 +133,21 @@ public function formats(){ * * @return string */ - private function сheckDocServiceUrl() { + private function checkDocServiceUrl() { $documentService = new DocumentService($this->trans, $this->config); try { $commandResponse = $documentService->CommandRequest("version"); - $this->logger->debug("CommandRequest on check: " . $commandResponse->error . " version: " . $commandResponse->version, array("app" => $this->appName)); + $this->logger->debug("CommandRequest on check: " . json_encode($commandResponse), array("app" => $this->appName)); $version = floatval($commandResponse->version); if ($version < 4.2) { throw new \Exception($this->trans->t("Not supported version")); } } catch (\Exception $e) { - $this->logger->error("CommandRequest on check: " . $e->getMessage(), array("app" => $this->appName)); + $this->logger->error("CommandRequest on check error: " . $e->getMessage(), array("app" => $this->appName)); return $e->getMessage(); } diff --git a/lib/documentservice.php b/lib/documentservice.php index 4a177278..35d482ff 100644 --- a/lib/documentservice.php +++ b/lib/documentservice.php @@ -201,7 +201,7 @@ function SendRequestToConvertService($document_uri, $from_extension, $to_extensi } /** - * Generate an error code table + * Generate an error code table of convertion * * @param string $errorCode - Error code * @@ -212,29 +212,32 @@ function ProcessConvServResponceError($errorCode) { $errorMessage = ""; switch ($errorCode) { + case -20: + $errorMessage = $errorMessageTemplate . "Error encrypt signature"; + break; case -8: - $errorMessage = $errorMessageTemplate . "Error document VKey"; + $errorMessage = $errorMessageTemplate . "Invalid token"; break; case -7: $errorMessage = $errorMessageTemplate . "Error document request"; break; case -6: - $errorMessage = $errorMessageTemplate . "Error database"; + $errorMessage = $errorMessageTemplate . "Error while accessing the conversion result database"; break; case -5: $errorMessage = $errorMessageTemplate . "Error unexpected guid"; break; case -4: - $errorMessage = $errorMessageTemplate . "Error download error"; + $errorMessage = $errorMessageTemplate . "Error while downloading the document file to be converted."; break; case -3: - $errorMessage = $errorMessageTemplate . "Error convertation error"; + $errorMessage = $errorMessageTemplate . "Conversion error"; break; case -2: - $errorMessage = $errorMessageTemplate . "Error convertation timeout"; + $errorMessage = $errorMessageTemplate . "Timeout conversion error"; break; case -1: - $errorMessage = $errorMessageTemplate . "Error convertation unknown"; + $errorMessage = $errorMessageTemplate . "Unknown error"; break; case 0: break; @@ -287,6 +290,41 @@ function CommandRequest($method) { throw new \Exception ($this->trans->t("Bad Request or timeout error")); } - return json_decode($response); + $data = json_decode($response); + + $this->ProcessCommandServResponceError($data->error); + + return $data; + } + + /** + * Generate an error code table of command + * + * @param string $errorCode - Error code + * + * @return null + */ + function ProcessCommandServResponceError($errorCode) { + $errorMessageTemplate = $this->trans->t("Error occurred in the document service: "); + $errorMessage = ""; + + switch ($errorCode) { + case 6: + $errorMessage = $errorMessageTemplate . "Invalid token"; + break; + case 5: + $errorMessage = $errorMessageTemplate . "Command not correсt"; + break; + case 3: + $errorMessage = $errorMessageTemplate . "Internal server error"; + break; + case 0: + return; + default: + $errorMessage = $errorMessageTemplate . "ErrorCode = " . $errorCode; + break; + } + + throw new \Exception($errorMessage); } } From e793724b3db20ce669f06e717421c3e5c0015789 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 4 Apr 2017 16:33:11 +0300 Subject: [PATCH 20/28] jwt for request to document server --- appinfo/app.php | 2 +- appinfo/application.php | 4 ++-- lib/documentservice.php | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/appinfo/app.php b/appinfo/app.php index 469955d7..68ebda69 100644 --- a/appinfo/app.php +++ b/appinfo/app.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice\AppInfo; diff --git a/appinfo/application.php b/appinfo/application.php index c8faedca..23e2fd01 100644 --- a/appinfo/application.php +++ b/appinfo/application.php @@ -71,10 +71,10 @@ public function __construct(array $urlParams = []) { Util::addStyle($appName, "main"); } } - - require_once __DIR__ . "/../3rdparty/jwt/JWT.php"; } + require_once __DIR__ . "/../3rdparty/jwt/JWT.php"; + $container = $this->getContainer(); $container->registerService("L10N", function($c) { diff --git a/lib/documentservice.php b/lib/documentservice.php index 35d482ff..a0c01404 100644 --- a/lib/documentservice.php +++ b/lib/documentservice.php @@ -168,6 +168,14 @@ function SendRequestToConvertService($document_uri, $from_extension, $to_extensi ) ); + if (!empty($this->config->GetDocumentServerSecret())) { + $params = [ + "payload" => $data + ]; + $token = \Firebase\JWT\JWT::encode($params, $this->config->GetDocumentServerSecret()); + $opts["http"]["header"] = $opts["http"]["header"] . "Authorization: Bearer " . $token . "\r\n"; + } + if (substr($urlToConverter, 0, strlen("https")) === "https") { $opts["ssl"] = array( "verify_peer" => FALSE ); } @@ -280,6 +288,14 @@ function CommandRequest($method) { ) ); + if (!empty($this->config->GetDocumentServerSecret())) { + $params = [ + "payload" => $data + ]; + $token = \Firebase\JWT\JWT::encode($params, $this->config->GetDocumentServerSecret()); + $opts["http"]["header"] = $opts["http"]["header"] . "Authorization: Bearer " . $token . "\r\n"; + } + if (substr($urlCommand, 0, strlen("https")) === "https") { $opts["ssl"] = array( "verify_peer" => FALSE ); } From e64d1fb0eb07bd2bfeaa29d9323134e29858afe6 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Tue, 4 Apr 2017 17:32:16 +0300 Subject: [PATCH 21/28] possibility preset secret --- lib/appconfig.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/appconfig.php b/lib/appconfig.php index 72f811e7..508de9b0 100644 --- a/lib/appconfig.php +++ b/lib/appconfig.php @@ -43,6 +43,13 @@ class AppConfig { */ private $predefDocumentServerUrl = ""; + /** + * Definition url on server + * + * @var string + */ + private $predefDocumentServerSecret = ""; + /** * Application name @@ -148,7 +155,11 @@ public function SetDocumentServerSecret($secret) { * @return string */ public function GetDocumentServerSecret() { - return $this->config->getAppValue($this->appName, $this->_secret, ""); + $secret = $this->config->getAppValue($this->appName, $this->_secret, ""); + if (empty($secret) || $secret == "") { + $secret = $this->predefDocumentServerSecret; + } + return $secret; } /** From 56a03d56aeedb922f6f8cf9bbc2a788b2111c8e2 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Wed, 5 Apr 2017 16:35:54 +0300 Subject: [PATCH 22/28] checking document server if address is not empty --- controller/settingscontroller.php | 5 ++++- lib/appconfig.php | 6 +++--- lib/crypt.php | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php index 7caf8146..33290b84 100644 --- a/controller/settingscontroller.php +++ b/controller/settingscontroller.php @@ -106,7 +106,10 @@ public function settings($documentserver, $secret) { $this->config->SetDocumentServerUrl($documentserver); $this->config->SetDocumentServerSecret($secret); - $error = $this->checkDocServiceUrl(); + $documentserver = $this->config->GetDocumentServerUrl(); + if (!empty($documentserver)) { + $error = $this->checkDocServiceUrl(); + } return [ "documentserver" => $this->config->GetDocumentServerUrl(), diff --git a/lib/appconfig.php b/lib/appconfig.php index 508de9b0..3cf78be9 100644 --- a/lib/appconfig.php +++ b/lib/appconfig.php @@ -128,7 +128,7 @@ public function SetDocumentServerUrl($documentServer) { */ public function GetDocumentServerUrl() { $url = $this->config->getAppValue($this->appName, $this->_documentserver, ""); - if (empty($url) || $url === "") { + if (empty($url)) { $url = $this->predefDocumentServerUrl; } return $url; @@ -156,7 +156,7 @@ public function SetDocumentServerSecret($secret) { */ public function GetDocumentServerSecret() { $secret = $this->config->getAppValue($this->appName, $this->_secret, ""); - if (empty($secret) || $secret == "") { + if (empty($secret)) { $secret = $this->predefDocumentServerSecret; } return $secret; @@ -169,7 +169,7 @@ public function GetDocumentServerSecret() { */ public function GetSKey() { $skey = $this->config->getAppValue($this->appName, $this->_cryptSecret, ""); - if (empty($skey) || $skey === "") { + if (empty($skey)) { $skey = number_format(round(microtime(true) * 1000), 0, ".", ""); $this->config->setAppValue($this->appName, $this->_cryptSecret, $skey); } diff --git a/lib/crypt.php b/lib/crypt.php index 28c888b1..14222d28 100644 --- a/lib/crypt.php +++ b/lib/crypt.php @@ -22,7 +22,7 @@ * in every copy of the program you distribute. * Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks. * -*/ + */ namespace OCA\Onlyoffice; @@ -43,7 +43,7 @@ class Crypt { private $skey; /** - * @param OCA\Onlyoffice\AppConfig $config application configutarion + * @param OCA\Onlyoffice\AppConfig $config - application configutarion */ public function __construct(AppConfig $appConfig) { $this->skey = $appConfig->GetSKey(); From 100654440837ee1d2fd815f2411941e8ab91e81a Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Wed, 5 Apr 2017 17:45:07 +0300 Subject: [PATCH 23/28] l10n argument --- controller/editorcontroller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index c561cb3c..08ed6386 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -362,7 +362,7 @@ public function config($fileId) { "documentType" => $format["type"], "editorConfig" => [ "callbackUrl" => $callback, - "lang" => \OC::$server->getL10NFactory()->get()->getLanguageCode(), + "lang" => \OC::$server->getL10NFactory("")->get("")->getLanguageCode(), "mode" => ($callback === NULL ? "view" : "edit"), "user" => [ "id" => $userId, From ebfdf520daa222d61493d76a6f8b04ffe2ddc003 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Wed, 5 Apr 2017 18:03:27 +0300 Subject: [PATCH 24/28] fix adding token value --- controller/editorcontroller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index 08ed6386..9ae01bec 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -373,7 +373,7 @@ public function config($fileId) { if (!empty($this->config->GetDocumentServerSecret())) { $token = \Firebase\JWT\JWT::encode($params, $this->config->GetDocumentServerSecret()); - $params->token = $token; + $params["token"] = $token; } return $params; From 7957dc8360be0044655dae260a681556a49e18ec Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Wed, 5 Apr 2017 19:21:27 +0300 Subject: [PATCH 25/28] upd screenshots --- screenshots/icon.png | Bin 990 -> 587 bytes screenshots/main.png | Bin 68010 -> 68411 bytes screenshots/new.png | Bin 18956 -> 17772 bytes screenshots/settings.png | Bin 26685 -> 14761 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/screenshots/icon.png b/screenshots/icon.png index 8a648f25f05f90a0921468f0abd051f5bb6db839..03bc00a892f5316d1b3f26e295f5278aaca39918 100644 GIT binary patch delta 563 zcmV-30?hs12g?MIBYy%CNklmuNSP8;K9O+Ar4SZUC5up%+S@BGN3f6@vxro_qJPy_4IHG-9E@u2gLT&o z9ONN$Fv@JaE{~G>Zp+OW9`cZR#47E#?Y9CLI7pp27z8R;|LwkQ;2<^TU{opfUHzQy zw(o8T3#pPtn0~X^paBdV1Qub>L-$e(A!S;Kbl{YQz`-EM95{xDHm7zCZMi^X`w&jCmo9DYZTv5UXMLCSDIrS)6= zyn%z1$u^NPIT)4MF#B2r3#k)}NEK`R*0)1gNR3#8s+7)u@S?#&MALSCsF6S_lt8E7 z!a^98s|%mM9KgUq+Hf%Q_y4Goz(b1gNT3US6M;&*^ncA8F+8LIhu`;1{J3HH(M~Zu zB!fqsK9fER2PwcKR+oQ%Q_A2GADs4G!-i9R4dNyyy_VjChm=ZP{qtP|2PuO`g1AWn z4=IC#QO#ZN@ScH#)R}`(`MTNdqX-sKV-}GrwOc*D3Sl8tvIteB-Rbv}Mgl2Q0TBrNcdJUj+Lt9sQqx^sXS4${OSMxdUw9st*Bu()h4iKPGl002ovPDHLkV1lhl B2Pgml delta 969 zcmV;)12+821l|XbBYyxHbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU# zfJsC_RCwC#mupCqQ5eT}wpX2PR@eorb+HdYnL%F2EDS*+=w4V+hKiR$#q0vor-F(I zDZ3e_NSX#+tsp8)kgi&07t*3{rStN^)RJkmmHnUfY^}L>ZhtP@mk#`R+54XNyw5q$ z|Nopb5q!H@;mxL0c)1NHfB=vUo&f_>2Qq=i-ND4HyDhHv4F*{t1&opD(*ue@0r==r z0HIa-q58z|jMo5_i@}<}b#MYacGgi+D}|%`zF;HR0m6roCJDqd&p|%80*r%JAf~3> z_V)y^9b|x@zkjT^Hcm|u=(Gl~>_G=zLqQJM4Adhm{C-fu>1mQQl9GOG`G?N)2WcP` zlu8ywV4hKaar8$l7C0cV3c!aHs4 zVihDFP*pqdMfc(euA6vO!aV#i+3+~HJX#+%$cB=nG=GbJF~|dRKw)58G%55v(XXqE z;XqcqQHZ{SN>aMNKFU&vrYMwZs-(%_9ykhKiBr`Pl#c|v0lrbh9C-uXFzRaDD#bqf zSW796WQ$W#^0Dh*Ci$wgv>^>p3hXLj0`rIh@oisu1J~WADYy3XEa=%>ez%cVtW;`U zVKApwrGJg*4@b)cOYi*58yN?;h8#WV?jFajMHTL^sx&l&F@5K z`frU@C5Mc+alvGn0eWfac*ae1om)R9i^sR zbmuOw;9XG23|hy5P(Y@aiE&!aHI?motmZeYiSqen)#L&l$mL+wPFzqXdiI$oKbwmU z34dvn%nL2-f+8m_m;v^JB(}1nW?&K1UhrOgKAdd(a2#)ynLG<;161(L1=~1{ZR{iS zUNdW}m{avjguVG$jylsI>sfpYJaj=VyP%TA`R86B{2Z=0iSQyrHrWZ**==6VnvvZ^ z+NpPX9uU4mp1|t(fI5{^LrWbf)3?*+SVG?F(y`o7deGe^)v#EJ5We>sTwq=FxqEze rw~+`78IPM77#R5f=hUn1rvL*0(i-P-QiV+)00000NkvXXu0mjf1(DDE diff --git a/screenshots/main.png b/screenshots/main.png index 1f2cb78aaa236fddf5a465a14b4949ce28f0bdf9..43e5017ed812dab6650a415c58440c0480db345c 100644 GIT binary patch literal 68411 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 literal 68010 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%0D5p9AhaDh0_ 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 diff --git a/screenshots/new.png b/screenshots/new.png index d318827014e5a8932685c26dddd5a4ee4c470a30..e25c93942083c3fcf7cae23d3cac18a95a6ee74c 100644 GIT binary patch literal 17772 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 Q0sQ3CZJ@K_HN3wC0^##sN0#)5NMv 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 diff --git a/screenshots/settings.png b/screenshots/settings.png index b054fd099e52c7b1603fe4e8f7dc9bffe0f80508..dd760ddb0871861c1db761e72cf0ddffd301b11a 100644 GIT binary patch literal 14761 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 Nh7Zi{SKo7u{a;k1MhgG{ literal 26685 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 PIy$|p&?_Zccc1(h?p_sw From 745c1edd243dbbb753a1fcf3ad7d3bb69a6afdea Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Thu, 6 Apr 2017 11:04:52 +0300 Subject: [PATCH 26/28] changelog 1.0.2 --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0cc51d6..cd434206 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,18 @@ +# Change Log + +## 1.0.2 +### Added +- logging +- checking Document Server address on save +- checking version of onlyoffice +- set language of editor + +# Changed +- replace own Response class to OCP\AppFramework\Http class from core + +### Security +- jwt signature for request to Document Server + ## 1.0.1 - fix exception when versions app is disabled - adding protocol to document server url From f0d9b34cd8062099e63d231d5587ce350977e3b9 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Thu, 6 Apr 2017 14:38:02 +0300 Subject: [PATCH 27/28] setting fileType --- controller/editorcontroller.php | 1 + 1 file changed, 1 insertion(+) diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php index 9ae01bec..92537445 100644 --- a/controller/editorcontroller.php +++ b/controller/editorcontroller.php @@ -355,6 +355,7 @@ public function config($fileId) { $params = [ "document" => [ + "fileType" => pathinfo($fileName, PATHINFO_EXTENSION), "key" => DocumentService::GenerateRevisionId($key), "title" => $fileName, "url" => $fileUrl, From 25de35b9565db11ae7a8bdada61797b9edbf4357 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Thu, 6 Apr 2017 15:24:07 +0300 Subject: [PATCH 28/28] fix changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd434206..9db56e13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ - checking version of onlyoffice - set language of editor -# Changed +### Changed - replace own Response class to OCP\AppFramework\Http class from core ### Security