From 56d96b32cb1b6e113c23b5cb3c8dae469309baaa Mon Sep 17 00:00:00 2001 From: Brasdrive Date: Sun, 9 Nov 2025 18:18:30 -0400 Subject: [PATCH] 3.0.0 --- src/Filesystem/Adapters/WebdavAdapter.php | 72 +++++++++++++++++------ 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/src/Filesystem/Adapters/WebdavAdapter.php b/src/Filesystem/Adapters/WebdavAdapter.php index 1123430..42eb9ff 100644 --- a/src/Filesystem/Adapters/WebdavAdapter.php +++ b/src/Filesystem/Adapters/WebdavAdapter.php @@ -15,13 +15,13 @@ final class WebdavAdapter { public function createAdapter(array $config): FilesystemAdapter { - if (!isset($config['webdav']) || !is_array($config['webdav'])) { + if (! isset($config['webdav']) || ! is_array($config['webdav'])) { throw new InvalidArgumentException('La configuración de WebDAV no está definida.'); } $webdav = $config['webdav']; - $endpoint = $this->requiredString($webdav, 'endpoint', 'webdav.endpoint'); + $endpoint = $this->requiredString($webdav, 'endpoint', 'webdav.endpoint'); $credentials = $webdav['credentials'] ?? []; $username = $this->requiredString($credentials, 'username', 'webdav.credentials.username'); @@ -38,39 +38,29 @@ final class WebdavAdapter $clientConfig['authType'] = $authType; } - if (!empty($webdav['default_headers']) && is_array($webdav['default_headers'])) { + if (! empty($webdav['default_headers']) && is_array($webdav['default_headers'])) { $clientConfig['headers'] = $this->normaliseHeaders($webdav['default_headers']); } - if (!empty($webdav['timeout'])) { + if (! empty($webdav['timeout'])) { $clientConfig['timeout'] = (int) $webdav['timeout']; } - if (!empty($webdav['curl_options']) && is_array($webdav['curl_options'])) { + if (! empty($webdav['curl_options']) && is_array($webdav['curl_options'])) { $clientConfig['curl.options'] = $webdav['curl_options']; } $client = new Client($clientConfig); $prefix = ''; - if (!empty($webdav['prefix'])) { + if (! empty($webdav['prefix'])) { $prefix = trim((string) $webdav['prefix'], '/'); } $defaultVisibility = $webdav['default_visibility'] ?? ($config['visibility'] ?? Visibility::PRIVATE); $visibility = $this->normaliseVisibility($defaultVisibility); - // Permisos Unix por defecto (puedes exponerlos en config si lo necesitas) - $permissions = $webdav['permissions'] ?? [ - 'file' => [ - Visibility::PUBLIC => 0644, - Visibility::PRIVATE => 0600, - ], - 'dir' => [ - Visibility::PUBLIC => 0755, - Visibility::PRIVATE => 0700, - ], - ]; + $permissions = $this->normalisePermissions($webdav['permissions'] ?? []); $directoryDefault = $visibility === Visibility::PUBLIC ? 0755 : 0700; @@ -86,7 +76,7 @@ final class WebdavAdapter { $value = $config[$key] ?? null; - if (!is_string($value) || trim($value) === '') { + if (! is_string($value) || trim($value) === '') { $path ??= $key; throw new InvalidArgumentException(sprintf( @@ -108,7 +98,7 @@ final class WebdavAdapter $normalised = []; foreach ($headers as $header => $value) { - if (!is_string($header) || $header === '') { + if (! is_string($header) || $header === '') { continue; } @@ -124,4 +114,48 @@ final class WebdavAdapter ? Visibility::PUBLIC : Visibility::PRIVATE; } + + private function normalisePermissions(array $permissions): array + { + $defaults = [ + 'file' => [ + Visibility::PUBLIC => 0644, + Visibility::PRIVATE => 0600, + ], + 'dir' => [ + Visibility::PUBLIC => 0755, + Visibility::PRIVATE => 0700, + ], + ]; + + foreach (['file', 'dir'] as $type) { + if (! isset($permissions[$type]) || ! is_array($permissions[$type])) { + continue; + } + + foreach ($permissions[$type] as $visibility => $mode) { + $visibility = strtolower((string) $visibility); + + if ($visibility !== Visibility::PUBLIC && $visibility !== Visibility::PRIVATE) { + continue; + } + + if (is_string($mode)) { + $mode = trim($mode); + + if ($mode === '') { + continue; + } + + $mode = octdec($mode); + } elseif (! is_int($mode)) { + continue; + } + + $defaults[$type][$visibility] = $mode; + } + } + + return $defaults; + } }