Skip to content

Commit

Permalink
Merge pull request #31050 from owncloud/stable10-11c0712ea23070a62020…
Browse files Browse the repository at this point in the history
…a5dd8b6407db259e5b0d

[stable10] Backport all objectstore related changes
  • Loading branch information
patrickjahns authored Jun 11, 2018
2 parents 785b426 + 94c18a3 commit ead5147
Show file tree
Hide file tree
Showing 105 changed files with 4,213 additions and 1,432 deletions.
10 changes: 9 additions & 1 deletion apps/dav/lib/Connector/Sabre/File.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
use OCA\DAV\Connector\Sabre\Exception\FileLocked;
use OCA\DAV\Connector\Sabre\Exception\Forbidden as DAVForbiddenException;
use OCA\DAV\Connector\Sabre\Exception\UnsupportedMediaType;
use OCA\DAV\Files\IFileNode;
use OCP\Encryption\Exceptions\GenericEncryptionException;
use OCP\Events\EventEmitterTrait;
use OCP\Files\EntityTooLargeException;
Expand All @@ -61,7 +62,7 @@
use Sabre\DAV\IFile;
use Symfony\Component\EventDispatcher\GenericEvent;

class File extends Node implements IFile {
class File extends Node implements IFile, IFileNode {

use EventEmitterTrait;
protected $request;
Expand Down Expand Up @@ -714,4 +715,11 @@ public function getChecksum($algo = null) {
protected function header($string) {
\header($string);
}

/**
* @return \OCP\Files\Node
*/
public function getNode() {
return \OC::$server->getRootFolder()->get($this->getFileInfo()->getPath());
}
}
16 changes: 14 additions & 2 deletions apps/dav/lib/Connector/Sabre/FilesPlugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
namespace OCA\DAV\Connector\Sabre;

use OC\AppFramework\Http\Request;
use OCA\DAV\Files\IProvidesAdditionalHeaders;
use OCA\DAV\Meta\MetaFile;
use OCP\Files\ForbiddenException;
use OCP\Files\StorageNotAvailableException;
use OCP\IConfig;
Expand Down Expand Up @@ -231,15 +233,18 @@ function httpGet(RequestInterface $request, ResponseInterface $response) {
// adds a 'Content-Disposition: attachment' header
if ($this->downloadAttachment) {
$filename = $node->getName();
if ($node instanceof IProvidesAdditionalHeaders) {
$filename = $node->getContentDispositionFileName();
}
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) . '"');
$response->setHeader('Content-Disposition', 'attachment; filename="' . rawurlencode($filename) . '"');
} else {
$response->addHeader('Content-Disposition', 'attachment; filename*=UTF-8\'\'' . rawurlencode($filename)
$response->setHeader('Content-Disposition', 'attachment; filename*=UTF-8\'\'' . rawurlencode($filename)
. '; filename="' . rawurlencode($filename) . '"');
}
}
Expand All @@ -255,6 +260,13 @@ function httpGet(RequestInterface $request, ResponseInterface $response) {
// cause memory problems in the nginx process.
$response->addHeader('X-Accel-Buffering', 'no');
}

if ($node instanceof IProvidesAdditionalHeaders) {
$headers = $node->getHeaders();
if (is_array($headers)) {
$response->addHeaders($headers);
}
}
}

/**
Expand Down
3 changes: 3 additions & 0 deletions apps/dav/lib/Connector/Sabre/Node.php
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,9 @@ public function changeLock($type) {
$this->fileView->changeLock($this->path, $type);
}

/**
* @return \OCP\Files\FileInfo
*/
public function getFileInfo() {
return $this->info;
}
Expand Down
3 changes: 3 additions & 0 deletions apps/dav/lib/Connector/Sabre/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@

namespace OCA\DAV\Connector\Sabre;

use OCA\DAV\DAV\CopyPlugin;

