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

90 lines
2.2 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 OCA\Mail\Account;
use OCA\Mail\Contracts\IDkimService;
use OCA\Mail\Contracts\IDkimValidator;
use OCA\Mail\Db\Mailbox;
use OCA\Mail\Exception\ServiceException;
use OCA\Mail\IMAP\IMAPClientFactory;
use OCA\Mail\IMAP\MessageMapper;
use OCP\ICache;
use OCP\ICacheFactory;
class DkimService implements IDkimService {
private const CACHE_PREFIX = 'mail_dkim';
private const CACHE_TTL = 7 * 24 * 3600;
/** @var IMAPClientFactory */
private $clientFactory;
/** @var MessageMapper */
private $messageMapper;
/** @var ICache */
private $cache;
private IDkimValidator $dkimValidator;
public function __construct(
IMAPClientFactory $clientFactory,
MessageMapper $messageMapper,
ICacheFactory $cacheFactory,
IDkimValidator $dkimValidator,
) {
$this->clientFactory = $clientFactory;
$this->messageMapper = $messageMapper;
$this->cache = $cacheFactory->createLocal(self::CACHE_PREFIX);
$this->dkimValidator = $dkimValidator;
}
#[\Override]
public function validate(Account $account, Mailbox $mailbox, int $id): bool {
$cached = $this->getCached($account, $mailbox, $id);
if (is_bool($cached)) {
return $cached;
}
$client = $this->clientFactory->getClient($account);
try {
$fullText = $this->messageMapper->getFullText(
$client,
$mailbox->getName(),
$id,
$account->getUserId(),
false,
);
if ($fullText === null) {
throw new ServiceException('Could not fetch message source for uid ' . $id);
}
} finally {
$client->logout();
}
$result = $this->dkimValidator->validate($fullText);
$cache_key = $this->buildCacheKey($account, $mailbox, $id);
$this->cache->set($cache_key, $result, self::CACHE_TTL);
return $result;
}
#[\Override]
public function getCached(Account $account, Mailbox $mailbox, int $id): ?bool {
return $this->cache->get($this->buildCacheKey($account, $mailbox, $id));
}
private function buildCacheKey(Account $account, Mailbox $mailbox, int $id): string {
return $account->getId() . '_' . $mailbox->getName() . '_' . $id;
}
}