commit 99b024f7155aff0c3a954ebdba4f4e5aef760c4b
parent c69f30dd4344afbe6e26c45b72b7f95c0ce4a147
Author: Jan Dankert <develop@jandankert.de>
Date: Sat, 26 Sep 2020 05:02:20 +0200
Fix: The file filtering must be done in the file generator.
Diffstat:
2 files changed, 68 insertions(+), 64 deletions(-)
diff --git a/modules/cms/generator/FileGenerator.class.php b/modules/cms/generator/FileGenerator.class.php
@@ -4,7 +4,10 @@
namespace cms\generator;
+use cms\generator\filter\AbstractFilter;
use cms\model\File;
+use logger\Logger;
+use util\exception\GeneratorException;
class FileGenerator extends BaseGenerator
{
@@ -18,7 +21,7 @@ class FileGenerator extends BaseGenerator
protected function generate()
{
$file = new File( $this->context->sourceObjectId );
- return $file->loadValue();
+ return $this->filterValue( $file );
}
public function getPublicFilename()
@@ -26,4 +29,67 @@ class FileGenerator extends BaseGenerator
$file = new File( $this->context->sourceObjectId );
return $file->filename();
}
+
+
+ /**
+ * @param $file File
+ * @return string
+ */
+ private function filterValue($file )
+ {
+ $value = $file->loadValue();
+
+ foreach(\util\ArrayUtils::getSubArray($file->getTotalSettings(), array( 'filter')) as $filterEntry )
+ {
+ $filterName = @$filterEntry['name'];
+ $extension = @$filterEntry['extension'];
+
+ if ( $extension && strtolower($extension) != strtolower($file->getRealExtension()) )
+ continue; // File extension does not match
+
+ $filterType = $this->context->scheme==Producer::SCHEME_PUBLIC?'public':'preview';
+
+ $onPublish = (array) @$filterEntry['on'];
+ if ( ! $onPublish || in_array('all',$onPublish ) )
+ $onPublish = ['edit','public','preview','show'];
+
+ if ( $onPublish && ! in_array($filterType,$onPublish))
+ continue; // Publish type does not match
+
+ $parameter = (array) @$filterEntry['parameter'];
+
+ $filterClassNameWithNS = 'cms\\publish\\filter\\' . $filterName.'Filter';
+
+ if ( !class_exists( $filterClassNameWithNS ) ) {
+ Logger::warn("Filter '$filterName' does not exist.");
+ continue;
+ }
+
+ /** @var AbstractFilter $filter */
+ $filter = new $filterClassNameWithNS();
+
+ // Copy filter configuration to filter instance.
+ foreach( $parameter as $name=>$value) {
+ if ( property_exists($filter,$name))
+ $filter->$name = $value;
+ }
+
+
+ // Execute the filter.
+ Logger::debug("Filtering '$file->filename' with filter '$filterName'.");
+
+ try {
+
+ $value = $filter->filter( $value );
+ } catch( \Exception $e ) {
+ // Filter has some undefined error.
+ Logger::warn( $e->getTraceAsString() );
+ throw new GeneratorException('Could not generate file '.$file->objectid.'. Filter '.$filterName.' has an error.', $e );
+ }
+ }
+
+ return $value;
+
+ }
+
}
\ No newline at end of file
diff --git a/modules/cms/model/File.class.php b/modules/cms/model/File.class.php
@@ -317,10 +317,7 @@ EOF
public function loadValue()
{
- if ( is_file( $this->getCache()->getFilename() ) && filemtime($this->getCache()->getFilename() < $this->lastchangeDate))
- $this->getCache()->invalidate();
-
- return $this->getCache()->get();
+ return $this->loadValueFromDatabase();
}
@@ -356,8 +353,6 @@ EOF
if ( $this->storeValueAsBase64 )
$this->value = base64_decode( $this->value );
- $this->filterValue();
-
return $this->value;
}
@@ -481,63 +476,6 @@ SQL
}
}
- private function filterValue()
- {
- $publishType = strtolower(substr(\util\ClassUtils::getSimpleClassName($this->publisher),7));
-
- foreach(\util\ArrayUtils::getSubArray($this->getTotalSettings(), array( 'filter')) as $filterEntry )
- {
- $filterName = @$filterEntry['name'];
- $extension = @$filterEntry['extension'];
-
- if ( $extension && strtolower($extension) != strtolower($this->getRealExtension()) )
- continue; // File extension does not match
-
- $onPublish = (array) @$filterEntry['on'];
- if ( ! $onPublish || in_array('all',$onPublish ) )
- $onPublish = ['edit','public','preview','show'];
-
- if ( $onPublish && ! in_array($publishType,$onPublish))
- continue; // Publish type does not match
-
- $parameter = (array) @$filterEntry['parameter'];
-
- $filterClassNameWithNS = 'cms\\publish\\filter\\' . $filterName.'Filter';
-
- if ( !class_exists( $filterClassNameWithNS ) ) {
- Logger::warn("Filter '$filterName' does not exist.");
- continue;
- }
-
- /** @var AbstractFilter $filter */
- $filter = new $filterClassNameWithNS();
-
- // Copy filter configuration to filter instance.
- foreach( $parameter as $name=>$value) {
- if ( property_exists($filter,$name))
- $filter->$name = $value;
- }
-
-
- // Execute the filter.
- Logger::debug("Filtering '$this->filename' with filter '$filterName'.");
-
- try {
-
- $this->value = $filter->filter( $this->value );
- } catch( \Exception $e ) {
- // Filter has some undefined error.
- Logger::warn( $e->getTraceAsString() );
- if ( $this->publisher instanceof PublishPublic )
- return ''; // Do not show errors on public publishing.
- else
- return $e->getMessage()."\n".$e->getTraceAsString();
- }
- }
-
- // Store in cache.
- $this->getCache()->invalidate();
- }