Spaces:
No application file
No application file
| declare(strict_types=1); | |
| namespace Mautic\IntegrationsBundle\Auth\Provider\ApiKey; | |
| use GuzzleHttp\Client; | |
| use GuzzleHttp\ClientInterface; | |
| use GuzzleHttp\Handler\CurlHandler; | |
| use GuzzleHttp\HandlerStack; | |
| use GuzzleHttp\Middleware; | |
| use GuzzleHttp\Psr7\Request; | |
| use GuzzleHttp\Psr7\Uri; | |
| use Mautic\IntegrationsBundle\Auth\Provider\ApiKey\Credentials\HeaderCredentialsInterface; | |
| use Mautic\IntegrationsBundle\Auth\Provider\ApiKey\Credentials\ParameterCredentialsInterface; | |
| use Mautic\IntegrationsBundle\Auth\Provider\AuthConfigInterface; | |
| use Mautic\IntegrationsBundle\Auth\Provider\AuthCredentialsInterface; | |
| use Mautic\IntegrationsBundle\Auth\Provider\AuthProviderInterface; | |
| use Mautic\IntegrationsBundle\Exception\InvalidCredentialsException; | |
| use Mautic\IntegrationsBundle\Exception\PluginNotConfiguredException; | |
| /** | |
| * Factory for building HTTP clients using basic auth. | |
| */ | |
| class HttpFactory implements AuthProviderInterface | |
| { | |
| public const NAME = 'api_key'; | |
| /** | |
| * Cache of initialized clients. | |
| * | |
| * @var Client[] | |
| */ | |
| private array $initializedClients = []; | |
| private HeaderCredentialsInterface|ParameterCredentialsInterface|null $credentials = null; | |
| public function getAuthType(): string | |
| { | |
| return self::NAME; | |
| } | |
| /** | |
| * @param HeaderCredentialsInterface|ParameterCredentialsInterface $credentials | |
| * | |
| * @throws PluginNotConfiguredException | |
| * @throws InvalidCredentialsException | |
| */ | |
| public function getClient(AuthCredentialsInterface $credentials, ?AuthConfigInterface $config = null): ClientInterface | |
| { | |
| if (!$this->credentialsAreValid($credentials)) { | |
| throw new InvalidCredentialsException(sprintf('Credentials must implement either the %s or %s interfaces', HeaderCredentialsInterface::class, ParameterCredentialsInterface::class)); | |
| } | |
| if (!$this->credentialsAreConfigured($credentials)) { | |
| throw new PluginNotConfiguredException('API key is missing'); | |
| } | |
| // Return cached initialized client if there is one. | |
| if (!empty($this->initializedClients[$credentials->getKeyName()])) { | |
| return $this->initializedClients[$credentials->getKeyName()]; | |
| } | |
| $this->credentials = $credentials; | |
| if ($credentials instanceof HeaderCredentialsInterface) { | |
| $this->initializedClients[$credentials->getKeyName()] = $this->getHeaderClient(); | |
| return $this->initializedClients[$credentials->getKeyName()]; | |
| } | |
| $this->initializedClients[$credentials->getKeyName()] = $this->getParameterClient(); | |
| return $this->initializedClients[$credentials->getKeyName()]; | |
| } | |
| private function credentialsAreValid(AuthCredentialsInterface $credentials): bool | |
| { | |
| return $credentials instanceof HeaderCredentialsInterface || $credentials instanceof ParameterCredentialsInterface; | |
| } | |
| /** | |
| * @param HeaderCredentialsInterface|ParameterCredentialsInterface|AuthCredentialsInterface $credentials | |
| */ | |
| private function credentialsAreConfigured(AuthCredentialsInterface $credentials): bool | |
| { | |
| return !empty($credentials->getApiKey()); | |
| } | |
| private function getHeaderClient(): ClientInterface | |
| { | |
| return new Client( | |
| [ | |
| 'headers' => [$this->credentials->getKeyName() => $this->credentials->getApiKey()], | |
| ] | |
| ); | |
| } | |
| private function getParameterClient(): ClientInterface | |
| { | |
| $handler = new HandlerStack(); | |
| $handler->setHandler(new CurlHandler()); | |
| $handler->unshift( | |
| Middleware::mapRequest( | |
| fn (Request $request) => $request->withUri( | |
| Uri::withQueryValue($request->getUri(), $this->credentials->getKeyName(), $this->credentials->getApiKey()) | |
| ) | |
| ) | |
| ); | |
| return new Client( | |
| [ | |
| 'handler' => $handler, | |
| ] | |
| ); | |
| } | |
| } | |