Browse Source

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>
pull/22359/head
Arthur Schiwon 5 years ago
parent
commit
28c0eea8cb
No known key found for this signature in database GPG Key ID: 7424F1874854DF23
  1. 2
      apps/workflowengine/lib/AppInfo/Application.php
  2. 14
      apps/workflowengine/lib/Service/RuleMatcher.php
  3. 10
      lib/public/WorkflowEngine/IRuleMatcher.php

2
apps/workflowengine/lib/AppInfo/Application.php

@ -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);

14
apps/workflowengine/lib/Service/RuleMatcher.php

@ -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);

10
lib/public/WorkflowEngine/IRuleMatcher.php

@ -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…
Cancel
Save