Skip to content

Commit b4924ea

Browse files
committed
fix: Default visibility for directories
1 parent bdae49f commit b4924ea

26 files changed

+162
-103
lines changed

src/Adapter/AdapterDefinitionFactory.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ public function __construct()
4040
];
4141
}
4242

43-
public function createDefinition(string $name, array $options): ?Definition
43+
public function createDefinition(string $name, array $options, ?string $defaultVisibilityForDirectories): ?Definition
4444
{
4545
foreach ($this->builders as $builder) {
4646
if ($builder->getName() === $name) {
47-
return $builder->createDefinition($options);
47+
return $builder->createDefinition($options, $defaultVisibilityForDirectories);
4848
}
4949
}
5050

src/Adapter/Builder/AbstractAdapterDefinitionBuilder.php

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace League\FlysystemBundle\Adapter\Builder;
1313

14+
use League\Flysystem\UnixVisibility\PortableVisibilityConverter;
1415
use League\FlysystemBundle\Exception\MissingPackageException;
1516
use Symfony\Component\DependencyInjection\Definition;
1617
use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -22,7 +23,7 @@
2223
*/
2324
abstract class AbstractAdapterDefinitionBuilder implements AdapterDefinitionBuilderInterface
2425
{
25-
final public function createDefinition(array $options): Definition
26+
final public function createDefinition(array $options, ?string $defaultVisibilityForDirectories): Definition
2627
{
2728
$this->ensureRequiredPackagesAvailable();
2829

@@ -31,7 +32,7 @@ final public function createDefinition(array $options): Definition
3132

3233
$definition = new Definition();
3334
$definition->setPublic(false);
34-
$this->configureDefinition($definition, $resolver->resolve($options));
35+
$this->configureDefinition($definition, $resolver->resolve($options), $defaultVisibilityForDirectories);
3536

3637
return $definition;
3738
}
@@ -40,9 +41,49 @@ abstract protected function getRequiredPackages(): array;
4041

4142
abstract protected function configureOptions(OptionsResolver $resolver);
4243

43-
abstract protected function configureDefinition(Definition $definition, array $options);
44+
abstract protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories);
4445

45-
private function ensureRequiredPackagesAvailable()
46+
protected function configureUnixOptions(OptionsResolver $resolver): void
47+
{
48+
$resolver->setDefault('permissions', function (OptionsResolver $subResolver) {
49+
$subResolver->setDefault('file', function (OptionsResolver $permsResolver) {
50+
$permsResolver->setDefault('public', 0644);
51+
$permsResolver->setAllowedTypes('public', 'scalar');
52+
53+
$permsResolver->setDefault('private', 0600);
54+
$permsResolver->setAllowedTypes('private', 'scalar');
55+
});
56+
57+
$subResolver->setDefault('dir', function (OptionsResolver $permsResolver) {
58+
$permsResolver->setDefault('public', 0755);
59+
$permsResolver->setAllowedTypes('public', 'scalar');
60+
61+
$permsResolver->setDefault('private', 0700);
62+
$permsResolver->setAllowedTypes('private', 'scalar');
63+
});
64+
});
65+
}
66+
67+
protected function createUnixDefinition(array $permissions, string $defaultVisibilityForDirectories): Definition
68+
{
69+
return (new Definition(PortableVisibilityConverter::class))
70+
->setFactory([PortableVisibilityConverter::class, 'fromArray'])
71+
->addArgument([
72+
'file' => [
73+
'public' => (int) $permissions['file']['public'],
74+
'private' => (int) $permissions['file']['private'],
75+
],
76+
'dir' => [
77+
'public' => (int) $permissions['dir']['public'],
78+
'private' => (int) $permissions['dir']['private'],
79+
],
80+
])
81+
->addArgument($defaultVisibilityForDirectories)
82+
->setShared(false)
83+
;
84+
}
85+
86+
private function ensureRequiredPackagesAvailable(): void
4687
{
4788
$missingPackages = [];
4889
foreach ($this->getRequiredPackages() as $requiredClass => $packageName) {

src/Adapter/Builder/AdapterDefinitionBuilderInterface.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@ public function getName(): string;
2525
/**
2626
* Create the definition for this builder's adapter given an array of options.
2727
*/
28-
public function createDefinition(array $options): Definition;
28+
public function createDefinition(array $options, ?string $defaultVisibilityForDirectories): Definition;
2929
}

src/Adapter/Builder/AsyncAwsAdapterDefinitionBuilder.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
namespace League\FlysystemBundle\Adapter\Builder;
1313

1414
use League\Flysystem\AsyncAwsS3\AsyncAwsS3Adapter;
15+
use League\Flysystem\AsyncAwsS3\PortableVisibilityConverter;
16+
use League\Flysystem\Visibility;
1517
use Symfony\Component\DependencyInjection\Definition;
1618
use Symfony\Component\DependencyInjection\Reference;
1719
use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -36,7 +38,7 @@ protected function getRequiredPackages(): array
3638
];
3739
}
3840

