Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions apps/dav/lib/Connector/Sabre/ServerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
use OCP\Files\IFilenameValidator;
use OCP\Files\Mount\IMountManager;
use OCP\IConfig;
use OCP\IDateTimeZone;
use OCP\IDBConnection;
use OCP\IL10N;
use OCP\IPreview;
Expand Down Expand Up @@ -79,6 +80,7 @@ public function createServer(string $baseUri,
$objectTree,
$this->logger,
$this->eventDispatcher,
\OCP\Server::get(IDateTimeZone::class),
));

// Some WebDAV clients do require Class 2 WebDAV support (locking), since
Expand Down
4 changes: 3 additions & 1 deletion apps/dav/lib/Connector/Sabre/ZipFolderPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use OCP\Files\File as NcFile;
use OCP\Files\Folder as NcFolder;
use OCP\Files\Node as NcNode;
use OCP\IDateTimeZone;
use Psr\Log\LoggerInterface;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
Expand All @@ -41,6 +42,7 @@ public function __construct(
private Tree $tree,
private LoggerInterface $logger,
private IEventDispatcher $eventDispatcher,
private IDateTimeZone $timezoneFactory,
) {
}

Expand Down Expand Up @@ -163,7 +165,7 @@ public function handleDownload(Request $request, Response $response): ?bool {
// Full folder is loaded to rename the archive to the folder name
$archiveName = $folder->getName();
}
$streamer = new Streamer($tarRequest, -1, count($content));
$streamer = new Streamer($tarRequest, -1, count($content), $this->timezoneFactory);
$streamer->sendHeaders($archiveName);
// For full folder downloads we also add the folder itself to the archive
if (empty($files)) {
Expand Down
2 changes: 2 additions & 0 deletions apps/dav/lib/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
use OCP\IAppConfig;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IDateTimeZone;
use OCP\IPreview;
use OCP\IRequest;
use OCP\IUserSession;
Expand Down Expand Up @@ -230,6 +231,7 @@ public function __construct(
$this->server->tree,
$logger,
$eventDispatcher,
\OCP\Server::get(IDateTimeZone::class),
));
$this->server->addPlugin(\OCP\Server::get(PaginatePlugin::class));

Expand Down
22 changes: 19 additions & 3 deletions lib/private/Streamer.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\IDateTimeZone;
use OCP\IRequest;
use ownCloud\TarStreamer\TarStreamer;
use Psr\Log\LoggerInterface;
Expand All @@ -40,7 +41,12 @@ public static function isUserAgentPreferTar(IRequest $request): bool {
* @param int $numberOfFiles The number of files (and directories) that will
* be included in the streamed file
*/
public function __construct(IRequest|bool $preferTar, int|float $size, int $numberOfFiles) {
public function __construct(
IRequest|bool $preferTar,
int|float $size,
int $numberOfFiles,
private IDateTimeZone $timezoneFactory,
) {
if ($preferTar instanceof IRequest) {
$preferTar = self::isUserAgentPreferTar($preferTar);
}
Expand Down Expand Up @@ -156,7 +162,7 @@ public function addFileFromStream($stream, string $internalName, int|float $size
$options = [];
if ($time) {
$options = [
'timestamp' => $time
'timestamp' => $this->fixTimestamp($time),
];
}

Expand All @@ -176,7 +182,7 @@ public function addFileFromStream($stream, string $internalName, int|float $size
public function addEmptyDir(string $dirName, int $timestamp = 0): bool {
$options = null;
if ($timestamp > 0) {
$options = ['timestamp' => $timestamp];
$options = ['timestamp' => $this->fixTimestamp($timestamp)];
}

return $this->streamerInstance->addEmptyDir($dirName, $options);
Expand All @@ -191,4 +197,14 @@ public function addEmptyDir(string $dirName, int $timestamp = 0): bool {
public function finalize() {
return $this->streamerInstance->finalize();
}

private function fixTimestamp(int $timestamp): int {
if ($this->streamerInstance instanceof ZipStreamer) {
// Zip does not support any timezone information
// while tar is interpreted as Unix time the Zip time is interpreted as local time of the user...
$zone = $this->timezoneFactory->getTimeZone($timestamp);
$timestamp += $zone->getOffset(new \DateTimeImmutable('@' . (string)$timestamp));
}
return $timestamp;
}
}
3 changes: 2 additions & 1 deletion lib/public/AppFramework/Http/ZipResponse.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

use OC\Streamer;
use OCP\AppFramework\Http;
use OCP\IDateTimeZone;
use OCP\IRequest;

/**
Expand Down Expand Up @@ -65,7 +66,7 @@ public function callback(IOutput $output) {
$size += $resource['size'];
}

$zip = new Streamer($this->request, $size, $files);
$zip = new Streamer($this->request, $size, $files, \OCP\Server::get(IDateTimeZone::class));
$zip->sendHeaders($this->name);

foreach ($this->resources as $resource) {
Expand Down
Loading