Completed
Push — master ( ce5be5...cd6056 )
by Florent
02:40
created

CheckerManagerFactory::createClaimCheckerManager()   C

Complexity

Conditions 7
Paths 16

Size

Total Lines 32
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 32
rs 6.7272
cc 7
eloc 21
nc 16
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\ClaimCheckerInterface;
15
use Jose\Checker\CheckerManager;
16
use Jose\Checker\HeaderCheckerInterface;
17
18
final class CheckerManagerFactory
19
{
20
    /**
21
     * @param string[] $claims
22
     * @param string[] $headers
23
     *
24
     * @return \Jose\Checker\CheckerManagerInterface
25
     */
26
    public static function createClaimCheckerManager(array $claims = ['exp', 'iat', 'nbf'], array $headers = ['crit'])
27
    {
28
        $claim_checker_manager = new CheckerManager();
29
30
        foreach ($claims as $key=>$value) {
31
            if ($value instanceof ClaimCheckerInterface) {
32
                $claim_checker_manager->addClaimChecker($value);
33
            } else {
34
                if (is_string($key)) {
35
                    $class = self::getClaimClass($key);
36
                } else {
37
                    $class = self::getClaimClass($value);
38
                }
39
                $claim_checker_manager->addClaimChecker(new $class($value));
40
            }
41
        }
42
43
        foreach ($headers as $key=>$value) {
44
            if ($value instanceof HeaderCheckerInterface) {
45
                $claim_checker_manager->addHeaderChecker($value);
46
            } else {
47
                if (is_string($key)) {
48
                    $class = self::getHeaderClass($key);
49
                } else {
50
                    $class = self::getHeaderClass($value);
51
                }
52
                $claim_checker_manager->addHeaderChecker(new $class($value));
53
            }
54
        }
55
56
        return $claim_checker_manager;
57
    }
58
59
    /**
60
     * @param string $claim
61
     *
62
     * @return bool
63
     */
64
    private static function isClaimSupported($claim)
65
    {
66
        return array_key_exists($claim, self::getSupportedClaims());
67
    }
68
69
    /**
70
     * @param string $header
71
     *
72
     * @return bool
73
     */
74
    private static function isHeaderSupported($header)
75
    {
76
        return array_key_exists($header, self::getSupportedHeaders());
77
    }
78
79
    /**
80
     * @param string $claim
81
     *
82
     * @throws \InvalidArgumentException
83
     *
84
     * @return string
85
     */
86
    private static function getClaimClass($claim)
87
    {
88
        if (true === self::isClaimSupported($claim)) {
89
            return self::getSupportedClaims()[$claim];
90
        }
91
        throw new \InvalidArgumentException(sprintf('Claim "%s" is not supported.', $claim));
92
    }
93
94
    /**
95
     * @param string $header
96
     *
97
     * @throws \InvalidArgumentException
98
     *
99
     * @return string
100
     */
101
    private static function getHeaderClass($header)
102
    {
103
        if (true === self::isHeaderSupported($header)) {
104
            return self::getSupportedHeaders()[$header];
105
        }
106
        throw new \InvalidArgumentException(sprintf('Header "%s" is not supported.', $header));
107
    }
108
109
    /**
110
     * @return array
111
     */
112
    private static function getSupportedClaims()
113
    {
114
        return [
115
            'aud' => '\Jose\Checker\AudienceChecker',
116
            'exp' => '\Jose\Checker\ExpirationTimeChecker',
117
            'iat' => '\Jose\Checker\IssuedAtChecker',
118
            'nbf' => '\Jose\Checker\NotBeforeChecker',
119
        ];
120
    }
121
122
    /**
123
     * @return array
124
     */
125
    private static function getSupportedHeaders()
126
    {
127
        return [
128
            'crit' => '\Jose\Checker\CriticalHeaderChecker',
129
        ];
130
    }
131
}
132