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

95 lines
2.5 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2021 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Mail\Sieve;
use Horde\ManageSieve;
use OCA\Mail\Account;
use OCP\IConfig;
use OCP\Security\ICrypto;
class SieveClientFactory {
private ICrypto $crypto;
private IConfig $config;
private array $cache = [];
public function __construct(ICrypto $crypto, IConfig $config) {
$this->crypto = $crypto;
$this->config = $config;
}
/**
* @throws ManageSieve\Exception
*/
public function getClient(Account $account): ManageSieve {
if (!isset($this->cache[$account->getId()])) {
$user = $account->getMailAccount()->getSieveUser();
if (empty($user)) {
$user = $account->getMailAccount()->getInboundUser();
}
$password = $account->getMailAccount()->getSievePassword();
if (empty($password)) {
$password = $account->getMailAccount()->getInboundPassword();
}
if ($account->getDebug() || $this->config->getSystemValueBool('app.mail.debug')) {
$logFile = $this->config->getSystemValue('datadirectory') . '/mail-' . $account->getUserId() . '-' . $account->getId() . '-sieve.log';
} else {
$logFile = null;
}
$this->cache[$account->getId()] = $this->createClient(
$account->getMailAccount()->getSieveHost(),
$account->getMailAccount()->getSievePort(),
$user,
$this->crypto->decrypt($password),
$account->getMailAccount()->getSieveSslMode(),
$logFile,
);
}
return $this->cache[$account->getId()];
}
/**
* @param string $sslMode possible values: '', 'none', 'ssl' or 'tls'
* @param ?string $logFile absolute path for logFile or null to disable logging
* @throws ManageSieve\Exception
*/
public function createClient(string $host, int $port, string $user, string $password, string $sslMode, ?string $logFile): ManageSieve {
if (empty($sslMode)) {
$sslMode = true;
} elseif ($sslMode === 'none') {
$sslMode = false;
}
$params = [
'host' => $host,
'port' => $port,
'user' => $user,
'password' => $password,
'secure' => $sslMode,
'timeout' => $this->config->getSystemValueInt('app.mail.sieve.timeout', 5),
'context' => [
'ssl' => [
'verify_peer' => $this->config->getSystemValueBool('app.mail.verify-tls-peer', true),
'verify_peer_name' => $this->config->getSystemValueBool('app.mail.verify-tls-peer', true),
]
],
];
if ($logFile !== null) {
$params['logger'] = new SieveLogger($logFile);
}
return new ManageSieve($params);
}
}