diff options
author | Robin Appelman <robin@icewind.nl> | 2022-03-17 19:25:26 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-17 19:25:26 +0300 |
commit | ec4be7f2be89dbd5fe99f7f3ea3f879739ffbea6 (patch) | |
tree | 76aca2435a0dda23d414bcefc2cffb2fd789f6a2 /apps/files_external | |
parent | bf48c0b1b4bd3677a70aa0d7c8a50a5253c4cb5b (diff) | |
parent | a6f245f6ffca51dd72149ac5e82b17fa7589ae02 (diff) |
Merge pull request #31215 from nextcloud/smb-directory-invalid-type
handle invalid type when listing directory in smb
Diffstat (limited to 'apps/files_external')
-rw-r--r-- | apps/files_external/lib/Lib/Storage/SMB.php | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php index 28a2d6de7cc..6464264f3a4 100644 --- a/apps/files_external/lib/Lib/Storage/SMB.php +++ b/apps/files_external/lib/Lib/Storage/SMB.php @@ -43,6 +43,7 @@ use Icewind\SMB\Exception\ConnectException; use Icewind\SMB\Exception\Exception; use Icewind\SMB\Exception\ForbiddenException; use Icewind\SMB\Exception\InvalidArgumentException; +use Icewind\SMB\Exception\InvalidTypeException; use Icewind\SMB\Exception\NotFoundException; use Icewind\SMB\Exception\OutOfSpaceException; use Icewind\SMB\Exception\TimedOutException; @@ -84,7 +85,7 @@ class SMB extends Common implements INotifyStorage { protected $root; /** - * @var \Icewind\SMB\IFileInfo[] + * @var IFileInfo[] */ protected $statCache; @@ -179,20 +180,24 @@ class SMB extends Common implements INotifyStorage { /** * @param string $path - * @return \Icewind\SMB\IFileInfo + * @return IFileInfo * @throws StorageAuthException */ protected function getFileInfo($path) { try { $path = $this->buildPath($path); - if (!isset($this->statCache[$path])) { - $this->statCache[$path] = $this->share->stat($path); + $cached = $this->statCache[$path] ?? null; + if ($cached instanceof IFileInfo) { + return $cached; + } else { + $stat = $this->share->stat($path); + $this->statCache[$path] = $stat; + return $stat; } - return $this->statCache[$path]; } catch (ConnectException $e) { $this->throwUnavailable($e); } catch (ForbiddenException $e) { - // with php-smbclient, this exceptions is thrown when the provided password is invalid. + // with php-smbclient, this exception is thrown when the provided password is invalid. // Possible is also ForbiddenException with a different error code, so we check it. if ($e->getCode() === 1) { $this->throwUnavailable($e); @@ -203,6 +208,7 @@ class SMB extends Common implements INotifyStorage { /** * @param \Exception $e + * @return never * @throws StorageAuthException */ protected function throwUnavailable(\Exception $e) { @@ -230,7 +236,7 @@ class SMB extends Common implements INotifyStorage { /** * @param string $path - * @return \Icewind\SMB\IFileInfo[] + * @return \Generator<IFileInfo> * @throws StorageNotAvailableException */ protected function getFolderContents($path): iterable { @@ -241,6 +247,8 @@ class SMB extends Common implements INotifyStorage { } catch (ForbiddenException $e) { $this->logger->critical($e->getMessage(), ['exception' => $e]); throw new NotPermittedException(); + } catch (InvalidTypeException $e) { + return; } foreach ($files as $file) { $this->statCache[$path . '/' . $file->getName()] = $file; @@ -281,7 +289,7 @@ class SMB extends Common implements INotifyStorage { } /** - * @param \Icewind\SMB\IFileInfo $info + * @param IFileInfo $info * @return array */ protected function formatInfo($info) { @@ -613,7 +621,7 @@ class SMB extends Common implements INotifyStorage { return false; } $names = array_map(function ($info) { - /** @var \Icewind\SMB\IFileInfo $info */ + /** @var IFileInfo $info */ return $info->getName(); }, iterator_to_array($files)); return IteratorDirectory::wrap($names); |