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 ( ad0fa8...0fb162 )
by Damien
03:23
created

Response::isAllowed()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 5.2

Importance

Changes 0
Metric Value
cc 5
eloc 9
nc 5
nop 2
dl 0
loc 17
ccs 8
cts 10
cp 0.8
crap 5.2
rs 9.6111
c 0
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 2
        $response->setCertificates(
71
            [
72 2
                $identityProvider->keychain->getDecryptedCertificate(),
73
            ]
74
        );
75
76
77
        /**
78
         * Kick off event here so people can manipulate this object if needed
79
         */
80 2
        $event = new Event();
81 2
        $event->data = $response;
82 2
        $this->trigger(static::EVENT_AFTER_MESSAGE_CREATED, $event);
83
84 2
        return $response;
85
    }
86
87
    /**
88
     * @param SamlAuthnRequest $authnRequest
89
     * @param Provider $identityProvider
90
     * @return ResponseMessage
91
     * @throws \Exception
92
     */
93 2
    protected function createGeneral(
94
        Provider $identityProvider,
95
        Provider $serviceProvider
96
    ) {
97
98 2
        $acsService = $serviceProvider->firstSpAcsService(
99 2
            Constants::BINDING_HTTP_POST
100 2
        ) ?? $serviceProvider->firstSpAcsService();
101 2
        $response = new ResponseMessage();
102 2
        $response->setIssuer(
103 2
            $identityProvider->getEntityId()
104
        );
105
106 2
        $response->setId($requestId = MessageHelper::generateId());
107 2
        $response->setDestination(
108 2
            $acsService->getLocation()
109
        );
110 2
        $response->setConsent(static::CONSENT_IMPLICIT);
111 2
        $response->setStatus(
112
            [
113 2
                'Code' => Constants::STATUS_SUCCESS,
114 2
                'Message' => Constants::STATUS_SUCCESS,
115
            ]
116
        );
117 2
        $response->setIssueInstant(
118 2
            (new \DateTime())->getTimestamp()
119
        );
120
121 2
        return $response;
122
    }
123
124
125
    /**
126
     * @throws \flipbox\saml\core\exceptions\InvalidMetadata
127
     */
128 2
    public function createAndSendFromSession()
129
    {
130 2
        if (! $authnRequest = Saml::getInstance()->getSession()->getAuthnRequest()) {
131 2
            return;
132
        }
133
134
        // Clear the session
135
        Saml::getInstance()->getSession()->remove();
136
137
        if (! $user = \Craft::$app->getUser()->getIdentity()) {
138
            return;
139
        }
140
141
        // load our container
142
        Saml::getInstance()->loadSaml2Container();
143
144
        /** @var ProviderRecord $serviceProvider */
145
        $serviceProvider = Saml::getInstance()->getProvider()->findByEntityId(
146
            MessageHelper::getIssuer($authnRequest->getIssuer())
147
        )->one();
148
149
        $identityProvider = Saml::getInstance()->getProvider()->findOwn();
150
151
        $response = $this->create(
152
            $user,
153
            $identityProvider,
154
            $serviceProvider,
155
            Saml::getInstance()->getSettings(),
156
            $authnRequest
157
        );
158
159
        Saml::getInstance()->getResponse()->finalizeWithAuthnRequest($response, $authnRequest);
160
161
        Factory::send($response, $serviceProvider);
162
    }
163
164
    /**
165
     * Utils
166
     */
167
168
    /**
169
     * @param ResponseMessage $response
170
     * @param SamlAuthnRequest $authnRequest
171
     */
172 2
    public function finalizeWithAuthnRequest(ResponseMessage $response, SamlAuthnRequest $authnRequest)
173
    {
174 2
        $response->setInResponseTo(
175 2
            $authnRequest->getId()
176
        );
177 2
        $response->setRelayState(
178 2
            $authnRequest->getRelayState()
179
        );
180 2
    }
181
182
    /**
183
     * @param User $user
184
     * @param AbstractProvider $serviceProvider
185
     * @return bool
186
     */
187 2
    protected function isAllowed(User $user, AbstractProvider $serviceProvider): bool
188
    {
189 2
        $options = $serviceProvider->getGroupOptions();
190 2
        if ($options->shouldAllowAny()) {
191
            return true;
192
        }
193
194 2
        if ($options->shouldAllowNoGroupAssigned($user)) {
195
            return true;
196
        }
197
198 2
        foreach ($user->getGroups() as $group) {
199 2
            if ($options->shouldAllow($group->id)) {
200 2
                return true;
201
            }
202
        }
203 2
        return false;
204
    }
205
}
206