This commit is contained in:
Brasdrive 2025-11-09 18:18:30 -04:00
parent ac0a351064
commit 56d96b32cb
1 changed files with 53 additions and 19 deletions

View File

@ -15,13 +15,13 @@ final class WebdavAdapter
{ {
public function createAdapter(array $config): FilesystemAdapter 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.'); throw new InvalidArgumentException('La configuración de WebDAV no está definida.');
} }
$webdav = $config['webdav']; $webdav = $config['webdav'];
$endpoint = $this->requiredString($webdav, 'endpoint', 'webdav.endpoint'); $endpoint = $this->requiredString($webdav, 'endpoint', 'webdav.endpoint');
$credentials = $webdav['credentials'] ?? []; $credentials = $webdav['credentials'] ?? [];
$username = $this->requiredString($credentials, 'username', 'webdav.credentials.username'); $username = $this->requiredString($credentials, 'username', 'webdav.credentials.username');
@ -38,39 +38,29 @@ final class WebdavAdapter
$clientConfig['authType'] = $authType; $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']); $clientConfig['headers'] = $this->normaliseHeaders($webdav['default_headers']);
} }
if (!empty($webdav['timeout'])) { if (! empty($webdav['timeout'])) {
$clientConfig['timeout'] = (int) $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']; $clientConfig['curl.options'] = $webdav['curl_options'];
} }
$client = new Client($clientConfig); $client = new Client($clientConfig);
$prefix = ''; $prefix = '';
if (!empty($webdav['prefix'])) { if (! empty($webdav['prefix'])) {
$prefix = trim((string) $webdav['prefix'], '/'); $prefix = trim((string) $webdav['prefix'], '/');
} }
$defaultVisibility = $webdav['default_visibility'] ?? ($config['visibility'] ?? Visibility::PRIVATE); $defaultVisibility = $webdav['default_visibility'] ?? ($config['visibility'] ?? Visibility::PRIVATE);
$visibility = $this->normaliseVisibility($defaultVisibility); $visibility = $this->normaliseVisibility($defaultVisibility);
// Permisos Unix por defecto (puedes exponerlos en config si lo necesitas) $permissions = $this->normalisePermissions($webdav['permissions'] ?? []);
$permissions = $webdav['permissions'] ?? [
'file' => [
Visibility::PUBLIC => 0644,
Visibility::PRIVATE => 0600,
],
'dir' => [
Visibility::PUBLIC => 0755,
Visibility::PRIVATE => 0700,
],
];
$directoryDefault = $visibility === Visibility::PUBLIC ? 0755 : 0700; $directoryDefault = $visibility === Visibility::PUBLIC ? 0755 : 0700;
@ -86,7 +76,7 @@ final class WebdavAdapter
{ {
$value = $config[$key] ?? null; $value = $config[$key] ?? null;
if (!is_string($value) || trim($value) === '') { if (! is_string($value) || trim($value) === '') {
$path ??= $key; $path ??= $key;
throw new InvalidArgumentException(sprintf( throw new InvalidArgumentException(sprintf(
@ -108,7 +98,7 @@ final class WebdavAdapter
$normalised = []; $normalised = [];
foreach ($headers as $header => $value) { foreach ($headers as $header => $value) {
if (!is_string($header) || $header === '') { if (! is_string($header) || $header === '') {
continue; continue;
} }
@ -124,4 +114,48 @@ final class WebdavAdapter
? Visibility::PUBLIC ? Visibility::PUBLIC
: Visibility::PRIVATE; : 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;
}
} }