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.
Completed
Push — master ( 1139e4...5d5bcc )
by Damien
03:04
created

Response::create()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 51
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 24
CRAP Score 2

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 2
eloc 23
c 3
b 0
f 0
nc 2
nop 5
dl 0
loc 51
ccs 24
cts 24
cp 1
crap 2
rs 9.552

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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