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>
tags/v20.0.0beta2
Arthur Schiwon 3 years ago
parent
commit
28c0eea8cb
No account linked to committer's email address

+ 2
- 0
apps/workflowengine/lib/AppInfo/Application.php View File

@@ -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
- 0
apps/workflowengine/lib/Service/RuleMatcher.php View File

@@ -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
- 0
lib/public/WorkflowEngine/IRuleMatcher.php View File

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