39-
protected function configureOptions(OptionsResolver $resolver)
41+
protected function configureOptions(OptionsResolver $resolver): void
4042
{
4143
$resolver->setRequired('client');
4244
$resolver->setAllowedTypes('client', 'string');
@@ -48,11 +50,16 @@ protected function configureOptions(OptionsResolver $resolver)
4850
$resolver->setAllowedTypes('prefix', 'string');
4951
}
5052

51-
protected function configureDefinition(Definition $definition, array $options)
53+
protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void
5254
{
5355
$definition->setClass(AsyncAwsS3Adapter::class);
5456
$definition->setArgument(0, new Reference($options['client']));
5557
$definition->setArgument(1, $options['bucket']);
5658
$definition->setArgument(2, $options['prefix']);
59+
$definition->setArgument(3,
60+
(new Definition(PortableVisibilityConverter::class))
61+
->setArgument(0, $defaultVisibilityForDirectories ?? Visibility::PUBLIC)
62+
->setShared(false)
63+
);
5764
}
5865
}

src/Adapter/Builder/AwsAdapterDefinitionBuilder.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
namespace League\FlysystemBundle\Adapter\Builder;
1313

1414
use League\Flysystem\AwsS3V3\AwsS3V3Adapter;
15+
use League\Flysystem\AwsS3V3\PortableVisibilityConverter;
16+
use League\Flysystem\Visibility;
1517
use Symfony\Component\DependencyInjection\Definition;
1618
use Symfony\Component\DependencyInjection\Reference;
1719
use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -35,7 +37,7 @@ protected function getRequiredPackages(): array
3537
];
3638
}
3739

38-
protected function configureOptions(OptionsResolver $resolver)
40+
protected function configureOptions(OptionsResolver $resolver): void
3941
{
4042
$resolver->setRequired('client');
4143
$resolver->setAllowedTypes('client', 'string');
@@ -53,13 +55,17 @@ protected function configureOptions(OptionsResolver $resolver)
5355
$resolver->setAllowedTypes('streamReads', 'bool');
5456
}
5557

56-
protected function configureDefinition(Definition $definition, array $options)
58+
protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void
5759
{
5860
$definition->setClass(AwsS3V3Adapter::class);
5961
$definition->setArgument(0, new Reference($options['client']));
6062
$definition->setArgument(1, $options['bucket']);
6163
$definition->setArgument(2, $options['prefix']);
62-
$definition->setArgument(3, null);
64+
$definition->setArgument(3,
65+
(new Definition(PortableVisibilityConverter::class))
66+
->setArgument(0, $defaultVisibilityForDirectories ?? Visibility::PUBLIC)
67+
->setShared(false)
68+
);
6369
$definition->setArgument(4, null);
6470
$definition->setArgument(5, $options['options']);
6571
$definition->setArgument(6, $options['streamReads']);

src/Adapter/Builder/AzureAdapterDefinitionBuilder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ protected function getRequiredPackages(): array
3535
];
3636
}
3737

38-
protected function configureOptions(OptionsResolver $resolver)
38+
protected function configureOptions(OptionsResolver $resolver): void
3939
{
4040
$resolver->setRequired('client');
4141
$resolver->setAllowedTypes('client', 'string');
@@ -47,7 +47,7 @@ protected function configureOptions(OptionsResolver $resolver)
4747
$resolver->setAllowedTypes('prefix', 'string');
4848
}
4949

50-
protected function configureDefinition(Definition $definition, array $options)
50+
protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void
5151
{
5252
$definition->setClass(AzureBlobStorageAdapter::class);
5353
$definition->setArgument(0, new Reference($options['client']));

src/Adapter/Builder/FtpAdapterDefinitionBuilder.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use League\Flysystem\Ftp\FtpAdapter;
1515
use League\Flysystem\Ftp\FtpConnectionOptions;
16+
use League\Flysystem\Visibility;
1617
use Symfony\Component\DependencyInjection\Definition;
1718
use Symfony\Component\DependencyInjection\Reference;
1819
use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -36,7 +37,7 @@ protected function getRequiredPackages(): array
3637
];
3738
}
3839

39-
protected function configureOptions(OptionsResolver $resolver)
40+
protected function configureOptions(OptionsResolver $resolver): void
4041
{
4142
$resolver->setRequired('host');
4243
$resolver->setAllowedTypes('host', 'string');
@@ -84,9 +85,11 @@ protected function configureOptions(OptionsResolver $resolver)
8485

8586
$resolver->setDefault('connectivityChecker', null);
8687
$resolver->setAllowedTypes('connectivityChecker', ['string', 'null']);
88+
89+
$this->configureUnixOptions($resolver);
8790
}
8891

