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

147 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2017 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Mail\Service;
use Horde_Imap_Client_Exception;
use Horde_Mail_Exception;
use Horde_Mail_Transport_Smtphorde;
use InvalidArgumentException;
use OCA\Mail\Account;
use OCA\Mail\Db\MailAccount;
use OCA\Mail\Db\TagMapper;
use OCA\Mail\Exception\CouldNotConnectException;
use OCA\Mail\Exception\ServiceException;
use OCA\Mail\IMAP\IMAPClientFactory;
use OCA\Mail\SMTP\SmtpClientFactory;
use OCP\Security\ICrypto;
use Psr\Log\LoggerInterface;
use function in_array;
class SetupService {
/** @var AccountService */
private $accountService;
/** @var ICrypto */
private $crypto;
/** @var SmtpClientFactory */
private $smtpClientFactory;
/** @var IMAPClientFactory */
private $imapClientFactory;
/** @var LoggerInterface */
private $logger;
/** @var TagMapper */
private $tagMapper;
public function __construct(AccountService $accountService,
ICrypto $crypto,
SmtpClientFactory $smtpClientFactory,
IMAPClientFactory $imapClientFactory,
LoggerInterface $logger,
TagMapper $tagMapper) {
$this->accountService = $accountService;
$this->crypto = $crypto;
$this->smtpClientFactory = $smtpClientFactory;
$this->imapClientFactory = $imapClientFactory;
$this->logger = $logger;
$this->tagMapper = $tagMapper;
}
/**
* @throws CouldNotConnectException
* @throws ServiceException
*
* @return Account
*/
public function createNewAccount(string $accountName,
string $emailAddress,
string $imapHost,
int $imapPort,
string $imapSslMode,
string $imapUser,
?string $imapPassword,
string $smtpHost,
int $smtpPort,
string $smtpSslMode,
string $smtpUser,
?string $smtpPassword,
string $uid,
string $authMethod,
?int $accountId = null): Account {
$this->logger->info('Setting up manually configured account');
$newAccount = new MailAccount([
'accountId' => $accountId,
'accountName' => $accountName,
'emailAddress' => $emailAddress,
'imapHost' => $imapHost,
'imapPort' => $imapPort,
'imapSslMode' => $imapSslMode,
'imapUser' => $imapUser,
'smtpHost' => $smtpHost,
'smtpPort' => $smtpPort,
'smtpSslMode' => $smtpSslMode,
'smtpUser' => $smtpUser,
]);
$newAccount->setUserId($uid);
if ($authMethod === 'password' && $imapPassword !== null) {
$newAccount->setInboundPassword($this->crypto->encrypt($imapPassword));
}
if ($authMethod === 'password' && $smtpPassword !== null) {
$newAccount->setOutboundPassword($this->crypto->encrypt($smtpPassword));
}
if (!in_array($authMethod, ['password', 'xoauth2'], true)) {
throw new InvalidArgumentException('Invalid auth method ' . $authMethod);
}
$newAccount->setAuthMethod($authMethod);
$account = new Account($newAccount);
if ($authMethod === 'password' && $imapPassword !== null) {
$this->logger->debug('Connecting to account {account}', ['account' => $newAccount->getEmail()]);
$this->testConnectivity($account);
}
$this->accountService->save($newAccount);
$this->logger->debug('account created ' . $newAccount->getId());
$this->tagMapper->createDefaultTags($newAccount);
return $account;
}
/**
* @param Account $account
* @throws CouldNotConnectException
*/
protected function testConnectivity(Account $account): void {
$mailAccount = $account->getMailAccount();
$imapClient = $this->imapClientFactory->getClient($account);
try {
$imapClient->login();
} catch (Horde_Imap_Client_Exception $e) {
throw new CouldNotConnectException($e, 'IMAP', $mailAccount->getInboundHost(), $mailAccount->getInboundPort());
} finally {
$imapClient->logout();
}
$transport = $this->smtpClientFactory->create($account);
if ($transport instanceof Horde_Mail_Transport_Smtphorde) {
try {
$transport->getSMTPObject();
} catch (Horde_Mail_Exception $e) {
throw new CouldNotConnectException($e, 'SMTP', $mailAccount->getOutboundHost(), $mailAccount->getOutboundPort());
}
}
}
}