From a2fd96061741906ce957be23f63d675320b9883b Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Fri, 27 Jan 2017 12:16:00 +0300 Subject: [PATCH] Initial release v1.0.0 --- AUTHORS.md | 4 + CHANGELOG.md | 2 + README.md | 77 ++++++ appinfo/app.php | 36 +++ appinfo/application.php | 125 +++++++++ appinfo/info.xml | 28 ++ appinfo/routes.php | 37 +++ assets/new.docx | Bin 0 -> 8463 bytes assets/new.pptx | Bin 0 -> 35742 bytes assets/new.xlsx | Bin 0 -> 6427 bytes controller/callbackcontroller.php | 256 ++++++++++++++++++ controller/editorcontroller.php | 419 ++++++++++++++++++++++++++++++ controller/settingscontroller.php | 93 +++++++ css/editor.css | 32 +++ css/main.css | 34 +++ css/settings.css | 36 +++ img/app.svg | 18 ++ img/btn-edit.svg | 17 ++ img/new-docx.svg | 23 ++ img/new-pptx.svg | 23 ++ img/new-xlsx.svg | 23 ++ js/editor.js | 72 +++++ js/main.js | 194 ++++++++++++++ js/settings.js | 63 +++++ lib/appconfig.php | 151 +++++++++++ lib/crypt.php | 104 ++++++++ lib/documentservice.php | 247 ++++++++++++++++++ lib/downloadresponse.php | 64 +++++ lib/errorresponse.php | 61 +++++ screenshots/icon.png | Bin 0 -> 990 bytes screenshots/main.png | Bin 0 -> 68010 bytes screenshots/main_small.png | Bin 0 -> 18805 bytes screenshots/new.png | Bin 0 -> 18956 bytes screenshots/open.png | Bin 0 -> 20035 bytes screenshots/settings.png | Bin 0 -> 26685 bytes settings.php | 39 +++ templates/editor.php | 56 ++++ templates/settings.php | 41 +++ 38 files changed, 2375 insertions(+) create mode 100644 AUTHORS.md create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 appinfo/app.php create mode 100644 appinfo/application.php create mode 100644 appinfo/info.xml create mode 100644 appinfo/routes.php create mode 100644 assets/new.docx create mode 100644 assets/new.pptx create mode 100644 assets/new.xlsx create mode 100644 controller/callbackcontroller.php create mode 100644 controller/editorcontroller.php create mode 100644 controller/settingscontroller.php create mode 100644 css/editor.css create mode 100644 css/main.css create mode 100644 css/settings.css create mode 100644 img/app.svg create mode 100644 img/btn-edit.svg create mode 100644 img/new-docx.svg create mode 100644 img/new-pptx.svg create mode 100644 img/new-xlsx.svg create mode 100644 js/editor.js create mode 100644 js/main.js create mode 100644 js/settings.js create mode 100644 lib/appconfig.php create mode 100644 lib/crypt.php create mode 100644 lib/documentservice.php create mode 100644 lib/downloadresponse.php create mode 100644 lib/errorresponse.php create mode 100644 screenshots/icon.png create mode 100644 screenshots/main.png create mode 100644 screenshots/main_small.png create mode 100644 screenshots/new.png create mode 100644 screenshots/open.png create mode 100644 screenshots/settings.png create mode 100644 settings.php create mode 100644 templates/editor.php create mode 100644 templates/settings.php diff --git a/AUTHORS.md b/AUTHORS.md new file mode 100644 index 0000000..686d12b --- /dev/null +++ b/AUTHORS.md @@ -0,0 +1,4 @@ +# Authors + +* Ascensio System SIA: + diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..973cf37 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +owncloud-onlyoffice (1.0.0) +* Initial release \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..09c45b0 --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +# ![](screenshots/icon.png) OwnCloud ONLYOFFICE integration app + +This app enables users to edit office documents from [ownCloud](https://owncloud.com) using ONLYOFFICE Document Server. Currently the following document formats can be edited with this app: DOCX, XLSX, PPTX, TXT. The above mentioned formats are also available for viewing together with PDF and CSV. The edited files of the corresponding type can be converted into the Office Open XML formats: ODT, ODS, ODP, DOC, XLS, PPT, PPS, EPUB, RTF, HTML, HTM. + +The app will create an item in the `new` (+) menu to create **Document**, **Spreadsheet**, **Presentation**. It will also create a new **Open in ONLYOFFICE** menu option within the document library for Office documents. This allows multiple users to collaborate in real time and to save back those changes to ownCloud. + + + +## Installing ONLYOFFICE Document Server + +You will need an instance of ONLYOFFICE Document Server that is resolvable and connectable both from ownCloud 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. + +The easiest way to start an instance of ONLYOFFICE Document Server is to use [Docker](https://github.com/ONLYOFFICE/Docker-DocumentServer). + + + +## Installing ownCloud ONLYOFFICE integration app + +To start using ONLYOFFICE Document Server with ownCloud, the following steps must be performed: + +1. Place ownCloud ONLYOFFICE integration app to your ownCloud server into the _/apps_ (or some other) directory, [used](https://doc.owncloud.org/server/9.0/admin_manual/installation/apps_management_installation.html#using-custom-app-directories) to connect applications: +``` +cd apps/ +git clone https://github.com/ONLYOFFICE/onlyoffice-owncloud.git onlyoffice +``` + +2. In ownCloud open the `~/index.php/settings/apps?category=disabled` page with _Not enabled_ apps by administrator and click _Enable_ for the **ONLYOFFICE** application. + + + +## Configuring ownCloud ONLYOFFICE integration app + +In ownCloud open the `~/index.php/settings/admin#onlyoffice` page with administrative settings for **ONLYOFFICE** section and enter the address + +``` +https:// +``` + +Where the **documentserver** is the name of the server with the ONLYOFFICE Document Server installed. + + + +## How it works + +The ONLYOFFICE integration follows the API documented here https://api.onlyoffice.com/editors/basic: + +* When creating a new file, the user navigates to a document folder within ownCloud and clicks the **Document**, **Spreadsheet** or **Presentation* item in the _new_ (+) menu. + +* The browser invokes the `create` method in the `/lib/Controller/EditorController.php` controller. This method adds the copy of the file from the assets folder to the folder the user is currently in. + +* Or, when opening an existing file, the user navigates to it within ownCloud and selects the **Open in ONLYOFFICE** menu option. + +* A new browser tab is opened and the `index` method of the `/lib/Controller/EditorController.php` controller is invoked. + +* The app prepares a JSON object with the following properties: + + * **url** - the URL that ONLYOFFICE Document Server uses to download the document; + * **callback** - the URL that ONLYOFFICE Document Server informs about status of the document editing; + * **documentServerUrl** - the URL that the client needs to reply to ONLYOFFICE Document Server (can be set at the administrative settings page); + * **key** - the UUID+Modified Timestamp to instruct ONLYOFFICE Document Server whether to download the document again or not; + * **fileName** - the document Title (name); + * **userId** - the identification of the user; + * **userName** - the name of the user. + +* ownCloud takes this object and constructs a page from `templates/editor.php` template, filling in all of those values so that the client browser can load up the editor. + +* The client browser makes a request for the javascript library from ONLYOFFICE Document Server and sends ONLYOFFICE Document Server the DocEditor configuration with the above properties. + +* Then ONLYOFFICE Document Server downloads the document from ownCloud and the user begins editing. + +* ONLYOFFICE Document Server sends a POST request to the _callback_ URL to inform ownCloud that a user is editing the document. + +* When all users and client browsers are done with editing, they close the editing window. + +* After 10 seconds of inactivity, ONLYOFFICE Document Server sends a POST to the _callback_ URL letting ownCloud know that the clients have finished editing the document and closed it. + +* ownCloud downloads the new version of the document, replacing the old one. diff --git a/appinfo/app.php b/appinfo/app.php new file mode 100644 index 0000000..469955d --- /dev/null +++ b/appinfo/app.php @@ -0,0 +1,36 @@ +appConfig = new AppConfig($appName); + $this->crypt = new Crypt($this->appConfig); + + // Default script and style if configured + if (!empty($this->appConfig->GetDocumentServerUrl())) + { + $url = \OC::$server->getRequest()->server["REQUEST_URI"]; + + if (isset($url)) { + if (preg_match("%/apps/files(/.*)?%", $url)) { + Util::addScript($appName, "main"); + Util::addStyle($appName, "main"); + } + } + } + + $container = $this->getContainer(); + + $container->registerService("L10N", function($c) { + return $c->query("ServerContainer")->getL10N($c->query("AppName")); + }); + + $container->registerService("RootStorage", function($c) { + return $c->query("ServerContainer")->getRootFolder(); + }); + + $container->registerService("UserSession", function($c) { + return $c->query("ServerContainer")->getUserSession(); + }); + + + // Controllers + $container->registerService("SettingsController", function($c) { + return new SettingsController( + $c->query("AppName"), + $c->query("Request"), + $this->appConfig + ); + }); + + $container->registerService("EditorController", function($c) { + return new EditorController( + $c->query("AppName"), + $c->query("Request"), + $c->query("RootStorage"), + $c->query("UserSession")->getUser(), + $c->query("ServerContainer")->getURLGenerator(), + $c->query("L10N"), + $this->appConfig, + $this->crypt + ); + }); + + $container->registerService("CallbackController", function($c) { + return new CallbackController( + $c->query("AppName"), + $c->query("Request"), + $c->query("RootStorage"), + $c->query("UserSession"), + $c->query("ServerContainer")->getUserManager(), + $c->query("L10N"), + $this->appConfig, + $this->crypt + ); + }); + } +} \ No newline at end of file diff --git a/appinfo/info.xml b/appinfo/info.xml new file mode 100644 index 0000000..3345034 --- /dev/null +++ b/appinfo/info.xml @@ -0,0 +1,28 @@ + + + onlyoffice + Onlyoffice + 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 + 1.0.0 + Onlyoffice + + + + + https://api.onlyoffice.com/editors/owncloud + + tool + https://www.onlyoffice.com + https://github.com/ONLYOFFICE/onlyoffice-owncloud/issues + https://github.com/ONLYOFFICE/onlyoffice-owncloud.git + https://raw.githubusercontent.com/ONLYOFFICE/onlyoffice-owncloud/master/screenshots/main.png + https://raw.githubusercontent.com/ONLYOFFICE/onlyoffice-owncloud/master/screenshots/new.png + https://raw.githubusercontent.com/ONLYOFFICE/onlyoffice-owncloud/master/screenshots/open.png + https://raw.githubusercontent.com/ONLYOFFICE/onlyoffice-owncloud/master/screenshots/settings.png + + + + \ No newline at end of file diff --git a/appinfo/routes.php b/appinfo/routes.php new file mode 100644 index 0000000..cfd973a --- /dev/null +++ b/appinfo/routes.php @@ -0,0 +1,37 @@ + [ + ["name" => "callback#download", "url" => "/download", "verb" => "GET"], + ["name" => "callback#track", "url" => "/track", "verb" => "POST"], + ["name" => "editor#index", "url" => "/{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"], + ["name" => "settings#formats", "url" => "/ajax/settings", "verb" => "GET"], + ] +]; \ No newline at end of file diff --git a/assets/new.docx b/assets/new.docx new file mode 100644 index 0000000000000000000000000000000000000000..56831d5cd02e476c98f35e0245fa3e087a43cd1d GIT binary patch literal 8463 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 "NotFound", + 1 => "Editing", + 2 => "MustSave", + 3 => "Corrupted", + 4 => "Closed" + ); + + /** + * @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 $l10n l10n service + * @param OCA\Onlyoffice\Crypt $crypt hash generator + */ + public function __construct($AppName, + IRequest $request, + IRootFolder $root, + IUserSession $userSession, + IUserManager $userManager, + IL10N $trans, + AppConfig $config, + Crypt $crypt + ) { + parent::__construct($AppName, $request); + + $this->root = $root; + $this->userSession = $userSession; + $this->userManager = $userManager; + $this->trans = $trans; + $this->config = $config; + $this->crypt = $crypt; + } + + + /** + * Downloading file by the document service + * + * @param string $doc - verification token with the file identifier + * + * @return OCA\Onlyoffice\DownloadResponse + * + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + * @CORS + */ + public function download($doc) { + + $hashData = $this->crypt->ReadHash($doc); + if ($hashData === NULL) { + return new ErrorResponse(Http::STATUS_FORBIDDEN, $this->trans->t("Access deny")); + } + if ($hashData->action !== "download") { + return new ErrorResponse(Http::STATUS_BAD_REQUEST, $this->trans->t("Invalid request")); + } + + $fileId = $hashData->fileId; + $ownerId = $hashData->ownerId; + + $files = $this->root->getUserFolder($ownerId)->getById($fileId); + if(empty($files)) { + return new ErrorResponse(Http::STATUS_NOT_FOUND, $this->trans->t("Files not found")); + } + $file = $files[0]; + + if (! $file instanceof File) { + return new ErrorResponse(Http::STATUS_NOT_FOUND, $this->trans->t("File not found")); + } + + try { + return new DownloadResponse($file); + } catch(\OCP\Files\NotPermittedException $e) { + return new ErrorResponse(Http::STATUS_FORBIDDEN, $this->trans->t("Not permitted")); + } + return new ErrorResponse(Http::STATUS_INTERNAL_SERVER_ERROR, $this->trans->t("Download failed")); + } + + /** + * Handle request from the document server with the document status information + * + * @param string $doc - verification token with the file identifier + * @param array $users - the list of the identifiers of the users + * @param string $key - the edited document identifier + * @param string $url - the link to the edited document to be saved + * + * @return array + * + * @NoAdminRequired + * @NoCSRFRequired + * @PublicPage + * @CORS + */ + public function track($doc, $users, $key, $status, $url) { + + $hashData = $this->crypt->ReadHash($doc); + if ($hashData === NULL) { + return ["message" => $this->trans->t("Access deny")]; + } + if ($hashData->action !== "track") { + return ["message" => $this->trans->t("Invalid request")]; + } + + $trackerStatus = $this->_trackerStatus[$status]; + + $error = 1; + switch ($trackerStatus) { + case "MustSave": + case "Corrupted": + + $fileId = $hashData->fileId; + $ownerId = $hashData->ownerId; + + $files = $this->root->getUserFolder($ownerId)->getById($fileId); + if(empty($files)) { + return ["message" => $this->trans->t("Files not found")]; + } + $file = $files[0]; + + if (! $file instanceof File) { + return ["message" => $this->trans->t("File not found")]; + } + + $fileName = $file->getName(); + $curExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); + $downloadExt = strtolower(pathinfo($url, PATHINFO_EXTENSION)); + + if ($downloadExt !== $curExt) { + $documentService = new DocumentService($this->trans, $this->config); + $key = DocumentService::GenerateRevisionId($fileId . $url); + + try { + $newFileUri; + $documentService->GetConvertedUri($url, $downloadExt, $curExt, $key, FALSE, $newFileUri); + $url = $newFileUri; + } catch (\Exception $e) { + return ["message" => $e->getMessage()]; + } + } + + if (($newData = file_get_contents($url))) { + + $this->userSession->setUser($this->userManager->get($users[0])); + + $file->putContent($newData); + $error = 0; + } + break; + + case "Editing": + $error = 0; + break; + } + + return ["error" => $error]; + } +} \ No newline at end of file diff --git a/controller/editorcontroller.php b/controller/editorcontroller.php new file mode 100644 index 0000000..33e290b --- /dev/null +++ b/controller/editorcontroller.php @@ -0,0 +1,419 @@ +user = $user; + $this->root = $root; + $this->urlGenerator = $urlGenerator; + $this->trans = $trans; + $this->config = $config; + $this->crypt = $crypt; + } + + /** + * Create new file in folder + * + * @param string $name - file name + * @param string $dir - folder path + * + * @return array + * + * @NoAdminRequired + */ + public function create($name, $dir) { + + $userId = $this->user->getUID(); + $userFolder = $this->root->getUserFolder($userId); + $folder = $userFolder->get($dir); + + if ($folder === NULL) { + return ["error" => $this->trans->t("The required folder was not found")]; + } + if (!$folder->isCreatable()) { + return ["error" => $this->trans->t("You don't have enough permission to create")]; + } + + $name = $userFolder->getNonExistingName($name); + $filePath = $dir . DIRECTORY_SEPARATOR . $name; + $ext = strtolower("." . pathinfo($filePath, PATHINFO_EXTENSION)); + $templatePath = dirname(__DIR__) . DIRECTORY_SEPARATOR . "assets" . DIRECTORY_SEPARATOR . "new" . $ext; + + $template = file_get_contents($templatePath); + if (!$template) { + return ["error" => $this->trans->t("Template not found")]; + } + + $view = Filesystem::getView(); + if (!$view->file_put_contents($filePath, $template)) { + return ["error" => $this->trans->t("Can't create file")]; + } + + $fileInfo = $view->getFileInfo($filePath); + + if ($fileInfo === false) { + return ["error" => $this->trans->t("File not found")]; + } + + $result = Helper::formatFileInfo($fileInfo); + return $result; + } + + /** + * Conversion file to Office Open XML format + * + * @param integer $fileId - file identifier + * + * @return array + * + * @NoAdminRequired + */ + public function convert($fileId) { + list ($file, $error) = $this->getFile($fileId); + + if (isset($error)) { + return ["error" => $error]; + } + + $fileName = $file->getName(); + $ext = pathinfo($fileName, PATHINFO_EXTENSION); + $format = $this->config->formats[$ext]; + if (!isset($format)) { + return ["error" => $this->trans->t("Format do not supported")]; + } + + if(!isset($format["conv"]) || $format["conv"] !== TRUE) { + return ["error" => $this->trans->t("Conversion not required")]; + } + + $internalExtension = "docx"; + switch ($format["type"]) { + case "spreadsheet": + $internalExtension = "xlsx"; + break; + case "presentation": + $internalExtension = "pptx"; + break; + } + + $newFileUri; + $documentService = new DocumentService($this->trans, $this->config); + $key = $this->getKey($file); + $fileUrl = $this->getUrl($file); + try { + $documentService->GetConvertedUri($fileUrl, $ext, $internalExtension, $key, FALSE, $newFileUri); + } catch (\Exception $e) { + return ["error" => $e->getMessage()]; + } + + $userId = $this->user->getUID(); + $folder = $file->getParent(); + if (!$folder->isCreatable()) { + $folder = $this->root->getUserFolder($userId); + } + $pattern = "/^\\" . DIRECTORY_SEPARATOR . $userId . "\\" . DIRECTORY_SEPARATOR . "files/"; + $newFolderPath = preg_replace($pattern, "", $folder->getPath()); + + $fileNameWithoutExt = substr($fileName, 0, strlen($fileName) - strlen($ext) - 1); + $newFileName = $folder->getNonExistingName($fileNameWithoutExt . "." . $internalExtension); + + $newFilePath = $newFolderPath . DIRECTORY_SEPARATOR . $newFileName; + + if (($newData = file_get_contents($newFileUri)) === FALSE){ + return ["error" => $this->trans->t("Failed download converted file")]; + } + + $view = Filesystem::getView(); + if (!$view->file_put_contents($newFilePath, $newData)) { + return ["error" => $this->trans->t("Can't create file")]; + } + + $fileInfo = $view->getFileInfo($newFilePath); + + if ($fileInfo === false) { + return ["error" => $this->trans->t("File not found")]; + } + + $result = Helper::formatFileInfo($fileInfo); + return $result; + } + + /** + * Print editor section + * + * @param integer $fileId - file identifier + * + * @return TemplateResponse + * + * @NoAdminRequired + * @NoCSRFRequired + */ + public function index($fileId) { + $params = $this->getParam($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); + } + $response->setContentSecurityPolicy($csp); + + return $response; + } + + /** + * Collecting the file parameters for the document service + * + * @param integer $fileId - file identifier + * + * @return array + */ + private function getParam($fileId) { + list ($file, $error) = $this->getFile($fileId); + + if (isset($error)) { + return ["error" => $error]; + } + + $fileName = $file->getName(); + $ext = pathinfo($fileName, PATHINFO_EXTENSION); + $format = $this->config->formats[$ext]; + if (!isset($format)) { + return ["error" => $this->trans->t("Format do not supported")]; + } + + $documentServerUrl = $this->config->GetDocumentServerUrl(); + + if (empty($documentServerUrl)) { + return ["error" => $this->trans->t("ONLYOFFICE app not configured. Please contact admin")]; + } + + $userId = $this->user->getUID(); + $ownerId = $file->getOwner()->getUID(); + try { + $this->root->getUserFolder($ownerId); + } catch (NoUserException $e) { + $ownerId = $userId; + } + + $fileId = $file->getId(); + $hashCallback = $this->crypt->GetHash(["fileId" => $fileId, "ownerId" => $ownerId, "action" => "track"]); + $fileUrl = $this->getUrl($file); + $key = $this->getKey($file); + + $canEdit = isset($format["edit"]) && $format["edit"]; + + $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->user->getDisplayName(), + "documentType" => $format["type"] + ]; + + return $params; + } + + /** + * Getting file by identifier + * + * @param integer $fileId - file identifier + * + * @return array + */ + private function getFile($fileId) { + if (empty($fileId)) { + return [NULL, $this->trans->t("FileId is empty")]; + } + + $files = $this->root->getById($fileId); + if(empty($files)) { + return [NULL, $this->trans->t("File not found")]; + } + $file = $files[0]; + + if (!$file->isReadable()) { + return [NULL, $this->trans->t("You do not have enough permissions to view the file")]; + } + return [$file, NULL]; + } + + /** + * Generate unique document identifier + * + * @param \OCP\Files\File - file + * + * @return string + */ + private function getKey($file) { + $fileId = $file->getId(); + + $ownerId = $file->getOwner()->getUID(); + try { + $this->root->getUserFolder($ownerId); + } catch (NoUserException $e) { + $ownerId = $this->user->getUID(); + } + + $key = $fileId . $file->getMtime(); + + $ownerView = new View('/'.$ownerId.'/files'); + $filePath = $ownerView->getPath($fileId); + $versions = ""; + try { + $versions = Storage::getVersions($ownerId, $filePath); + } catch (AutoloadNotAllowedException $e) { + } + + $countVersions = count($versions); + if ($countVersions > 0) { + $key = $key . $countVersions; + } + return $key; + } + + /** + * Generate secure link to download document + * + * @param \OCP\Files\File - file + * + * @return string + */ + private function getUrl($file) { + $fileId = $file->getId(); + + $ownerId = $file->getOwner()->getUID(); + try { + $this->root->getUserFolder($ownerId); + } catch (NoUserException $e) { + $ownerId = $userId; + } + + $hashUrl = $this->crypt->GetHash(["fileId" => $fileId, "ownerId" => $ownerId, "action" => "download"]); + + $fileUrl = $this->urlGenerator->linkToRouteAbsolute($this->appName . ".callback.download", ["doc" => $hashUrl]); + return $fileUrl; + } +} \ No newline at end of file diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php new file mode 100644 index 0000000..dcdf7b5 --- /dev/null +++ b/controller/settingscontroller.php @@ -0,0 +1,93 @@ +config = $config; + } + + /** + * Print config section + * + * @return TemplateResponse + */ + public function index() { + $data = [ "documentserver" => $this->config->GetDocumentServerUrl()]; + return new TemplateResponse($this->appName, "settings", $data, "blank"); + } + + /** + * Save the document server address + * + * @param string $documentserver application name + * + * @return array + */ + public function settings($documentserver) { + $this->config->SetDocumentServerUrl($documentserver); + return [ "documentserver" => $this->config->GetDocumentServerUrl()]; + } + + /** + * Get supported formats + * + * @return array + * + * @NoAdminRequired + */ + public function formats(){ + return $this->config->formats; + } +} diff --git a/css/editor.css b/css/editor.css new file mode 100644 index 0000000..0056090 --- /dev/null +++ b/css/editor.css @@ -0,0 +1,32 @@ +/** + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). + * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that + * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. + * + * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html + * + * You can contact Ascensio System SIA by email at sales@onlyoffice.com + * + * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display + * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. + * + * Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains + * relevant author attributions when distributing the software. If the display of the logo in its graphic + * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" + * 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. + * +*/ + +#app > iframe { + vertical-align: top; +} + +#iframeEditor.error { + color: red; +} \ No newline at end of file diff --git a/css/main.css b/css/main.css new file mode 100644 index 0000000..34c3f68 --- /dev/null +++ b/css/main.css @@ -0,0 +1,34 @@ +/** + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). + * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that + * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. + * + * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html + * + * You can contact Ascensio System SIA by email at sales@onlyoffice.com + * + * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display + * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. + * + * Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains + * relevant author attributions when distributing the software. If the display of the logo in its graphic + * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" + * 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. + * +*/ + +.onlyoffice-new-docx { + background-image: url("../img/new-docx.svg"); +} +.onlyoffice-new-xlsx { + background-image: url("../img/new-xlsx.svg"); +} +.onlyoffice-new-pptx { + background-image: url("../img/new-pptx.svg"); +} \ No newline at end of file diff --git a/css/settings.css b/css/settings.css new file mode 100644 index 0000000..8c45562 --- /dev/null +++ b/css/settings.css @@ -0,0 +1,36 @@ +/** + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). + * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that + * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. + * + * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html + * + * You can contact Ascensio System SIA by email at sales@onlyoffice.com + * + * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display + * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. + * + * Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains + * relevant author attributions when distributing the software. If the display of the logo in its graphic + * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" + * 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. + * +*/ + +.section-onlyoffice h2 { + display: inline; +} +.onlyoffice-header { + margin-top: 16px; +} +.section-onlyoffice input { + display: block; + margin: 6px 0 4px; + width: 250px; +} diff --git a/img/app.svg b/img/app.svg new file mode 100644 index 0000000..fe108e8 --- /dev/null +++ b/img/app.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/img/btn-edit.svg b/img/btn-edit.svg new file mode 100644 index 0000000..b9e4967 --- /dev/null +++ b/img/btn-edit.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/img/new-docx.svg b/img/new-docx.svg new file mode 100644 index 0000000..449c626 --- /dev/null +++ b/img/new-docx.svg @@ -0,0 +1,23 @@ + + + + ownCloud-icon-doc-16x16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/img/new-pptx.svg b/img/new-pptx.svg new file mode 100644 index 0000000..15f7ded --- /dev/null +++ b/img/new-pptx.svg @@ -0,0 +1,23 @@ + + + + ownCloud-icon-pres-16x16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/img/new-xlsx.svg b/img/new-xlsx.svg new file mode 100644 index 0000000..fecfcf4 --- /dev/null +++ b/img/new-xlsx.svg @@ -0,0 +1,23 @@ + + + + ownCloud-icon-ss-16x16 + Created with Sketch. + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/js/editor.js b/js/editor.js new file mode 100644 index 0000000..2a7851d --- /dev/null +++ b/js/editor.js @@ -0,0 +1,72 @@ +/** + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). + * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that + * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. + * + * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html + * + * You can contact Ascensio System SIA by email at sales@onlyoffice.com + * + * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display + * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. + * + * Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains + * relevant author attributions when distributing the software. If the display of the logo in its graphic + * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" + * 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. + * +*/ + +(function ($, OCA) { + + OCA.Onlyoffice = _.extend({}, OCA.Onlyoffice); + if (!OCA.Onlyoffice.AppName) { + OCA.Onlyoffice = { + AppName: "onlyoffice" + }; + } + + 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"); + } + + if (data.error.length) { + $("#iframeEditor").text(data.error).addClass("error"); + return; + } + + var ext = (data.title || "").toLowerCase().split(".").pop(); + + 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%" + }; + + var docEditor = new DocsAPI.DocEditor("iframeEditor", config); + }; + +})(jQuery, OCA); \ No newline at end of file diff --git a/js/main.js b/js/main.js new file mode 100644 index 0000000..14dcf2d --- /dev/null +++ b/js/main.js @@ -0,0 +1,194 @@ +/** + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). + * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that + * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. + * + * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html + * + * You can contact Ascensio System SIA by email at sales@onlyoffice.com + * + * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display + * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. + * + * Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains + * relevant author attributions when distributing the software. If the display of the logo in its graphic + * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" + * 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. + * +*/ + +(function (OCA) { + + OCA.Onlyoffice = _.extend({}, OCA.Onlyoffice); + if (!OCA.Onlyoffice.AppName) { + OCA.Onlyoffice = { + AppName: "onlyoffice" + }; + } + + OCA.Onlyoffice.CreateFile = function (name, fileList) { + var dir = fileList.getCurrentDirectory(); + + var winEditor = window.open(""); + if (winEditor) { + winEditor.document.write(t(OCA.Onlyoffice.AppName, "Loading, please wait.")); + winEditor.document.close(); + } + + $.post(OC.generateUrl("apps/" + OCA.Onlyoffice.AppName + "/ajax/new"), + { + name: name, + dir: dir + }, + function onSuccess(response) { + if (response.error) { + winEditor.close(); + var row = OC.Notification.show(response.error); + setTimeout(function () { + OC.Notification.hide(row); + }, 3000); + return; + } + + fileList.add(response, { animate: true }); + OCA.Onlyoffice.OpenEditor(response.id, winEditor); + + var row = OC.Notification.show(t(OCA.Onlyoffice.AppName, "File created")); + setTimeout(function () { + OC.Notification.hide(row); + }, 3000); + } + ); + }; + + OCA.Onlyoffice.OpenEditor = function (fileId, winEditor) { + var url = OC.generateUrl("/apps/" + OCA.Onlyoffice.AppName + "/{fileId}", + { + fileId: fileId + }); + + if (winEditor && winEditor.location) { + winEditor.location.href = url; + } else { + winEditor = window.open(url, "_blank"); + } + }; + + OCA.Onlyoffice.FileClick = function (context, attr) { + var fileInfoModel = context.fileInfoModel; + var fileList = context.fileList; + if (!attr.conv) { + OCA.Onlyoffice.OpenEditor(fileInfoModel.id); + return; + } + + OC.dialogs.confirm(t(OCA.Onlyoffice.AppName, "The document file you open will be converted to the Office Open XML format for faster viewing and editing."), + t(OCA.Onlyoffice.AppName, "Convert and open document"), + function (convert) { + if (!convert) { + return; + } + + $.post(OC.generateUrl("apps/" + OCA.Onlyoffice.AppName + "/ajax/convert"), + { + fileId: fileInfoModel.id + }, + function onSuccess(response) { + if (response.error) { + var row = OC.Notification.show(response.error); + setTimeout(function () { + OC.Notification.hide(row); + }, 3000); + return; + } + + if (response.parentId == fileList.dirInfo.id) { + fileList.add(response, { animate: true }); + } + + var row = OC.Notification.show(t(OCA.Onlyoffice.AppName, "File created")); + setTimeout(function () { + OC.Notification.hide(row); + }, 3000); + }); + }); + }; + + OCA.Onlyoffice.FileList = { + attach: function (fileList) { + if (fileList.id == "trashbin") { + return; + } + + $.get(OC.generateUrl("apps/" + OCA.Onlyoffice.AppName + "/ajax/settings"), + function onSuccess(mimes) { + + OCA.Onlyoffice.mimes = mimes; + $.each(mimes, function (ext, attr) { + fileList.fileActions.registerAction({ + name: "onlyofficeOpen", + displayName: t(OCA.Onlyoffice.AppName, "Open in ONLYOFFICE"), + mime: attr.mime, + permissions: OC.PERMISSION_READ, + icon: function () { + return OC.imagePath(OCA.Onlyoffice.AppName, "btn-edit"); + }, + actionHandler: function (fileName, context) { + OCA.Onlyoffice.FileClick(context, attr); + } + }); + }); + } + ); + } + }; + + OCA.Onlyoffice.NewFileMenu = { + attach: function (menu) { + var fileList = menu.fileList; + + if (fileList.id !== "files") { + return; + } + + menu.addMenuEntry({ + id: "onlyofficeDocx", + displayName: t(OCA.Onlyoffice.AppName, "Document"), + iconClass: "onlyoffice-new-docx", + fileType: "docx", + actionHandler: function (name) { + OCA.Onlyoffice.CreateFile(name + ".docx", fileList); + } + }); + + menu.addMenuEntry({ + id: "onlyofficeXlsx", + displayName: t(OCA.Onlyoffice.AppName, "Spreadsheet"), + iconClass: "onlyoffice-new-xlsx", + fileType: "xlsx", + actionHandler: function (name) { + OCA.Onlyoffice.CreateFile(name + ".xlsx", fileList); + } + }); + + menu.addMenuEntry({ + id: "onlyofficePpts", + displayName: t(OCA.Onlyoffice.AppName, "Presentation"), + iconClass: "onlyoffice-new-pptx", + fileType: "pptx", + actionHandler: function (name) { + OCA.Onlyoffice.CreateFile(name + ".pptx", fileList); + } + }); + } + }; +})(OCA); + +OC.Plugins.register("OCA.Files.FileList", OCA.Onlyoffice.FileList); +OC.Plugins.register("OCA.Files.NewFileMenu", OCA.Onlyoffice.NewFileMenu); diff --git a/js/settings.js b/js/settings.js new file mode 100644 index 0000000..47c8bf1 --- /dev/null +++ b/js/settings.js @@ -0,0 +1,63 @@ +/** + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * This program is freeware. You can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html). + * In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that + * Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights. + * + * THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html + * + * You can contact Ascensio System SIA by email at sales@onlyoffice.com + * + * The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display + * Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3. + * + * Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains + * relevant author attributions when distributing the software. If the display of the logo in its graphic + * form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE" + * 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. + * +*/ + +(function ($, OC) { + + $(document).ready(function () { + OCA.Onlyoffice = _.extend({}, OCA.Onlyoffice); + if (!OCA.Onlyoffice.AppName) { + OCA.Onlyoffice = { + AppName: "onlyoffice" + }; + } + + $("#onlyofficeSave").click(function () { + var docServiceUrlApi = $("#docServiceUrlApi").val().trim(); + + $.ajax({ + method: "PUT", + url: OC.generateUrl("apps/onlyoffice/ajax/settings"), + data: { documentserver: docServiceUrlApi }, + 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")); + setTimeout(function () { + OC.Notification.hide(row); + }, 3000); + } + } + }); + }); + + $("#docServiceUrlApi").keypress(function (e) { + var code = e.keyCode || e.which; + if (code === 13) { + $("#onlyofficeSave").click(); + } + }); + }); + +})(jQuery, OC); \ No newline at end of file diff --git a/lib/appconfig.php b/lib/appconfig.php new file mode 100644 index 0000000..1d34fbe --- /dev/null +++ b/lib/appconfig.php @@ -0,0 +1,151 @@ +appName = $AppName; + $this->config = \OC::$server->getConfig(); + } + + /** + * Save the document service address to the application configuration + * + * @param string $documentServer - document service address + */ + public function SetDocumentServerUrl($documentServer) { + $documentServer = rtrim(trim($documentServer), "/"); + $this->config->setAppValue($this->appName, $this->_documentserver, $documentServer); + $this->DropSKey(); + } + + /** + * Get the document service address from the application configuration + * + * @return string + */ + public function GetDocumentServerUrl() { + return $this->config->getAppValue($this->appName, $this->_documentserver, ""); + } + + /** + * Get the secret key from the application configuration + * + * @return string + */ + public function GetSKey() { + $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); + } + return $skey; + } + + /** + * 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); + } + } + + + /** + * Additional data about formats + * + * @var array + */ + public $formats = [ + "docx" => [ "mime" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "type" => "text", "edit" => true ], + "xlsx" => [ "mime" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "type" => "spreadsheet", "edit" => true ], + "pptx" => [ "mime" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", "type" => "presentation", "edit" => true ], + "ppsx" => [ "mime" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow", "type" => "presentation", "edit" => true ], + "txt" => [ "mime" => "text/plain", "type" => "text", "edit" => true ], + "csv" => [ "mime" => "text/csv", "type" => "spreadsheet"/*, "edit" => true*/ ], + "odt" => [ "mime" => "application/vnd.oasis.opendocument.text", "type" => "text", "conv" => true ], + "ods" => [ "mime" => "application/vnd.oasis.opendocument.spreadsheet", "type" => "spreadsheet", "conv" => true ], + "odp" => [ "mime" => "application/vnd.oasis.opendocument.presentation", "type" => "presentation", "conv" => true ], + "doc" => [ "mime" => "application/msword", "type" => "text", "conv" => true ], + "xls" => [ "mime" => "application/vnd.ms-excel", "type" => "spreadsheet", "conv" => true ], + "ppt" => [ "mime" => "application/vnd.ms-powerpoint", "type" => "presentation", "conv" => true ], + "pps" => [ "mime" => "application/vnd.ms-powerpoint", "type" => "presentation", "conv" => true ], + "epub" => [ "mime" => "application/epub+zip", "type" => "text", "conv" => true ], + "rtf" => [ "mime" => "text/rtf", "type" => "text", "type" => "text", "conv" => true ], + "mht" => [ "mime" => "message/rfc822", "conv" => true ], + "html" => [ "mime" => "text/html", "type" => "text", "conv" => true ], + "htm" => [ "mime" => "text/html", "type" => "text", "conv" => true ], + "xps" => [ "mime" => "application/vnd.ms-xpsdocument", "type" => "text" ], + "pdf" => [ "mime" => "application/pdf", "type" => "text" ], + "djvu" => [ "mime" => "image/vnd.djvu", "type" => "text" ] + ]; +} diff --git a/lib/crypt.php b/lib/crypt.php new file mode 100644 index 0000000..28c888b --- /dev/null +++ b/lib/crypt.php @@ -0,0 +1,104 @@ +skey = $appConfig->GetSKey(); + } + + /** + * Generate base64 hash for the object + * + * @param array $object - object to signature hash + * + * @return string + */ + public function GetHash($object) { + $primaryKey = json_encode($object); + $hash = $this->SignatureCreate($primaryKey); + return $hash; + } + + /** + * Create an object from the base64 hash + * + * @param string $hash - base64 hash + * + * @return array + */ + public function ReadHash($hash) { + $result = NULL; + if ($hash === NULL) { + return $result; + } + try { + $payload = base64_decode($hash); + $payloadParts = explode("?", $payload); + + $encode = base64_encode( hash( "sha256", ($payloadParts[1] . $this->skey), true ) ); + + if ($payloadParts[0] === $encode) { + $result = json_decode($payloadParts[1]); + } + } catch (\Exception $e) { + } + return $result; + } + + /** + * Generate base64 hash for the object + * + * @param string $primary_key - string to the signature hash + * + * @return string + */ + private function SignatureCreate($primary_key) { + $payload = base64_encode( hash( "sha256", ($primary_key . $this->skey), true ) ) . "?" . $primary_key; + $base64Str = base64_encode($payload); + + return $base64Str; + } +} diff --git a/lib/documentservice.php b/lib/documentservice.php new file mode 100644 index 0000000..e3b0703 --- /dev/null +++ b/lib/documentservice.php @@ -0,0 +1,247 @@ +trans = $trans; + $this->config = $appConfig; + } + + /** + * Translation key to a supported form. + * + * @param string $expected_key Expected key + * + * @return Supported key + */ + public static function GenerateRevisionId($expected_key) { + if (strlen($expected_key) > 20) { + $expected_key = crc32( $expected_key); + } + $key = preg_replace("[^0-9-.a-zA-Z_=]", "_", $expected_key); + $key = substr($key, 0, min(array(strlen($key), 20))); + return $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 + */ + 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); + + $errorElement = $responceFromConvertService->Error; + if ($errorElement->count() > 0) { + $this->ProcessConvServResponceError($errorElement.""); + } + + $isEndConvert = $responceFromConvertService->EndConvert; + $percent = $responceFromConvertService->Percent . ""; + + if ($isEndConvert !== NULL && strtolower($isEndConvert) === "true") { + $converted_document_uri = $responceFromConvertService->FileUrl; + $percent = 100; + } else if ($percent >= 100) { + $percent = 99; + } + + return $percent; + } + + /** + * 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 + */ + function SendRequestToConvertService($document_uri, $from_extension, $to_extension, $document_revision_id, $is_async) { + if (empty($from_extension)) { + $path_parts = pathinfo($document_uri); + $from_extension = $path_parts["extension"]; + } + + $title = basename($document_uri); + if (empty($title)) { + $title = $document_revision_id . $from_extension; + } + + if (empty($document_revision_id)) { + $document_revision_id = $document_uri; + } + + $document_revision_id = self::GenerateRevisionId($document_revision_id); + + $documentServerUrl = $this->config->GetDocumentServerUrl(); + + if (empty($documentServerUrl)) { + throw new \Exception($this->trans->t("ONLYOFFICE app not configured. Please contact admin")); + } + + $urlToConverter = $documentServerUrl . "/ConvertService.ashx"; + + $data = json_encode( + array( + "async" => $is_async, + "url" => $document_uri, + "outputtype" => trim($to_extension, "."), + "filetype" => trim($from_extension, "."), + "title" => $title, + "key" => $document_revision_id + ) + ); + + $response_xml_data; + $countTry = 0; + + $opts = array("http" => array( + "method" => "POST", + "timeout" => "120000", + "header"=> "Content-type: application/json\r\n", + "content" => $data + ) + ); + + if (substr($urlToConverter, 0, strlen("https")) === "https") { + $opts["ssl"] = array( "verify_peer" => FALSE ); + } + + $context = stream_context_create($opts); + $ServiceConverterMaxTry = 3; + while ($countTry < $ServiceConverterMaxTry) { + $countTry = $countTry + 1; + $response_xml_data = file_get_contents($urlToConverter, FALSE, $context); + if ($response_xml_data !== false){ break; } + } + + if ($countTry === $ServiceConverterMaxTry) { + throw new \Exception ($this->trans->t("Bad Request or timeout error")); + } + + libxml_use_internal_errors(true); + if (!function_exists("simplexml_load_file")) { + throw new \Exception($this->trans->t("Server can't read xml")); + } + $response_data = simplexml_load_string($response_xml_data); + if (!$response_data) { + $exc = $this->trans->t("Bad Response. Errors: "); + foreach(libxml_get_errors() as $error) { + $exc = $exc . "\t" . $error->message; + } + throw new \Exception ($exc); + } + + return $response_data; + } + + /** + * 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 = ""; + + switch ($errorCode) { + case -8: + $errorMessage = $errorMessageTemplate . "Error document VKey"; + break; + case -7: + $errorMessage = $errorMessageTemplate . "Error document request"; + break; + case -6: + $errorMessage = $errorMessageTemplate . "Error database"; + break; + case -5: + $errorMessage = $errorMessageTemplate . "Error unexpected guid"; + break; + case -4: + $errorMessage = $errorMessageTemplate . "Error download error"; + break; + case -3: + $errorMessage = $errorMessageTemplate . "Error convertation error"; + break; + case -2: + $errorMessage = $errorMessageTemplate . "Error convertation timeout"; + break; + case -1: + $errorMessage = $errorMessageTemplate . "Error convertation unknown"; + break; + case 0: + break; + default: + $errorMessage = $errorMessageTemplate . "ErrorCode = " . $errorCode; + break; + } + + throw new \Exception($errorMessage); + } +} diff --git a/lib/downloadresponse.php b/lib/downloadresponse.php new file mode 100644 index 0000000..c37bd59 --- /dev/null +++ b/lib/downloadresponse.php @@ -0,0 +1,64 @@ +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; + } +} diff --git a/lib/errorresponse.php b/lib/errorresponse.php new file mode 100644 index 0000000..512257a --- /dev/null +++ b/lib/errorresponse.php @@ -0,0 +1,61 @@ +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 diff --git a/screenshots/icon.png b/screenshots/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8a648f25f05f90a0921468f0abd051f5bb6db839 GIT binary patch literal 990 zcmV<410np0P)ZZ6xG4*Yo8`=0l_&pFTk|C}=se7jlU&8Ad%xeX_P0FVuy0RvM9 zGJ(e3!Njb)Ew1(r23a5ljFIWn1ByWb_~=pqp;h{!`o!>z*8r7^!J5EzZ~{Db)=^R` zg`@kvU?bQ8!iSM23B)tcK|Z(wjDuDnrl#HY_XMyVWPqT*thY8!O%dp{2C(cw2VFx! z4%iITBP{%WP{HYGk~ET%er)-N&hrOpAQhBK8kI14vko8tWfHE(Sa7rwek1(Nub>>9 z1dSr^&P?l*j-ZB#xNI9i5uO2OgF3=HZS7(eBpy&zJMcyK;s~yrcvZqY{4m+@IJi7o zA2!H_lB6_?elf@cb3kEWTQn*3JkhVKi{U_4yHSX~gGy4mzdp)Rh^8o%YO18k;2t;% zUWrrH5tNSvy8*sY#2k48-7xBE+$zOB`dCXTj%15dQS!0tUncpgw6q}&PzvlSVFL4r z0`YBMc>~worYX1f^DOAuTz z58yN?;h8#WV?jFajMHTL^sx&l&F@5K`frU@C5Mc+alvGn0eWfac*aeHlt+#o`Ir1C2l&q zAeD3NsCDyhR}fiJO%s>|_HbGqrKVhT=Ps|{T~NpjTE~G%@_L(O?n~MzzX_U+hE$o6KCoY%)_JSm~vZH2T5z}7qUVJ{B zZ2NE=ZiB>e8{? zPOV M07*qoM6N<$f@$v0U;qFB literal 0 HcmV?d00001 diff --git a/screenshots/main.png b/screenshots/main.png new file mode 100644 index 0000000000000000000000000000000000000000..1f2cb78aaa236fddf5a465a14b4949ce28f0bdf9 GIT binary patch literal 68010 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%0D5p9AhaDh0_ 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 literal 0 HcmV?d00001 diff --git a/screenshots/main_small.png b/screenshots/main_small.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9659ea884a95d94ac3b2feedf7164400acbbd8 GIT binary patch literal 18805 zcmXt9Wmp?cxTO?m@Dz6v+}$azMM{AdcXuo9l;B>9ySux$xJz(%cZ%!H_uPAbB%7UQ zvpceL&YAZ;6ZZ9s3_1!C3LG39`e#{56*#zeOt9Zk0C?Evmqkv9N9ru^9LLpM$dnrcLVmtCa^+6XDJP5ReLjMH$x{=I0r*Z zJ7*RzSp8n`R-LC$ky0^o>{?e1 zwBfs}UY94{-n7Z+=(y*28`fOc>r(4l4-1!$L z?)0sG9Tuk9S(|DB>>p0g(Ho+uak&c;3Wtw^S8|7MD>KV~Iw^AWy-v8dd8&ev{V|FB zxv7;dYRs$K??qGDgFBy_t7&XZ7yRiH$1pfTync?#je!{Gu*S zNand2hR^%5b34%WGX13IXFu`MwSGVA_tbZ;w{pF==ks>E-InC5@>nJE7GnSU^N)zP zSA(E3Y-%XhAOc*b6`P2S1R$-4u7RiWU7j?0wq3qz9Ev+p4f-NU&husbZXK`*kfrnl zwbvg9y1pGR?nAY7*BsM++&kz@XApCcyHh@4lHyXCGU zvEno3Nhhy7nfHA0LY)_p2;cOTNE)6Ij+cji9-#e4p{+bb6OvRXa$@K1{^NA5dHjxY zwCc>-)7Gye)Xze7%=&4k+OAdCTH7C343+n6Jqbv(v)3{E@GT$5xyx(etA#U=FKaQH zG}N{^cD+HQaPt8(e4AtWPHH|&(RL9}89UC#*I2)=5qnl}JXz9`^@Psvpkr&^Ex~R< z?{Ve!3g7M9ruPFGlAt zjS#I?ot8h)RsJ|`Y3wO!+{UknOA#8t7P#wmrcT7zQ@b6&$B;Bz;v9aOFuxYQ)Vukh zY)c&7sKel-S581ze&FXWZ~HBgxnz*ctHoUZr_01c^iJ+8e&ak{!!Zo+mf#_G?Wqkn zk~c%BiP%GXB4nklKP387ekU3uk0CFT8YF(7(^gr2J34bpryAlR=OmN2=vM09{6~&= z9$midQi%cYfm`rmXuccV@!ejw{d;HQ`aSflwBn-+vD^3d>XGIbogQs3#@FhOtqS8p zbDrIf+OEeGTk3O?k~P=by|EYWbMi8eyU@+G2Q_44{!+W^kq~C`4BJ(**+%A4N{+I- zi-$SI0p<^^{Ns8DOHPeK6tj;fjYpW#2YdG*b;rEqog_8@UdCQ&QDXvFz{Z$w|;aFiX0arl#g+mYas+Wzn^hSS@Ys-C~cvfdTza zZ+;#gwN?96VX+m&rJi&;@`>ZhwzFIzvpP*-wJ>pl#OZm_&!0a>CT?yTvfFUMU`%6_82);pr)LwkTbt zRyzwa7y%k^9qb?S5hRWEB2Bfbt*rbvM+Nl0sk%B=70pP6VY+D6s({w*Y-Pw6n_c|- z_wUytm*1#lf_j@HLqmava(D?=pl{(6e}J2I;U=S*_8m8KK6k4F1_`NxBG*!n5+N8< z;?$Yi>rklE?TIE4+!wh|{sH>R${&qIxkPocThVt4=&0n>t|%%)zrb}zM`KXy@iR&W zAR{ARE5P`fgu6=HuBD)+=5nhq!a4evZYbL-%lcA`NFg3Hl+8HP7kjfTT<6=E!mtlM z`_Rx(dnHzPb2DG1mh5ylA^_~N-sy9F|N8R8s?!V`sDR#4bSG|ZZk8ZZk=YN3Z!vhZ1<+@?XM>3z zoMo}Gv8mdecEkOF^~v?kO810zT?8s)V`I+W+}wCKslg_6Y$%5aD;Oaw#&MAWBcH}J z|Lnzv(;N=Zv|94mA1YFv8pF*-zrhpQ-A9qbIn<4Ao9{2q-GrWJ}~=#E!0D+=JO z4>o^-G{SiY{z2|wW@ZM(%`Fkf z$qjbs2}XBYaSQ>x-RQsFq;Q%`-j}w%+%7lSEQ;^5y-JPJ{=68Bqs;x0?AqdRBX0Ii z{E98^WTEDLNa1)@OI#>7W?p;_i2OsKGp_;%cD!!KjPm}?L%Xm3#&*h3bf$0Dym{k{ zwqR?2k@^3)P)B_<7*h-jocvklPsvC&%4Og1TOg zp~%CKk_A;ARgTpOGZEj}ao=C@ zBYyW-EaqMV735ehYj>?8L0F!c3+O8lByn%b~N{$F8Ooc|Yl_ygFH&h@JmeMh-O^UpajMC5rB^U~~q^>vHY|6*M5{CT%9l>)G@YZf{Q8UYAgu!6;}V9BF=d(-XqR&rC_P znQJs#==sn)#){aT*obk%ov9>;d&w&&0HGrhA9K1cNYeW$@Jt|2oW9W1^>XUA<`Htr zh*4Kmv@av_I8~^a*5BXXdD~D`fd)3J%}o8}i;CnU2Uy&zshvN$pGWD&bS3w^3tZK9 zC3E+C(t}T`#j{1WU`PG*V4%0f(ajqCTfP&S66J5q(7->G7%_LA%N z!bEt(pq#xtADQtCrS9=wDu)ybvYI5IHas4W(>K`@uvGir<)f3mvcqQi@89MOjPgIu z85kL*QhtMAAcw)j$rq+R9+Ac3H8&bT^@o@{!*~O*gEDce7Eu=22l4J86IvlHspJL{(5%45e5ER zi8~Ow{*>1BKzzG!ko9_))%h@HzeOzactBYi9TkPUC^D5<-O!Mb@rhX76hF`6BP8G0 zRDptBAc!ktQ1dcdiPLomy09=9t@9#FNz$#?me)B%f?=qorNxJ~f~D8PTdRX?9d;r3 zJ2UeOxuxqf&Ip#ia56q=uk^#gR9?Q)=g(mD4f+#OVQ-C#{subZpJe8E`Q)4F?l-2T z;7{()3Yw-ao@#5+F9S0`=n@Q8t#FjoaFyxtWusCyhFVQD^ znaVTi`)TOm-#%FXb6~Tc)xM{gc-Z{P*6pn;(a_e{f7Ri=)nk*UaAoWK*ig~tU@aj? zBq0**{P_LUsJ|>K*bNXn^ImE??3%Pg3Gs;50L|zz`VvK6LDuO+1$et~vI&Grn&Cf) z7Ubqqn8}RQ%XC~`UaoK+sfdIX#=if6L3f@&-~I1oy(`P9H~S+6yS3YJjShJ}TFV?C5?R3XX1t83LECNnf+wd_yN~op$B;<0Y2Zl?4LHP(@ z*cZ8ZdE+(UdKiIFk$s7#UtC7R^YsBbUbiQP!bTuRIS)a|alv;T);KvmbO;*O8HTTh za3;R3Xe4%_zk_)*87Tk90lPp*S+E4ZtDY8s@JA%_&BmN_?hb3BRs}d1pR4pkia?b= z+pg1XNiiQfWM^w`_yfboAt6+K1Qn*~ut$oI6}guvoZ+E4pV=ClQO;*(@+c|qloW+H z*lVPsQD^TRWHE)VV^jC1Vw3GOFYAP2jrR+J9rgo^9r0QEs0tyhGMZiNMBPbwkqleh z_R4J8VUjC2{8oAfEjz}K4wh%6oEWwSK#R=nI#zg*U;uU$OihKPnj*r-TwOU4N!QKl z4&y{J8W&EBVyy+AE;nTfd8yT0oWV=8Y1G^DFPvR(7n@f)ATBP|L!01p zq<^YMNd_9J5C?0w(@Fbp$2l9z@A}(^2ksyJ@~$<{R<#c6>cu)lo@a7_D<=)WX+qVv z4UR0*?-MlQ)oNg_6?C%<$2;F7Vm?KxLdeGPMBp7UYrnUg@qPwBSRO5agJ7QS`?2-@+hFRhu| zHDXA}E_Rlt?&@6PTqAeWmE88|X!#F=!LtK$rxur|pUbpFW|0ma&c0^vzPPzHO<6!{ zxcw*1k}|unZ)NR81~HFC+D6SH+%aR-e`mz!kz5fu9y!Bk)2T5#J9d6)Ns9tGJw^#6 zT3uKu%^%ThW+XpS=4l%pvoG>>S>)}sYUuM}Tf_=34bHBErzcTX2?<7vPJ!tz!f#CS z#S>S(zQvT3lo3MBA3uH!Ybx`x$0}v#)L5E)d$d;D&ME!yA;diaW1zs^ra({bF1S;L zNltY?$JZ=SU)Yz$GLPV3bD_Yn(A)6@1}l< zf%z#AW3Z=)wM%Q z!-p9j6`yC>W|pnD6I#D|$rKe7aMSQqwrUYk$wp$U%EF{>jpOA93^FqSVbm4d@yW?A znSFD-4fjuEP0LZ7I>Z1>vQM)2TA~_idMuS9+}w)%<>jRUK6~X(p&Xob?%V`u&g230 z@`qr+F^o_W>WcI8^IHoG^V^4)toQLeJD{QGN57EBv8o+$72JoxO+OrDe~OVToniz| z$r`x3Cu0HX>l+!&38fDSQ`#BKr8av38$bSCWqdh|=q8IvQfJqQTRz>y?Qg9RLXfl^ z)^yZRwdNow==ws7p{(r{;sm&5W>%3emIYFjs*U&eQ%6QdT8vY~!J(y&LCI5`TUMcE zBj{eki*kYNoQwnfY#5v2-*{rsuxm$ymDv+nbGc!b9@<|IpPck39_eseRa zuz!);@7em^2whAdcD*T0QUYb@)>vItruzgn>K5#L=duaHDlI)GKr>B{9s|WO+a$Y` zm(b!wRz%UBG%VV>e&{EP>GSvA;*2;F^Bfynf%bO?hc&G8XY&`ZTPs!FPu>sDEi%94 z2GDSNqYo)X%hAIOS17o9drz}iT7|25;l2cP#{oY8tPc%r0%>Sz&lhR}ah!f**A4Cv6e`- z{=K4u)xh}Mkd4Y`qlCx}k_Z3nC zW_GQs;iIcz;vZ-gL?fluCW#|z21k`v?ESXVj4<*F}AM6=wuG z;|y9EyJfWjwRnq1<(Xg1FG}Z(?zC*k`iNRXN|)1b_7~U(>8;Nh~bU2rIz_ zIh|+~SGX0A^N`rBR!VgZon9zfVKJG{&KdaDH9@y3T2sF_J<95@oDGzE{Z#a!WYo@+ z;84M#Ffx zWU8mPm38fhQJ)^gTLaVOuVR6eUB1+emaeXt(f0#p@Y|fhduw&{rbSq&N;J4xU#c|6 z$4z-@e!J{)p%=_!>dZQgot0J^boiJcmYtyNXtgt@{Ux$-jOON-h8{n%raUIro8$>~ zmbxLz7uQk~kXSKRHxr-0s@q}PoV!|}p}G83O;^8gD5s_sWB)OzI=A-M>dsAo0|?}Y z@zuiW7A2$jb6q<3ErzwbHk3%j7cju<6E?2y zJMIuPxr?#`G#sr@R<}4KB{isknqQtW6)pjPkkTZxjnF$@IY#`EKJ|qYJ%NGG)oXu6 zO|%e!M&>MpTpRRA0qjzz`|<*)OqJz@V(3mpBNhZq=NCV~+(JD>7c*++^1S4u&J#Kq>t*F_mV78_j{lKj1R*Y5bU>kSwr=EMC z*YErikDgX$m1Djx7=q$6$N=_jhIDYSpDL(4!!58L9Z++d!;VD<#A|v$8I|9rO+yhc zUpc`+n7ezNMPN`fzro|Zu?8?Tp`jtrAOx&UmHhrGAO><}nRezW(+ec00rVP02wsgz zI3zDNV}(dn=mC0@)sAemZfE+PL?tr%ue90|eUZEOI^#x01bZNCx77|GiZwh!l*X2S zsm*Sx0hl;2Ef!R5Y{6(glMEL_pnT7|MFp}4zWie}!ww&J*DsF-^;*+)>JE~rzc80^d&Nkg7Ko2r++m3V}$-HA*UW=fuhOwj=FY}wX{raL(~8qvwA&KNBdRj9S9r=CjyP2(_8T&YiHXTsAY<$N z3bw)m>WvSM4v%+Y08^i28UVpN?WvrQwIRZXsy4KkvFhXLjSy~U#Gl4cUNnek+!RPq z;utz!U89t`k@Jn}y$Hy}5H<`r@a$>!wYjqy-81X(=5LrQRgblPe!DZmgb_@G@b3^;J2xvMS)Wo$Ck)e>CF zVXURL5#;NS$F&t z&Lq*tT+3Zst1k%188NFX0r#>mo!+jk>22(kht7x(GSUkO3QD120f(b6mL!Tj81gL4 z&QQF?Q)xPknrZkgW%ID>to$r&E*FFQ_r&#uRU(Wx{`xQ~m}a~S$TD(R5IjeE zdWit_wubaym3q~dwFZ6HLMqilDq{-7P5jI8&!EJky4j<;+Oj&^l5QeDsJi~I^8D#6 z2;VNzw{a}q3ciC<75^VTUhc1g@64ifOfvGIM9pvUDu5 zwFTp>n?XeZz8E2ag9YG|g9AExdVb$$cW38%5^l`R8xJ;#q=)aBa+Ln>`YsRop=bz& zpd6pCsb7Zx>AfR|dws3-voxoeX{~{I+aq`p-o~70qz#;CLcz#Z7ufyuR`@`HJzj_v z=koJUQ46kmG#2xV6#dmapoU2;;c{?wf1i>m*W3|FP3ypipQ=`XsQ;=qq%ty#AibM5 zk>p&9JR_Q{cl;I9JA*0DNgOiV1L$p*QS=!N*1E+pUe~C8#!h{Humzi)5%&?ouk~5U z{F;ihaMme5RH`x$6i9BqCp<(Up&@+g9n^$2Yj$K_2J4X{z(OD;$fNc|lfcjlX2=$C z2N3|dC+8xb!s#PKoQr~+`@3*+bY``!L8MP=WFPIvSKF3IcVT-6hS4`>FhSy(=^)|U zHHN&BTK7edLvmhxU9$hzK=Qf$B(fADZ6yEdK^O%W)r6awS1MBgiO?$o;k%D8)a#57 zZ4ICP&|#40QE)?|NWU;cPLMgRW)V=P9g?l;Veen<9y#=P{R7v%VL1GQksS+u{nxQe2DcCU# z2IBp{G^qMLtmbkt)=j#$z#Z5@4IR6RFEC1}sLx@YSWq=31R}@*8{1AY9n;)aj>wJ) zNcwJSUV8;X`Vj)UE&Sng>}>=piuK-aF4oJT2W*n)l^;!shMIDr?WL{~J+n<>A)wF} zzEd)GSDridV7PS}T`M=UH;bojTa33(WG-6t$te^WtM|{U=8ES;6SqOeaLgpSg=|)W zV;#Bqg+e@jVrRSru#NxX07vs`a&I4Y&6b zocypcK~zna@|ti;+f~gHb}b9;J^kDv36BO6*C4Z{X_OC2fQGidgN3`CZJ<~Q1$RKQ zwfklZ-5lqJNK&aM8+L7RyBT^ww~@RFMm$3~5q!}1;Ex)!xLgygltDEoIuE3%XhrIa zxTE%$raWF8sV0FEVg{Lgsx%!*+p|DAroY)9(hLeChNVL#e=&`t4TMcs$Hx)jW%`Rq zD?g43b3tKB%h{7*Y308mvIdySG&cg5f^F8qE_kWznl(~`S4JYuO;T$x-iyxe$Fso_ zw0Nx&Juu*}L6}W;!(sbLwANiQe8Nqf~y<{=Ato~2Nw5|_eMB3W@PPnnh zMBUbx2K~EnzBT(avooW(_c&*OHH2a-<8?k>w}Qo^5<60;e^Fztryvle%;xOeCC2gs zdyZTK!LZ5=e!Ywa_ydu4ivt}c;4}4U7&Uaj2yc`3{C!Xc>mh7*b1xLU@L$jYIcm8P zw9<_?Xu&v--+*TrG{@b5-UVs+oFz#XJzVTGi6~tT{%I?GA;IrV9hGlRJ;3O1p9G9n zQP)gK-(grX2*>hAU<8P+WDBz8(0ol^<%TYj_cEezE_=JI>PdtYEec%sT|xA!p0{;) z^E8sS7!vM2-D4&R3sbjzogcgwHIQ?6ADa)=xS`l^vWOc*Re+SeOmhQny(*d!nm zP(8~}BkWrADN>nOUX@$Qoj)vO65DKysKJaq0A4)mbGFud53@T8z;QYeOzc@X^YAZF z#kiqGHDJmKrxb>}fo99F5*aEt>D#p8 zZ|jH8euq~^m}U$WkRtyB_TyP!Vka(B`B+HTl(LW`pctEfuka+uYuxKpMwd+hV+3s; zY{-eae}~^}9N{+n_r-`5OF6(Bl?y`_$Z|8)2<35WvW|?3G}?PrzI2};d*rGzBDrm* zh18@S+$qW`wXYak9lJ!i@P(w=2DFmt%j;LW{qYI}m#3;bI@Z95%uvnsi=AF3#-GatV| z=InkYf>Ru&dy*U9OeSl7aape4FDgG9VV~ zPR3i?Oauthks;_7{MH|NhHT#qr}BOorQcr_RDT^q)b?UEs#d+F=63AgOAw90JIIk- zz*;8E?c1&K!%9O%fk`na!39Zfp)@G5B-Nzb%C@J2j5*-tH7JInnxy&~F+w{Sg;_#Z zB7!8_s2&Ko%r#;zb@jJ0re@{)ZAp@OL_qM7JhkZ>5p*FSN&rBx;n7xCSNHM~y!?+E zsi~=hf}r-eup(Ig1h_>8vpQjHqJMKRdRLbaMM^oIGXxe=1W%q2O#Nw0Cv1J*=^o*} ziQ+I>%#b6V+4v1owJqo2<||RuOigr=1tz-6>M6$~p)yMjz;Fea+d?tAIbBH#I1>t_YR1kk!>y2RdN|N(y|jg}FJJ*F+~iNH^vY za7{EyVce>J7X>Ng^q;n1dHrhMrlPGB^V#s1tSjVEngP03Ng!S1-->|A=FugUn&C+( z&U3GX{7N3pySerm@!ze_hDm{oNg-b!;kN$}0IiBqdCl<3$N1rWQ3A|B&N?ChQjC!6 zAH90#P#_CEX}3#m*dae(Z}0vdo{iPtesLb$M;>Gt+N6305?w$N>OHJH^9LToYkr>I zDU~AQ^yeyrCu{Gg4xEDXuwTC>?=f|9d4t2>g&~PV@=LwX>~{z*3#c9t(wjfdqMc*~ z;56<5TXk3##J&`%cF;m3q$te30~_6(!$e3-8|#N_tihz+)}@T#zAPHj?cEo!0!L*(WnLHxn5a}9~(?DY=aahi5$zI3b=p1Ui+~mh? z_wXq=*g6e6#!&6UrevUEx%dl;Z@1Pwk$A%lFxdJ#5Thl(Yddg-tcs)!4+?Id`ve_NJ7Gw$I8lMAHyHFcm0PE}4xY zehY&lND28+ag=U)t3p%|S${cR_icc3dQPxtxoJgKbZG+*@Qaet#P~RDIGwK|2P2>~ z1ED3nptVqa=mjlIq44li`rM1!U>xIjiTr)7{>u)n8O+ADP2NSNSfQmV?w$&U7_c~O!0qMB!S=SmO^|~gwrLPtkP=^EJ z3?zfyJ1-#eV8P~Q>6`$l!g!T3V(s~lMPz-+Kjs%%X^lZ!E7V?#V1M9tI3HEP^(x>PZ0HA_Ss)7Pmr;eW(J3-?-|h?dRQMqNedJ!QWcq$jTu=db zos9TL$#)GCyo-AzX5@nm-+;0U0$f|pPgV4gfJysNQBtj2pYGaPj`*Qo%Lk2+3sm}M z?Xme!14a7_k(PhH5*w4M$rPD!uM_QBc&a_NfGk4TK|5d5Q&T#+=e{X!px9$=JzDr9 zXj^C(n<=qho(1)bDt{KG4Ed?Lty=d@2<_)Qf%t||N0@<^pD@ z@-Zxb07&;Xp0-kwS|E&_OWX=Lvckz!@Mcx;R*AVv=uYBHC)S(cr0{8$dF+Ph=SHZL zWFv`KA57b#1avRpMqu*md;o}z<3pi9SPp*+8D^RJ_wOGwUPS1OP)=nT%9;ic16@h% zXaAuOUd^{c6Zbh#5&QGzOnJL$Us@Px)vVCe$H#8N{YiIx8i2F>`W;M6M(V^*&y$EF zIAN)N-F2d8k4VhhM4@&gj+|8-8?$S|$f-PLPDWxTp*&WZudYA&h8;SOe%IW~Mju-B z%zzXERrvVZw+iBqBpxZ`z$TgVNp${8*2!OmW(3IAlCx5=wGiL{gjrSg>KN!yGttYx zjSL3z0(`gdKhN;sJfedGsQ1uiafaVJpXN&xAEPoS4pa*W@C)*AhY0r36jHx8<_S=( zQ#Zg>LLJN3na`X&Pa<1|aSL(*$cd(|-Pp!R zE3IkSrKKKygwERSNm_~^FZLvSJgkHe>MZCD@p>#^u{|RA2EG5e-J1=|&P)cUhmYHZ zsQ1#Tc;@x5>|YJ}{r2PcfH#)gL_dY%=KL8%K+nufDQGHKchm0Fo@;@%DnK+A_izjz zocHh{M*2R4R#-sys^Tfe^ZmBqM4}Ycyo20xAG@Bt#}QMY1|-40htBXL@B=Jye{|t* zzLPW|RSIQI&wY1i7umJlm;9s;LlDmWmChQUDO?ecEv`WBiei_4m)#MFiSxH65xok) z`bK*?0*{i{7ECDkYrLENx4x=Z;LAy)yx%MYw`~ju%ndh74tr`0W8LM5WI^38ZE zug`~d@6QYmOoQRYX+RWi8H`?L)%_!f9@Pb&1HIKSm-wz+r33`9j4c%F7g_7T`w zD~KJ=cDd@1j>*lEf)7B<0svAZB{eP~6E^aK?wt&5pWboqLyzd*Y_u|T+z*P#3(fc7 z0tYv1==XkxtjTp_Z`t$T>?D3`hKkCbCdn_a3nxE4ha6smnawd!X6eNM_PGwq&Pv1A}Yc{RL_>x+IL)E|?NQ#Y584zQ0AAY(ir?YKos!P-Cib+LK|>APp~j+|2uUPl8v^r~MB6N95it*Z+d}js#C_)`B(y z-q3xmOnl+=V)aIjgzT3oST7Yu^@s1`nmfmaS~u3uMTQZ#9@LS+&a0OyXb}#3AZ3iO zgziN=xsj>;Jcpta14KyY20|v`hAN7-WD|~>n>?`p+pml-24Z3+P8RyDYtEz~sz{A! z_{2~hX2>iz_n6tp*i9JWuDNwV*Bi@+0@;sxe1hbZK?T2|0rw&%&>RP~=Xfl6WYeHu z^oO(NR3G!G)W<{MWf|m>Wx*74f9IMR1|+j_zk*!UDZ2rKmdUQ1a0Om_4}R|5+Kdiv6EmxIm&< zeja_UHMkm#z=5GiaSGg zIn`;Mx_W_tK=v%S?zBPdFJHbm+4}hSs8{MZw&*yW(BgCARjI0?`aylTQ`6GY zGBOH|E-xKZ!2`jPJ+K0EvwWovu*(0g0?<8V0`uaxB=ne9S)L3Gyp39yH%YIe6%^(D znAVo|kI{V;!}__nxhrZvuL$th|L*n*KGx+xJ-vQX_o{1lQ2a+QH`CWJGH|Q`(-w2N zSSlkgX9vHqfHe9FVSFzAKJng0!Bc)`D=qVSUKKexnPgoH%uQ|e_171hJsa0BkD{xyb8N)s?A)BR zG<0TW<||GJ0ux@um>DA@<8~~RMX%k0jUe=s@AG}9&r>nX7o0L?M&$7N{2-siG8-hx zpHJljx=tv|*ZHC5G2kVGx>cLHCXk#KyXw9CPx-@ydYF=#$n9Cs!l*R-@1d8G!NKCH zDppq3{RF3Ccwc``Uf!f=>i+$IQ%h0AygWQSD%?VUW*r}@ziDU;Y90wW?EnzN*9J#M zww-eG@=_=d5GeX^l>uQeOGbQr{7|<>wsyIiwY)qkB2iR7%!yTMY(*>D6dQa6Gv02Ek%Dz{Sv7JBZl$V}z_ax+h#o=Z>#vmrm- zozuSKrlF?(%K#L<`&%$JfNIU;bGfMawTZTLD`m3j10tk(IRDc>a?ITTgciDiL+5Vr zym-w_H)4Np@1N0VQo&>#*&d*I_W5dClG>D$3iN7WVIiJY2?|zFnw0Hne)%n7Kj}0s zEhR-N;2gR)H8_^W8=n+TmyYW9cvwWpVv-+`+}u&|B-YxIYovY8E zJ9IvxXS?dqDL`%T`m4n}HxDcr-eDN>2?=Ge@n*ocm`En3r;|JeL}1ln;!B~CCI7~e zH*T)@Cd1E_K=2sFwSqWUw0Mmc^i`NLrj9CaH(y6YYaSR*7`y zzdcOHnHH|e_t~b!;5srC(P=v%xiq*j!1g0` z)#*@6^16|Q^QY(Aph0=`i*(Joj|pp{TZPeoQ9Tlge!SgIo8rq(@5l}}G8=7rG-uC z-R>Y%2>pM!3EN*`*OaCnGtiSvsp;kAWoT#!D>5}TRaA^xv{|b&S8{W6`%!n@8PsR= zSx&CBxY+&aw22;e3{^cmJna3ZuD-v&pOlnjztUWjlM?{94T1$|I5?baY$D;2Aig6rA=n_S(tr@AOmvq})9QafA~VHg*XwGjo({VSYYDc;>4N zB|UkDfJ^v%V`C%C;v<*6E1aeDjL42rR$592L2^LO`Y$wwOp_%4JVS&PR~E!Z|6ru` zxSO`iYeqw3PVk7W%6U%0;QnOr8h>6y56o3}HC6gDA-*(o%`}v`f~mE_zfmv6~G^i z3*3tR-t?^0Jk0G(@wx3*(%Nn$ht`URo6Bh~Xco)b>WG&u|r^ zI$Le~3u2IaED*i)@Tbjm|0y>52eA|eu+rvEPFMedde5JzurNbWasg++?O^vNZ2I#_ zf%7+kl7^N~x2I^T99Vo#JA-ZKoy4T1K6|5t7nJOI0R%@BBZt#Pgm)%IT$h)@#skp- zi-PCv@7>9L?{gf)5O{2tB)8`E{a#jDe#D|-)_|2uijx-e^YQ}OqK~6^*Wk2<^Hpl6 z&930VL&>CcQF~(aRk_&BD&a!z7oZ>q%dax=g+)dDZ65#39H^`9*E`3@$JOt^>ECZ>AQ1DiaA>q5AhgeO7NX-&aE^l+CSafIF5PW#&6Y_^%KJlzrx~qzOfyOBn-84FGUaCSa&kL?Y&A#5 z_bg35TADkiLk#3PGVgv3nNT>q7a4D?1YduE=Q^eNIce3fMdIn@mBO7u+V`O(5nCIi zH)~8Z!Rl(Ea5TDD4wrJ?SE9t=xoD=nMZ4~Z>SW=uiMcy@g{34&&^(;Psm59~J!B`> z;-Hp^6e#urFz0uaD!1GXj2&zy+Jo&i+nsE8XhdTN{Epd|LbFp9)(GkizU7p=gILoK zE_V5eJWxhYGh~hVX$Ha(rS2c%}f29^gWo+c`{uD8Z{amIrAp1M#G4Wb@Ko zVT#Xq03%T;QlwUu$t}VKCorau_;9fwl;|2smZ${VSwUt{?Vs;z1^z`%(n1&8So7?4 zR8pj2RI`z9n=AUO2HW`aXS6z`k#3l?KJA7qWE8PJyg&Ze$qAe#=f8*rz8WTzJE>V6 z#4nLGBNeNSw#0=0uCAI@68%`ao;f@;7q`TRWYbE1_Q0fCE${YGvKw8N`>!~EhGb6* z=69aK>PNX&w*g#f$411`x+j+wV8V6pe~NP*I{2%7H1P=6RL7s8)0p*;lGwcKxh;i8+18r+aJflAs#dY z{0Wo@S9O;i2IE6GGwGrN2FF7-yXmOj#i7ZS;(75KnAH|lxt*`QoVA^Y*Wt*@A>rkP zOd-|SOfRBtJ`PIZ)llUD4UF4n*Ve{OrlzMQTq2cgzm_a8v1fbiY7x|agDrJ`A%W=M z4vVtPHlSve(cOdx?rbbkQS?^{@U4`?ar!Qq7*VqY`d3%fOc!6Yl0ml^7FA@`~sA(z|o8feXyn|62XQ78mCOM)6+fLyT5lwch!;DEo zt?x1DLxPq0@CVs&rqM%oj4r#8RBXgFMN~Cc}rLhpzzJF)${j8uMC56~9i8N*N z%TcxlLRiAq4<5@SsV*`Z+=My|!u7a>1yM^)$!?X9?hs7s(1fhm{7q=STS z;9;0t>26l7Ot;LVtoN8%aT@qQW?!acQZl)2-n^O8aD9}67c!Yl(8a7wX}pT57d!~l zmEtU~O!MRg1EzDXlmf|4JXNzq6eW|MQ$(^P#t%~hxklUz&X(;Th2ZNr#mcR2@r+lPWZ6SX_Au;H*rWl;^z<|fKQ=sMA?Br*UV?oP(kK?F$nw@(Z?SA<&jzuip$fKqOeGXc17Pg$IRq!Nu*Jt8GH_E;QW(L+$HvA|PJDbk=^5n=@%s9DO3Tj9WhO?(7| z0s)v9oFsYK3qceuB+N#UT4)JV0C=+<<=Ux2)Jvt}nJsnEFfnWBT2AX4!q(Qdnp)G% zxF@`(qHn|#6vV<(39q?IOG{VSH|km|ts#W$CM0&CC-mzLGH^@j^SK<=rR&pa4IzXZ z!5AyAwSkaD*O>kb+`2yRT3ZO&U$EDJG2IjD(zRNxErjBo(p5o-yIetRp63Vol~25zj~!ffeL*I_1z!sH;F2@Js&GFaKiqB6(GR;mPB6k;doq&i}Tzu5}?b zgr#Mc1Bdf+&ZJpWQo1uTh;h5vYPiK&#J%=-JmL-#2*pYFH1x;3Lid^!KA(SnH28g9 zg2YjZ-|v?r=L0Cf!BRtq*v!n#sHmv!?ru3Mq#gT@!rr;_N!a0&kwv8yB3^;8yu7?L zq`bU55u->AVRLhHPEJmCb~d%(A?4VR$eW*^Pxj*CVmT@#mX7S-NKY=MI{If|aN);b zG@?&JedBYvhI~>F(KYiud#Irr>j8N)leE4mlT&)kW*M{tSHXT&95pg zs;+BtJA2;SvYiAbLs?0A`TpIzU0(N|E$>(t{^XOc8!t74Cr=kY|6*$78z+a(p0&or z5EFG`e`!Tkdg`UBn)=-Aj7t~eVv;i}stkpt6=zQz$S*1j23$#T=VM}$2!x zRV2qnCuJ6A<>WOt)yJGZV(j!9b5mo}a!yAauQ8SvmzG4Fjw;E|u4`(^PEToQYEH_Q zK!Ol8BxPk~iHV8Fj~|bYj+UcBI(Xvjsi^qMYE%4$OISFBAav@~sbj~ERfc|LLwa5@ zKg8ALlk7z3yC9K~k(#wYZf>slax-|yQ6V)pHnJ=v0F9&(k=-qIhfl>;SC*7l8OsXu zj5S93Dm6W`y52Hi@7VI;?zE)1*mDub4;?yqA~Gs6%I=o_&IGEht)JXkz%qh#c^v7-6y#{ADVV9`C7sUkn!k9((ta@1PtN5)d9c9UYsLT2xkfIO5!r z5W)|y0LCHvF6ER4!ib27{rmTWx&}gGsQS#AGjVZoa#TnLg8`q3GZY_u55)!IP93T+ znd4%k;$kBsqY{$iBV(hJ&YVw;ij_utOyuc{@i8%HPaHjPpvcr!lo7x4M0_Y?kU4_V zVq;?gd%m=lbhYIuOA6^98(&XjO=Wgok=N^CMZzgoCZX4mBMyaGtmv!JbtUx>?5nG5 zOH35j8Cs6Am_j~QRqlbJoXb@Wo#IxyS!0Dnni`|g>v40(ITUxAR~E4h3dWgOj=Dn& zR*K@h^y-nm1@3mc1|8j|mfle1i$tsNX4|%HD=8_Fqe9wu^b`cfB&MWX&W?(|5Dp>q zvdl|LN)lhWQcDdXtJYn+c5UCj9S)VeLYFUJK7IN$eljgBO^ynQYst#WvRbY1)6ydE zMcHJzTyAmMTwbV4WO0^PsZ)G@kH^ih$LVqXBIDrTAfA@e@cH;d5xIi&2Q!~%Y5c%C z*V)*_Q&Dk>H8hz;yauEtrH1g+35wXGsy+5+5p+`8YBq$yVDSF|HcCczMhGQ3CZJ@K_HN3wC0^##sN0#)5NMv zIOvaHGR;vg{QJbjD&f6JgJu7;j+brcgC9DrjH}!`BaIy*Rhy)P9=G}6d7Vb2 zM`m30!^`%tGZ)z22Z+U7zRy?-Vx#5e&6X@0}IU$M0&jwVun;N`Ps07b>i6&JT#OOSv7+ zlIKraO8=Q6`7l!=L8X^=B&?0C8GBK?_h(h{9Yx2>p`^tg!IH9T!i^p# zRZ()y07>M}W+I34dRhA$`yqKXdVfZzypTOkcx8zMn*i7;N(%{u{GYcgyjUJPEc{ z%B0=EEW#RV>t>>sd;MWkHGb}Yj?2-5LQ@)VYy4MpyYeizKV~oRWK?w&CXt^vpxJifwIvG*t$Ohr(AliHhKa~ z@||UN{59p(0N74g*1<&n*whEl9hCG`5NW6fKJQPqe0+Roub)jLTQp?hwO!Y2(UnC+ z-8+{d$jSVHS_BfeR}Is*!m+pR&u%o3)lpt6+ofZ*dvMdmI`{&TE6^-B|M$V=_GJ+| zSf!xw$qdVl3Vs&Kk&QYmx}^{6WRHqc@tspkvi6Es>n-Y4VVR!B!a75fZd%2~Vp%T;p4fxe2ZNEx-+gvlfmWf5DCBZKL%>$WFQ`6_J!hus<(Cq{u6I zvqjmp<>ts-dvpSpyez8>BcxQb5QvBuT?PY z?r!A@$dp!Ump8rXOA=-?4IdeoiCl_HJ76n6;MjRAN}jH;ZVltLZdFlKB5J#sCCDb2 zxZJQL?9B1e$|02+KPc_q^mBg23rSf=5o@i!s#6U(*x1y}z7l)Hn4CECb4;*cd zd_51&3{ozv^PJlJs;BnOxS$r>w`qGgk`H{UjjXFT@dS1If=PE8bjq&n?X`$jAj(gv zojNbC0C8Ek|8wvZ%`TvKkB0Z_@@2l`KF+)6qHnu^BQjaGYnR*-7L z{*yDz(rZ>JR|;K9&_>?Hxh2#kQp>@tP8iNuqP8`zw$GJmS-Ba@kT&bKIoLLNa<*Et zKr5FGdN7|=Dnb`^I2)@{?P9H^NajLaCvl+F@&*n?i#%La zVNl%^1WHolB$?awqiEv_T$GLBbwDg zkthF4j`x72p|E7SjOX?XQrE08Ef0RDwK4lJ$uMn3!50HaSD~*4Pwz+R&-q{2QdQuv zwzoZ`JpVQ?Qqc6MSC#U?YKPG}e)mvRM1Fez!!MZW9oNHehkY`y zBgK;sCgCF!0p&(X+VBUG7WwWuUa2%ASlLZpV7)rHa!8|gRl;) zrtFk4IytQqJ{2l~tzE_eamZmGxI5+1h&4N9hG=N;HRkCRz)}%$jm7ROI`^`ZXGw|V z#VtH9O`B#55PUmFHWsJ*|!mC*G|;?#_nr;=fQ5!yf&}C zr>J)btCLIE_pAEa?E~h^S;^*ngY$apWvY4HUJJ*$j;ff2<+CQC{S8a-?JBUsels5h z%$&mv)VR!&B4qstapOCR`{ZQ+tw|I!g5XJicvmx<0Xo0ot3}G5ahNzn2tsW94gTVH z+hQ1b*0H>y@}Q-j9YWgR%G?=4JXTLHrjEJxI`>ARw6}J)ZQmRGKK$;z?Cp(v9l^JF zcn8hX%=z@0b609W6gNdID2UZXYOT%L` z(A9j2R@z6uq)ad2#b7^kGMf>%E8y?HYcMD_ zL+M-Tcf%{JyatHMB`gsQfo+SWkop>nfK>#SYjBb8OKS;3Dz&+gT{Hw%M`%)EPz)MS zv}~!#)6QnFHm;cR!y@Z!kUy1iB%7DN4P8}AQFa>1bJ&@1S0DFJ&&YmN$~Q+-nqAa+ zGm{1JAAnh*m~sPYFoDu#rk^W+puu@f>iT*UpUTtJ=QN|Mw!Pa5{s0Fi%xc4a=Nl`B6v?`Z+${Q;!IIsF~PD+x+9^dyKju<`n$2;tO zE-^_Rb0`WwV7;BNIJNWk&ZaSKepnbWBoako%e(Pvq|M$C-y z6zIVou=5L(44;v^Lt6ZLnPn`CcK~{NGpVnz+NG%!>Sj#TLBKU){C~&FgwgoGi!EfB z(BryGX$5>|K_AzEr9BH61<;NL#Vuz`Ru?g>tp^>kqAeH5rae5b0k%|0TTmf)GO!`) zZQBbyrGgLEGG0-;IOrMq;+$pt*2d@BB1^;1X6tK>9(a*Bze=^IKB4~=M#r?yQV*34ec5{0g4 znQWY?vhR88GCb_PJeZS3+ATzVF8fVNA@#kLAuh3Detjz=!Sd(@ZY-6Ko5^frKxuJ7 z;RO~v!UWHcD)Eqfc%$*m73XiQzZo#d>D%a zvhkRplb&vN!iO?_vnNVa9WSEpI)46^s}6?ZP%aPse(@_#i|TyC&`3`PK-U#NJWi^- z+(6YlC5k$AjNx-6Pt% z)ye)Z;$Kj^oY&9Q)#VTUiu6$%{5bvLWgMIedAOL?!pshO&=Pl>iViAWa6Q$b|9QGf z&bU9~zWn>AR?p#7YUDd7OlWf{`t(Jn)5E8157%A_EqX+hn-}|R0#ZFk(>~JwfJd4PNS`g zukUT&4$yy7wJR{2pp|@=hvfy2Uz>L4b!_e&L!Cd)ZbnN4HX`5|;hBY4OJB_vF*}Ut84NI3pK~JKuhJNW-;nhF=q!NcIttgT-=g-qQ>sTeuoO6lLN0#bin_HSrWQPPDd(x}{u-TBxg#U{oYQocZ zclle?Tc0At0ZlR7kZ?)fPe=-e+_ku79goYQ&oRFBQ0$ql{aQ}re0LJ3F~WitB;*7f zL$6Y3$?#k!jc1KQ`8&%i58hd#y{hjyArG0{ya@+e8c9x>W?<+|7_)l(rD*tY_*udE zlJU#PYs}KlNDgM(rOK-t0vqMcli}GxPa_pqKp$24Lcge`ZHRu^XBJr>!!@$jRvR8@v9<0 zwD7#tHf&tTjXb0!+R#s{`WF#nE zWR zuw_Lm1TQd|6lFF?>=Fu=pc#A`ZDu{QwFDZo_4CdSxMeZ6h_is!$WdSIZqa1mk&8*{}N^|@vt0}P|0YAp3 zdq-s(*&&aeR8913t|{hlEB36gLBjQ+$9@yDtdYG7d5!1KU@6>=9$t_M)^#Lz_-k+} zb1J?haWMJjznR@I4MAD9>nY46fnl;i4uF;h@2y3D4&3|h$m2Sc3;21I6^`l$ zFnQc)i)pFPbA}7kd4Z{7FShH#ki0UEf7TB>gM2(zo+0mlcPQ_qd`7*AD+_yJT^I&@ zHin}>QJvmo-?)U{_FbN%n2FWb9Me-b1qF!rQz@dL@<$YI<{3@;#9Qv`1?}+nKQ}te zTa1<fJ~N-Kg93c;+{71?MmQLwCA=chdma|91ZZAzZTCgm$}jSbSU`Nwdbp>n)q%I zi1rEKl-y<#$dj0UqvDBAQzEnQx2u1}zSiAJ_`t7AGxMz((ek z?RF+T*Vz_gWfx~`SOw>16gt9lXIyjbx?l3%CI43&rGc&UqVzWv!CO=L>9K`3G6#_h zSosd4OL{&E)5TAR_|X{Yr>X?WAuT@QBhV8~en5I2Q02pKr!N+eWIfS$@Px_Iik4KR zLzblZ5+5d(%;ofenEB}VLixF%Cg;`ZD14 zfB~x^!>!9+^}d6NL(gAfWox91Hv90d{&yvm7N6T0khUD)%SBw(#}5!Z3oPNZs`yh= zIkzMCu(Mo(!<|B|TX(vKIrM_?GFHuJhS+bdRCxe~jpYLHQYwvc)<^+$P!-|Ivt3IS zoTUnYaXRb?VF8V+(ocsV)E!#yNJ3Vw0Qx`pMDbIdsKQ4Je+)s6t)|af!~cCo}*b)cmRP^*(VZ21!CsyHkX?c~f;F`H}*eu(OrN zr4S%y!@qSyBP(2s=8X+M$`ADMCt!|jrD%2mYux3qV&u`}w|?)}euf?A&?jEDa0G9% zp94J!2b|~F9GcyonXyl5R2}A!^dmsGC#oC=yayDMq^_PEP&#r|SUE|5DT-C4`Aj^A z{G#<`(ETD^=}@%KC%BN~mEL5PzKXUPWUzlaQ(;{9Erscou}}=;P7#v;QAEFn10;3` z3?8ij!-=>tGg`4uImV(xUk{u=_u5p0gqt=!dZoPeT#jz`=)Uc75N(??-{31AbrHZa zsKv7UaurX^yEFo<-H#hzvA#_6rqGnCBR1y{IZk2z>*0IZ!C2(JL_Qbc$4S)n3uZig zgS4W}@9nzctHosxy7gd;dX3anPc8v@NoydGxE5-PusH8XgPM>Hbk&(KTKL>|R4Uk? zOiUA9TbB|k4=l6NybElRl&iuhV0n$=*Yi^jjh#C*{*o*sf4H79arZcbg2ya$9|3M{ z!6XhL>Sh|9hYRX46uIxaOLVg09sFMUx+=)=d8`4GK!5ab=T8-?V=78_HL@c)gO*Fd zL>Cixb!E~4t~yf!$R^_%xoI`;;ZK&* z?p6qzoz1t*kmEFWB01#!G%ka_v^#M<3r0uti?ke|OU@K{ep6#r#4qQf=p5XZ*(E%$ zT3APETvL5?J*XscLG_g&vIZ%9+gv;@q!{}SBHCvuy)RR9jP@DzyD)%5A4%P$U65K%Nd$GCjtNNFjQ)#V!BCRJ5EGWU{MKp*HlED43dI z2p*oXM_RS(Ky`vkYe#2NtQe!{0YTUnPokEC5e||7u9gH}ByC_x8(&`W0Lxz#dgTz@ zzR(hWGp+Enfc0dP=PPN{&2{V1o;WwvozdHp7O~xaQcO<61v>k)aCpr}UceWA`J#b$ z5b#V&mJfR!-5Xa5aI0hR4euoUd&7U*Ob z_mwVmB8=GS${rk(c}!Cc#42j}_4)`~AZ!DD>9S&6?w7|tmpqslYhe+7Guj^5rp9W` zEZDk_#OB`=bMM!sLJk=%hbeOdEuRd-? zTwYd|2#ac``OY|J`zZENLB5y3tJ)NAbQVj6GBoBzl^FQ&>#s>DzC4f?DHL9%j-f*@ zdUCg?;z6k|kS!*U^rplRt{bv?l+)q{ko~hp_F}M1nrBTJ!gn#&Y?u~6Okt8 zidoded@g1x@|~zFQvcd|@)-3!?r(^RUCBJ^5*C?UihA6pq$z$2I%U&Ol}<@> z&`84nd=z`)rAjZ?pEXsfzTKh#2Ec@uDn1l>WcZcq_@!q5>pcHk4P6us9fbtCuCFVX zETt?l7@LX7{$<~xR<;8vgxQw8g>L($10%&Qy> z+9(Pl_>Xpy+%Tf>7x)2^yj9Duuk9PA`$~o5`>>=n=D$yHhhP7a9~|)#>V%AS!BvV@1M!%)K9$91O6%Q?TUmx4Y)oXYlsJ`M|l=ILUJEXtlozIE44py)J3F&k)@6^BC- z3T=e695tv=v3>rbE{skBe`L(oi%9?)flwmVr%MUY7HMS2OzhI@X|NaKwy-}OXLtwo z|E~D+s=mgngpskgCyap*k+r0>hc2RAZ-FN?0?1PQlFZ-dQkE!p+wm>@V&ZRDp=<$8 z(+u?mn9ACxO^-AysxY1k-vYPnOM~If z6HmAP$_y}|2F_% zeK(M;gi3j%6DE^=pO0qtTl^&nD_JCG-;Vo@o1ba14NI9W4_{M^6-AI8l|xgF+@xt= zsYuTR*wt)~T4IC7nrwAy#9-)gK=Z`RDPi&;^=X4!xKxVQ6%@S8feiox#^JALC-V|L zxrL>Act;Cqoz0wkUY6fW^|wF-b;)Bg@u?+VK&Bja8&QP0jo>1F)AK4Syn4-lQ!>b+P^(8Zxr7}0l`4wS|{}Slg6EWMG z(?giJpdLA67Y-WZii)1=nv?A{D=n|bFH6PJB63{{UIF>OtFZuav_Gt~O~><;G_fe- z(jdU)i_iZ=4dlGb=T(g|R1h5ZE`uJZ0$Hs}5RA3R*93Xt*6Yy`prq!S$HpY!e!dA| zdb8S49mo$QXaPPn4U|>DHrM_2eJ;8L5%mB``8+lW?$JDdh^p1iBkFsssV84n8x{tR zg|X{h`Mcq#Gbds`7NPhO+HHN+L{(oqrB&Z>=Zy6OU%mk8+ypvh?ILh~^ zRKfs?cT!b=5T|`S)tj7Wa0?Xn*StJOm=5(m%$)WvnqUR-{k1f9r6>t+_Vd((ynocx z*0sjgp+EO2$OXWxU)tPhTKY)W(fF*&mH!%YV^LE5#IfJGdB9!)vxpTcUq1ze>A$RB z`?$-A-V6P;>VBLGgdpE~P{M!v1lJj$Ypnlo4?8-?b^q;A;(s1dJPCl8|BpEl8>o}b zAv&`^Xha@Njk6S;Y1uhKu{@Xlx5+5OObL0>)G>j({Qk!5;+>SEG`VOekD8;>ruvOD z(}zFK7e9qH&-c4DdDb}er3QRKskXWSsoA;LDu7TqKVLVFq!pt9#s_OR25BU( z7C$Xnci`R#GHCO$_j2g-r|KY;YR%uH60fz$7q2zq5TSVBKhbOa`rg1m#*=K{hZRPu z>};3>_Jl$o^#AukwpSPhHvAX9CZbet1DV62Bh?(3P#?}&r~R%)SrebV$&mJ|ICkk# z!P{&6ra;)Nh&WSut4x!I*?+_;r5!Q!72l$2r7Ji;ao?5G&q5;ef6%B(WkO2?3b1D@ z#gk9>C0^4QT3C+3dqpV~Gx3e85449b94Cz7cF%}LLo#?*@i8_*kE?Aweg*O+_NZrfPWpcB=BF*N51 zn>!b*iydz_xn}V?i0sMjrXSm3d_xo3ma~7JJle%}@@;MO%`o*F?*C)2x>R(jx2gC% z&%8QYEI@IEZJqrz?!^}{b0ToX9vDU5J|E3vrs`U*S?;gf@uxCZHU#}Fh4u7`iZ7Owam&5wOOdevC!)pD&F-CaPojhOQ{4k6fr3wbeij^`_;>y9!5)3;AlD zQ#nq<%=!;ju)PLBe0HDb-%ba;#ygn(im@p0WlnjL#+$|~S2S$Jt=)Y!T!#sR78*3h z!fz%EGl9G}$K9b3f8)}o{8QNvX(R){+_hyd5G+j>tz`cvm8w*}+BMVKhH)c?uFo{0 zieg>d;6uhqLGQGOq`337@DD5vN3<&(F~UZ@?YDK2##+jii#kArvEo(ZJg+r}R;?-7 za&D|%kcoUr4FK9bJJ&)vt0$V2MCBdcL7yv}sa*qX{Qt%b@d}#i`HmxtzTxyje+Z&B zO^`-%_TLWxz~aR;>Qo40R3++qTxABviT@n zH8{ZWe+5FhfCHR(1yCD1F4}7PM{)l53J7k7#uGP#D_on)Zt7VP7sB>oh5x5cQYfPC zH;Da;!(ywlR0eEX>&l5Q6=hADd*=GS{7ex;j}dT5c6WJVU0{PX}UY?SBCDN54Tf zN>*ursg6 zGsgxD$-+A>(?^zb-DZrM!%$;_wFKqjQ_(K5nT;w#eXE-qW1|@Ak~#*!8C%P1G{1(pl&Vr`zY|ee=kpWyk0w;z zPJ>F^N-iH<1%tB5Yn3+=4>2*H2dU*6uvt>p(zsZ~q;i|O!{{)SuUmye(2=j15ZJ=i zT#HMMT_ZZj&2uxlFK(7QrfK5Ce1NaX+(EqXswsGMl03A)3ih0iILcx_PyiPP2_f`m ztZPZ#0SfHpNXhB0p@k&trn$KlP91KJ#jlo}nOmmQU77TS0o5nDHrAc`Mlpkq0plQ` z!57FkFgm?wvY=s(OuA?%_l=iZL^3vC$~r}ItgCOeDM}H@-4N0?M2cB^RwJjrU3jf> zCP{Ziv~@j29nz4eFyFFRUhIANiCXUPXGBkr#148YM2$nbr(#yBn%!@P)E6r%0wWfl zjW#@3T$i6uHRsho{8n?;-*`%7-M%}9J=h=D>$akg2gG_W$AHmkOS%Pz*w%e3Qt_I{ z%Bv^0ZU0;ebt7SW!?Mq34K-J00Y7RykK_<)*lIzivO!LZ(f&4^7bUr9nBQs2d0i>L zcWy{1Wx~gvQE>G&kh+ob%t=w%YST=LMZTHLyITVPjH^Vk^D;(tC+M!kipd-fPHc|^ ze@{gamsaA0zQZ14@_NRUGiTn)07vA0?RFlHWRUf#k?lh{5}hbKdws8ofJYpae2^g> z;J3>~8fpk&b6*cL_Y&;>K@LA>${t;@Ght_`SFMd(Vg+2EFJ4P!+|>m}_Lm7uTkRn_tzB8Y=2I7U_~>>}K4l4cMgx z$Z(=2(!3;w+ zl6Wa0+*ZzYf6T%FHL8!$dk#PvxYfN4saLq~RUmFnh2z3~G@o(1O*l9P>f3HGHTq;yen? zR|>g=j>q(kZl|%C=Fdu=)_QC0yIMVKFXpj%`$bS=ppc4rPrv2|b*q0B`8(2`a@AJn>N!2&)13k4`P z!iGlYNM6%XJoNW;rx@6?DPbZdR}nQgbPY;QIoJW-&5WwR1HCRLgjswDd>QgJJ>*9L zcPsaZq!2rW^~MdT{S&^^L0B+uOmki6>Y!^pG*$j0@!|0^K#}}cy2G~K=iaOm6Bat_ zbHld(JHDGZ=nAV>)dqtguAniq* z^iLW?ZZEIT+Ca^%A9nbz)@qZ97pH2a4C8GP)Vm#K3c2#JJ+x3pKf-*L&_Tg6u}V>MVIa4 z#=tKmek9ohIS*tiG71Q8`E(^@G78xI^R3O7s$-QG`QTqwGiD5R(0rUUdP-VKK49|) zr3SV>kw__;Deg~ETC#BLqE7rSv&1z zK7F9Tb}w7s?KDVR2H+u3xlEsqkm+-SiTdGvvw=2?0-zp;XSTwNJPTlxY&|F6{tv)F zO1T9nSTYZ>xygOfp)n@QQ3`JK9CFogGUp35w{iIr))>7dcQ1JAWwfQFud@_l20>lCWRw&TQK6{>dsc9uH zo6=*a>4A@F)L)-|7S4Z#KNB7BZWwYbANy1batxLAR7>=={`5bfWDfx9&s^1i zt?Qizq0U!6>jUsZMi{n|p9BPWbtXRna6Ro$7uuIH)nZH33<*HM#z((LJCu<%Oa@qbl%q1=3f13*uj3=s+(Bv9Q1 zirf_~cnnZ22HI8Ls5<@b7eHq!2BX(x14C&H6dyMEcS&487i(`Z>A5R(0R0~L*dG=E z9juy%CC5N4l-L+BvzV$$pAVL1`gogXKxKN&CU_kvM|r+YS7K%5?>l+Vlgc`F$GOu8 zcLtZYB$BB2d%tNgGJoa<-tz2_B_)Fl%=r4xjQ=nR0KEo?(yonZjLzCZ9(K#-Ao6g znfTGYGEfnb_6DzX@xm*%s`-v$nO}F)|1b?f(iD9@81m}T<4IgBE4US5A!D>?U--!J zgN?ckPK;8SxR9!n6PP+#mVLIc!}nA^%jvG*Az8_Ucd$|P?5=Ua0nIg->JBkWzf~2} zli++1IJP#>xwz2W*L}Haw>M*~oYbGoUz-26JBTA=@tYrscX2s|u9QX8hT?6Wqg060 z)T#2BrhK?Fj&&7#aHx91E*a7S%>Xf1u4)BsybicNJe-=jAO}+o;*$ikGr9j=LCE`q zuJu3^E2I_Eo9>cX$)OW*)Qa?3No^`6lc!;82{<{qzTEXA&2;Xq?3o!SlGrF{`esbnrjZci%OF`Uf3O+xSX4Jy)V(G!m8l|Oz|Fc&Ze7XG z^E-x4ISARf2)LD~t@B5uz0oDiaUptm9|ttj_bA~AO$zD(L)@nWsE;#b>&??A30YPy z9*NSIae7@EgG~F+B1(HsHU_M8Ad#&B`@Vu-BaMqW4@b)J`;y!7_+F1ElW29qx=9Dh zY}!UKFOyrDkialiT~;$E2y}Ko>aMG89`a1qoX=$58d?+J7qB-U4)UPG?L9nORX!+Q?YIghrl90WwPO zctTzJm}Y%sM;yCx_E)Wmt_8H3tATp4w4XP<(-$YuR_-f9v1X6}k0lb&^r2jNXxYOm z+OSxT`B~hsAhAwak!fb(MmS5NTZB1D6jhyZn^{dKOmh zG&G~Taeyp05Z<2j=a7Zvjgw>eJY%GOwwKC?Ti0xS8t>@lIr3NfV83(RbI~kdv3A^g zEnDGZ#zMbnD?$z~LJ!|UFLcax8LWqRSPO}mf2gj*@vMr1U+Z$y@^e|Faem5~?_yB= z;EdZYChlItZVs{6DOB>ezf!oLvDfc$spqY*XoaE|FMZx2&$4`=h$8&RWT8AJtGnFo zv8c5nnOA+vAS;D_lYJIH+F@4SR2Oi6O9975YOB!uC}@AIBZaITnPPLjBf*eBomKC@ znu|KG$bhh}JxFaTNmM%~Y+37y`3c8N>vV+GU+e+~cB|OSy3W0$$g< zhrBl{Km6F$JiVygYJYPibKR9K(c$ zxVtyEd3fwduL}3HL98s(v3nT;taa`RPZt%>1j4h8ryhNoPd${ub2<=C;bC9a!(3da zLYnNWIdCb5pri_@)8>+8>SCm_32pecv78$!FnOJ8Hyds8P5w|M^FyhWn}yNrw}e&E zRiflX#Yjt+jn#L5=?=O`f=|I`gt0<_&(CSml|^V$>PfM-7ga|l%0$}AW(N$Pxk7H3 za5*1ppb!C6W}<4Zs2Q@a#A4%XX*q?{C< zwzLWNi;1=hL$5l0eJL;WJm3=am~){6#Su3nTE6sc8ugp%xIXjOQz zfvg%5$lhpkRX%x}`GpLJZsnNFnr(-1@-C9E=CH&P;dVvopSCrxBp=4a@}pwREHJ3Mc+6ypI?;BGZEbIXq5c;xI%VC5|f5w1^9 z_R1q?A70p!!PDpYx>c6m@*X$HGGKV`HqOxcT?Oj6WF0BHmVYCA{MOb#>RT|)?~ENB ziGsD|DUE6UT{F!eB-ia+CH1$yeZa&eve^t}G-d6Tzed+0N-dSMj-eLg`ky~b!Mi?O zT|~6ePm5xATL)s3L`3ctk>ZL2m^m1zSVRC*p{pGF;Kq4=T`1YUeng=`uz$gVEZgLX z+l*Dj&GdkE>wn^f^>$(Wwl4FZygOR-{OEi`y56#jt`j+XUMBR}n#}jbwLG4TGU`DV}pC~#| z(3^$asD^jsW38&7SMIwG22dwW-I&ix5@L9drBC=4pNmzQ7-K0s#F^>tvb(86?<#zx zH&Q0(H%FMxY(HSupKtm{j-iSm{AN+hz9`_EkY&@{+eDnD(yI$v<+JZw&g4`V997n3 zVfwr7OAg-jSG?dao_O9`bfx-e5w0Wv9zjkIY|gL2Q2woFV|C^o83!D8#vMpo{o4!H zo%gYWFSu5Y#(99tDU=!)U=bSTw$YP)Qi}JX$nT5W%3F}4*8N7Aq{kuQ7I@RL)jAV? zNMBWN!iyQNZb@*KNjg-xA%w`Yupg~hxzMSVBw{|)WZh_vOLPlHe>KsHg!4>6rNPkE zw`lo=uTU$vCbSc}S^ikAb-8S(xqdtwM!jI>fM}^9Fjj0g%}4>4s9us!&5-WaH*sE< zzPKWThx>G}ZIxgN^#^y$x8pu+v(JejJ$HB({DaPehkRE#RzAho=PKoLJjil}ALPjJ zg9E$yv@Vu9$n=hyy;ZDto*WT=+%b6%*qK{;Zs z6P3!I74Xp3yB2R>yfdeqS02Gx1T2M{{m0?JvwyP$3*&yPj5R66pLUW`o^jr%X#9~M zLHWrx?VO)dJ*i}-NlT5zPwDjiBEY!>?DZPpuHe8S<{#FEP^-0TPU#9sOJ1v32*Emg zk;}|E!=43>$=gylCOLy4ZD@u(=GME0)?1qi-|pbnbw}Y!1@&IT^Dnxr_c9u<4iK_Q zZK@p)XM(`UeXspEW&hy-(DA}|>pN)MuoiWFa_F1wf!UCyoE-AN+`+uRE|DWqtD?0@ zPLX3y#^R*cW~lGNfMfTEn*AifRCr|JfsybS@j;{aDx2SkU1`ly>RP47k%fNV> z>a>y28*MKndI3I#0DOwXPgf4D!J6Cl@n3JxnnTTzdoimUAqq&LuOqFPz0iI6ho1nO zpi1@0$3ZEHCpZpbkY*JpdJ(h@TrCKve!8M@*+Cyx^cYQBbnqsdit02FQ)ygI2JX_x zb-lPG3wva?C9gJ2J~vqDe}l7q>vjkB@SvCV<*zP`2Xc&2D|xNp>Rt3>NJXon-F9AU zQq`mHV`GY9yMhN#2){;wKtMtYm=gqgN=cHO0zCoZa-f|IbooCY|A#IA5r_Y%!T;~j zf%2a#HY1g-jALjijpP(e6Z4`X5|)%_n*(=%pbx#>8OLr!1+;xDjkW?;I4PF_C(d-n zQBV)KhW*cnCE2`fYWv7Lqh=#Z5cIb<(6vEZby&J7S<`-x!w_<|HAbW&my_8(6mm1;YDH?qySVGud{QAS#EuiJBVz@t zg?mQLMn0BDo#8G1X{v!bvo?-tw%Ql|%u(z5-4NIJPHoJ}Tc@V>;dG-f3Kh%J(TSQc zzh>n4V>-QaX(EQMB(~D;y3xhe+Y+G{#U*O87TxB(kX|mVLid01mJ>^r`1OoS3*GQq zBFQ$zV)~T|u}(*;4~1K><%)|l&jvcoKo5Tc*C<;Le|$R0Rc4yV8Tj*6HB6+HcEtFt zzQIi-Z|aR?aci290LMblg!=K}-b_q?YAGfEOL>!eqS8+NUd9g4)E+OtF>VQTQYMco z<3@~71>Pvyx1{IAH-j8@sZ%Fxi&~&n?E=3BSG(k;Bu@MoAIz^V-bW*D63`A8`D@C5Y}}vbYQ} t;XLJlz6gbWN&f%Z6#oFOJ>bd5_OsRMzIrZx0s&u|YPxsIRUbV4KLC3TUvdBd literal 0 HcmV?d00001 diff --git a/screenshots/open.png b/screenshots/open.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab459f491bde2abd4a1614b0946ba1c5fddeff2 GIT binary patch literal 20035 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 literal 0 HcmV?d00001 diff --git a/screenshots/settings.png b/screenshots/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..b054fd099e52c7b1603fe4e8f7dc9bffe0f80508 GIT binary patch literal 26685 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 PIy$|p&?_Zccc1(h?p_sw literal 0 HcmV?d00001 diff --git a/settings.php b/settings.php new file mode 100644 index 0000000..a43e2a6 --- /dev/null +++ b/settings.php @@ -0,0 +1,39 @@ +getContainer(); +$response = $container->query("\OCA\Onlyoffice\Controller\SettingsController")->index(); + +return $response->render(); diff --git a/templates/editor.php b/templates/editor.php new file mode 100644 index 0000000..a76de16 --- /dev/null +++ b/templates/editor.php @@ -0,0 +1,56 @@ + + +

+ +
+ + "); + } ?> + + + + +
diff --git a/templates/settings.php b/templates/settings.php new file mode 100644 index 0000000..b721ba4 --- /dev/null +++ b/templates/settings.php @@ -0,0 +1,41 @@ + +
+

ONLYOFFICE

+ "> + +

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"> + +
+ t("Save")) ?> +
\ No newline at end of file