89-
protected function configureDefinition(Definition $definition, array $options)
92+
protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void
9093
{
9194
$options['transferMode'] = $options['transfer_mode'];
9295
$options['systemType'] = $options['system_type'];
@@ -117,5 +120,6 @@ protected function configureDefinition(Definition $definition, array $options)
117120
);
118121
$definition->setArgument(1, null);
119122
$definition->setArgument(2, $connectivityChecker);
123+
$definition->setArgument(3, $this->createUnixDefinition($options['permissions'], $defaultVisibilityForDirectories ?? Visibility::PRIVATE));
120124
}
121125
}

src/Adapter/Builder/GcloudAdapterDefinitionBuilder.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ protected function getRequiredPackages(): array
3535
];
3636
}
3737

38-
protected function configureOptions(OptionsResolver $resolver)
38+
protected function configureOptions(OptionsResolver $resolver): void
3939
{
4040
$resolver->setRequired('client');
4141
$resolver->setAllowedTypes('client', 'string');
@@ -47,7 +47,7 @@ protected function configureOptions(OptionsResolver $resolver)
4747
$resolver->setAllowedTypes('prefix', 'string');
4848
}
4949

50-
protected function configureDefinition(Definition $definition, array $options)
50+
protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void
5151
{
5252
$bucketDefinition = new Definition();
5353
$bucketDefinition->setFactory([new Reference($options['client']), 'bucket']);

src/Adapter/Builder/LocalAdapterDefinitionBuilder.php

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace League\FlysystemBundle\Adapter\Builder;
1313

1414
use League\Flysystem\Local\LocalFilesystemAdapter;
15-
use League\Flysystem\UnixVisibility\PortableVisibilityConverter;
15+
use League\Flysystem\Visibility;
1616
use Symfony\Component\DependencyInjection\Definition;
1717
use Symfony\Component\OptionsResolver\OptionsResolver;
1818

@@ -33,58 +33,28 @@ protected function getRequiredPackages(): array
3333
return [];
3434
}
3535

36-
protected function configureOptions(OptionsResolver $resolver)
36+
protected function configureOptions(OptionsResolver $resolver): void
3737
{
3838
$resolver->setRequired('directory');
3939
$resolver->setAllowedTypes('directory', 'string');
4040

41+
$this->configureUnixOptions($resolver);
42+
4143
$resolver->setDefault('lock', 0);
4244
$resolver->setAllowedTypes('lock', 'scalar');
4345

4446
$resolver->setDefault('skip_links', false);
4547
$resolver->setAllowedTypes('skip_links', 'scalar');
4648

47-
$resolver->setDefault('permissions', function (OptionsResolver $subResolver) {
48-
$subResolver->setDefault('file', function (OptionsResolver $permsResolver) {
49-
$permsResolver->setDefault('public', 0644);
50-
$permsResolver->setAllowedTypes('public', 'scalar');
51-
52-
$permsResolver->setDefault('private', 0600);
53-
$permsResolver->setAllowedTypes('private', 'scalar');
54-
});
55-
56-
$subResolver->setDefault('dir', function (OptionsResolver $permsResolver) {
57-
$permsResolver->setDefault('public', 0755);
58-
$permsResolver->setAllowedTypes('public', 'scalar');
59-
60-
$permsResolver->setDefault('private', 0700);
61-
$permsResolver->setAllowedTypes('private', 'scalar');
62-
});
63-
});
64-
6549
$resolver->setDefault('lazy_root_creation', false);
6650
$resolver->setAllowedTypes('lazy_root_creation', 'scalar');
6751
}
6852

69-
protected function configureDefinition(Definition $definition, array $options)
53+
protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void
7054
{
7155
$definition->setClass(LocalFilesystemAdapter::class);
7256
$definition->setArgument(0, $options['directory']);
73-
$definition->setArgument(1,
74-
(new Definition(PortableVisibilityConverter::class))
75-
->setFactory([PortableVisibilityConverter::class, 'fromArray'])
76-
->addArgument([
77-
'file' => [
78-
'public' => (int) $options['permissions']['file']['public'],
79-
'private' => (int) $options['permissions']['file']['private'],
80-
],
81-
'dir' => [
82-
'public' => (int) $options['permissions']['dir']['public'],
83-
'private' => (int) $options['permissions']['dir']['private'],
84-
],
85-
])
86-
->setShared(false)
87-
);
57+
$definition->setArgument(1, $this->createUnixDefinition($options['permissions'], $defaultVisibilityForDirectories ?? Visibility::PRIVATE));
8858
$definition->setArgument(2, $options['lock']);
8959
$definition->setArgument(3, $options['skip_links'] ? LocalFilesystemAdapter::SKIP_LINKS : LocalFilesystemAdapter::DISALLOW_LINKS);
9060
$definition->setArgument(4, null);

src/Adapter/Builder/MemoryAdapterDefinitionBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ protected function configureOptions(OptionsResolver $resolver)
3838
{
3939
}
4040

41-
protected function configureDefinition(Definition $definition, array $options)
41+
protected function configureDefinition(Definition $definition, array $options, ?string $defaultVisibilityForDirectories): void
4242
{
4343
$definition->setClass(InMemoryFilesystemAdapter::class);
4444
}

0 commit comments

Comments
 (0)