Skip to content

Commit

Permalink
COPY does not delete the destination and by that allows to keep versi…
Browse files Browse the repository at this point in the history
…ons - related to #18307 but needs to be addressed for MOVE
  • Loading branch information
DeepDiver1975 committed Oct 19, 2017
1 parent 2f8d0aa commit 52cdaa2
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 0 deletions.
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 @@ -384,6 +384,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\CorePlugin;

/**
* Class \OCA\DAV\Connector\Sabre\Server
*
Expand All @@ -40,5 +42,6 @@ public function __construct($treeOrNode = null) {
parent::__construct($treeOrNode);
self::$exposeVersion = false;
$this->enablePropfindDepthInfinity = true;
$this->addPlugin(new CorePlugin());
}
}
88 changes: 88 additions & 0 deletions apps/dav/lib/DAV/CorePlugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
<?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\File;
use OCA\DAV\Files\ICopySource;
use Sabre\DAV\IFile;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;

class CorePlugin 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
*/
function httpCopy(RequestInterface $request, ResponseInterface $response) {

$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->put($sourceNode->get());
}

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

// If a resource was overwritten we should send a 204, otherwise a 201
$response->setHeader('Content-Length', '0');
$response->setStatus($copyInfo['destinationExists'] ? 204 : 201);

// Sending back false will interrupt the event chain and tell the server
// we've handled this method.
return false;
}

}
33 changes: 33 additions & 0 deletions apps/dav/lib/Files/ICopySource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?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 {

/**
* @param string $destinationPath
* @return boolean
*/
public function copy($destinationPath);
}

0 comments on commit 52cdaa2

Please sign in to comment.