f7cloud_client/apps/mail/lib/Service/SieveService.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

79 lines
2.1 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2023 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Mail\Service;
use Horde\ManageSieve\Exception as ManagesieveException;
use OCA\Mail\Exception\ClientException;
use OCA\Mail\Exception\CouldNotConnectException;
use OCA\Mail\Sieve\NamedSieveScript;
use OCA\Mail\Sieve\SieveClientFactory;
class SieveService {
public function __construct(
private SieveClientFactory $sieveClientFactory,
private AccountService $accountService,
) {
}
/**
* @throws CouldNotConnectException
* @throws ClientException
* @throws ManagesieveException
*/
public function getActiveScript(string $userId, int $accountId): NamedSieveScript {
$sieve = $this->getClient($userId, $accountId);
$scriptName = $sieve->getActive();
if ($scriptName === null) {
$script = '';
} else {
$script = $sieve->getScript($scriptName);
}
// Sieve appends the script with a carriage return and line feed (\r\n) each time it's saved.
// Strip those line feeds to avoid the accumulation of unnecessary white space.
$script = rtrim($script, "\r\n");
return new NamedSieveScript($scriptName, $script);
}
/**
* @throws ClientException
* @throws CouldNotConnectException
* @throws ManagesieveException
*/
public function updateActiveScript(string $userId, int $accountId, string $script): void {
$sieve = $this->getClient($userId, $accountId);
$scriptName = $sieve->getActive() ?? 'f7cloud';
$sieve->installScript($scriptName, $script, true);
}
/**
* @throws ClientException
* @throws CouldNotConnectException
*/
private function getClient(string $userId, int $accountId): \Horde\ManageSieve {
$account = $this->accountService->find($userId, $accountId);
if (!$account->getMailAccount()->isSieveEnabled()) {
throw new ClientException('ManageSieve is disabled');
}
try {
$sieve = $this->sieveClientFactory->getClient($account);
} catch (ManagesieveException $e) {
throw new CouldNotConnectException($e, 'ManageSieve', $account->getMailAccount()->getSieveHost(), $account->getMailAccount()->getSievePort());
}
return $sieve;
}
}