GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( 4d285c...edf968 )
by Damien
03:23
created

Response::create()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 44
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 21
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 2
eloc 20
nc 2
nop 5
dl 0
loc 44
ccs 21
cts 21
cp 1
crap 2
rs 9.6
c 2
b 0
f 0
1
<?php
2
3
namespace flipbox\saml\idp\services\messages;
4
5
use craft\base\Component;
6
use craft\elements\User;
7
use flipbox\saml\core\exceptions\AccessDenied;
8
use flipbox\saml\core\helpers\MessageHelper;
9
use flipbox\saml\core\records\AbstractProvider;
10
use flipbox\saml\core\services\bindings\Factory;
11
use flipbox\saml\idp\models\Settings;
12
use flipbox\saml\idp\records\ProviderRecord;
13
use flipbox\saml\idp\records\ProviderRecord as Provider;
14
use flipbox\saml\idp\Saml;
15
use SAML2\AuthnRequest as SamlAuthnRequest;
16
use SAML2\Constants;
17
use SAML2\Response as ResponseMessage;
18
use yii\base\Event;
19
20
class Response extends Component
21
{
22
23
    const CONSENT_IMPLICIT = Constants::CONSENT_IMPLICIT;
24
    const EVENT_AFTER_MESSAGE_CREATED = 'eventAfterMessageCreated';
25
26
    /**
27
     * @param User $user
28
     * @param SamlAuthnRequest $authnRequest
29
     * @param Provider $identityProvider
30
     * @param Provider $serviceProvider
31
     * @param Settings $settings
32
     * @return ResponseMessage
33
     * @throws \Exception
34
     */
35 2
    public function create(
36
        User $user,
37
        Provider $identityProvider,
38
        Provider $serviceProvider,
39
        Settings $settings,
40
        SamlAuthnRequest $authnRequest = null
41
    ) {
42
        // Check Conditional login on the user
43 2
        if (! $this->isAllowed($user, $serviceProvider)) {
44 2
            throw new AccessDenied(
45 2
                sprintf(
46 2
                    'Entity (%s) Access denied for user %s',
47 2
                    $serviceProvider->getEntityId(),
48 2
                    $user->username
49
                )
50
            );
51
        }
52
53
54 2
        $response = $this->createGeneral($identityProvider, $serviceProvider);
55
56 2
        Saml::getInstance()->getResponseAssertion()->create(
57 2
            $user,
58 1
            $response,
59 1
            $identityProvider,
60 1
            $serviceProvider,
61 1
            $settings,
62 1
            $authnRequest
63
        );
64
65
66 2
        $response->setSignatureKey(
67 2
            $identityProvider->keychainPrivateXmlSecurityKey()
68
        );
69
70
71
        /**
72
         * Kick off event here so people can manipulate this object if needed
73
         */
74 2
        $event = new Event();
75 2
        $event->data = $response;
76 2
        $this->trigger(static::EVENT_AFTER_MESSAGE_CREATED, $event);
77
78 2
        return $response;
79
    }
80
81
    /**
82
     * @param SamlAuthnRequest $authnRequest
83
     * @param Provider $identityProvider
84
     * @return ResponseMessage
85
     * @throws \Exception
86
     */
87 2
    protected function createGeneral(
88
        Provider $identityProvider,
89
        Provider $serviceProvider
90
    ) {
91
92 2
        $acsService = $serviceProvider->firstSpAcsService(
93 2
            Constants::BINDING_HTTP_POST
94 2
        ) ?? $serviceProvider->firstSpAcsService();
95 2
        $response = new ResponseMessage();
96 2
        $response->setIssuer(
97 2
            $identityProvider->getEntityId()
98
        );
99
100 2
        $response->setId($requestId = MessageHelper::generateId());
101 2
        $response->setDestination(
102 2
            $acsService->getLocation()
103
        );
104 2
        $response->setConsent(static::CONSENT_IMPLICIT);
105 2
        $response->setStatus(
106
            [
107 2
                'Code' => Constants::STATUS_SUCCESS,
108
            ]
109
        );
110 2
        $response->setIssueInstant(
111 2
            (new \DateTime())->getTimestamp()
112
        );
113
114 2
        return $response;
115
    }
116
117
118
    /**
119
     * @throws \flipbox\saml\core\exceptions\InvalidMetadata
120
     */
121 2
    public function createAndSendFromSession()
122
    {
123 2
        if (! $authnRequest = Saml::getInstance()->getSession()->getAuthnRequest()) {
124 2
            return;
125
        }
126
127
        // Clear the session
128
        Saml::getInstance()->getSession()->remove();
129
130
        if (! $user = \Craft::$app->getUser()->getIdentity()) {
131
            return;
132
        }
133
134
        // load our container
135
        Saml::getInstance()->loadSaml2Container();
136
137
        /** @var ProviderRecord $serviceProvider */
138
        $serviceProvider = Saml::getInstance()->getProvider()->findByEntityId(
139
            MessageHelper::getIssuer($authnRequest->getIssuer())
140
        )->one();
141
142
        $identityProvider = Saml::getInstance()->getProvider()->findOwn();
143
144
        $response = $this->create(
145
            $user,
146
            $identityProvider,
147
            $serviceProvider,
148
            Saml::getInstance()->getSettings(),
149
            $authnRequest
150
        );
151
152
        Saml::getInstance()->getResponse()->finalizeWithAuthnRequest($response, $authnRequest);
153
154
        Factory::send($response, $serviceProvider);
155
    }
156
157
    /**
158
     * Utils
159
     */
160
161
    /**
162
     * @param ResponseMessage $response
163
     * @param SamlAuthnRequest $authnRequest
164
     */
165 2
    public function finalizeWithAuthnRequest(ResponseMessage $response, SamlAuthnRequest $authnRequest)
166
    {
167 2
        $response->setInResponseTo(
168 2
            $authnRequest->getId()
169
        );
170 2
        $response->setRelayState(
171 2
            $authnRequest->getRelayState()
172
        );
173 2
    }
174
175
    /**
176
     * @param User $user
177
     * @param AbstractProvider $serviceProvider
178
     * @return bool
179
     */
180 2
    protected function isAllowed(User $user, AbstractProvider $serviceProvider): bool
181
    {
182 2
        $options = $serviceProvider->getGroupOptions();
183 2
        if ($options->shouldAllowAny()) {
184
            return true;
185
        }
186
187 2
        if ($options->shouldAllowNoGroupAssigned($user)) {
188
            return true;
189
        }
190
191 2
        foreach ($user->getGroups() as $group) {
192 2
            if ($options->shouldAllow($group->id)) {
193 2
                return true;
194
            }
195
        }
196 2
        return false;
197
    }
198
}
199