Completed
Push — master ( 4e360d...80bc96 )
by Daan van
07:27
created

createSubjectConfirmationValidator()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 29
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 29
rs 8.8571
cc 1
eloc 19
nc 1
nop 4
1
<?php
2
3
namespace SAML2\Assertion;
4
5
use Psr\Log\LoggerInterface;
6
use SAML2\Assertion\Transformer\DecodeBase64Transformer;
7
use SAML2\Assertion\Transformer\NameIdDecryptionTransformer;
8
use SAML2\Assertion\Transformer\TransformerChain;
9
use SAML2\Assertion\Validation\AssertionValidator;
10
use SAML2\Assertion\Validation\ConstraintValidator\NotBefore;
11
use SAML2\Assertion\Validation\ConstraintValidator\NotOnOrAfter;
12
use SAML2\Assertion\Validation\ConstraintValidator\SessionNotOnOrAfter;
13
use SAML2\Assertion\Validation\ConstraintValidator\SpIsValidAudience;
14
use SAML2\Assertion\Validation\ConstraintValidator\SubjectConfirmationMethod;
15
use SAML2\Assertion\Validation\ConstraintValidator\SubjectConfirmationNotBefore;
16
use SAML2\Assertion\Validation\ConstraintValidator\SubjectConfirmationNotOnOrAfter;
17
use SAML2\Assertion\Validation\ConstraintValidator\SubjectConfirmationRecipientMatches;
18
use SAML2\Assertion\Validation\ConstraintValidator\SubjectConfirmationResponseToMatches;
19
use SAML2\Assertion\Validation\SubjectConfirmationValidator;
20
use SAML2\Certificate\PrivateKeyLoader;
21
use SAML2\Configuration\Destination;
22
use SAML2\Configuration\IdentityProvider;
23
use SAML2\Configuration\ServiceProvider;
24
use SAML2\Response;
25
use SAML2\Signature\Validator;
26
27
/**
28
 * Simple Builder that allows to build a new Assertion Processor.
29
 *
30
 * This is an excellent candidate for refactoring towards dependency injection
31
 *
32
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
33
 */
34
class ProcessorBuilder
35
{
36
    public static function build(
37
        LoggerInterface $logger,
38
        Validator $signatureValidator,
39
        Destination $currentDestination,
40
        IdentityProvider $identityProvider,
41
        ServiceProvider $serviceProvider,
42
        Response $response
43
    ) {
44
        $keyloader = new PrivateKeyLoader();
45
        $decrypter = new Decrypter($logger, $identityProvider, $serviceProvider, $keyloader);
46
        $assertionValidator = self::createAssertionValidator($identityProvider, $serviceProvider);
47
        $subjectConfirmationValidator = self::createSubjectConfirmationValidator(
48
            $identityProvider,
49
            $serviceProvider,
50
            $currentDestination,
51
            $response
52
        );
53
54
        $transformerChain = self::createAssertionTransformerChain(
55
            $logger,
56
            $keyloader,
57
            $identityProvider,
58
            $serviceProvider
59
        );
60
61
        return new Processor(
62
            $decrypter,
63
            $signatureValidator,
64
            $assertionValidator,
65
            $subjectConfirmationValidator,
66
            $transformerChain,
67
            $identityProvider,
68
            $logger
69
        );
70
    }
71
72
    private static function createAssertionValidator(
73
        IdentityProvider $identityProvider,
74
        ServiceProvider $serviceProvider
75
    ) {
76
        $validator = new AssertionValidator($identityProvider, $serviceProvider);
77
        $validator->addConstraintValidator(new NotBefore());
78
        $validator->addConstraintValidator(new NotOnOrAfter());
79
        $validator->addConstraintValidator(new SessionNotOnOrAfter());
80
        $validator->addConstraintValidator(new SpIsValidAudience());
81
82
        return $validator;
83
    }
84
85
    private static function createSubjectConfirmationValidator(
86
        IdentityProvider $identityProvider,
87
        ServiceProvider $serviceProvider,
88
        Destination $currentDestination,
89
        Response $response
90
    ) {
91
        $validator = new SubjectConfirmationValidator($identityProvider, $serviceProvider);
92
        $validator->addConstraintValidator(
93
            new SubjectConfirmationMethod()
94
        );
95
        $validator->addConstraintValidator(
96
            new SubjectConfirmationNotBefore()
97
        );
98
        $validator->addConstraintValidator(
99
            new SubjectConfirmationNotOnOrAfter()
100
        );
101
        $validator->addConstraintValidator(
102
            new SubjectConfirmationRecipientMatches(
103
                $currentDestination
104
            )
105
        );
106
        $validator->addConstraintValidator(
107
            new SubjectConfirmationResponseToMatches(
108
                $response
109
            )
110
        );
111
112
        return $validator;
113
    }
114
115
    private static function createAssertionTransformerChain(
116
        LoggerInterface $logger,
117
        PrivateKeyLoader $keyloader,
118
        IdentityProvider $identityProvider,
119
        ServiceProvider $serviceProvider
120
    ) {
121
        $chain = new TransformerChain($identityProvider, $serviceProvider);
122
        $chain->addTransformerStep(new DecodeBase64Transformer());
123
        $chain->addTransformerStep(
124
            new NameIdDecryptionTransformer($logger, $keyloader)
125
        );
126
127
        return $chain;
128
    }
129
}
130