diff --git a/src/Bundle/ChillDocStoreBundle/AsyncUpload/Driver/OpenstackObjectStore/TempUrlOpenstackGenerator.php b/src/Bundle/ChillDocStoreBundle/AsyncUpload/Driver/OpenstackObjectStore/TempUrlOpenstackGenerator.php index 742e4285c..9d79d3603 100644 --- a/src/Bundle/ChillDocStoreBundle/AsyncUpload/Driver/OpenstackObjectStore/TempUrlOpenstackGenerator.php +++ b/src/Bundle/ChillDocStoreBundle/AsyncUpload/Driver/OpenstackObjectStore/TempUrlOpenstackGenerator.php @@ -18,6 +18,7 @@ use Chill\DocStoreBundle\AsyncUpload\SignedUrlPost; use Chill\DocStoreBundle\AsyncUpload\TempUrlGeneratorInterface; use Psr\Log\LoggerInterface; use Symfony\Component\Clock\ClockInterface; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** @@ -27,17 +28,28 @@ final readonly class TempUrlOpenstackGenerator implements TempUrlGeneratorInterf { private const CHARACTERS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; + private string $base_url; + private string $key; + private int $max_expire_delay; + private int $max_submit_delay; + private int $max_post_file_size; + private int $max_file_count; + public function __construct( private LoggerInterface $logger, private EventDispatcherInterface $event_dispatcher, private ClockInterface $clock, - private string $base_url, - private string $key, - private int $max_expire_delay, - private int $max_submit_delay, - private int $max_post_file_size, - private int $max_file_count = 1 - ) {} + ParameterBagInterface $parameterBag, + ) { + $config = $parameterBag->get('chill_doc_store')['openstack']['temp_url']; + + $this->key = $config['temp_url_key']; + $this->base_url = $config['temp_url_base_path']; + $this->max_expire_delay = $config['max_expires_delay']; + $this->max_submit_delay = $config['max_submit_delay']; + $this->max_post_file_size = $config['max_post_file_size']; + $this->max_file_count = $config['max_post_file_count']; + } /** * @throws TempUrlGeneratorException @@ -115,7 +127,7 @@ final readonly class TempUrlOpenstackGenerator implements TempUrlGeneratorInterf ]; $url = $url.'?'.\http_build_query($args); - $signature = new SignedUrl($method, $url, $expires); + $signature = new SignedUrl(strtoupper($method), $url, $expires); $this->event_dispatcher->dispatch( new TempUrlGenerateEvent($signature) diff --git a/src/Bundle/ChillDocStoreBundle/DependencyInjection/ChillDocStoreExtension.php b/src/Bundle/ChillDocStoreBundle/DependencyInjection/ChillDocStoreExtension.php index f57e675dd..70c479456 100644 --- a/src/Bundle/ChillDocStoreBundle/DependencyInjection/ChillDocStoreExtension.php +++ b/src/Bundle/ChillDocStoreBundle/DependencyInjection/ChillDocStoreExtension.php @@ -32,6 +32,8 @@ class ChillDocStoreExtension extends Extension implements PrependExtensionInterf $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); + $container->setParameter('chill_doc_store', $config); + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../config')); $loader->load('services.yaml'); $loader->load('services/media.yaml'); @@ -94,7 +96,6 @@ class ChillDocStoreExtension extends Extension implements PrependExtensionInterf 'routing' => [ 'resources' => [ '@ChillDocStoreBundle/config/routes.yaml', - '@ChampsLibresAsyncUploaderBundle/config/routes.yaml', ], ], ]); diff --git a/src/Bundle/ChillDocStoreBundle/DependencyInjection/Configuration.php b/src/Bundle/ChillDocStoreBundle/DependencyInjection/Configuration.php index 466158783..7c6a08f80 100644 --- a/src/Bundle/ChillDocStoreBundle/DependencyInjection/Configuration.php +++ b/src/Bundle/ChillDocStoreBundle/DependencyInjection/Configuration.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Chill\DocStoreBundle\DependencyInjection; +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\ConfigurationInterface; @@ -24,11 +25,68 @@ class Configuration implements ConfigurationInterface public function getConfigTreeBuilder() { $treeBuilder = new TreeBuilder('chill_doc_store'); + /** @var ArrayNodeDefinition $rootNode */ $rootNode = $treeBuilder->getRootNode(); - // Here you should define the parameters that are allowed to - // configure your bundle. See the documentation linked above for - // more information on that topic. + /* @phpstan-ignore-next-line As there are inconsistencies in return types, but the code works... */ + $rootNode->children() + // openstack node + ->arrayNode('openstack') + ->info('parameters to authenticate and generate temp url against the openstack object storage service') + ->addDefaultsIfNotSet() + ->children() + // openstack.temp_url + ->arrayNode('temp_url') + ->addDefaultsIfNotSet() + ->children() + // openstack.temp_url.temp_url_key + ->scalarNode('temp_url_key') + ->isRequired()->cannotBeEmpty() + ->info('the temp url key') + ->end() + + ->scalarNode('temp_url_base_path') + ->isRequired()->cannotBeEmpty() + ->info('the base path to add **before** the path to media. Must contains the container') + ->end() + + ->scalarNode('container') + ->info('the container name') + ->isRequired()->cannotBeEmpty() + ->end() + + ->integerNode('max_post_file_size') + ->defaultValue(15_000_000) + ->info('Maximum size of the posted file, in bytes') + ->end() + + ->integerNode('max_post_file_count') + ->defaultValue(1) + ->info('Maximum number of files which may be posted at once using a POST operation using async upload') + ->end() + + ->integerNode('max_expires_delay') + ->defaultValue(180) + ->info('the maximum of seconds a cryptographic signature ' + .'will be valid for submitting a file. This should be ' + .'short, to avoid uploading multiple files') + ->end() + + ->integerNode('max_submit_delay') + ->defaultValue(3600) + ->info('the maximum of seconds between the upload of a file and ' + .'a the submission of the form. This delay will also prevent ' + .'the check of persistence of uploaded file. Should be long ' + .'enough for keeping user-friendly forms') + ->end() + + ->end() // end of children 's temp_url + ->end() // end array temp_url + + ->end() // end of children's openstack + ->end() // end of openstack + ->end() // end of root's children + ->end(); return $treeBuilder; } diff --git a/src/Bundle/ChillDocStoreBundle/Tests/AsyncUpload/Driver/OpenstackObjectStore/TempUrlOpenstackGeneratorTest.php b/src/Bundle/ChillDocStoreBundle/Tests/AsyncUpload/Driver/OpenstackObjectStore/TempUrlOpenstackGeneratorTest.php index 25c5a1ebc..77d2f8252 100644 --- a/src/Bundle/ChillDocStoreBundle/Tests/AsyncUpload/Driver/OpenstackObjectStore/TempUrlOpenstackGeneratorTest.php +++ b/src/Bundle/ChillDocStoreBundle/Tests/AsyncUpload/Driver/OpenstackObjectStore/TempUrlOpenstackGeneratorTest.php @@ -17,6 +17,7 @@ use Chill\DocStoreBundle\AsyncUpload\SignedUrlPost; use PHPUnit\Framework\TestCase; use Psr\Log\NullLogger; use Symfony\Component\Clock\MockClock; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\EventDispatcher\EventDispatcher; /** @@ -34,16 +35,28 @@ class TempUrlOpenstackGeneratorTest extends TestCase $logger = new NullLogger(); $eventDispatcher = new EventDispatcher(); $clock = new MockClock($now); + $parameters = new ParameterBag( + [ + 'chill_doc_store' => [ + 'openstack' => [ + 'temp_url' => [ + 'temp_url_key' => $key, + 'temp_url_base_path' => $baseUrl, + 'max_post_file_size' => 150, + 'max_post_file_count' => 1, + 'max_expires_delay' => 1800, + 'max_submit_delay' => 1800, + ], + ], + ], + ] + ); $generator = new TempUrlOpenstackGenerator( $logger, $eventDispatcher, $clock, - $baseUrl, - $key, - 1800, - 1800, - 150 + $parameters, ); $signedUrl = $generator->generate($method, $objectName, $expireDelay); @@ -59,16 +72,28 @@ class TempUrlOpenstackGeneratorTest extends TestCase $logger = new NullLogger(); $eventDispatcher = new EventDispatcher(); $clock = new MockClock($now); + $parameters = new ParameterBag( + [ + 'chill_doc_store' => [ + 'openstack' => [ + 'temp_url' => [ + 'temp_url_key' => $key, + 'temp_url_base_path' => $baseUrl, + 'max_post_file_size' => 150, + 'max_post_file_count' => 1, + 'max_expires_delay' => 1800, + 'max_submit_delay' => 1800, + ], + ], + ], + ] + ); $generator = new TempUrlOpenstackGenerator( $logger, $eventDispatcher, $clock, - $baseUrl, - $key, - 1800, - 1800, - 150 + $parameters, ); $signedUrl = $generator->generatePost();