File size: 2,890 Bytes
d2897cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php

declare(strict_types=1);

namespace Mautic\IntegrationsBundle\Auth\Provider\Oauth1aTwoLegged;

use GuzzleHttp\Client;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Subscriber\Oauth\Oauth1;
use Mautic\IntegrationsBundle\Auth\Provider\AuthConfigInterface;
use Mautic\IntegrationsBundle\Auth\Provider\AuthCredentialsInterface;
use Mautic\IntegrationsBundle\Auth\Provider\AuthProviderInterface;
use Mautic\IntegrationsBundle\Exception\PluginNotConfiguredException;

/**
 * Factory for building HTTP clients that will sign the requests with Oauth1a headers.
 */
class HttpFactory implements AuthProviderInterface
{
    public const NAME = 'oauth1a_two_legged';

    /**
     * Cache of initialized clients.
     *
     * @var Client[]
     */
    private array $initializedClients = [];

    public function getAuthType(): string
    {
        return self::NAME;
    }

    /**
     * @param CredentialsInterface|AuthCredentialsInterface $credentials
     *
     * @throws PluginNotConfiguredException
     */
    public function getClient(AuthCredentialsInterface $credentials, ?AuthConfigInterface $config = null): ClientInterface
    {
        // Return cached initialized client if there is one.
        if (!empty($this->initializedClients[$credentials->getConsumerKey()])) {
            return $this->initializedClients[$credentials->getConsumerKey()];
        }

        if (!$this->credentialsAreConfigured($credentials)) {
            throw new PluginNotConfiguredException('Oauth1a Credentials or URL is missing');
        }

        $this->initializedClients[$credentials->getConsumerKey()] = $this->buildClient($credentials);

        return $this->initializedClients[$credentials->getConsumerKey()];
    }

    private function buildClient(CredentialsInterface $credentials): Client
    {
        $stack = HandlerStack::create();
        $stack->push($this->createOauth1($credentials));

        return new Client(
            [
                'handler'  => $stack,
                'base_uri' => $credentials->getAuthUrl(),
                'auth'     => 'oauth',
            ]
        );
    }

    private function createOauth1(CredentialsInterface $credentials): Oauth1
    {
        $config = [
            'consumer_key'    => $credentials->getConsumerKey(),
            'consumer_secret' => $credentials->getConsumerSecret(),
        ];

        if ($credentials->getToken() && $credentials->getTokenSecret()) {
            $config['token']        = $credentials->getToken();
            $config['token_secret'] = $credentials->getTokenSecret();
        }

        return new Oauth1($config);
    }

    private function credentialsAreConfigured(CredentialsInterface $credentials): bool
    {
        return !empty($credentials->getAuthUrl()) && !empty($credentials->getConsumerKey()) && !empty($credentials->getConsumerSecret());
    }
}