Merge pull request #5070 from owncloud/smb-streamwrapper-fixes
Various fixes for the streamwrapper based SMB backend
This commit is contained in:
commit
9637ca3ae8
|
@ -181,6 +181,8 @@ class smb {
|
||||||
return false;
|
return false;
|
||||||
}elseif(substr($regs[0],0,31)=='NT_STATUS_OBJECT_PATH_NOT_FOUND'){
|
}elseif(substr($regs[0],0,31)=='NT_STATUS_OBJECT_PATH_NOT_FOUND'){
|
||||||
return false;
|
return false;
|
||||||
|
}elseif(substr($regs[0],0,31)=='NT_STATUS_OBJECT_NAME_NOT_FOUND'){
|
||||||
|
return false;
|
||||||
}elseif(substr($regs[0],0,29)=='NT_STATUS_FILE_IS_A_DIRECTORY'){
|
}elseif(substr($regs[0],0,29)=='NT_STATUS_FILE_IS_A_DIRECTORY'){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -305,7 +307,8 @@ class smb {
|
||||||
trigger_error('rename(): error in URL', E_USER_ERROR);
|
trigger_error('rename(): error in URL', E_USER_ERROR);
|
||||||
}
|
}
|
||||||
smb::clearstatcache ($url_from);
|
smb::clearstatcache ($url_from);
|
||||||
return smb::execute ('rename "'.$from['path'].'" "'.$to['path'].'"', $to);
|
$result = smb::execute ('rename "'.$from['path'].'" "'.$to['path'].'"', $to);
|
||||||
|
return $result !== false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function mkdir ($url, $mode, $options) {
|
function mkdir ($url, $mode, $options) {
|
||||||
|
@ -430,7 +433,10 @@ class smb_stream_wrapper extends smb {
|
||||||
case 'rb':
|
case 'rb':
|
||||||
case 'a':
|
case 'a':
|
||||||
case 'a+': $this->tmpfile = tempnam('/tmp', 'smb.down.');
|
case 'a+': $this->tmpfile = tempnam('/tmp', 'smb.down.');
|
||||||
smb::execute ('get "'.$pu['path'].'" "'.$this->tmpfile.'"', $pu);
|
$result = smb::execute ('get "'.$pu['path'].'" "'.$this->tmpfile.'"', $pu);
|
||||||
|
if($result === false){
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
case 'w+':
|
case 'w+':
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
namespace OC\Files\Storage;
|
namespace OC\Files\Storage;
|
||||||
|
|
||||||
abstract class StreamWrapper extends Common{
|
abstract class StreamWrapper extends Common {
|
||||||
abstract public function constructUrl($path);
|
abstract public function constructUrl($path);
|
||||||
|
|
||||||
public function mkdir($path) {
|
public function mkdir($path) {
|
||||||
|
@ -16,7 +16,15 @@ abstract class StreamWrapper extends Common{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function rmdir($path) {
|
public function rmdir($path) {
|
||||||
if($this->file_exists($path)) {
|
if ($this->file_exists($path)) {
|
||||||
|
$dh = $this->opendir($path);
|
||||||
|
while (($file = readdir($dh)) !== false) {
|
||||||
|
if ($this->is_dir($path . '/' . $file)) {
|
||||||
|
$this->rmdir($path . '/' . $file);
|
||||||
|
} else {
|
||||||
|
$this->unlink($path . '/' . $file);
|
||||||
|
}
|
||||||
|
}
|
||||||
$success = rmdir($this->constructUrl($path));
|
$success = rmdir($this->constructUrl($path));
|
||||||
clearstatcache();
|
clearstatcache();
|
||||||
return $success;
|
return $success;
|
||||||
|
@ -34,11 +42,11 @@ abstract class StreamWrapper extends Common{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isReadable($path) {
|
public function isReadable($path) {
|
||||||
return true;//not properly supported
|
return true; //not properly supported
|
||||||
}
|
}
|
||||||
|
|
||||||
public function isUpdatable($path) {
|
public function isUpdatable($path) {
|
||||||
return true;//not properly supported
|
return true; //not properly supported
|
||||||
}
|
}
|
||||||
|
|
||||||
public function file_exists($path) {
|
public function file_exists($path) {
|
||||||
|
@ -55,15 +63,19 @@ abstract class StreamWrapper extends Common{
|
||||||
return fopen($this->constructUrl($path), $mode);
|
return fopen($this->constructUrl($path), $mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function touch($path, $mtime=null) {
|
public function touch($path, $mtime = null) {
|
||||||
if(is_null($mtime)) {
|
if ($this->file_exists($path)) {
|
||||||
|
if (is_null($mtime)) {
|
||||||
$fh = $this->fopen($path, 'a');
|
$fh = $this->fopen($path, 'a');
|
||||||
fwrite($fh, '');
|
fwrite($fh, '');
|
||||||
fclose($fh);
|
fclose($fh);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;//not supported
|
return false; //not supported
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$this->file_put_contents($path, '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ class SMB extends Storage {
|
||||||
public function setUp() {
|
public function setUp() {
|
||||||
$id = uniqid();
|
$id = uniqid();
|
||||||
$this->config = include('files_external/tests/config.php');
|
$this->config = include('files_external/tests/config.php');
|
||||||
if ( ! is_array($this->config) or ! isset($this->config['smb']) or ! $this->config['smb']['run']) {
|
if (!is_array($this->config) or !isset($this->config['smb']) or !$this->config['smb']['run']) {
|
||||||
$this->markTestSkipped('Samba backend not configured');
|
$this->markTestSkipped('Samba backend not configured');
|
||||||
}
|
}
|
||||||
$this->config['smb']['root'] .= $id; //make sure we have an new empty folder to work in
|
$this->config['smb']['root'] .= $id; //make sure we have an new empty folder to work in
|
||||||
|
@ -28,4 +28,11 @@ class SMB extends Storage {
|
||||||
\OCP\Files::rmdirr($this->instance->constructUrl(''));
|
\OCP\Files::rmdirr($this->instance->constructUrl(''));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testRenameWithSpaces() {
|
||||||
|
$this->instance->mkdir('with spaces');
|
||||||
|
$result = $this->instance->rename('with spaces', 'foo bar');
|
||||||
|
$this->assertTrue($result);
|
||||||
|
$this->assertTrue($this->instance->is_dir('foo bar'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue