From c1b8cb2e210377a818daf3cf107313a3d2ac9ca2 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Thu, 10 Oct 2019 12:51:24 +0200 Subject: Set the proper filename for version downloads Before it just used the internalid (timestamp often) which is not really user friendly. Signed-off-by: Roeland Jago Douma --- apps/files_versions/lib/Sabre/Plugin.php | 83 +++++++++++++++++++++++++++ apps/files_versions/lib/Sabre/VersionFile.php | 4 ++ 2 files changed, 87 insertions(+) create mode 100644 apps/files_versions/lib/Sabre/Plugin.php (limited to 'apps/files_versions/lib') diff --git a/apps/files_versions/lib/Sabre/Plugin.php b/apps/files_versions/lib/Sabre/Plugin.php new file mode 100644 index 00000000000..771d71696a9 --- /dev/null +++ b/apps/files_versions/lib/Sabre/Plugin.php @@ -0,0 +1,83 @@ + + * + * @author Roeland Jago Douma + * + * @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\Files_Versions\Sabre; + +use OC\AppFramework\Http\Request; +use OCP\IRequest; +use Sabre\DAV\Exception\NotFound; +use Sabre\DAV\Server; +use Sabre\DAV\ServerPlugin; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; + +class Plugin extends ServerPlugin { + + /** @var Server */ + private $server; + /** @var IRequest */ + private $request; + + function __construct(IRequest $request) { + $this->request = $request; + } + + function initialize(Server $server) { + $this->server = $server; + + $server->on('afterMethod:GET', [$this, 'afterGet']); + } + + public function afterGet(RequestInterface $request, ResponseInterface $response) { + $path = $request->getPath(); + if (strpos($path, 'versions') !== 0) { + return; + } + + try { + $node = $this->server->tree->getNodeForPath($path); + } catch (NotFound $e) { + return; + } + + if (!($node instanceof VersionFile)) { + return; + } + + $filename = $node->getVersion()->getSourceFileName(); + + if ($this->request->isUserAgent( + [ + Request::USER_AGENT_IE, + Request::USER_AGENT_ANDROID_MOBILE_CHROME, + Request::USER_AGENT_FREEBOX, + ])) { + $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurlencode($filename) . '"'); + } else { + $response->addHeader('Content-Disposition', 'attachment; filename*=UTF-8\'\'' . rawurlencode($filename) + . '; filename="' . rawurlencode($filename) . '"'); + } + } + +} diff --git a/apps/files_versions/lib/Sabre/VersionFile.php b/apps/files_versions/lib/Sabre/VersionFile.php index 2d630008d2a..ac28e0fd877 100644 --- a/apps/files_versions/lib/Sabre/VersionFile.php +++ b/apps/files_versions/lib/Sabre/VersionFile.php @@ -86,4 +86,8 @@ class VersionFile implements IFile { public function rollBack() { $this->versionManager->rollback($this->version); } + + public function getVersion(): IVersion { + return $this->version; + } } -- cgit v1.2.3