Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ONLYOFFICE/onlyoffice-nextcloud.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorSergey Linnik <sergey.linnik@onlyoffice.com>2020-09-17 10:58:02 +0300
committerGitHub <noreply@github.com>2020-09-17 10:58:02 +0300
commita4dcd81d4e5da4a7db95feff32f043b4f096ae76 (patch)
treecea95abfafef859bfaa2b042694270d02c4f4414 /lib
parentdc5082828f943fb0b6cb274447680dbc07451eec (diff)
parent44d8e51712777ffd15a064650d0bc8c6b5bbbbcd (diff)
Release/6.0.0v6.0.0
Release/6.0.0
Diffstat (limited to 'lib')
-rw-r--r--lib/appconfig.php34
-rw-r--r--lib/fileutility.php30
-rw-r--r--lib/hooks.php39
-rw-r--r--lib/keymanager.php150
4 files changed, 243 insertions, 10 deletions
diff --git a/lib/appconfig.php b/lib/appconfig.php
index 98a8969..36479ac 100644
--- a/lib/appconfig.php
+++ b/lib/appconfig.php
@@ -131,6 +131,13 @@ class AppConfig {
private $_customizationFeedback = "customizationFeedback";
/**
+ * The config key for the forcesave setting
+ *
+ * @var string
+ */
+ private $_customizationForcesave = "customizationForcesave";
+
+ /**
* The config key for the help display setting
*
* @var string
@@ -208,13 +215,6 @@ class AppConfig {
public $_customization_customer = "customization_customer";
/**
- * The config key for the feedback
- *
- * @var string
- */
- public $_customization_feedback = "customization_feedback";
-
- /**
* The config key for the loaderLogo
*
* @var string
@@ -666,6 +666,26 @@ class AppConfig {
}
/**
+ * Save forcesave setting
+ *
+ * @param bool $value - forcesave
+ */
+ public function SetCustomizationForcesave($value) {
+ $this->logger->info("Set forcesave: " . json_encode($value), ["app" => $this->appName]);
+
+ $this->config->setAppValue($this->appName, $this->_customizationForcesave, json_encode($value));
+ }
+
+ /**
+ * Get forcesave setting
+ *
+ * @return bool
+ */
+ public function GetCustomizationForcesave() {
+ return $this->config->getAppValue($this->appName, $this->_customizationForcesave, "false") === "true";
+ }
+
+ /**
* Save help display setting
*
* @param bool $value - display help
diff --git a/lib/fileutility.php b/lib/fileutility.php
index 5dc4690..c166774 100644
--- a/lib/fileutility.php
+++ b/lib/fileutility.php
@@ -30,6 +30,7 @@ use OCP\Share\IManager;
use OCA\Files_Sharing\External\Storage as SharingExternalStorage;
use OCA\Onlyoffice\AppConfig;
+use OCA\Onlyoffice\KeyManager;
/**
* File utility
@@ -217,6 +218,8 @@ class FileUtility {
* @return string
*/
public function getKey($file, $origin = false) {
+ $fileId = $file->getId();
+
if ($origin
&& $file->getStorage()->instanceOfStorage(SharingExternalStorage::class)) {
@@ -227,18 +230,39 @@ class FileUtility {
return $key;
}
} catch (\Exception $e) {
- $this->logger->logException($e, ["message" => "Failed to request federated key " . $file->getId(), "app" => $this->appName]);
+ $this->logger->logException($e, ["message" => "Failed to request federated key $fileId", "app" => $this->appName]);
}
}
- $instanceId = $this->config->GetSystemValue("instanceid", true);
+ $key = KeyManager::get($fileId);
- $key = $instanceId . "_" . $file->getEtag();
+ if (empty($key) ) {
+ $instanceId = $this->config->GetSystemValue("instanceid", true);
+
+ $key = $instanceId . "_" . $this->GUID();
+
+ KeyManager::set($fileId, $key);
+ }
return $key;
}
/**
+ * Generate unique identifier
+ *
+ * @return string
+ */
+ private function GUID()
+ {
+ if (function_exists("com_create_guid") === true)
+ {
+ return trim(com_create_guid(), "{}");
+ }
+
+ return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
+ }
+
+ /**
* Generate unique document identifier in federated share
*
* @param File $file - file
diff --git a/lib/hooks.php b/lib/hooks.php
index 013c79c..e0d96b8 100644
--- a/lib/hooks.php
+++ b/lib/hooks.php
@@ -24,6 +24,7 @@ use OC\Files\Filesystem;
use OCP\Util;
use OCA\Onlyoffice\FileVersions;
+use OCA\Onlyoffice\KeyManager;
/**
* The class to handle the filesystem hooks
@@ -43,6 +44,9 @@ class Hooks {
// Listen user deletion
Util::connectHook("OC_User", "pre_deleteUser", Hooks::class, "userDelete");
+ // Listen file change
+ Util::connectHook("OC_Filesystem", "write", Hooks::class, "fileUpdate");
+
// Listen file deletion
Util::connectHook("OC_Filesystem", "delete", Hooks::class, "fileDelete");
@@ -65,6 +69,27 @@ class Hooks {
}
/**
+ * Listen of file change
+ *
+ * @param array $params - hook params
+ */
+ public static function fileUpdate($params) {
+ $filePath = $params[Filesystem::signal_param_path];
+ if (empty($filePath)) {
+ return;
+ }
+
+ $fileInfo = Filesystem::getFileInfo($filePath);
+ if ($fileInfo === false) {
+ return;
+ }
+
+ $fileId = $fileInfo->getId();
+
+ KeyManager::delete($fileId);
+ }
+
+ /**
* Erase versions of deleted file
*
* @param array $params - hook params
@@ -79,8 +104,14 @@ class Hooks {
$ownerId = Filesystem::getOwner($filePath);
$fileInfo = Filesystem::getFileInfo($filePath);
+ if ($fileInfo === false) {
+ return;
+ }
+
$fileId = $fileInfo->getId();
+ KeyManager::delete($fileId, true);
+
FileVersions::deleteAllVersions($ownerId, $fileId);
} catch (\Exception $e) {
\OC::$server->getLogger()->logException($e, ["message" => "Hook: fileDelete " . json_encode($params), "app" => self::$appName]);
@@ -107,6 +138,10 @@ class Hooks {
$ownerId = Filesystem::getOwner($filePath);
$fileInfo = Filesystem::getFileInfo($filePath);
+ if ($fileInfo === false) {
+ return;
+ }
+
$fileId = $fileInfo->getId();
FileVersions::deleteVersion($ownerId, $fileId, $versionId);
@@ -132,6 +167,10 @@ class Hooks {
$ownerId = Filesystem::getOwner($filePath);
$fileInfo = Filesystem::getFileInfo($filePath);
+ if ($fileInfo === false) {
+ return;
+ }
+
$fileId = $fileInfo->getId();
FileVersions::deleteVersion($ownerId, $fileId, $versionId);
diff --git a/lib/keymanager.php b/lib/keymanager.php
new file mode 100644
index 0000000..3571696
--- /dev/null
+++ b/lib/keymanager.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ *
+ * (c) Copyright Ascensio System SIA 2020
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+namespace OCA\Onlyoffice;
+
+
+/**
+ * Key manager
+ *
+ * @package OCA\Onlyoffice
+ */
+class KeyManager {
+
+ /**
+ * Table name
+ */
+ private const TableName_Key = "onlyoffice_filekey";
+
+ /**
+ * Get document identifier
+ *
+ * @param integer $fileId - file identifier
+ *
+ * @return string
+ */
+ public static function get($fileId) {
+ $connection = \OC::$server->getDatabaseConnection();
+ $select = $connection->prepare("
+ SELECT `key`
+ FROM `*PREFIX*" . self::TableName_Key . "`
+ WHERE `file_id` = ?
+ ");
+ $result = $select->execute([$fileId]);
+
+ $keys = $result ? $select->fetch() : [];
+ $key = is_array($keys) && isset($keys["key"]) ? $keys["key"] : "";
+
+ return $key;
+ }
+
+ /**
+ * Store document identifier
+ *
+ * @param integer $fileId - file identifier
+ * @param integer $key - file key
+ *
+ * @return bool
+ */
+ public static function set($fileId, $key) {
+ $connection = \OC::$server->getDatabaseConnection();
+ $insert = $connection->prepare("
+ INSERT INTO `*PREFIX*" . self::TableName_Key . "`
+ (`file_id`, `key`)
+ VALUES (?, ?)
+ ");
+ return (bool)$insert->execute([$fileId, $key]);
+ }
+
+ /**
+ * Delete document identifier
+ *
+ * @param integer $fileId - file identifier
+ * @param bool $unlock - delete even with lock label
+ *
+ * @return bool
+ */
+ public static function delete($fileId, $unlock = false) {
+ $connection = \OC::$server->getDatabaseConnection();
+ $delete = $connection->prepare("
+ DELETE FROM `*PREFIX*" . self::TableName_Key . "`
+ WHERE `file_id` = ?
+ " . ($unlock === false ? "AND `lock` != 1" : "")
+ );
+ return (bool)$delete->execute([$fileId]);
+ }
+
+ /**
+ * Change lock status
+ *
+ * @param integer $fileId - file identifier
+ * @param integer $lock - status
+ *
+ * @return bool
+ */
+ public static function lock($fileId, $lock = true) {
+ $connection = \OC::$server->getDatabaseConnection();
+ $update = $connection->prepare("
+ UPDATE `*PREFIX*" . self::TableName_Key . "`
+ SET `lock` = ?
+ WHERE `file_id` = ?
+ ");
+ return (bool)$update->execute([$lock === true ? 1 : 0, $fileId]);
+ }
+
+ /**
+ * Change forcesave status
+ *
+ * @param integer $fileId - file identifier
+ * @param integer $fs - status
+ *
+ * @return bool
+ */
+ public static function setForcesave($fileId, $fs = true) {
+ $connection = \OC::$server->getDatabaseConnection();
+ $update = $connection->prepare("
+ UPDATE `*PREFIX*" . self::TableName_Key . "`
+ SET `fs` = ?
+ WHERE `file_id` = ?
+ ");
+ return (bool)$update->execute([$fs === true ? 1 : 0, $fileId]);
+ }
+
+ /**
+ * Get forcesave status
+ *
+ * @param integer $fileId - file identifier
+ *
+ * @return bool
+ */
+ public static function wasForcesave($fileId) {
+ $connection = \OC::$server->getDatabaseConnection();
+ $select = $connection->prepare("
+ SELECT `fs`
+ FROM `*PREFIX*" . self::TableName_Key . "`
+ WHERE `file_id` = ?
+ ");
+ $result = $select->execute([$fileId]);
+
+ $rows = $result ? $select->fetch() : [];
+ $fs = is_array($rows) && isset($rows["fs"]) ? $rows["fs"] : "";
+
+ return $fs === "1";
+ }
+}