/**
* Class \OCA\DAV\Connector\Sabre\Server
*
Expand All @@ -41,5 +43,6 @@ public function __construct($treeOrNode = null) {
parent::__construct($treeOrNode);
self::$exposeVersion = false;
$this->enablePropfindDepthInfinity = true;
$this->addPlugin(new CopyPlugin());
}
}
106 changes: 106 additions & 0 deletions apps/dav/lib/DAV/CopyPlugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<?php
/**
* @author Thomas Müller <[email protected]>
*
* @copyright Copyright (c) 2017, ownCloud GmbH
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/


namespace OCA\DAV\DAV;

use OCA\DAV\Connector\Sabre\Exception\Forbidden;
use OCA\DAV\Connector\Sabre\File;
use OCA\DAV\Files\ICopySource;
use OCP\Files\ForbiddenException;
use OCP\Lock\ILockingProvider;
use Sabre\DAV\IFile;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;

/**
* Class CopyPlugin - adds own implementation of the COPY method.
* This is necessary because we don't want the target to be deleted before the move.
*
* Deleting the target will kill the versions which is the wrong behavior.
*
* @package OCA\DAV\DAV
*/
class CopyPlugin extends ServerPlugin {

/** @var Server */
private $server;

/**
* @param Server $server
*/
function initialize(Server $server) {
$this->server = $server;
$server->on('method:COPY', [$this, 'httpCopy'], 90);
}

/**
* WebDAV HTTP COPY method
*
* This method copies one uri to a different uri, and works much like the MOVE request
* A lot of the actual request processing is done in getCopyMoveInfo
*
* @param RequestInterface $request
* @param ResponseInterface $response
* @return bool
* @throws Forbidden
*/
function httpCopy(RequestInterface $request, ResponseInterface $response) {

try {

$path = $request->getPath();

$copyInfo = $this->server->getCopyAndMoveInfo($request);
$sourceNode = $this->server->tree->getNodeForPath($path);
$destinationNode = $copyInfo['destinationNode'];
if (!$copyInfo['destinationExists'] || !$destinationNode instanceof File || !$sourceNode instanceof IFile) {
return true;
}

if (!$this->server->emit('beforeBind', [$copyInfo['destination']])) return false;

$copySuccess = false;
if ($sourceNode instanceof ICopySource) {
$copySuccess = $sourceNode->copy($destinationNode->getFileInfo()->getPath());
}
if (!$copySuccess) {
$destinationNode->acquireLock(ILockingProvider::LOCK_SHARED);
$destinationNode->put($sourceNode->get());
$destinationNode->releaseLock(ILockingProvider::LOCK_SHARED);
}

$this->server->emit('afterBind', [$copyInfo['destination']]);

$response->setHeader('Content-Length', '0');
$response->setStatus(204);

// Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
} catch (ForbiddenException $ex) {
throw new Forbidden($ex->getMessage(), $ex->getRetry());
}
}

}
43 changes: 43 additions & 0 deletions apps/dav/lib/Files/ICopySource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php
/**
* @author Thomas Müller <[email protected]>
*
* @copyright Copyright (c) 2017, ownCloud GmbH
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/


namespace OCA\DAV\Files;


/**
* Interface ICopySource
* This interface allows special handling of copy operations based on the copy source.
* This gives the developer the freedom to implement a more efficient copy operation.
*
* @package OCA\DAV\Files
*/
interface ICopySource {

/**
* Copies the source to the given destination.
* If the operation was not successful false is returned.
*
* @param string $destinationPath
* @return boolean
*/
public function copy($destinationPath);
}
35 changes: 35 additions & 0 deletions apps/dav/lib/Files/IFileNode.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php
/**
* @author Thomas Müller <[email protected]>
*
* @copyright Copyright (c) 2017, ownCloud GmbH
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/


namespace OCA\DAV\Files;


use OCP\Files\Node;

interface IFileNode {

/**
* @return Node
*/
public function getNode();

}
44 changes: 44 additions & 0 deletions apps/dav/lib/Files/IProvidesAdditionalHeaders.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?php
/**
* @author Thomas Müller <[email protected]>
*
* @copyright Copyright (c) 2017, ownCloud GmbH
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* 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, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/


namespace OCA\DAV\Files;


/**
* Interface IProvidesAdditionalHeaders
* This interface allows to add additional headers to the response
*
* @package OCA\DAV\Files
*/
interface IProvidesAdditionalHeaders {

/**
* @return array
*/
public function getHeaders();

/**
* @return string
*/
public function getContentDispositionFileName();

}
Loading

0 comments on commit ead5147

Please sign in to comment.