Completed
Push — master ( bbbcd8...934958 )
by Florent
03:54
created

CheckerManagerFactory::populateClaimCheckers()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 16
rs 9.2
cc 4
eloc 10
nc 4
nop 2
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\CheckerManagerInterface;
15
use Jose\Checker\ClaimCheckerInterface;
16
use Jose\Checker\CheckerManager;
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
44
        foreach ($claims as $key=>$value) {
45
            if ($value instanceof ClaimCheckerInterface) {
46
                $checker_manager->addClaimChecker($value);
47
            } else {
48
                if (is_string($key)) {
49
                    $class = self::getClaimClass($key);
50
                } else {
51
                    $class = self::getClaimClass($value);
52
                }
53
                $checker_manager->addClaimChecker(new $class($value));
54
            }
55
        }
56
    }
57
58
    /**
59
     * @param \Jose\Checker\CheckerManagerInterface $checker_manager
60
     * @param array                                 $headers
61
     */
62
    private static function populateHeaderCheckers(CheckerManagerInterface &$checker_manager, array $headers)
63
    {
64
        foreach ($headers as $key=>$value) {
65
            if ($value instanceof HeaderCheckerInterface) {
66
                $checker_manager->addHeaderChecker($value);
67
            } else {
68
                if (is_string($key)) {
69
                    $class = self::getHeaderClass($key);
70
                } else {
71
                    $class = self::getHeaderClass($value);
72
                }
73
                $checker_manager->addHeaderChecker(new $class($value));
74
            }
75
        }
76
    }
77
78
    /**
79
     * @param string $claim
80
     *
81
     * @return bool
82
     */
83
    private static function isClaimSupported($claim)
84
    {
85
        return array_key_exists($claim, self::getSupportedClaims());
86
    }
87
88
    /**
89
     * @param string $header
90
     *
91
     * @return bool
92
     */
93
    private static function isHeaderSupported($header)
94
    {
95
        return array_key_exists($header, self::getSupportedHeaders());
96
    }
97
98
    /**
99
     * @param string $claim
100
     *
101
     * @throws \InvalidArgumentException
102
     *
103
     * @return string
104
     */
105
    private static function getClaimClass($claim)
106
    {
107
        if (true === self::isClaimSupported($claim)) {
108
            return self::getSupportedClaims()[$claim];
109
        }
110
        throw new \InvalidArgumentException(sprintf('Claim "%s" is not supported.', $claim));
111
    }
112
113
    /**
114
     * @param string $header
115
     *
116
     * @throws \InvalidArgumentException
117
     *
118
     * @return string
119
     */
120
    private static function getHeaderClass($header)
121
    {
122
        if (true === self::isHeaderSupported($header)) {
123
            return self::getSupportedHeaders()[$header];
124
        }
125
        throw new \InvalidArgumentException(sprintf('Header "%s" is not supported.', $header));
126
    }
127
128
    /**
129
     * @return array
130
     */
131
    private static function getSupportedClaims()
132
    {
133
        return [
134
            'aud' => '\Jose\Checker\AudienceChecker',
135
            'exp' => '\Jose\Checker\ExpirationTimeChecker',
136
            'iat' => '\Jose\Checker\IssuedAtChecker',
137
            'nbf' => '\Jose\Checker\NotBeforeChecker',
138
        ];
139
    }
140
141
    /**
142
     * @return array
143
     */
144
    private static function getSupportedHeaders()
145
    {
146
        return [
147
            'crit' => '\Jose\Checker\CriticalHeaderChecker',
148
        ];
149
    }
150
}
151