From e15dd783ab86c0c65ec626685d59fff0128f3aca Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 18 Jun 2015 17:40:38 +0200 Subject: [PATCH] Workaround for empty dir deletion for SFTP Explicitly clear the stat cache after deleting an empty folder to make sure it is properly detected as deleted in subsequent requests. This works around a problem with phpseclib where the folder is properly deleted remotely but the stat cache was not updated. --- apps/files_external/lib/sftp.php | 6 +++++- tests/lib/files/storage/storage.php | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php index c457a87a6c..cbe090311a 100644 --- a/apps/files_external/lib/sftp.php +++ b/apps/files_external/lib/sftp.php @@ -251,7 +251,11 @@ class SFTP extends \OC\Files\Storage\Common { */ public function rmdir($path) { try { - return $this->getConnection()->delete($this->absPath($path), true); + $result = $this->getConnection()->delete($this->absPath($path), true); + // workaround: stray stat cache entry when deleting empty folders + // see https://github.com/phpseclib/phpseclib/issues/706 + $this->getConnection()->clearStatCache(); + return $result; } catch (\Exception $e) { return false; } diff --git a/tests/lib/files/storage/storage.php b/tests/lib/files/storage/storage.php index 2355009c9b..fcd7f73dcd 100644 --- a/tests/lib/files/storage/storage.php +++ b/tests/lib/files/storage/storage.php @@ -380,6 +380,13 @@ abstract class Storage extends \Test\TestCase { $this->assertFalse($this->instance->file_exists('folder')); } + public function testRmdirEmptyFolder() { + $this->assertTrue($this->instance->mkdir('empty')); + $this->wait(); + $this->assertTrue($this->instance->rmdir('empty')); + $this->assertFalse($this->instance->file_exists('empty')); + } + public function testRecursiveUnlink() { $this->instance->mkdir('folder'); $this->instance->mkdir('folder/bar');