<?php
/**
* Pimcore
*
* This source file is available under following license:
* - Pimcore Commercial License (PCL)
*
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
* @license http://www.pimcore.org/license PCL
*/
namespace Pimcore\Bundle\OpenIdConnectBundle\Service;
use Pimcore\Config\LocationAwareConfigRepository;
class ConfigurationService
{
const CONFIG_ID = 'pimcore_open_id_connect';
/**
* @var null|string
*/
protected ?string $defaultProvider;
/**
* @var array
*/
protected array $providers;
/**
* @var bool
*/
protected bool $isWriteable;
/**
* @var bool
*/
protected bool $configLoaded = false;
/**
* @var LocationAwareConfigRepository
*/
protected $locationAwareConfigRepository;
public function __construct(array $config)
{
$containerConfig = [];
if (!empty($config['default_provider'])) {
$containerConfig[self::CONFIG_ID]['default_provider'] = $config['default_provider'];
}
if (!empty($config['providers'])) {
$containerConfig[self::CONFIG_ID]['providers'] = $config['providers'];
}
if (\Pimcore\Version::getMajorVersion() >= 11) {
$storageConfig = $config['config_location']['open_id_connect'];
$this->locationAwareConfigRepository = new LocationAwareConfigRepository(
$containerConfig,
'pimcore_oidc',
$storageConfig
);
} else {
$storageConfig = LocationAwareConfigRepository::getStorageConfigurationCompatibilityLayer(
$config,
'open_id_connect',
'PIMCORE_CONFIG_STORAGE_DIR_OIDC',
'PIMCORE_WRITE_TARGET_OIDC'
);
$this->locationAwareConfigRepository = new LocationAwareConfigRepository(
$containerConfig,
'pimcore_oidc',
$storageConfig,
null
);
}
}
protected function loadConfig()
{
if ($this->configLoaded === false) {
list($config, $dataSource) = $this->locationAwareConfigRepository->loadConfigByKey(self::CONFIG_ID);
$this->defaultProvider = $config['default_provider'] ?? null;
$this->providers = $config['providers'] ?? [];
$this->isWriteable = $this->locationAwareConfigRepository->isWriteable(self::CONFIG_ID, $dataSource);
$this->configLoaded = true;
}
}
/**
* @return string|null
*/
public function getDefaultProvider(): ?string
{
$this->loadConfig();
return $this->defaultProvider;
}
/**
* @return array
*/
public function getProviders(): array
{
$this->loadConfig();
return array_keys($this->providers);
}
/**
* @param string $providerName
*
* @return array|null
*/
public function getProviderConfig(string $providerName): ?array
{
$this->loadConfig();
return $this->providers[$providerName] ?? null;
}
/**
* @param array $providers
* @param string|null $defaultProvider
*
* @throws \Exception
*/
public function saveConfiguration(array $providers, ?string $defaultProvider)
{
$data = [
'default_provider' => $defaultProvider,
'providers' => $providers
];
$this->locationAwareConfigRepository->saveConfig(self::CONFIG_ID, $data, function ($key, $data) {
return [
$key => $data
];
});
$this->configLoaded = false;
}
/**
* @return array
*/
public function getFullConfiguration(): array
{
$this->loadConfig();
return [
'default_provider' => $this->defaultProvider,
'providers' => $this->providers
];
}
/**
* @return bool
*/
public function isWriteable(): bool
{
$this->loadConfig();
return $this->isWriteable;
}
}