fix possible leaking scope in Flow
- a configured flow can be brought into consideration, despite its event was not fired - it could either run through - or run into a RuntimeException and killing processing of valid flows Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This commit is contained in:
parent
9073a6937d
commit
28c0eea8cb
|
@ -65,6 +65,7 @@ class Application extends App implements IBootstrap {
|
|||
private function registerRuleListeners(IEventDispatcher $dispatcher,
|
||||
IServerContainer $container,
|
||||
ILogger $logger): void {
|
||||
/** @var Manager $manager */
|
||||
$manager = $container->query(Manager::class);
|
||||
$configuredEvents = $manager->getAllConfiguredEvents();
|
||||
|
||||
|
@ -81,6 +82,7 @@ class Application extends App implements IBootstrap {
|
|||
/** @var IOperation $operation */
|
||||
$operation = $container->query($operationClass);
|
||||
|
||||
$ruleMatcher->setEventName($eventName);
|
||||
$ruleMatcher->setEntity($entity);
|
||||
$ruleMatcher->setOperation($operation);
|
||||
|
||||
|
|
|
@ -62,6 +62,8 @@ class RuleMatcher implements IRuleMatcher {
|
|||
protected $entity;
|
||||
/** @var Logger */
|
||||
protected $logger;
|
||||
/** @var string */
|
||||
protected $eventName;
|
||||
|
||||
public function __construct(
|
||||
IUserSession $session,
|
||||
|
@ -101,6 +103,13 @@ class RuleMatcher implements IRuleMatcher {
|
|||
$this->entity = $entity;
|
||||
}
|
||||
|
||||
public function setEventName(string $eventName): void {
|
||||
if ($this->eventName !== null) {
|
||||
throw new RuntimeException('This method must not be called more than once');
|
||||
}
|
||||
$this->eventName = $eventName;
|
||||
}
|
||||
|
||||
public function getEntity(): IEntity {
|
||||
if ($this->entity === null) {
|
||||
throw new \LogicException('Entity was not set yet');
|
||||
|
@ -155,6 +164,11 @@ class RuleMatcher implements IRuleMatcher {
|
|||
|
||||
$matches = [];
|
||||
foreach ($operations as $operation) {
|
||||
$configuredEvents = json_decode($operation['events'], true);
|
||||
if ($this->eventName !== null && !in_array($this->eventName, $configuredEvents)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$checkIds = json_decode($operation['checks'], true);
|
||||
$checks = $this->manager->getChecks($checkIds);
|
||||
|
||||
|
|
|
@ -78,4 +78,14 @@ interface IRuleMatcher extends IFileCheck {
|
|||
* @since 18.0.0
|
||||
*/
|
||||
public function getEntity(): IEntity;
|
||||
|
||||
/**
|
||||
* this method can be called once to set the event name that is currently
|
||||
* being processed. The workflow engine takes care of this usually, only an
|
||||
* IComplexOperation might want to make use of it.
|
||||
*
|
||||
* @throws RuntimeException
|
||||
* @since 20.0.0
|
||||
*/
|
||||
public function setEventName(string $eventName): void;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue