Merge pull request #22410 from nextcloud/backport/22359/stable19

[stable19] fix possible leaking scope in Flow
This commit is contained in:
Roeland Jago Douma 2020-08-26 20:22:37 +02:00 committed by GitHub
commit c9a1379bdf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 0 deletions

View File

@ -95,6 +95,7 @@ class Application extends \OCP\AppFramework\App {
/** @var IOperation $operation */
$operation = $this->getContainer()->query($operationClass);
$ruleMatcher->setEventName($eventName);
$ruleMatcher->setEntity($entity);
$ruleMatcher->setOperation($operation);

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

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 19.0.3
*/
public function setEventName(string $eventName): void;
}