diff --git a/DependencyInjection/IrsteaFileUploadExtension.php b/DependencyInjection/IrsteaFileUploadExtension.php index 5e64c37458f254607c5a4db8c94b78026e6782f5..d84b81ae8563a999dd30b92afc161b36140fd454 100644 --- a/DependencyInjection/IrsteaFileUploadExtension.php +++ b/DependencyInjection/IrsteaFileUploadExtension.php @@ -22,6 +22,12 @@ class IrsteaFileUploadExtension extends Extension implements PrependExtensionInt $loader->load('services.yml'); $container->setParameter('irstea_file_upload.max_chunk_size', $config['max_chunk_size']); + + $bundles = $container->getParameter('kernel.bundles'); + if(!isset($bundles['CLTissueBundle'])) { + // On a pas le CLTissueBundle => pas d'antivirus + $container->removeDefinition('irstea_file_upload.virus_scanner'); + } } /** diff --git a/Listener/VirusScannerListener.php b/Listener/VirusScannerListener.php new file mode 100644 index 0000000000000000000000000000000000000000..d9f37c1789e4ff6388460365656f28852dbe0ace --- /dev/null +++ b/Listener/VirusScannerListener.php @@ -0,0 +1,65 @@ +<?php + +/* + * Copyright (C) 2015 IRSTEA + * All rights reserved. + */ + +namespace Irstea\FileUploadBundle\Listener; + +use CL\Tissue\Adapter\AdapterInterface; +use CL\Tissue\Model\Detection; +use CL\Tissue\Model\ScanResult; +use Irstea\FileUploadBundle\Event\FileUploadCompleteEvent; +use Irstea\FileUploadBundle\Exception\RejectedFileException; + +/** + * Description of AntivirusListener + * + * @author Guillaume Perréal <guillaume.perreal@irstea.fr> + */ +class VirusScannerListener +{ + /** + * + * @var AdapterInterface + */ + private $scanner; + + /** + * + * @param AdapterInterface $scanner + */ + public function __construct(AdapterInterface $scanner) + { + $this->scanner = $scanner; + } + + /** + * + * @param FileUploadCompleteEvent $event + */ + public function onFileUploadCompleted(FileUploadCompleteEvent $event) + { + $file = $event->getUploadedFile(); + $path = $file->getLocalPath(); + + $result = $this->scanner->scan([$path]); + + $meta = $file->getMetadata(); + + $meta['virus_scanner'] = ['has_virus' => $result->hasVirus()]; + + if($result->hasVirus()) { + if(null !== $desc = $result->getDetections()[0]->getDescription()) { + $meta['virus_scanner']['detected'] = $desc; + } + } + + $file->setMetadata($meta); + + if($result->hasVirus()) { + throw new RejectedFileException($file, "Found a virus !"); + } + } +} diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 14b63a7084162e1b112188dc80d4041319c50d0d..38b58f0b0ee33cf1aaa716584b9637a61d2c862a 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -57,3 +57,11 @@ services: factory: [ @knp_gaufrette.filesystem_map, get ] arguments: - %irstea_file_upload.filesystem.name% + + # Scanner anti-virus + irstea_file_upload.virus_scanner: + class: Irstea\FileUploadBundle\Listener\VirusScannerListener + arguments: + - @cl_tissue.scanner + tags: + - { name: kernel.event_listener, event: file_upload.complete, method: onFileUploadCompleted }