diff options
author | Vincent Petry <pvince81@owncloud.com> | 2013-11-26 06:42:36 -0800 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2013-11-26 06:42:36 -0800 |
commit | 2653d914d96e40541378d40c0e6c7589c789f401 (patch) | |
tree | 09a0c68c38324f90a513951ae5ad157d8e7a4e2c | |
parent | dbd8128c0717941791a48334e0dcd8fec02d1e4a (diff) | |
parent | c3e34676ba0a5467cadc1fd931ed659262705388 (diff) | |
download | nextcloud-server-2653d914d96e40541378d40c0e6c7589c789f401.tar.gz nextcloud-server-2653d914d96e40541378d40c0e6c7589c789f401.zip |
Merge pull request #6008 from owncloud/extstorage-smb-webdav-renamefix
Fixed SMB rename function to overwrite target file
-rw-r--r-- | apps/files_external/3rdparty/smb4php/smb.php | 16 | ||||
-rw-r--r-- | apps/files_external/lib/streamwrapper.php | 2 | ||||
-rw-r--r-- | tests/lib/files/storage/storage.php | 10 |
3 files changed, 25 insertions, 3 deletions
diff --git a/apps/files_external/3rdparty/smb4php/smb.php b/apps/files_external/3rdparty/smb4php/smb.php index 9650f809041..87638271f0e 100644 --- a/apps/files_external/3rdparty/smb4php/smb.php +++ b/apps/files_external/3rdparty/smb4php/smb.php @@ -302,6 +302,7 @@ class smb { } function rename ($url_from, $url_to) { + $replace = false; list ($from, $to) = array (smb::parse_url($url_from), smb::parse_url($url_to)); if ($from['host'] <> $to['host'] || $from['share'] <> $to['share'] || @@ -314,7 +315,20 @@ class smb { trigger_error('rename(): error in URL', E_USER_ERROR); } smb::clearstatcache ($url_from); - $result = smb::execute ('rename "'.$from['path'].'" "'.$to['path'].'"', $to); + $cmd = ''; + // check if target file exists + if (smb::url_stat($url_to)) { + // delete target file first + $cmd = 'del "' . $to['path'] . '"; '; + $replace = true; + } + $cmd .= 'rename "' . $from['path'] . '" "' . $to['path'] . '"'; + $result = smb::execute($cmd, $to); + if ($replace) { + // clear again, else the cache will return the info + // from the old file + smb::clearstatcache ($url_to); + } return $result !== false; } diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php index aa42cbde828..7a1991d4f04 100644 --- a/apps/files_external/lib/streamwrapper.php +++ b/apps/files_external/lib/streamwrapper.php @@ -38,7 +38,7 @@ abstract class StreamWrapper extends Common { } public function filetype($path) { - return filetype($this->constructUrl($path)); + return @filetype($this->constructUrl($path)); } public function file_exists($path) { diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php index 5b5b8556859..19113f52623 100644 --- a/tests/lib/files/storage/storage.php +++ b/tests/lib/files/storage/storage.php @@ -139,7 +139,15 @@ abstract class Storage extends \PHPUnit_Framework_TestCase { $this->instance->rename('/source.txt', '/target2.txt'); $this->assertTrue($this->instance->file_exists('/target2.txt')); $this->assertFalse($this->instance->file_exists('/source.txt')); - $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target.txt')); + $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target2.txt')); + + // move to overwrite + $testContents = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; + $this->instance->file_put_contents('/target3.txt', $testContents); + $this->instance->rename('/target2.txt', '/target3.txt'); + $this->assertTrue($this->instance->file_exists('/target3.txt')); + $this->assertFalse($this->instance->file_exists('/target2.txt')); + $this->assertEquals(file_get_contents($textFile), $this->instance->file_get_contents('/target3.txt')); } public function testLocal() { |