openrat-cms

OpenRat Content Management System
git clone http://git.code.weiherhei.de/openrat-cms.git
Log | Files | Refs

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:
modules/cms/generator/FileGenerator.class.php | 68+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
modules/cms/model/File.class.php | 64+---------------------------------------------------------------
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(); - }