Completed
Push — master ( d8c018...19ac78 )
by Florent
06:38
created

CheckerManagerFactory::getClaimClass()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 2
eloc 4
nc 2
nop 1
1
<?php
2
3
/*
4
 * The MIT License (MIT)
5
 *
6
 * Copyright (c) 2014-2016 Spomky-Labs
7
 *
8
 * This software may be modified and distributed under the terms
9
 * of the MIT license.  See the LICENSE file for details.
10
 */
11
12
namespace Jose\Factory;
13
14
use Jose\Checker\CheckerManager;
15
use Jose\Checker\CheckerManagerInterface;
16
use Jose\Checker\ClaimCheckerInterface;
17
use Jose\Checker\HeaderCheckerInterface;
18
19
final class CheckerManagerFactory
20
{
21
    /**
22
     * @param string[] $claims
23
     * @param string[] $headers
24
     *
25
     * @return \Jose\Checker\CheckerManagerInterface
26
     */
27
    public static function createClaimCheckerManager(array $claims = ['exp', 'iat', 'nbf'], array $headers = ['crit'])
28
    {
29
        $checker_manager = new CheckerManager();
30
31
        self::populateClaimCheckers($checker_manager, $claims);
32
        self::populateHeaderCheckers($checker_manager, $headers);
33
34
        return $checker_manager;
35
    }
36
37
    /**
38
     * @param \Jose\Checker\CheckerManagerInterface $checker_manager
39
     * @param array                                 $claims
40
     */
41
    private static function populateClaimCheckers(CheckerManagerInterface &$checker_manager, array $claims)
42
    {
43
        foreach ($claims as $key => $value) {
44
            if ($value instanceof ClaimCheckerInterface) {
45
                $checker_manager->addClaimChecker($value);
46
            } else {
47
                if (is_string($key)) {
48
                    $class = self::getClaimClass($key);
49
                } else {
50
                    $class = self::getClaimClass($value);
51
                }
52
                $checker_manager->addClaimChecker(new $class($value));
53
            }
54
        }
55
    }
56
57
    /**
58
     * @param \Jose\Checker\CheckerManagerInterface $checker_manager
59
     * @param array                                 $headers
60
     */
61
    private static function populateHeaderCheckers(CheckerManagerInterface &$checker_manager, array $headers)
62
    {
63
        foreach ($headers as $key => $value) {
64
            if ($value instanceof HeaderCheckerInterface) {
65
                $checker_manager->addHeaderChecker($value);
66
            } else {
67
                if (is_string($key)) {
68
                    $class = self::getHeaderClass($key);
69
                } else {
70
                    $class = self::getHeaderClass($value);
71
                }
72
                $checker_manager->addHeaderChecker(new $class($value));
73
            }
74
        }
75
    }
76
77
    /**
78
     * @param string $claim
79
     *
80
     * @return bool
81
     */
82
    private static function isClaimSupported($claim)
83
    {
84
        return array_key_exists($claim, self::getSupportedClaims());
85
    }
86
87
    /**
88
     * @param string $header
89
     *
90
     * @return bool
91
     */
92
    private static function isHeaderSupported($header)
93
    {
94
        return array_key_exists($header, self::getSupportedHeaders());
95
    }
96
97
    /**
98
     * @param string $claim
99
     *
100
     * @throws \InvalidArgumentException
101
     *
102
     * @return string
103
     */
104
    private static function getClaimClass($claim)
105
    {
106
        if (true === self::isClaimSupported($claim)) {
107
            return self::getSupportedClaims()[$claim];
108
        }
109
        throw new \InvalidArgumentException(sprintf('Claim "%s" is not supported. Please add an instance of ClaimCheckerInterface directly.', $claim));
110
    }
111
112
    /**
113
     * @param string $header
114
     *
115
     * @throws \InvalidArgumentException
116
     *
117
     * @return string
118
     */
119
    private static function getHeaderClass($header)
120
    {
121
        if (true === self::isHeaderSupported($header)) {
122
            return self::getSupportedHeaders()[$header];
123
        }
124
        throw new \InvalidArgumentException(sprintf('Header "%s" is not supported. Please add an instance of HeaderCheckerInterface directly.', $header));
125
    }
126
127
    /**
128
     * @return array
129
     */
130
    private static function getSupportedClaims()
131
    {
132
        return [
133
            'aud' => '\Jose\Checker\AudienceChecker',
134
            'exp' => '\Jose\Checker\ExpirationTimeChecker',
135
            'iat' => '\Jose\Checker\IssuedAtChecker',
136
            'nbf' => '\Jose\Checker\NotBeforeChecker',
137
        ];
138
    }
139
140
    /**
141
     * @return array
142
     */
143
    private static function getSupportedHeaders()
144
    {
145
        return [
146
            'crit' => '\Jose\Checker\CriticalHeaderChecker',
147
        ];
148
    }
149
}
150