diff options
author | Maxence Lange <maxence@artificial-owl.com> | 2019-07-21 09:57:56 -0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-21 09:57:56 -0100 |
commit | 0b84625c9238e139863b0794a460c75505b66bc9 (patch) | |
tree | 8cf7aa22df67e4c5605998db461f50ea6f8180a0 /lib | |
parent | 523e08505ceca0b358b136fc6b9c341eedec9913 (diff) | |
parent | 201196a7d734c193d5a7f28a9394655a62c0d7f3 (diff) |
Merge pull request #626 from StCyr/stCyr_showAttachments
show post attachments
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Controller/LocalController.php | 25 | ||||
-rw-r--r-- | lib/Controller/NavigationController.php | 59 | ||||
-rw-r--r-- | lib/Db/CacheDocumentsRequest.php | 3 | ||||
-rw-r--r-- | lib/Db/CacheDocumentsRequestBuilder.php | 2 | ||||
-rw-r--r-- | lib/Migration/Version0002Date20190717000001.php | 105 | ||||
-rw-r--r-- | lib/Model/ActivityPub/Object/Document.php | 30 | ||||
-rw-r--r-- | lib/Service/CacheDocumentService.php | 70 | ||||
-rw-r--r-- | lib/Service/DocumentService.php | 27 |
8 files changed, 288 insertions, 33 deletions
diff --git a/lib/Controller/LocalController.php b/lib/Controller/LocalController.php index b731be2e..107c57e5 100644 --- a/lib/Controller/LocalController.php +++ b/lib/Controller/LocalController.php @@ -183,6 +183,26 @@ class LocalController extends Controller { /** + * get info about a post (limited to viewer rights). + * + * @NoAdminRequired + * + * @param string $id + * + * @return DataResponse + */ + public function postData(string $id): DataResponse { + try { + $this->initViewer(true); + + return $this->directSuccess($this->noteService->getNoteById($id, true)); + } catch (Exception $e) { + return $this->fail($e); + } + } + + + /** * Delete your own post. * * @NoAdminRequired @@ -703,9 +723,10 @@ class LocalController extends Controller { $actor = $this->cacheActorService->getFromId($id); if ($actor->gotIcon()) { $avatar = $actor->getIcon(); - $document = $this->documentService->getFromCache($avatar->getId()); + $document = $this->documentService->getFromCache($avatar->getId(), $mime); - $response = new FileDisplayResponse($document); + $response = + new FileDisplayResponse($document, Http::STATUS_OK, ['Content-Type' => $mime]); $response->cacheFor(86400); return $response; diff --git a/lib/Controller/NavigationController.php b/lib/Controller/NavigationController.php index c4438e5a..b613fb1e 100644 --- a/lib/Controller/NavigationController.php +++ b/lib/Controller/NavigationController.php @@ -34,6 +34,7 @@ use daita\MySmallPhpTools\Traits\Nextcloud\TNCDataResponse; use daita\MySmallPhpTools\Traits\TArrayTools; use Exception; use OC; +use OC\AppFramework\Http; use OC\User\NoUserException; use OCA\Social\AppInfo\Application; use OCA\Social\Exceptions\AccountAlreadyExistsException; @@ -139,7 +140,7 @@ class NavigationController extends Controller { 'firstrun' => false, 'setup' => false, 'isAdmin' => OC::$server->getGroupManager() - ->isAdmin($this->userId), + ->isAdmin($this->userId), 'cliUrl' => $this->getCliUrl() ] ]; @@ -282,17 +283,61 @@ class NavigationController extends Controller { /** * @NoAdminRequired + * @NoCSRFRequired * * @param string $id * * @return Response */ public function documentGet(string $id): Response { + try { + $mime = ''; + $file = $this->documentService->getFromCache($id, $mime); + + return new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => $mime]); + + } catch (Exception $e) { + return $this->fail($e); + } + } + + /** + * + * @PublicPage + * @NoCSRFRequired + * + * @param string $id + * + * @return Response + */ + public function documentGetPublic(string $id): Response { try { - $file = $this->documentService->getFromCache($id); + $mime = ''; + $file = $this->documentService->getFromCache($id, $mime, true); - return new FileDisplayResponse($file); + return new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => $mime]); + } catch (Exception $e) { + return $this->fail($e); + } + } + + + /** + * @NoAdminRequired + * @NoCSRFRequired + * + * @param string $id + * + * @return Response + */ + public function resizedGet(string $id): Response { + + try { + $mime = ''; + $file = $this->documentService->getResizedFromCache($id, $mime); + + return new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => $mime]); } catch (Exception $e) { return $this->fail($e); } @@ -307,15 +352,17 @@ class NavigationController extends Controller { * * @return Response */ - public function documentGetPublic(string $id): Response { + public function resizedGetPublic(string $id): Response { try { - $file = $this->documentService->getFromCache($id, true); + $mime = ''; + $file = $this->documentService->getResizedFromCache($id, $mime, true); - return new FileDisplayResponse($file); + return new FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => $mime]); } catch (Exception $e) { return $this->fail($e); } } } + diff --git a/lib/Db/CacheDocumentsRequest.php b/lib/Db/CacheDocumentsRequest.php index c8297599..bd7da9e9 100644 --- a/lib/Db/CacheDocumentsRequest.php +++ b/lib/Db/CacheDocumentsRequest.php @@ -56,6 +56,7 @@ class CacheDocumentsRequest extends CacheDocumentsRequestBuilder { ->setValue('mime_type', $qb->createNamedParameter($document->getMimeType())) ->setValue('error', $qb->createNamedParameter($document->getError())) ->setValue('local_copy', $qb->createNamedParameter($document->getLocalCopy())) + ->setValue('resized_copy', $qb->createNamedParameter($document->getResizedCopy())) ->setValue('parent_id', $qb->createNamedParameter($document->getParentId())) ->setValue('public', $qb->createNamedParameter(($document->isPublic()) ? '1' : '0')); @@ -86,6 +87,7 @@ class CacheDocumentsRequest extends CacheDocumentsRequestBuilder { ->set('mime_type', $qb->createNamedParameter($document->getMimeType())) ->set('error', $qb->createNamedParameter($document->getError())) ->set('local_copy', $qb->createNamedParameter($document->getLocalCopy())) + ->set('resized_copy', $qb->createNamedParameter($document->getResizedCopy())) ->set('parent_id', $qb->createNamedParameter($document->getParentId())) ->set('public', $qb->createNamedParameter(($document->isPublic()) ? '1' : '0')); @@ -127,6 +129,7 @@ class CacheDocumentsRequest extends CacheDocumentsRequestBuilder { $qb = $this->getCacheDocumentsUpdateSql(); $this->limitToIdString($qb, $document->getId()); $qb->set('local_copy', $qb->createNamedParameter($document->getLocalCopy())); + $qb->set('resized_copy', $qb->createNamedParameter($document->getResizedCopy())); $qb->set('error', $qb->createNamedParameter($document->getError())); $qb->execute(); diff --git a/lib/Db/CacheDocumentsRequestBuilder.php b/lib/Db/CacheDocumentsRequestBuilder.php index a75c4a0a..10b91f79 100644 --- a/lib/Db/CacheDocumentsRequestBuilder.php +++ b/lib/Db/CacheDocumentsRequestBuilder.php @@ -77,7 +77,7 @@ class CacheDocumentsRequestBuilder extends CoreRequestBuilder { /** @noinspection PhpMethodParametersCountMismatchInspection */ $qb->select( 'cd.id', 'cd.type', 'cd.parent_id', 'cd.media_type', 'cd.mime_type', 'cd.url', - 'cd.local_copy', 'cd.public', 'cd.error', 'cd.creation', 'cd.caching' + 'cd.local_copy', 'cd.public', 'cd.error', 'cd.creation', 'cd.caching', 'cd.resized_copy' ) ->from(self::TABLE_CACHE_DOCUMENTS, 'cd'); diff --git a/lib/Migration/Version0002Date20190717000001.php b/lib/Migration/Version0002Date20190717000001.php new file mode 100644 index 00000000..7864e31b --- /dev/null +++ b/lib/Migration/Version0002Date20190717000001.php @@ -0,0 +1,105 @@ +<?php +declare(strict_types=1); + + +/** + * Nextcloud - Social Support + * + * This file is licensed under the Affero General Public License version 3 or + * later. See the COPYING file. + * + * @author Maxence Lange <maxence@artificial-owl.com> + * @copyright 2018, Maxence Lange <maxence@artificial-owl.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\Social\Migration; + + +use Closure; +use Doctrine\DBAL\Schema\SchemaException; +use Doctrine\DBAL\Types\Type; +use Exception; +use OCP\DB\ISchemaWrapper; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\SimpleMigrationStep; + + +/** + * Class Version0002Date20190717000001 + * + * @package OCA\Social\Migration + */ +class Version0002Date20190717000001 extends SimpleMigrationStep { + + + /** @var IDBConnection */ + private $connection; + + + /** + * @param IDBConnection $connection + */ + public function __construct(IDBConnection $connection) { + $this->connection = $connection; + } + + + /** + * @param IOutput $output + * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + * @param array $options + * + * @return ISchemaWrapper + * @throws SchemaException + */ + public function changeSchema(IOutput $output, Closure $schemaClosure, array $options + ): ISchemaWrapper { + /** @var ISchemaWrapper $schema */ + $schema = $schemaClosure(); + if (!$schema->hasTable('social_a2_cache_documts')) { + return $schema; + } + + $table = $schema->getTable('social_a2_cache_documts'); + if (!$table->hasColumn('resized_copy')) { + $table->addColumn( + 'resized_copy', Type::TEXT, + [ + 'notnull' => true + ] + ); + } + + return $schema; + } + + + /** + * @param IOutput $output + * @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper` + * @param array $options + * + * @throws Exception + */ + public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options) { + } + +} + diff --git a/lib/Model/ActivityPub/Object/Document.php b/lib/Model/ActivityPub/Object/Document.php index ca6e4a6f..6685fb62 100644 --- a/lib/Model/ActivityPub/Object/Document.php +++ b/lib/Model/ActivityPub/Object/Document.php @@ -59,6 +59,9 @@ class Document extends ACore implements JsonSerializable { /** @var string */ private $localCopy = ''; + /** @var string */ + private $resizedCopy = ''; + /** @var int */ private $caching = 0; @@ -141,6 +144,25 @@ class Document extends ACore implements JsonSerializable { /** + * @return string + */ + public function getResizedCopy(): string { + return $this->resizedCopy; + } + + /** + * @param string $resizedCopy + * + * @return Document + */ + public function setResizedCopy(string $resizedCopy): Document { + $this->resizedCopy = $resizedCopy; + + return $this; + } + + + /** * @return bool */ public function isPublic(): bool { @@ -244,6 +266,7 @@ class Document extends ACore implements JsonSerializable { $this->setPublic(($this->getInt('public', $data, 0) === 1) ? true : false); $this->setError($this->getInt('error', $data, 0)); $this->setLocalCopy($this->get('local_copy', $data, '')); + $this->setResizedCopy($this->get('resized_copy', $data, '')); $this->setMediaType($this->get('media_type', $data, '')); $this->setMimeType($this->get('mime_type', $data, '')); $this->setParentId($this->get('parent_id', $data, '')); @@ -266,9 +289,10 @@ class Document extends ACore implements JsonSerializable { $result = array_merge( parent::jsonSerialize(), [ - 'mediaType' => $this->getMediaType(), - 'mimeType' => $this->getMimeType(), - 'localCopy' => $this->getLocalCopy() + 'mediaType' => $this->getMediaType(), + 'mimeType' => $this->getMimeType(), + 'localCopy' => $this->getLocalCopy(), + 'resizedCopy' => $this->getResizedCopy() ] ); diff --git a/lib/Service/CacheDocumentService.php b/lib/Service/CacheDocumentService.php index 84aa32a2..b147c8f6 100644 --- a/lib/Service/CacheDocumentService.php +++ b/lib/Service/CacheDocumentService.php @@ -35,6 +35,8 @@ use daita\MySmallPhpTools\Model\Request; use daita\MySmallPhpTools\Traits\TArrayTools; use daita\MySmallPhpTools\Traits\TStringTools; use Exception; +use Gumlet\ImageResize; +use Gumlet\ImageResizeException; use OCA\Social\Exceptions\CacheContentException; use OCA\Social\Exceptions\CacheContentMimeTypeException; use OCA\Social\Exceptions\CacheDocumentDoesNotExistException; @@ -45,6 +47,7 @@ use OCA\Social\Exceptions\RequestResultSizeException; use OCA\Social\Exceptions\RequestServerException; use OCA\Social\Exceptions\SocialAppConfigException; use OCA\Social\Exceptions\UnauthorizedFediverseException; +use OCA\Social\Model\ActivityPub\Object\Document; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; @@ -58,6 +61,9 @@ class CacheDocumentService { use TStringTools; + const RESIZED_WIDTH = 280; + const RESIZED_HEIGHT = 180; + /** @var IAppData */ private $appData; @@ -91,11 +97,9 @@ class CacheDocumentService { /** - * @param string $url - * + * @param Document $document * @param string $mime * - * @return string * @throws CacheContentMimeTypeException * @throws MalformedArrayException * @throws NotFoundException @@ -108,10 +112,36 @@ class CacheDocumentService { * @throws SocialAppConfigException * @throws UnauthorizedFediverseException */ - public function saveRemoteFileToCache(string $url, &$mime = '') { + public function saveRemoteFileToCache(Document $document, &$mime = '') { + $content = $this->retrieveContent($document->getUrl()); - $filename = $this->uuid(); + // To get the mime type, we create a temp file + $tmpFile = tmpfile(); + $tmpPath = stream_get_meta_data($tmpFile)['uri']; + fwrite($tmpFile, $content); + $mime = mime_content_type($tmpPath); + fclose($tmpFile); + $this->filterMimeTypes($mime); + + $filename = $this->saveContentToCache($content); + $document->setLocalCopy($filename); + $this->resizeImage($content); + $resized = $this->saveContentToCache($content); + $document->setResizedCopy($resized); + } + + + /** + * @param string $content + * + * @return string + * @throws NotPermittedException + * @throws NotFoundException + */ + private function saveContentToCache(string $content): string { + + $filename = $this->uuid(); // creating a path aa/bb/cc/dd/ from the filename aabbccdd-0123-[...] $path = chunk_split(substr($filename, 0, 8), 2, '/'); @@ -121,17 +151,6 @@ class CacheDocumentService { $folder = $this->appData->newFolder($path); } - $content = $this->retrieveContent($url); - - // To get the mime type, we create a temp file - $tmpFile = tmpfile(); - $tmpPath = stream_get_meta_data($tmpFile)['uri']; - fwrite($tmpFile, $content); - $mime = mime_content_type($tmpPath); - fclose($tmpFile); - - $this->filterMimeTypes($mime); - $cache = $folder->newFile($filename); $cache->putContent($content); @@ -160,6 +179,23 @@ class CacheDocumentService { throw new CacheContentMimeTypeException(); } + + /** + * @param $content + */ + private function resizeImage(&$content) { + try { + $image = ImageResize::createFromString($content); + $image->quality_jpg = 100; + $image->quality_png = 9; + + $image->resizeToBestFit(self::RESIZED_WIDTH, self::RESIZED_HEIGHT); + $content = $image->getImageAsString(); + } catch (ImageResizeException $e) { + } + } + + /** * @param string $path * @@ -167,7 +203,7 @@ class CacheDocumentService { * @throws CacheContentException * @throws CacheDocumentDoesNotExistException */ - public function getContentFromCache(string $path) { + public function getContentFromCache(string $path): ISimpleFile { if ($path === '') { throw new CacheDocumentDoesNotExistException(); } diff --git a/lib/Service/DocumentService.php b/lib/Service/DocumentService.php index 4fedac0c..c5318bc3 100644 --- a/lib/Service/DocumentService.php +++ b/lib/Service/DocumentService.php @@ -143,9 +143,7 @@ class DocumentService { $this->cacheDocumentsRequest->initCaching($document); try { - $localCopy = $this->cacheService->saveRemoteFileToCache($document->getUrl(), $mime); - $document->setMimeType($mime); - $document->setLocalCopy($localCopy); + $this->cacheService->saveRemoteFileToCache($document, $mime); $this->cacheDocumentsRequest->endCaching($document); $this->streamRequest->updateAttachments($document); @@ -192,8 +190,28 @@ class DocumentService { /** * @param string $id + * @param string $mime + * @param bool $public * + * @return ISimpleFile + * @throws CacheContentException + * @throws CacheDocumentDoesNotExistException + * @throws MalformedArrayException + * @throws RequestResultNotJsonException + * @throws SocialAppConfigException + */ + public function getResizedFromCache(string $id, string &$mime = '', bool $public = false) { + $document = $this->cacheRemoteDocument($id, $public); + $mime = $document->getMimeType(); + + return $this->cacheService->getContentFromCache($document->getResizedCopy()); + } + + + /** + * @param string $id * @param bool $public + * @param string $mimeType * * @return ISimpleFile * @throws CacheContentException @@ -202,8 +220,9 @@ class DocumentService { * @throws RequestResultNotJsonException * @throws SocialAppConfigException */ - public function getFromCache(string $id, bool $public = false) { + public function getFromCache(string $id, string &$mimeType = '', bool $public = false) { $document = $this->cacheRemoteDocument($id, $public); + $mimeType = $document->getMimeType(); return $this->cacheService->getContentFromCache($document->getLocalCopy()); } |