Merge pull request #3491 from nextcloud/fix/preview

This commit is contained in:
Julius Härtl 2024-02-22 19:47:31 +01:00 коммит произвёл GitHub
Родитель b784eeb24d 6da08e6eb5
Коммит 6d48310b9b
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
10 изменённых файлов: 60 добавлений и 134 удалений

Просмотреть файл

@ -142,15 +142,15 @@ class AppConfig {
}
public function getCollaboraUrlPublic(): string {
return $this->config->getAppValue(Application::APPNAME, self::PUBLIC_WOPI_URL, $this->getCollaboraUrlInternal());
return rtrim($this->config->getAppValue(Application::APPNAME, self::PUBLIC_WOPI_URL, $this->getCollaboraUrlInternal()), '/');
}
public function getCollaboraUrlInternal(): string {
return $this->config->getAppValue(Application::APPNAME, self::WOPI_URL, '');
return rtrim($this->config->getAppValue(Application::APPNAME, self::WOPI_URL, ''), '/');
}
public function getNextcloudUrl(): string {
return $this->config->getAppValue(Application::APPNAME, self::WOPI_CALLBACK_URL, '');
return rtrim($this->config->getAppValue(Application::APPNAME, self::WOPI_CALLBACK_URL, ''), '/');
}
public function getDisableCertificateValidation(): bool {

Просмотреть файл

@ -61,7 +61,6 @@ use OCP\Files\Template\ITemplateManager;
use OCP\Files\Template\TemplateFileCreator;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IPreview;
use OCP\Preview\BeforePreviewFetchedEvent;
use OCP\Security\CSP\AddContentSecurityPolicyEvent;
use OCP\Security\FeaturePolicy\AddFeaturePolicyEvent;
@ -92,6 +91,13 @@ class Application extends App implements IBootstrap {
'getPathForToken',
'getWopiForToken',
]);
$context->registerPreviewProvider(EMF::class, EMF::MIMETYPE_REGEX);
$context->registerPreviewProvider(MSExcel::class, MSExcel::MIMETYPE_REGEX);
$context->registerPreviewProvider(MSWord::class, MSWord::MIMETYPE_REGEX);
$context->registerPreviewProvider(OOXML::class, OOXML::MIMETYPE_REGEX);
$context->registerPreviewProvider(OpenDocument::class, OpenDocument::MIMETYPE_REGEX);
$context->registerPreviewProvider(Pdf::class, Pdf::MIMETYPE_REGEX);
}
public function boot(IBootContext $context): void {
@ -153,43 +159,9 @@ class Application extends App implements IBootstrap {
});
});
$this->registerProvider();
$this->checkAndEnableCODEServer();
}
public function registerProvider() {
$container = $this->getContainer();
/** @var IPreview $previewManager */
$previewManager = $container->get(IPreview::class);
$previewManager->registerProvider('/application\/vnd.ms-excel/', function () use ($container) {
return $container->get(MSExcel::class);
});
$previewManager->registerProvider('/application\/msword/', function () use ($container) {
return $container->get(MSWord::class);
});
$previewManager->registerProvider('/application\/vnd.openxmlformats-officedocument.*/', function () use ($container) {
return $container->get(OOXML::class);
});
$previewManager->registerProvider('/application\/vnd.oasis.opendocument.*/', function () use ($container) {
return $container->get(OpenDocument::class);
});
$previewManager->registerProvider('/image\/emf/', function () use ($container) {
return $container->get(EMF::class);
});
if (!$previewManager->isMimeSupported('application/pdf')) {
$previewManager->registerProvider('/application\/pdf/', function () use ($container) {
return $container->get(Pdf::class);
});
}
}
public function checkAndEnableCODEServer() {
// Supported only on Linux OS, and x86_64 & ARM64 platforms
$supportedArchs = ['x86_64', 'aarch64'];

Просмотреть файл

@ -26,10 +26,11 @@ declare(strict_types=1);
namespace OCA\Richdocuments\Preview;
class EMF extends Office {
public const MIMETYPE_REGEX = '/image\/emf/';
/**
* {@inheritDoc}
*/
public function getMimeType() {
return '/image\/emf/';
public function getMimeType(): string {
return self::MIMETYPE_REGEX;
}
}

Просмотреть файл

@ -22,10 +22,11 @@
namespace OCA\Richdocuments\Preview;
class MSExcel extends Office {
public const MIMETYPE_REGEX = '/application\/vnd.ms-excel/';
/**
* {@inheritDoc}
*/
public function getMimeType() {
return '/application\/vnd.ms-excel/';
public function getMimeType(): string {
return self::MIMETYPE_REGEX;
}
}

Просмотреть файл

@ -22,10 +22,11 @@
namespace OCA\Richdocuments\Preview;
class MSWord extends Office {
public const MIMETYPE_REGEX = '/application\/msword/';
/**
* {@inheritDoc}
*/
public function getMimeType() {
return '/application\/msword/';
public function getMimeType(): string {
return self::MIMETYPE_REGEX;
}
}

Просмотреть файл

@ -22,10 +22,12 @@
namespace OCA\Richdocuments\Preview;
class OOXML extends Office {
public const MIMETYPE_REGEX = '/application\/vnd.openxmlformats-officedocument.*/';
/**
* {@inheritDoc}
*/
public function getMimeType() {
return '/application\/vnd.openxmlformats-officedocument.*/';
public function getMimeType(): string {
return self::MIMETYPE_REGEX;
}
}

Просмотреть файл

@ -21,39 +21,23 @@
*/
namespace OCA\Richdocuments\Preview;
use OC\Preview\Provider;
use OCA\Richdocuments\AppConfig;
use OCA\Richdocuments\Capabilities;
use OCP\Files\File;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IImage;
use OCP\Image;
use OCP\Preview\IProviderV2;
use Psr\Log\LoggerInterface;
abstract class Office extends Provider {
/** @var IClientService */
private $clientService;
/** @var IConfig */
private $config;
/** @var array */
private $capabilitites;
/** @var ILogger */
private $logger;
public function __construct(IClientService $clientService, IConfig $config, Capabilities $capabilities, ILogger $logger) {
parent::__construct();
$this->clientService = $clientService;
$this->config = $config;
abstract class Office implements IProviderV2 {
private array $capabilities = [];
public function __construct(private IClientService $clientService, private AppConfig $config, Capabilities $capabilities, private LoggerInterface $logger) {
$this->capabilitites = $capabilities->getCapabilities()['richdocuments'] ?? [];
$this->logger = $logger;
}
private function getWopiURL() {
return $this->config->getAppValue('richdocuments', 'wopi_url');
}
public function isAvailable(\OCP\Files\FileInfo $file) {
public function isAvailable(\OCP\Files\FileInfo $file): bool {
if (isset($this->capabilitites['collabora']['convert-to']['available'])) {
return (bool)$this->capabilitites['collabora']['convert-to']['available'];
}
@ -63,18 +47,17 @@ abstract class Office extends Provider {
/**
* {@inheritDoc}
*/
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
$fileInfo = $fileview->getFileInfo($path);
if (!$fileInfo || $fileInfo->getSize() === 0) {
return false;
public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage {
if ($file->getSize() === 0) {
return null;
}
$useTempFile = $fileInfo->isEncrypted() || !$fileInfo->getStorage()->isLocal();
$useTempFile = $file->isEncrypted() || !$file->getStorage()->isLocal();
if ($useTempFile) {
$fileName = $fileview->toTmpFile($path);
$fileName = $file->getStorage()->getLocalFile($file->getInternalPath());
$stream = fopen($fileName, 'r');
} else {
$stream = $fileview->fopen($path, 'r');
$stream = $file->fopen('r');
}
$client = $this->clientService->newClient();
@ -88,17 +71,13 @@ abstract class Office extends Provider {
$options['verify'] = false;
}
$options['multipart'] = [['name' => $path, 'contents' => $stream]];
$options['multipart'] = [['name' => $file->getName(), 'contents' => $stream]];
try {
$response = $client->post($this->getWopiURL(). '/lool/convert-to/png', $options);
$response = $client->post($this->config->getCollaboraUrlInternal() . '/cool/convert-to/png', $options);
} catch (\Exception $e) {
$this->logger->logException($e, [
'message' => 'Failed to convert file to preview',
'level' => ILogger::INFO,
'app' => 'richdocuments',
]);
return false;
$this->logger->info('Failed to convert preview: ' . $e->getMessage(), ['exception' => $e]);
return null;
}
$image = new Image();
@ -108,6 +87,6 @@ abstract class Office extends Provider {
$image->scaleDownToFit($maxX, $maxY);
return $image;
}
return false;
return null;
}
}

Просмотреть файл

@ -23,10 +23,11 @@ namespace OCA\Richdocuments\Preview;
//.odt, .ott, .oth, .odm, .odg, .otg, .odp, .otp, .ods, .ots, .odc, .odf, .odb, .odi, .oxt
class OpenDocument extends Office {
public const MIMETYPE_REGEX = '/application\/vnd.oasis.opendocument.*/';
/**
* {@inheritDoc}
*/
public function getMimeType() {
return '/application\/vnd.oasis.opendocument.*/';
public function getMimeType(): string {
return self::MIMETYPE_REGEX;
}
}

Просмотреть файл

@ -23,10 +23,11 @@
namespace OCA\Richdocuments\Preview;
class Pdf extends Office {
public const MIMETYPE_REGEX = '/application\/pdf/';
/**
* {@inheritDoc}
*/
public function getMimeType() {
return '/application\/pdf/';
public function getMimeType(): string {
return self::MIMETYPE_REGEX;
}
}

Просмотреть файл

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="5.15.0@5c774aca4746caf3d239d9c8cadb9f882ca29352">
<files psalm-version="5.21.1@8c473e2437be8b6a8fd8f630f0f11a16b114c494">
<file src="lib/AppConfig.php">
<InvalidArgument>
<code>[]</code>
@ -8,16 +8,6 @@
<code><![CDATA[array_key_exists($key, self::APP_SETTING_TYPES) && self::APP_SETTING_TYPES[$key] === 'array']]></code>
</RedundantCondition>
</file>
<file src="lib/AppInfo/Application.php">
<MissingDependency>
<code>EMF</code>
<code>MSExcel</code>
<code>MSWord</code>
<code>OOXML</code>
<code>OpenDocument</code>
<code>Pdf</code>
</MissingDependency>
</file>
<file src="lib/Command/ActivateConfig.php">
<UndefinedClass>
<code>Command</code>
@ -28,12 +18,12 @@
<code>Command</code>
</UndefinedClass>
</file>
<file src="lib/Command/UpdateEmptyTemplates.php">
<file src="lib/Command/InstallDefaultFonts.php">
<UndefinedClass>
<code>Command</code>
</UndefinedClass>
</file>
<file src="lib/Command/InstallDefaultFonts.php">
<file src="lib/Command/UpdateEmptyTemplates.php">
<UndefinedClass>
<code>Command</code>
</UndefinedClass>
@ -53,7 +43,7 @@
<code><![CDATA[$node->getId()]]></code>
</InvalidScalarArgument>
<RedundantCondition>
<code><![CDATA[$app !== '']]></code>
<code>$app !== ''</code>
</RedundantCondition>
</file>
<file src="lib/Controller/SettingsController.php">
@ -78,7 +68,7 @@
<code>null</code>
</NullArgument>
<TypeDoesNotContainType>
<code><![CDATA[$path === '']]></code>
<code>$path === ''</code>
</TypeDoesNotContainType>
<UndefinedInterfaceMethod>
<code>putContent</code>
@ -95,35 +85,13 @@
<code><![CDATA[$share && method_exists($share, 'getAttributes')]]></code>
</RedundantCondition>
</file>
<file src="lib/Preview/EMF.php">
<file src="lib/Preview/Office.php">
<MissingDependency>
<code>Office</code>
</MissingDependency>
</file>
<file src="lib/Preview/MSExcel.php">
<MissingDependency>
<code>Office</code>
</MissingDependency>
</file>
<file src="lib/Preview/MSWord.php">
<MissingDependency>
<code>Office</code>
</MissingDependency>
</file>
<file src="lib/Preview/OOXML.php">
<MissingDependency>
<code>Office</code>
</MissingDependency>
</file>
<file src="lib/Preview/OpenDocument.php">
<MissingDependency>
<code>Office</code>
</MissingDependency>
</file>
<file src="lib/Preview/Pdf.php">
<MissingDependency>
<code>Office</code>
<code>Image</code>
</MissingDependency>
<UndefinedThisPropertyAssignment>
<code><![CDATA[$this->capabilitites]]></code>
</UndefinedThisPropertyAssignment>
</file>
<file src="lib/Service/ConnectivityService.php">
<UndefinedClass>