appName = $appName; $this->root = $root; $this->logger = $logger; $this->trans = $trans; $this->config = $config; $this->urlGenerator = $urlGenerator; $this->crypt = $crypt; if (\OC::$server->getAppManager()->isInstalled("files_versions")) { try { $this->versionManager = \OC::$server->query(IVersionManager::class); } catch (QueryException $e) { $this->logger->error("VersionManager init error", ["exception" => $e]); } } $this->fileUtility = new FileUtility($appName, $trans, $logger, $config, $shareManager, $session); } /** * Return mime type */ public static function getMimeTypeRegex() { $mimeTypeRegex = ""; foreach (self::$capabilities as $format) { if (!empty($mimeTypeRegex)) { $mimeTypeRegex = $mimeTypeRegex . "|"; } $mimeTypeRegex = $mimeTypeRegex . str_replace("/", "\/", $format); } $mimeTypeRegex = "/" . $mimeTypeRegex . "/"; return $mimeTypeRegex; } /** * Return mime type */ public function getMimeType(): string { $m = self::getMimeTypeRegex(); return $m; } /** * The method checks if the file can be converted * * @param FileInfo $file - File * * @return bool */ public function isAvailable(FileInfo $file): bool { if ($this->config->getPreview() !== true) { return false; } if (!$file || $file->getSize() === 0 || $file->getSize() > $this->config->getLimitThumbSize()) { return false; } if (!in_array($file->getMimetype(), self::$capabilities, true)) { return false; } if ($file->getStorage()->instanceOfStorage(SharingExternalStorage::class)) { return false; } return true; } /** * {@inheritDoc} */ public function getThumbnail(File $file, int $maxX, int $maxY): ?IImage { $this->logger->debug("getThumbnail {$file->getId()} $maxX $maxY"); [$fileUrl, $extension, $key] = $this->getFileParam($file); if ($fileUrl === null || $extension === null || $key === null) { return null; } $imageUrl = null; $documentService = new DocumentService($this->trans, $this->config); try { $imageUrl = $documentService->getConvertedUri($fileUrl, $extension, self::THUMBEXTENSION, $key); } catch (\Exception $e) { $this->logger->error("getConvertedUri: from $extension to " . self::THUMBEXTENSION, ["exception" => $e]); return null; } try { $thumbnail = $documentService->request($imageUrl); } catch (\Exception $e) { $this->logger->error("Failed to download thumbnail", ["exception" => $e]); return null; } $image = new Image(); $image->loadFromData($thumbnail); if ($image->valid()) { $image->scaleDownToFit($maxX, $maxY); return $image; } return null; } /** * Generate secure link to download document * * @param File $file - file * @param IUser $user - user with access * @param int $version - file version * @param bool $template - file is template * * @return string */ private function getUrl(File $file, ?IUser $user, int $version = 0, bool $template = false): string { $data = [ "action" => "download", "fileId" => $file->getId() ]; $userId = null; if (!empty($user)) { $userId = $user->getUID(); $data["userId"] = $userId; } if ($version > 0) { $data["version"] = $version; } if ($template) { $data["template"] = true; } $hashUrl = $this->crypt->getHash($data); $fileUrl = $this->urlGenerator->linkToRouteAbsolute($this->appName . ".callback.download", ["doc" => $hashUrl]); if (!$this->config->useDemo() && !empty($this->config->getStorageUrl())) { $fileUrl = str_replace($this->urlGenerator->getAbsoluteURL("/"), $this->config->getStorageUrl(), $fileUrl); } return $fileUrl; } /** * Generate array with file parameters * * @param File $file - file * * @return array */ private function getFileParam(File $file): array { if ($file->getType() !== FileInfo::TYPE_FILE || $file->getSize() === 0) { return [null, null, null]; } $owner = $file->getOwner(); $key = null; $versionNum = 0; $template = false; if (FileVersions::splitPathVersion($file->getPath()) !== false) { if ($this->versionManager === null || $owner === null) { return [null, null, null]; } $versionFolder = new View("/" . $owner->getUID() . "/files_versions"); $absolutePath = $file->getPath(); $relativePath = $versionFolder->getRelativePath($absolutePath); [$filePath, $fileVersion] = FileVersions::splitPathVersion($relativePath); if ($filePath === null) { return [null, null, null]; } $file = $this->root->getUserFolder($owner->getUID())->get($filePath); $versions = FileVersions::processVersionsArray($this->versionManager->getVersionsForFile($owner, $file)); foreach ($versions as $version) { $versionNum = $versionNum + 1; $versionId = $version->getRevisionId(); if (strcmp($versionId, $fileVersion) === 0) { $key = $this->fileUtility->getVersionKey($version); $key = DocumentService::generateRevisionId($key); break; } } } else { $key = $this->fileUtility->getKey($file); $key = DocumentService::generateRevisionId($key); } if (TemplateManager::isTemplate($file->getId())) { $template = true; } $fileUrl = $this->getUrl($file, $owner, $versionNum, $template); $fileExtension = $file->getExtension(); return [$fileUrl, $fileExtension, "thumb_$key"]; } }