* SPDX-License-Identifier: AGPL-3.0-or-later */ namespace KTXM\ProviderImapMail\Service\Remote; use Gricob\IMAP\Client; use KTXC\Server; use KTXC\Logger\PlainFileLogger; use KTXM\ProviderImapMail\Providers\Service; /** * Static factory for IMAP remote service objects. * * - freshClient() → builds a gricob Client from service config * - mailService() → constructs a RemoteMailService from the client */ class RemoteService { /** * Build a fully-configured IMAP client from a Service's location and identity. * * Handles STARTTLS: connects on plain TCP, sends STARTTLS, upgrades to TLS, * then authenticates — all before returning the client. */ public static function freshClient(Service $service): Client { $location = $service->getLocation(); $identity = $service->getIdentity(); // Build a file logger when debug mode is enabled, otherwise pass null $logger = null; if ($service->getDebug()) { $logDir = Server::getInstance()?->logDir() ?? __DIR__ . '/../../../../../var/log'; $logger = new PlainFileLogger($logDir . '/imap', $service->identifier()); } $client = Client::create($location->toConfiguration(), $logger); $client->connect(); if ($location->getEncryption() === 'starttls') { $client->startTls(); } $client->logIn($identity->getIdentity(), $identity->getSecret()); return $client; } /** * Build a RemoteMailService from a Service and a pre-authenticated client. * * The provider identifier and service ID are taken directly from the Service * object so the caller does not have to repeat them. */ public static function mailService(Service $service, Client $client): RemoteMailService { return new RemoteMailService($client, $service->provider(), $service->identifier()); } }