Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/files_antivirus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCôme Chilliet <come.chilliet@nextcloud.com>2022-09-29 17:58:10 +0300
committerCôme Chilliet <come.chilliet@nextcloud.com>2022-09-29 17:58:10 +0300
commit3f47b876879b7577bdd3d3c0ab8a084ab1742258 (patch)
treeca2933c1490017399abb6c4a5b37ec1d2544d371
parent1742fbdb04fb9799b60ea26ce8c168f0d4210855 (diff)
Migrate away from deprecated interfaces and cleanup typing
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
-rw-r--r--lib/BackgroundJob/BackgroundScanner.php50
-rw-r--r--lib/Item.php56
-rw-r--r--lib/ItemFactory.php52
-rw-r--r--lib/Scanner/ExternalClam.php17
-rw-r--r--lib/Scanner/ExternalKaspersky.php10
-rw-r--r--lib/Scanner/ICAP.php20
-rw-r--r--lib/Scanner/LocalClam.php15
-rw-r--r--lib/Scanner/ScannerBase.php46
-rw-r--r--lib/Status.php11
-rw-r--r--lib/StatusFactory.php23
-rw-r--r--tests/AvirWrapperTest.php8
-rw-r--r--tests/Scanner/ExternalKasperskyTest.php4
-rw-r--r--tests/Scanner/ICAPTest.php4
-rw-r--r--tests/StatusTest.php4
14 files changed, 111 insertions, 209 deletions
diff --git a/lib/BackgroundJob/BackgroundScanner.php b/lib/BackgroundJob/BackgroundScanner.php
index 1e41e50..36ab7c4 100644
--- a/lib/BackgroundJob/BackgroundScanner.php
+++ b/lib/BackgroundJob/BackgroundScanner.php
@@ -10,51 +10,35 @@ declare(strict_types=1);
namespace OCA\Files_Antivirus\BackgroundJob;
-use OC\BackgroundJob\TimedJob;
use OCA\Files_Antivirus\AppConfig;
use OCA\Files_Antivirus\ItemFactory;
use OCA\Files_Antivirus\Scanner\ScannerFactory;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\File;
use OCP\Files\IMimeTypeLoader;
-use OCP\IDBConnection;
use OCP\Files\IRootFolder;
-use OCP\ILogger;
+use OCP\IDBConnection;
use OCP\IUser;
use OCP\IUserManager;
+use OC\BackgroundJob\TimedJob;
+use Psr\Log\LoggerInterface;
class BackgroundScanner extends TimedJob {
- /** @var IRootFolder */
- protected $rootFolder;
-
- /** @var ScannerFactory */
- private $scannerFactory;
-
- /** @var AppConfig */
- private $appConfig;
-
- /** @var ILogger */
- protected $logger;
-
- /** @var IUserManager */
- protected $userManager;
-
- /** @var IDBConnection */
- protected $db;
-
- /** @var IMimeTypeLoader */
- protected $mimeTypeLoader;
-
- /** @var ItemFactory */
- protected $itemFactory;
- /** @var bool */
- private $isCLI;
+ protected IRootFolder $rootFolder;
+ private ScannerFactory $scannerFactory;
+ private AppConfig $appConfig;
+ protected LoggerInterface $logger;
+ protected IUserManager $userManager;
+ protected IDBConnection $db;
+ protected IMimeTypeLoader $mimeTypeLoader;
+ protected ItemFactory $itemFactory;
+ private bool $isCLI;
public function __construct(
ScannerFactory $scannerFactory,
AppConfig $appConfig,
IRootFolder $rootFolder,
- ILogger $logger,
+ LoggerInterface $logger,
IUserManager $userManager,
IDBConnection $db,
IMimeTypeLoader $mimeTypeLoader,
@@ -89,7 +73,7 @@ class BackgroundScanner extends TimedJob {
try {
$result = $this->getUnscannedFiles();
} catch (\Exception $e) {
- $this->logger->logException($e);
+ $this->logger->error($e->getMessage(), ['exception' => $e]);
return;
}
@@ -131,7 +115,7 @@ class BackgroundScanner extends TimedJob {
break;
}
} catch (\Exception $e) {
- $this->logger->logException($e, ['app' => 'files_antivirus']);
+ $this->logger->error($e->getMessage(), ['exception' => $e]);
}
}
@@ -144,7 +128,7 @@ class BackgroundScanner extends TimedJob {
try {
$result = $this->getToRescanFiles();
} catch (\Exception $e) {
- $this->logger->logException($e);
+ $this->logger->error($e->getMessage(), ['exception' => $e]);
return;
}
@@ -191,7 +175,7 @@ class BackgroundScanner extends TimedJob {
try {
$result = $this->getOutdatedFiles();
} catch (\Exception $e) {
- $this->logger->logException($e);
+ $this->logger->error($e->getMessage(), ['exception' => $e]);
return;
}
diff --git a/lib/Item.php b/lib/Item.php
index a6da6c8..7a25c09 100644
--- a/lib/Item.php
+++ b/lib/Item.php
@@ -1,4 +1,7 @@
<?php
+
+declare(strict_types=1);
+
/**
* Copyright (c) 2015 Victor Dubiniuk <victor.dubiniuk@gmail.com>
* This file is licensed under the Affero General Public License version 3 or
@@ -11,13 +14,13 @@ namespace OCA\Files_Antivirus;
use OCA\Files_Antivirus\Activity\Provider;
use OCA\Files_Antivirus\AppInfo\Application;
use OCA\Files_Antivirus\Db\ItemMapper;
+use OCA\Files_Trashbin\Trash\ITrashManager;
use OCP\Activity\IManager as ActivityManager;
-use OCP\App;
use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\App\IAppManager;
use OCP\Files\File;
use OCP\Files\IRootFolder;
-use OCA\Files_Trashbin\Trash\ITrashManager;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
class Item {
/**
@@ -27,44 +30,27 @@ class Item {
*/
protected $fileHandle;
- /** @var AppConfig */
- private $config;
-
- /** @var ActivityManager */
- private $activityManager;
-
- /** @var ItemMapper */
- private $itemMapper;
-
- /** @var ILogger */
- private $logger;
-
- /** @var IRootFolder */
- private $rootFolder;
-
- /** @var File */
- private $file;
- private $isCron;
+ private AppConfig $config;
+ private ActivityManager $activityManager;
+ private ItemMapper $itemMapper;
+ private LoggerInterface $logger;
+ private IRootFolder $rootFolder;
+ private IAppManager $appManager;
+ private File $file;
+ private bool $isCron;
/**
* Item constructor.
- *
- * @param AppConfig $appConfig
- * @param ActivityManager $activityManager
- * @param ItemMapper $itemMapper
- * @param ILogger $logger
- * @param IRootFolder $rootFolder
- * @param File $file
- * @param bool $isCron
*/
public function __construct(
AppConfig $appConfig,
ActivityManager $activityManager,
ItemMapper $itemMapper,
- ILogger $logger,
+ LoggerInterface $logger,
IRootFolder $rootFolder,
+ IAppManager $appManager,
File $file,
- $isCron
+ bool $isCron
) {
$this->config = $appConfig;
$this->activityManager = $activityManager;
@@ -177,10 +163,8 @@ class Item {
/**
* Check if the end of file is reached
- *
- * @return boolean
*/
- private function feof() {
+ private function feof(): bool {
$isDone = feof($this->fileHandle);
if ($isDone) {
$this->logDebug('Scan is done');
@@ -213,13 +197,13 @@ class Item {
*/
private function deleteFile(): void {
//prevent from going to trashbin
- if (App::isEnabled('files_trashbin')) {
+ if ($this->appManager->isEnabledForUser('files_trashbin')) {
/** @var ITrashManager $trashManager */
$trashManager = \OC::$server->get(ITrashManager::class);
$trashManager->pauseTrash();
}
$this->file->delete();
- if (App::isEnabled('files_trashbin')) {
+ if ($this->appManager->isEnabledForUser('files_trashbin')) {
/** @var ITrashManager $trashManager */
$trashManager = \OC::$server->get(ITrashManager::class);
$trashManager->resumeTrash();
diff --git a/lib/ItemFactory.php b/lib/ItemFactory.php
index e2039a1..32b1ee9 100644
--- a/lib/ItemFactory.php
+++ b/lib/ItemFactory.php
@@ -1,8 +1,12 @@
<?php
+
+declare(strict_types=1);
+
/**
* @copyright Copyright (c) 2018 Roeland Jago Douma <roeland@famdouma.nl>
*
* @author Roeland Jago Douma <roeland@famdouma.nl>
+ * @author Côme Chilliet <come.chilliet@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
@@ -27,38 +31,22 @@ use OCA\Files_Antivirus\Db\ItemMapper;
use OCP\Activity\IManager as ActivityManager;
use OCP\Files\File;
use OCP\Files\IRootFolder;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
class ItemFactory {
- /** @var AppConfig */
- private $config;
-
- /** @var ActivityManager */
- private $activityManager;
-
- /** @var ItemMapper */
- private $itemMapper;
-
- /** @var ILogger */
- private $logger;
-
- /** @var IRootFolder */
- private $rootFolder;
+ private AppConfig $config;
+ private ActivityManager $activityManager;
+ private ItemMapper $itemMapper;
+ private LoggerInterface $logger;
+ private IRootFolder $rootFolder;
- /**
- * ItemFactory constructor.
- *
- * @param AppConfig $appConfig
- * @param ActivityManager $activityManager
- * @param ItemMapper $itemMapper
- * @param ILogger $logger
- * @param IRootFolder $rootFolder
- */
- public function __construct(AppConfig $appConfig,
- ActivityManager $activityManager,
- ItemMapper $itemMapper,
- ILogger $logger,
- IRootFolder $rootFolder) {
+ public function __construct(
+ AppConfig $appConfig,
+ ActivityManager $activityManager,
+ ItemMapper $itemMapper,
+ LoggerInterface $logger,
+ IRootFolder $rootFolder
+ ) {
$this->config = $appConfig;
$this->activityManager = $activityManager;
$this->itemMapper = $itemMapper;
@@ -66,11 +54,7 @@ class ItemFactory {
$this->rootFolder = $rootFolder;
}
- /**
- * @param File $file
- * @return Item
- */
- public function newItem(File $file, $isCron = false) {
+ public function newItem(File $file, bool $isCron = false): Item {
return new Item(
$this->config,
$this->activityManager,
diff --git a/lib/Scanner/ExternalClam.php b/lib/Scanner/ExternalClam.php
index 6cf34bd..b9d4654 100644
--- a/lib/Scanner/ExternalClam.php
+++ b/lib/Scanner/ExternalClam.php
@@ -1,4 +1,7 @@
<?php
+
+declare(strict_types=1);
+
/**
* Copyright (c) 2014 Victor Dubiniuk <victor.dubiniuk@gmail.com>
* This file is licensed under the Affero General Public License version 3 or
@@ -11,24 +14,16 @@ namespace OCA\Files_Antivirus\Scanner;
use OCA\Files_Antivirus\AppConfig;
use OCA\Files_Antivirus\StatusFactory;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
class ExternalClam extends ScannerBase {
/**
* Daemon/socket mode
- * @var bool
*/
- private $useSocket;
+ private bool $useSocket;
- /**
- * External constructor.
- *
- * @param AppConfig $config
- * @param ILogger $logger
- * @param StatusFactory $statusFactory
- */
- public function __construct(AppConfig $config, ILogger $logger, StatusFactory $statusFactory) {
+ public function __construct(AppConfig $config, LoggerInterface $logger, StatusFactory $statusFactory) {
parent::__construct($config, $logger, $statusFactory);
$this->useSocket = $this->appConfig->getAvMode() === 'socket';
}
diff --git a/lib/Scanner/ExternalKaspersky.php b/lib/Scanner/ExternalKaspersky.php
index 878bc9b..6b63e2e 100644
--- a/lib/Scanner/ExternalKaspersky.php
+++ b/lib/Scanner/ExternalKaspersky.php
@@ -1,6 +1,7 @@
<?php
declare(strict_types=1);
+
/**
* @copyright Copyright (c) 2020 Robin Appelman <robin@icewind.nl>
*
@@ -27,16 +28,15 @@ use OCA\Files_Antivirus\AppConfig;
use OCA\Files_Antivirus\Status;
use OCA\Files_Antivirus\StatusFactory;
use OCP\Http\Client\IClientService;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
class ExternalKaspersky extends ScannerBase {
- /** @var IClientService IClientService */
- private $clientService;
- private $chunkSize;
+ private IClientService $clientService;
+ private int $chunkSize;
public function __construct(
AppConfig $config,
- ILogger $logger,
+ LoggerInterface $logger,
StatusFactory $statusFactory,
IClientService $clientService
) {
diff --git a/lib/Scanner/ICAP.php b/lib/Scanner/ICAP.php
index 2821076..7dae418 100644
--- a/lib/Scanner/ICAP.php
+++ b/lib/Scanner/ICAP.php
@@ -1,6 +1,7 @@
<?php
declare(strict_types=1);
+
/**
* @copyright Copyright (c) 2020 Robin Appelman <robin@icewind.nl>
*
@@ -28,23 +29,18 @@ use OCA\Files_Antivirus\ICAP\ICAPClient;
use OCA\Files_Antivirus\ICAP\ICAPRequest;
use OCA\Files_Antivirus\Status;
use OCA\Files_Antivirus\StatusFactory;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
class ICAP extends ScannerBase {
- /** @var ICAPClient */
- private $icapClient;
- /** @var ?ICAPRequest */
- private $request;
- /** @var string */
- private $service;
- /** @var string */
- private $virusHeader;
- /** @var int */
- private $chunkSize;
+ private ICAPClient $icapClient;
+ private ?ICAPRequest $request;
+ private string $service;
+ private string $virusHeader;
+ private int $chunkSize;
public function __construct(
AppConfig $config,
- ILogger $logger,
+ LoggerInterface $logger,
StatusFactory $statusFactory
) {
parent::__construct($config, $logger, $statusFactory);
diff --git a/lib/Scanner/LocalClam.php b/lib/Scanner/LocalClam.php
index 2d314a9..9ce7653 100644
--- a/lib/Scanner/LocalClam.php
+++ b/lib/Scanner/LocalClam.php
@@ -1,4 +1,7 @@
<?php
+
+declare(strict_types=1);
+
/**
* Copyright (c) 2014 Victor Dubiniuk <victor.dubiniuk@gmail.com>
* This file is licensed under the Affero General Public License version 3 or
@@ -6,25 +9,21 @@
* See the COPYING-README file.
*/
-
namespace OCA\Files_Antivirus\Scanner;
use OCA\Files_Antivirus\AppConfig;
use OCA\Files_Antivirus\StatusFactory;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
class LocalClam extends ScannerBase {
- /**
- * @var string
- */
- protected $avPath;
+ protected string $avPath;
/**
* STDIN and STDOUT descriptors
* @var array of resources
*/
- private $pipes = [];
+ private array $pipes = [];
/**
* Process handle
@@ -32,7 +31,7 @@ class LocalClam extends ScannerBase {
*/
private $process;
- public function __construct(AppConfig $config, ILogger $logger, StatusFactory $statusFactory) {
+ public function __construct(AppConfig $config, LoggerInterface $logger, StatusFactory $statusFactory) {
parent::__construct($config, $logger, $statusFactory);
// get the path to the executable
diff --git a/lib/Scanner/ScannerBase.php b/lib/Scanner/ScannerBase.php
index d964266..4914b2d 100644
--- a/lib/Scanner/ScannerBase.php
+++ b/lib/Scanner/ScannerBase.php
@@ -27,57 +27,34 @@ use OCA\Files_Antivirus\AppConfig;
use OCA\Files_Antivirus\Item;
use OCA\Files_Antivirus\Status;
use OCA\Files_Antivirus\StatusFactory;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
abstract class ScannerBase implements IScanner {
/**
* Scan result
- *
- * @var Status
*/
- protected $status;
+ protected Status $status;
/**
* If scanning was done part by part
* the first detected infected part is stored here
- *
- * @var Status
*/
- protected $infectedStatus;
+ protected Status $infectedStatus;
- /** @var int */
- protected $byteCount;
+ protected int $byteCount;
/** @var resource */
protected $writeHandle;
- /** @var AppConfig */
- protected $appConfig;
-
- /** @var ILogger */
- protected $logger;
-
- /** @var StatusFactory */
- protected $statusFactory;
-
- /** @var string */
- protected $lastChunk;
-
- /** @var bool */
- protected $isLogUsed = false;
+ protected AppConfig $appConfig;
+ protected LoggerInterface $logger;
+ protected StatusFactory $statusFactory;
+ protected string $lastChunk;
+ protected bool $isLogUsed = false;
+ protected bool $isAborted = false;
- /** @var bool */
- protected $isAborted = false;
-
- /**
- * ScannerBase constructor.
- *
- * @param AppConfig $config
- * @param ILogger $logger
- * @param StatusFactory $statusFactory
- */
- public function __construct(AppConfig $config, ILogger $logger, StatusFactory $statusFactory) {
+ public function __construct(AppConfig $config, LoggerInterface $logger, StatusFactory $statusFactory) {
$this->appConfig = $config;
$this->logger = $logger;
$this->statusFactory = $statusFactory;
@@ -88,7 +65,6 @@ abstract class ScannerBase implements IScanner {
*/
abstract protected function shutdownScanner();
-
/**
* @return Status
*/
diff --git a/lib/Status.php b/lib/Status.php
index 688eb51..d1077cd 100644
--- a/lib/Status.php
+++ b/lib/Status.php
@@ -10,7 +10,7 @@ namespace OCA\Files_Antivirus;
use OCA\Files_Antivirus\Db\Rule;
use OCA\Files_Antivirus\Db\RuleMapper;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
class Status {
@@ -39,11 +39,8 @@ class Status {
*/
protected $details = '';
- /** @var RuleMapper */
- protected $ruleMapper;
-
- /** @var ILogger */
- protected $logger;
+ protected RuleMapper $ruleMapper;
+ protected LoggerInterface $logger;
/**
* Status constructor.
@@ -51,7 +48,7 @@ class Status {
* @param RuleMapper $ruleMapper
* @param ILogger $logger
*/
- public function __construct(RuleMapper $ruleMapper, ILogger $logger) {
+ public function __construct(RuleMapper $ruleMapper, LoggerInterface $logger) {
$this->ruleMapper = $ruleMapper;
$this->logger = $logger;
}
diff --git a/lib/StatusFactory.php b/lib/StatusFactory.php
index 7f07d7c..94fe26f 100644
--- a/lib/StatusFactory.php
+++ b/lib/StatusFactory.php
@@ -24,31 +24,18 @@
namespace OCA\Files_Antivirus;
use OCA\Files_Antivirus\Db\RuleMapper;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
class StatusFactory {
+ private RuleMapper $ruleMapper;
+ private LoggerInterface $logger;
- /** @var RuleMapper */
- private $ruleMapper;
-
- /** @var ILogger */
- private $logger;
-
- /**
- * StatusFactory constructor.
- *
- * @param RuleMapper $ruleMapper
- * @param ILogger $logger
- */
- public function __construct(RuleMapper $ruleMapper, ILogger $logger) {
+ public function __construct(RuleMapper $ruleMapper, LoggerInterface $logger) {
$this->ruleMapper = $ruleMapper;
$this->logger = $logger;
}
- /**
- * @return Status
- */
- public function newStatus() {
+ public function newStatus(): Status {
return new Status(
$this->ruleMapper,
$this->logger
diff --git a/tests/AvirWrapperTest.php b/tests/AvirWrapperTest.php
index 84349a0..7343701 100644
--- a/tests/AvirWrapperTest.php
+++ b/tests/AvirWrapperTest.php
@@ -10,13 +10,13 @@
namespace OCA\Files_Antivirus\Tests;
-use OC\Files\Storage\Temporary;
use OCA\Files_Antivirus\AvirWrapper;
use OCA\Files_Antivirus\Scanner\ExternalClam;
use OCA\Files_Antivirus\Scanner\ScannerFactory;
use OCA\Files_Antivirus\StatusFactory;
use OCP\Activity\IManager;
-use OCP\ILogger;
+use OC\Files\Storage\Temporary;
+use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Test\Traits\UserTrait;
@@ -40,7 +40,7 @@ class AvirWrapperTest extends TestBase {
/** @var Temporary */
protected $storage;
- /** @var ILogger */
+ /** @var LoggerInterface */
protected $logger;
/** @var AvirWrapper */
@@ -51,7 +51,7 @@ class AvirWrapperTest extends TestBase {
$this->createUser(self::UID, self::PWD);
$this->storage = new Temporary([]);
- $this->logger = $this->createMock(ILogger::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
$scanner = new ExternalClam(
$this->config,
diff --git a/tests/Scanner/ExternalKasperskyTest.php b/tests/Scanner/ExternalKasperskyTest.php
index 639a6cb..a570cee 100644
--- a/tests/Scanner/ExternalKasperskyTest.php
+++ b/tests/Scanner/ExternalKasperskyTest.php
@@ -28,7 +28,7 @@ use OCA\Files_Antivirus\Scanner\ExternalKaspersky;
use OCA\Files_Antivirus\Scanner\ScannerBase;
use OCA\Files_Antivirus\StatusFactory;
use OCP\Http\Client\IClientService;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
/**
* @group DB
@@ -39,7 +39,7 @@ class ExternalKasperskyTest extends ScannerBaseTest {
$this->markTestSkipped("Set KASPERSKY_HOST and KASPERSKY_PORT to enable kaspersky tests");
}
- $logger = $this->createMock(ILogger::class);
+ $logger = $this->createMock(LoggerInterface::class);
$config = $this->createPartialMock(AppConfig::class, ['getter']);
$config->method('getter')
->willReturnCallback(function ($key) {
diff --git a/tests/Scanner/ICAPTest.php b/tests/Scanner/ICAPTest.php
index 13061cd..dfd7cca 100644
--- a/tests/Scanner/ICAPTest.php
+++ b/tests/Scanner/ICAPTest.php
@@ -27,7 +27,7 @@ use OCA\Files_Antivirus\AppConfig;
use OCA\Files_Antivirus\Scanner\ICAP;
use OCA\Files_Antivirus\Scanner\ScannerBase;
use OCA\Files_Antivirus\StatusFactory;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
/**
* @group DB
@@ -38,7 +38,7 @@ class ICAPTest extends ScannerBaseTest {
$this->markTestSkipped("Set ICAP_HOST, ICAP_PORT, ICAP_REQUEST and ICAP_HEADER to enable icap tests");
}
- $logger = $this->createMock(ILogger::class);
+ $logger = $this->createMock(LoggerInterface::class);
$config = $this->createPartialMock(AppConfig::class, ['getter']);
$config->method('getter')
->willReturnCallback(function ($key) {
diff --git a/tests/StatusTest.php b/tests/StatusTest.php
index fa25daa..cf25352 100644
--- a/tests/StatusTest.php
+++ b/tests/StatusTest.php
@@ -9,7 +9,7 @@
namespace OCA\Files_Antivirus\Tests;
use \OCA\Files_Antivirus\Db\RuleMapper;
-use OCP\ILogger;
+use Psr\Log\LoggerInterface;
/**
* @group DB
@@ -35,7 +35,7 @@ class StatusTest extends TestBase {
// Testing status codes
$testStatus = new \OCA\Files_Antivirus\Status(
$this->ruleMapper,
- $this->createMock(ILogger::class)
+ $this->createMock(LoggerInterface::class)
);
$testStatus->parseResponse('dummy : OK', self::TEST_CLEAN);