Passed
Push — master ( 7b370f...6c3070 )
by Thierry
03:36
created

PublicKeyGetter   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Test Coverage

Coverage 61.11%

Importance

Changes 0
Metric Value
dl 0
loc 65
ccs 11
cts 18
cp 0.6111
rs 10
c 0
b 0
f 0
wmc 11

3 Methods

Rating   Name   Duplication   Size   Complexity  
B getVerifyingKey() 0 13 5
B getSealingKey() 0 13 5
A __construct() 0 4 1
1
<?php
2
declare(strict_types=1);
3
4
namespace lepiaf\SapientBundle\Service;
5
6
use lepiaf\SapientBundle\Exception\{
7
    RequesterHeaderMissingException,
8
    NoKeyFoundForRequesterException,
9
    SignerHeaderMissingException
10
};
11
use Psr\Http\Message\RequestInterface;
12
use Psr\Http\Message\ResponseInterface;
13
14
class PublicKeyGetter
15
{
16
    public const HEADER_SIGNER = 'Sapient-Signer';
17
    private const HEADER_REQUESTER = 'Sapient-Requester';
18
19
    /**
20
     * @var array
21
     */
22
    private $sealingPublicKeys;
23
24
    /**
25
     * @var array
26
     */
27
    private $verifyingPublicKeys;
28
29 4
    public function __construct(array $sealingPublicKeys, array $verifyingPublicKeys)
30
    {
31 4
        $this->sealingPublicKeys = $sealingPublicKeys;
32 4
        $this->verifyingPublicKeys = $verifyingPublicKeys;
33 4
    }
34
35
    /**
36
     * @param RequestInterface $request
37
     *
38
     * @return string
39
     *
40
     * @throws RequesterHeaderMissingException
41
     * @throws NoKeyFoundForRequesterException
42
     */
43 4
    public function getSealingKey(RequestInterface $request): string
44
    {
45 4
        if (!$request->hasHeader(self::HEADER_REQUESTER) || 0 === \count($request->getHeader(self::HEADER_REQUESTER))) {
46 2
            throw new RequesterHeaderMissingException(sprintf('%s header is missing.', self::HEADER_REQUESTER));
47
        }
48
49 2
        foreach ($this->sealingPublicKeys as $sealingPublicKey) {
50 2
            if ($request->getHeader(self::HEADER_REQUESTER)[0] === $sealingPublicKey['name']) {
51 2
                return $sealingPublicKey['key'];
52
            }
53
        }
54
55 1
        throw new NoKeyFoundForRequesterException('Sealing key not found.');
56
    }
57
58
    /**
59
     * @param ResponseInterface $response
60
     *
61
     * @return string
62
     *
63
     * @throws SignerHeaderMissingException
64
     * @throws NoKeyFoundForRequesterException
65
     */
66
    public function getVerifyingKey(ResponseInterface $response): string
67
    {
68
        if (!$response->hasHeader(self::HEADER_SIGNER) || 0 === \count($response->getHeader(self::HEADER_SIGNER))) {
69
            throw new SignerHeaderMissingException(sprintf('%s header is missing.', self::HEADER_SIGNER));
70
        }
71
72
        foreach ($this->verifyingPublicKeys as $verifyingPublicKeys) {
73
            if ($response->getHeader(self::HEADER_SIGNER)[0] === $verifyingPublicKeys['name']) {
74
                return $verifyingPublicKeys['key'];
75
            }
76
        }
77
78
        throw new NoKeyFoundForRequesterException('Verifying key not found.');
79
    }
80
}
81