aboutsummaryrefslogtreecommitdiffstats
path: root/apps/workflowengine
diff options
context:
space:
mode:
Diffstat (limited to 'apps/workflowengine')
-rw-r--r--apps/workflowengine/composer/composer/autoload_classmap.php1
-rw-r--r--apps/workflowengine/composer/composer/autoload_static.php1
-rw-r--r--apps/workflowengine/l10n/mk.js10
-rw-r--r--apps/workflowengine/l10n/mk.json10
-rw-r--r--apps/workflowengine/lib/Check/Directory.php58
-rw-r--r--apps/workflowengine/lib/Manager.php2
-rw-r--r--apps/workflowengine/src/components/Checks/file.js13
-rw-r--r--apps/workflowengine/tests/Check/DirectoryTest.php68
8 files changed, 163 insertions, 0 deletions
diff --git a/apps/workflowengine/composer/composer/autoload_classmap.php b/apps/workflowengine/composer/composer/autoload_classmap.php
index 0444cce13e7..52d221fb767 100644
--- a/apps/workflowengine/composer/composer/autoload_classmap.php
+++ b/apps/workflowengine/composer/composer/autoload_classmap.php
@@ -10,6 +10,7 @@ return array(
'OCA\\WorkflowEngine\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
'OCA\\WorkflowEngine\\BackgroundJobs\\Rotate' => $baseDir . '/../lib/BackgroundJobs/Rotate.php',
'OCA\\WorkflowEngine\\Check\\AbstractStringCheck' => $baseDir . '/../lib/Check/AbstractStringCheck.php',
+ 'OCA\\WorkflowEngine\\Check\\Directory' => $baseDir . '/../lib/Check/Directory.php',
'OCA\\WorkflowEngine\\Check\\FileMimeType' => $baseDir . '/../lib/Check/FileMimeType.php',
'OCA\\WorkflowEngine\\Check\\FileName' => $baseDir . '/../lib/Check/FileName.php',
'OCA\\WorkflowEngine\\Check\\FileSize' => $baseDir . '/../lib/Check/FileSize.php',
diff --git a/apps/workflowengine/composer/composer/autoload_static.php b/apps/workflowengine/composer/composer/autoload_static.php
index 0b9ac89ae30..57b569dbc10 100644
--- a/apps/workflowengine/composer/composer/autoload_static.php
+++ b/apps/workflowengine/composer/composer/autoload_static.php
@@ -25,6 +25,7 @@ class ComposerStaticInitWorkflowEngine
'OCA\\WorkflowEngine\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
'OCA\\WorkflowEngine\\BackgroundJobs\\Rotate' => __DIR__ . '/..' . '/../lib/BackgroundJobs/Rotate.php',
'OCA\\WorkflowEngine\\Check\\AbstractStringCheck' => __DIR__ . '/..' . '/../lib/Check/AbstractStringCheck.php',
+ 'OCA\\WorkflowEngine\\Check\\Directory' => __DIR__ . '/..' . '/../lib/Check/Directory.php',
'OCA\\WorkflowEngine\\Check\\FileMimeType' => __DIR__ . '/..' . '/../lib/Check/FileMimeType.php',
'OCA\\WorkflowEngine\\Check\\FileName' => __DIR__ . '/..' . '/../lib/Check/FileName.php',
'OCA\\WorkflowEngine\\Check\\FileSize' => __DIR__ . '/..' . '/../lib/Check/FileSize.php',
diff --git a/apps/workflowengine/l10n/mk.js b/apps/workflowengine/l10n/mk.js
index 357509f3896..a7f641f0aff 100644
--- a/apps/workflowengine/l10n/mk.js
+++ b/apps/workflowengine/l10n/mk.js
@@ -47,13 +47,19 @@ OC.L10N.register(
"Select a file type" : "Изберете вид на датотека",
"e.g. httpd/unix-directory" : "Пр. httpd/unix-directory",
"Please enter a valid time span" : "Внесете валиден времески осег",
+ "Android client" : "Android клиент",
+ "iOS client" : "iOS клиент",
"Desktop client" : "Клиент за компјутер",
"Select groups" : "Одбери групи",
"Groups" : "Групи",
+ "Select a trigger" : "Избери активатор",
+ "At least one event must be selected" : "Најмалку едно мора да биде означено",
+ "Add new flow" : "Додади нов проток",
"Active" : "Активно",
"Save" : "Зачувај",
"When" : "Кога",
"and" : "и",
+ "Add a new filter" : "Додади нов филтер",
"Cancel" : "Откажи",
"Delete" : "Избриши",
"Available flows" : "Достапни протоци",
@@ -75,6 +81,7 @@ OC.L10N.register(
"less or equals" : "помалку или еднакво",
"greater or equals" : "поголемо или еднакво",
"greater" : "поголемо",
+ "Request remote address" : "Барање од надворешна адреса",
"matches IPv4" : "се совпаѓањаат IPv4",
"does not match IPv4" : "не се совпаѓаат IPv4",
"matches IPv6" : "се совпаѓањаат IPv6",
@@ -82,8 +89,11 @@ OC.L10N.register(
"File system tag" : "Датотека со системска ознака",
"is tagged with" : "е означена со",
"is not tagged with" : "не е означена со",
+ "Request URL" : "Барање URL",
+ "Request time" : "Време на барање",
"between" : "помеѓу",
"not between" : "не помеѓу",
+ "Request user agent" : "Барање од кориснички агент",
"is member of" : "е член на",
"is not member of" : "не е член на"
},
diff --git a/apps/workflowengine/l10n/mk.json b/apps/workflowengine/l10n/mk.json
index a50e5edf93c..f2ef7213da4 100644
--- a/apps/workflowengine/l10n/mk.json
+++ b/apps/workflowengine/l10n/mk.json
@@ -45,13 +45,19 @@
"Select a file type" : "Изберете вид на датотека",
"e.g. httpd/unix-directory" : "Пр. httpd/unix-directory",
"Please enter a valid time span" : "Внесете валиден времески осег",
+ "Android client" : "Android клиент",
+ "iOS client" : "iOS клиент",
"Desktop client" : "Клиент за компјутер",
"Select groups" : "Одбери групи",
"Groups" : "Групи",
+ "Select a trigger" : "Избери активатор",
+ "At least one event must be selected" : "Најмалку едно мора да биде означено",
+ "Add new flow" : "Додади нов проток",
"Active" : "Активно",
"Save" : "Зачувај",
"When" : "Кога",
"and" : "и",
+ "Add a new filter" : "Додади нов филтер",
"Cancel" : "Откажи",
"Delete" : "Избриши",
"Available flows" : "Достапни протоци",
@@ -73,6 +79,7 @@
"less or equals" : "помалку или еднакво",
"greater or equals" : "поголемо или еднакво",
"greater" : "поголемо",
+ "Request remote address" : "Барање од надворешна адреса",
"matches IPv4" : "се совпаѓањаат IPv4",
"does not match IPv4" : "не се совпаѓаат IPv4",
"matches IPv6" : "се совпаѓањаат IPv6",
@@ -80,8 +87,11 @@
"File system tag" : "Датотека со системска ознака",
"is tagged with" : "е означена со",
"is not tagged with" : "не е означена со",
+ "Request URL" : "Барање URL",
+ "Request time" : "Време на барање",
"between" : "помеѓу",
"not between" : "не помеѓу",
+ "Request user agent" : "Барање од кориснички агент",
"is member of" : "е член на",
"is not member of" : "не е член на"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
diff --git a/apps/workflowengine/lib/Check/Directory.php b/apps/workflowengine/lib/Check/Directory.php
new file mode 100644
index 00000000000..f7b856a95fe
--- /dev/null
+++ b/apps/workflowengine/lib/Check/Directory.php
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace OCA\WorkflowEngine\Check;
+
+use OCA\WorkflowEngine\Entity\File;
+use OCP\IL10N;
+use OCP\WorkflowEngine\IFileCheck;
+
+class Directory extends AbstractStringCheck implements IFileCheck {
+ use TFileCheck;
+
+ /**
+ * @param IL10N $l
+ */
+ public function __construct(
+ IL10N $l,
+ ) {
+ parent::__construct($l);
+ }
+
+ /**
+ * @return string
+ */
+ protected function getActualValue(): string {
+ if ($this->path === null) {
+ return '';
+ }
+ // files/some/path -> some/path
+ return preg_replace('/^files\//', '', pathinfo($this->path, PATHINFO_DIRNAME));
+ }
+
+ /**
+ * @param string $operator
+ * @param string $checkValue
+ * @param string $actualValue
+ * @return bool
+ */
+ protected function executeStringCheck($operator, $checkValue, $actualValue) {
+ if ($operator === 'is' || $operator === '!is') {
+ $checkValue = ltrim(rtrim($checkValue, '/'), '/');
+ }
+ return parent::executeStringCheck($operator, $checkValue, $actualValue);
+ }
+
+ public function supportedEntities(): array {
+ return [ File::class ];
+ }
+
+ public function isAvailableForScope(int $scope): bool {
+ return true;
+ }
+}
diff --git a/apps/workflowengine/lib/Manager.php b/apps/workflowengine/lib/Manager.php
index 0f41679789d..27b25a2e752 100644
--- a/apps/workflowengine/lib/Manager.php
+++ b/apps/workflowengine/lib/Manager.php
@@ -8,6 +8,7 @@ namespace OCA\WorkflowEngine;
use Doctrine\DBAL\Exception;
use OCA\WorkflowEngine\AppInfo\Application;
+use OCA\WorkflowEngine\Check\Directory;
use OCA\WorkflowEngine\Check\FileMimeType;
use OCA\WorkflowEngine\Check\FileName;
use OCA\WorkflowEngine\Check\FileSize;
@@ -692,6 +693,7 @@ class Manager implements IManager {
protected function getBuildInChecks(): array {
try {
return [
+ $this->container->query(Directory::class),
$this->container->query(FileMimeType::class),
$this->container->query(FileName::class),
$this->container->query(FileSize::class),
diff --git a/apps/workflowengine/src/components/Checks/file.js b/apps/workflowengine/src/components/Checks/file.js
index 568efc81cd3..b2d348e4712 100644
--- a/apps/workflowengine/src/components/Checks/file.js
+++ b/apps/workflowengine/src/components/Checks/file.js
@@ -32,6 +32,19 @@ const FileChecks = [
},
{
+ class: 'OCA\\WorkflowEngine\\Check\\Directory',
+ name: t('workflowengine', 'Directory'),
+ operators: stringOrRegexOperators,
+ placeholder: (check) => {
+ if (check.operator === 'matches' || check.operator === '!matches') {
+ return '/^myfolder/.+$/i'
+ }
+ return 'myfolder/subfolder'
+ },
+ validate: stringValidator,
+ },
+
+ {
class: 'OCA\\WorkflowEngine\\Check\\FileMimeType',
name: t('workflowengine', 'File MIME type'),
operators: stringOrRegexOperators,
diff --git a/apps/workflowengine/tests/Check/DirectoryTest.php b/apps/workflowengine/tests/Check/DirectoryTest.php
new file mode 100644
index 00000000000..6eef082b5e5
--- /dev/null
+++ b/apps/workflowengine/tests/Check/DirectoryTest.php
@@ -0,0 +1,68 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\WorkflowEngine\Tests\Check;
+
+use OCA\WorkflowEngine\Check\Directory;
+use OCA\WorkflowEngine\Entity\File;
+use OCP\Files\Storage\IStorage;
+use OCP\IL10N;
+use Test\TestCase;
+
+class DirectoryTest extends TestCase {
+ /** @var IL10N */
+ private $l10n;
+
+ /** @var IStorage */
+ private $storage;
+
+ /** @var Directory */
+ private $directory;
+
+ protected function setUp(): void {
+ parent::setUp();
+ $this->l10n = $this->createMock(IL10N::class);
+ $this->storage = $this->createMock(IStorage::class);
+ $this->directory = new Directory($this->l10n);
+ }
+
+ /**
+ * @dataProvider dataProviderCheck
+ */
+ public function testExecuteStringCheck(string $operator, string $configuredDirectoryPath, string $filePath, bool $expectedResult): void {
+ $this->directory->setFileInfo($this->storage, $filePath);
+
+ $result = $this->directory->executeCheck($operator, $configuredDirectoryPath);
+
+ $this->assertEquals($expectedResult, $result);
+ }
+
+ public function testSupportedEntities(): void {
+ $this->assertSame([File::class], $this->directory->supportedEntities());
+ }
+
+ public function testIsAvailableForScope(): void {
+ $this->assertTrue($this->directory->isAvailableForScope(1));
+ }
+
+ public function dataProviderCheck(): array {
+ return [
+ ['is', 'some/path', 'files/some/path/file.txt', true],
+ ['is', '/some/path/', 'files/some/path/file.txt', true],
+
+ ['!is', 'some/path', 'files/some/path/file.txt', false],
+ ['!is', 'some/path/', 'files/someother/path/file.txt', true],
+
+ ['matches', '/^some\/path\/.+$/i', 'files/SomE/PATH/subfolder/file.txt', true],
+ ['matches', '/some\/path\/.*\/sub2/', 'files/some/path/subfolder1/sub2/anotherfile.pdf', true],
+
+ ['!matches', '/some\/path/', 'files/some/path/file.txt', false],
+ ['!matches', '/some\/path/', 'files/another/path/file.txt', true],
+ ];
+ }
+}