Passed
Push — master ( 106006...c1ddb5 )
by Thomas Mauro
06:38 queued 11s
created

DistributedParser::fetch()   B

Complexity

Conditions 8
Paths 27

Size

Total Lines 45
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 24
CRAP Score 8.004

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 8
eloc 26
nc 27
nop 3
dl 0
loc 45
ccs 24
cts 25
cp 0.96
crap 8.004
rs 8.4444
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace TMV\OpenIdClient\Claims;
6
7
use function array_filter;
8
use Http\Discovery\Psr17FactoryDiscovery;
9
use Http\Discovery\Psr18ClientDiscovery;
10
use function is_array;
11
use Jose\Component\Core\AlgorithmManager;
12
use Jose\Component\Signature\JWSVerifier;
13
use Psr\Http\Client\ClientInterface;
14
use Psr\Http\Message\RequestFactoryInterface;
15
use Psr\Http\Message\ResponseInterface;
16
use Throwable;
17
use function TMV\OpenIdClient\check_server_response;
18
use TMV\OpenIdClient\Client\ClientInterface as OpenIDClient;
19
use TMV\OpenIdClient\Issuer\IssuerFactoryInterface;
20
21
final class DistributedParser extends AbstractClaims implements DistributedParserInterface
22
{
23
    /** @var ClientInterface */
24
    private $client;
25
26
    /** @var RequestFactoryInterface */
27
    private $requestFactory;
28
29 4
    public function __construct(
30
        ?ClientInterface $client = null,
31
        ?RequestFactoryInterface $requestFactory = null,
32
        ?AlgorithmManager $algorithmManager = null,
33
        ?JWSVerifier $JWSVerifier = null,
34
        ?IssuerFactoryInterface $issuerFactory = null
35
    ) {
36 4
        parent::__construct($algorithmManager, $JWSVerifier, $issuerFactory);
37
38 4
        $this->client = $client ?: Psr18ClientDiscovery::find();
39 4
        $this->requestFactory = $requestFactory ?: Psr17FactoryDiscovery::findRequestFactory();
40 4
    }
41
42 4
    public function fetch(OpenIDClient $client, array $claims, array $accessTokens = []): array
43
    {
44 4
        $claimSources = $claims['_claim_sources'] ?? null;
45 4
        $claimNames = $claims['_claim_names'] ?? null;
46
47 4
        if (! is_array($claimSources)) {
48 1
            return $claims;
49
        }
50
51 3
        if (! is_array($claimNames)) {
52 1
            return $claims;
53
        }
54
55
        $distributedSources = array_filter($claimSources, static function ($value) {
56 2
            return null !== ($value['endpoint'] ?? null);
57 2
        });
58
59
        /** @var ResponseInterface[] $responses */
60 2
        $responses = [];
61 2
        foreach ($distributedSources as $sourceName => $source) {
62 2
            $request = $this->requestFactory->createRequest('GET', (string) $source['endpoint'])
63 2
                ->withHeader('accept', 'application/jwt');
64
65 2
            $accessToken = $source['access_token'] ?? ($accessTokens[$sourceName] ?? null);
66 2
            if ($accessToken) {
67 2
                $request = $request->withHeader('authorization', 'Bearer ' . $accessToken);
68
            }
69
70
            try {
71 2
                $responses[$sourceName] = $this->client->sendRequest($request);
72
            } catch (Throwable $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
73
            }
74
        }
75
76 2
        $claimPayloads = [];
77 2
        foreach ($responses as $sourceName => $response) {
78
            try {
79 2
                check_server_response($response);
80 1
                $claimPayloads[$sourceName] = $this->claimJWT($client, (string) $response->getBody());
81 1
                unset($claims['_claim_sources'][$sourceName]);
82 1
            } catch (Throwable $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
83
            }
84
        }
85
86 2
        return $this->cleanClaims($this->assignClaims($claims, $claimNames, $claimPayloads));
87
    }
88
}
89