diff --git a/.drone.yml b/.drone.yml index e2f644c9d6f..15da1f354b1 100644 --- a/.drone.yml +++ b/.drone.yml @@ -2,7 +2,7 @@ kind: pipeline name: compatibility steps: - name: compatibility - image: nextcloudci/php7.3:php7.3-5 + image: ghcr.io/nextcloud/continuous-integration-php7.4:php7.4-3 environment: APP_NAME: text CORE_BRANCH: stable22 @@ -25,7 +25,7 @@ kind: pipeline name: php-sqlite steps: - name: php7.3 - image: nextcloudci/php7.3:php7.3-5 + image: ghcr.io/nextcloud/continuous-integration-php7.4:php7.4-3 environment: APP_NAME: text CORE_BRANCH: stable22 @@ -36,7 +36,7 @@ steps: - composer install - phpunit -c tests/phpunit.xml --coverage-clover build/php-unit.coverage.xml - name: php7.4 - image: nextcloudci/php7.4:2 + image: ghcr.io/nextcloud/continuous-integration-php7.4:php7.4-3 environment: APP_NAME: text CORE_BRANCH: master @@ -58,7 +58,7 @@ kind: pipeline name: php-mysql steps: - name: php7.3 - image: nextcloudci/php7.3:php7.3-5 + image: ghcr.io/nextcloud/continuous-integration-php7.4:php7.4-3 environment: APP_NAME: text CORE_BRANCH: stable22 @@ -89,7 +89,7 @@ kind: pipeline name: php-postgres steps: - name: php7.3 - image: nextcloudci/php7.3:php7.3-5 + image: ghcr.io/nextcloud/continuous-integration-php7.4:php7.4-3 environment: APP_NAME: text CORE_BRANCH: stable22 diff --git a/lib/Service/ApiService.php b/lib/Service/ApiService.php index faa4c879e06..db432c43b99 100644 --- a/lib/Service/ApiService.php +++ b/lib/Service/ApiService.php @@ -30,6 +30,7 @@ use OC\Files\Node\File; 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; @@ -47,12 +48,14 @@ class ApiService { protected $sessionService; protected $documentService; protected $logger; + private $encodingService; - public function __construct(IRequest $request, SessionService $sessionService, DocumentService $documentService, ILogger $logger) { + public function __construct(IRequest $request, SessionService $sessionService, DocumentService $documentService, ILogger $logger, EncodingService $encodingService) { $this->request = $request; $this->sessionService = $sessionService; $this->documentService = $documentService; $this->logger = $logger; + $this->encodingService = $encodingService; } public function create($fileId = null, $filePath = null, $token = null, $guestName = null, bool $forceRecreate = false): DataResponse { @@ -111,7 +114,7 @@ public function fetch($documentId, $sessionId, $sessionToken) { 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 00000000000..639c6257550 --- /dev/null +++ b/lib/TextFile.php @@ -0,0 +1,92 @@ + + * + * @author Raul Ferreira Fuentes + * + * @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 . + * + */ + +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 read() { + return $this->file->read(); + } + + public function write() { + return $this->file->write(); + } +}