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

github.com/nextcloud/text.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaul Ferreira Fuentes <Raudius@users.noreply.github.com>2022-06-09 17:17:48 +0300
committerGitHub <noreply@github.com>2022-06-09 17:17:48 +0300
commita4bb1be2dbd27c3a1db8f12146cd8e3a8835c06a (patch)
treed6aef7684046c0a0e4ce6940627758939867b0fc
parent7864e723023da27ebb526978ce0e3fbeca13cd70 (diff)
parent51c60f12c7dd6bde4a494d8fb261f89b1936ca88 (diff)
Merge pull request #2498 from nextcloud/backport/2446/stable24
[stable24] Encode file to UTF-8 on `fetch` call
-rw-r--r--lib/Service/ApiService.php3
-rw-r--r--lib/TextFile.php96
2 files changed, 98 insertions, 1 deletions
diff --git a/lib/Service/ApiService.php b/lib/Service/ApiService.php
index a5cbc03e2..5ed1b3e79 100644
--- a/lib/Service/ApiService.php
+++ b/lib/Service/ApiService.php
@@ -31,6 +31,7 @@ use OC\Files\Node\File;
use OCA\Text\AppInfo\Application;
use OCA\Text\DocumentHasUnsavedChangesException;
use OCA\Text\DocumentSaveConflictException;
+use OCA\Text\TextFile;
use OCA\Text\VersionMismatchException;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Http;
@@ -141,7 +142,7 @@ class ApiService {
if ($this->sessionService->isValidSession($documentId, $sessionId, $sessionToken)) {
$this->sessionService->removeInactiveSessions($documentId);
try {
- $file = $this->documentService->getBaseFile($documentId);
+ $file = new TextFile($this->documentService->getBaseFile($documentId), $this->encodingService);
} catch (NotFoundException $e) {
return new NotFoundResponse();
}
diff --git a/lib/TextFile.php b/lib/TextFile.php
new file mode 100644
index 000000000..30b58c84c
--- /dev/null
+++ b/lib/TextFile.php
@@ -0,0 +1,96 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2022 Raul Ferreira Fuentes <raul@nextcloud.com>
+ *
+ * @author Raul Ferreira Fuentes <raul@nextcloud.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Text;
+
+use OCA\Text\Service\EncodingService;
+use OCP\Files\NotFoundException;
+use OCP\Files\SimpleFS\ISimpleFile;
+
+/**
+ * Wrapper around a ISimpleFile object to ensure that it is correctly encoded (UTF-8) for the text app.
+ */
+class TextFile implements ISimpleFile {
+
+ /** @var ISimpleFile */
+ private $file;
+ /** @var EncodingService */
+ private $encodingService;
+
+ public function __construct(ISimpleFile $file, EncodingService $encodingService) {
+ $this->file = $file;
+ $this->encodingService = $encodingService;
+ }
+
+ public function getName() {
+ return $this->file->getName();
+ }
+
+ public function getSize() {
+ return $this->file->getSize();
+ }
+
+ public function getETag() {
+ return $this->file->getETag();
+ }
+
+ public function getMTime() {
+ return $this->file->getMTime();
+ }
+
+ public function getContent() {
+ $content = $this->encodingService->encodeToUtf8($this->file->getContent());
+ if (!$content) {
+ throw new NotFoundException('File not compatible with text because it could not be encoded to UTF-8.');
+ }
+
+ return $content;
+ }
+
+ public function putContent($data) {
+ return $this->file->putContent($data);
+ }
+
+ public function delete() {
+ $this->file->delete();
+ }
+
+ public function getMimeType() {
+ return 'text/plain;encoding=utf-8';
+ }
+
+ public function getExtension(): string {
+ return $this->file->getExtension();
+ }
+
+ public function read() {
+ return $this->file->read();
+ }
+
+ public function write() {
+ return $this->file->write();
+ }
+}