From d02293ad90c219474c0fae10249a642b645c3b8e Mon Sep 17 00:00:00 2001 From: Maik Hundt Date: Thu, 9 Jan 2020 15:37:52 +0100 Subject: [PATCH 1/3] fix Notice: Undefined index: 0777 in Twistor\Flysystem\Plugin\Stat->mergeMeta() (line 157 of \vendor\twistor\flysystem-stream-wrapper\src\Flysystem\Plugin\Stat.php). --- src/Flysystem/Plugin/Stat.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Flysystem/Plugin/Stat.php b/src/Flysystem/Plugin/Stat.php index 94bd492..07bc976 100644 --- a/src/Flysystem/Plugin/Stat.php +++ b/src/Flysystem/Plugin/Stat.php @@ -154,7 +154,11 @@ protected function mergeMeta(array $metadata) $ret['gid'] = $this->uid->getGid(); $ret['mode'] = $metadata['type'] === 'dir' ? 040000 : 0100000; - $ret['mode'] += $this->permissions[$metadata['type']][$metadata['visibility']]; + $visibility = $metadata['visibility']; + if (is_integer($metadata['visibility'])) { + $visibility = $metadata['visibility'] & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE; + } + $ret['mode'] += $this->permissions[$metadata['type']][$visibility]; if (isset($metadata['size'])) { $ret['size'] = (int) $metadata['size']; From 824d6dbf31e1cfb7634861c492523ffe91688c01 Mon Sep 17 00:00:00 2001 From: Maik Hundt Date: Thu, 9 Jan 2020 15:54:01 +0100 Subject: [PATCH 2/3] fix --- src/Flysystem/Plugin/Stat.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Flysystem/Plugin/Stat.php b/src/Flysystem/Plugin/Stat.php index 07bc976..1e47256 100644 --- a/src/Flysystem/Plugin/Stat.php +++ b/src/Flysystem/Plugin/Stat.php @@ -154,10 +154,7 @@ protected function mergeMeta(array $metadata) $ret['gid'] = $this->uid->getGid(); $ret['mode'] = $metadata['type'] === 'dir' ? 040000 : 0100000; - $visibility = $metadata['visibility']; - if (is_integer($metadata['visibility'])) { - $visibility = $metadata['visibility'] & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE; - } + $visibility = $metadata['visibility'] & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE; $ret['mode'] += $this->permissions[$metadata['type']][$visibility]; if (isset($metadata['size'])) { From 3f90145d4016f826ad80cf921550cda2c68c4402 Mon Sep 17 00:00:00 2001 From: Maik Hundt Date: Fri, 10 Jan 2020 10:23:55 +0100 Subject: [PATCH 3/3] more generic (different adapter) --- src/Flysystem/Plugin/Stat.php | 37 ++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/Flysystem/Plugin/Stat.php b/src/Flysystem/Plugin/Stat.php index 1e47256..39ef289 100644 --- a/src/Flysystem/Plugin/Stat.php +++ b/src/Flysystem/Plugin/Stat.php @@ -139,6 +139,38 @@ protected function getWithMetadata($path, array $ignore) return $metadata; } + /** + * Normalize a permissions string. + * + * @param string $permissions + * + * @return int + */ + protected function normalizePermissions($permissions) + { + if (is_numeric($permissions)) { + return $permissions & 0777; + } + + // remove the type identifier + $permissions = substr($permissions, 1); + + // map the string rights to the numeric counterparts + $map = ['-' => '0', 'r' => '4', 'w' => '2', 'x' => '1']; + $permissions = strtr($permissions, $map); + + // split up the permission groups + $parts = str_split($permissions, 3); + + // convert the groups + $mapper = function ($part) { + return array_sum(str_split($part)); + }; + + // converts to decimal number + return octdec(implode('', array_map($mapper, $parts))); + } + /** * Merges the available metadata from Filesystem::getMetadata(). * @@ -154,7 +186,10 @@ protected function mergeMeta(array $metadata) $ret['gid'] = $this->uid->getGid(); $ret['mode'] = $metadata['type'] === 'dir' ? 040000 : 0100000; - $visibility = $metadata['visibility'] & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE; + $visibility = $metadata['visibility']; + if ($visibility != AdapterInterface::VISIBILITY_PUBLIC && $visibility != AdapterInterface::VISIBILITY_PRIVATE) { + $visibility = $this->normalizePermissions($visibility) & 0044 ? AdapterInterface::VISIBILITY_PUBLIC : AdapterInterface::VISIBILITY_PRIVATE; + } $ret['mode'] += $this->permissions[$metadata['type']][$visibility]; if (isset($metadata['size'])) {