Initial commit
This commit is contained in:
213
lib/Service/Remote/RemoteService.php
Normal file
213
lib/Service/Remote/RemoteService.php
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: Sebastian Krupinski <krupinski01@gmail.com>
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace KTXM\ProviderJmapc\Service\Remote;
|
||||
|
||||
use JmapClient\Authentication\Basic;
|
||||
use JmapClient\Authentication\Bearer;
|
||||
use JmapClient\Authentication\JsonBasic;
|
||||
use JmapClient\Authentication\JsonBasicCookie;
|
||||
use JmapClient\Client as JmapClient;
|
||||
use KTXF\Resource\Provider\ResourceServiceBaseInterface;
|
||||
use KTXF\Resource\Provider\ResourceServiceIdentityBasic;
|
||||
use KTXF\Resource\Provider\ResourceServiceIdentityBearer;
|
||||
use KTXF\Resource\Provider\ResourceServiceIdentityOAuth;
|
||||
use KTXF\Resource\Provider\ResourceServiceLocationUri;
|
||||
use KTXM\ProviderJmapc\Providers\Mail\Service;
|
||||
use KTXM\ProviderJmapc\Service\Remote\FM\RemoteContactsServiceFM;
|
||||
use KTXM\ProviderJmapc\Service\Remote\FM\RemoteCoreServiceFM;
|
||||
use KTXM\ProviderJmapc\Service\Remote\FM\RemoteEventsServiceFM;
|
||||
|
||||
class RemoteService {
|
||||
static string $clientTransportAgent = 'KtrixJMAP/1.0 (1.0; x64)';
|
||||
//public static string $clientTransportAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:130.0) Gecko/20100101 Firefox/130.0';
|
||||
|
||||
/**
|
||||
* Initialize remote data store client
|
||||
*
|
||||
* @since Release 1.0.0
|
||||
*/
|
||||
public static function freshClient(Service $service): JmapClient {
|
||||
|
||||
// defaults
|
||||
$client = new JmapClient();
|
||||
$client->setTransportAgent(self::$clientTransportAgent);
|
||||
$location = $service->getLocation();
|
||||
$identity = $service->getIdentity();
|
||||
|
||||
// location
|
||||
if ($location instanceof ResourceServiceLocationUri === false) {
|
||||
throw new \InvalidArgumentException('Service location is not a valid URI');
|
||||
}
|
||||
$client->configureTransportMode($location->getScheme());
|
||||
$client->setHost($location->getHost() . ':' . $location->getPort());
|
||||
if (!empty($location->getPath())) {
|
||||
$client->setDiscoveryPath($location->getPath());
|
||||
}
|
||||
$client->configureTransportVerification((bool)$location->getVerifyPeer());
|
||||
// authentication
|
||||
if (($identity instanceof ResourceServiceIdentityBasic) === false) {
|
||||
throw new \InvalidArgumentException('Service identity is not a valid Basic or Bearer authentication');
|
||||
}
|
||||
|
||||
if ($identity instanceof ResourceServiceIdentityBasic) {
|
||||
$client->setAuthentication(new Basic(
|
||||
$identity->getIdentity(),
|
||||
$identity->getSecret()
|
||||
));
|
||||
}
|
||||
// debugging
|
||||
if ($service->getDebug()) {
|
||||
$client->configureTransportLogState(true);
|
||||
$client->configureTransportLogLocation(
|
||||
sys_get_temp_dir() . '/' . $location->getHost() . '-' . $identity->getIdentity() . '.log'
|
||||
);
|
||||
}
|
||||
// return
|
||||
return $client;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroys remote data store client (Jmap Client)
|
||||
*
|
||||
* @since Release 1.0.0
|
||||
*/
|
||||
public static function destroyClient(JmapClient $Client): void {
|
||||
|
||||
// destroy remote data store client
|
||||
$Client = null;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Appropriate Mail Service for Connection
|
||||
*
|
||||
* @since Release 1.0.0
|
||||
*/
|
||||
public static function coreService(JmapClient $Client, ?string $dataAccount = null): RemoteCoreService {
|
||||
// determine if client is connected
|
||||
if (!$Client->sessionStatus()) {
|
||||
$Client->connect();
|
||||
}
|
||||
// construct service based on capabilities
|
||||
if ($Client->sessionCapable('https://www.fastmail.com/dev/user', false)) {
|
||||
$service = new RemoteCoreServiceFM();
|
||||
} else {
|
||||
$service = new RemoteCoreService();
|
||||
}
|
||||
$service->initialize($Client, $dataAccount);
|
||||
return $service;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appropriate Mail Service for Connection
|
||||
*
|
||||
* @since Release 1.0.0
|
||||
*/
|
||||
public static function mailService(JmapClient $Client, ?string $dataAccount = null): RemoteMailService {
|
||||
// determine if client is connected
|
||||
if (!$Client->sessionStatus()) {
|
||||
$Client->connect();
|
||||
}
|
||||
$service = new RemoteMailService();
|
||||
$service->initialize($Client, $dataAccount);
|
||||
return $service;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appropriate Contacts Service for Connection
|
||||
*
|
||||
* @since Release 1.0.0
|
||||
*/
|
||||
public static function contactsService(JmapClient $Client, ?string $dataAccount = null): RemoteContactsService {
|
||||
// determine if client is connected
|
||||
if (!$Client->sessionStatus()) {
|
||||
$Client->connect();
|
||||
}
|
||||
// construct service based on capabilities
|
||||
if ($Client->sessionCapable('https://www.fastmail.com/dev/contacts', false)) {
|
||||
$service = new RemoteContactsServiceFM();
|
||||
} else {
|
||||
$service = new RemoteContactsService();
|
||||
}
|
||||
$service->initialize($Client, $dataAccount);
|
||||
return $service;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appropriate Events Service for Connection
|
||||
*
|
||||
* @since Release 1.0.0
|
||||
*/
|
||||
public static function eventsService(JmapClient $Client, ?string $dataAccount = null): RemoteEventsService {
|
||||
// determine if client is connected
|
||||
if (!$Client->sessionStatus()) {
|
||||
$Client->connect();
|
||||
}
|
||||
// construct service based on capabilities
|
||||
if ($Client->sessionCapable('https://www.fastmail.com/dev/calendars', false)) {
|
||||
$service = new RemoteEventsServiceFM();
|
||||
} else {
|
||||
$service = new RemoteEventsService();
|
||||
}
|
||||
$service->initialize($Client, $dataAccount);
|
||||
return $service;
|
||||
}
|
||||
|
||||
/**
|
||||
* Appropriate Tasks Service for Connection
|
||||
*
|
||||
* @since Release 1.0.0
|
||||
*/
|
||||
public static function tasksService(JmapClient $Client, ?string $dataAccount = null): RemoteTasksService {
|
||||
// determine if client is connected
|
||||
if (!$Client->sessionStatus()) {
|
||||
$Client->connect();
|
||||
}
|
||||
$service = new RemoteTasksService();
|
||||
$service->initialize($Client, $dataAccount);
|
||||
return $service;
|
||||
}
|
||||
|
||||
public static function cookieStoreRetrieve(mixed $id): ?array {
|
||||
|
||||
$file = sys_get_temp_dir() . DIRECTORY_SEPARATOR . (string)$id . '.jmapc';
|
||||
|
||||
if (!file_exists($file)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$data = file_get_contents($file);
|
||||
$crypto = \OC::$server->get(\OCP\Security\ICrypto::class);
|
||||
$data = $crypto->decrypt($data);
|
||||
|
||||
if (!empty($data)) {
|
||||
return json_decode($data, true);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
public static function cookieStoreDeposit(mixed $id, array $value): void {
|
||||
|
||||
if (empty($value)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$crypto = \OC::$server->get(\OCP\Security\ICrypto::class);
|
||||
$data = $crypto->encrypt(json_encode($value));
|
||||
|
||||
$file = sys_get_temp_dir() . DIRECTORY_SEPARATOR . (string)$id . '.jmapc';
|
||||
file_put_contents($file, $data);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user