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 ( f3cbc4...468738 )
by Damien
04:14
created

Response::isAllowed()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 13
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 4.0312

Importance

Changes 0
Metric Value
cc 4
eloc 7
nc 4
nop 2
dl 0
loc 13
ccs 7
cts 8
cp 0.875
crap 4.0312
rs 10
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
        SamlAuthnRequest $authnRequest,
38
        Provider $identityProvider,
39
        Provider $serviceProvider,
40
        Settings $settings
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($authnRequest, $identityProvider, $serviceProvider);
55
56 2
        Saml::getInstance()->getResponseAssertion()->create(
57 2
            $user,
58 2
            $authnRequest,
59 2
            $response,
60 2
            $identityProvider,
61 2
            $serviceProvider,
62 2
            $settings
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
        SamlAuthnRequest $authnRequest,
89
        Provider $identityProvider,
90
        Provider $serviceProvider
91
    ) {
92
93 2
        $acsService = $serviceProvider->firstSpAcsService(
94 2
            Constants::BINDING_HTTP_POST
95 2
        ) ?? $serviceProvider->firstSpAcsService();
96 2
        $response = new ResponseMessage();
97 2
        $response->setIssuer(
98 2
            $identityProvider->getEntityId()
99
        );
100
101 2
        $response->setId($requestId = MessageHelper::generateId());
102 2
        $response->setDestination(
103 2
            $authnRequest->getAssertionConsumerServiceURL() ?? $acsService->getLocation()
104
        );
105 2
        $response->setConsent(static::CONSENT_IMPLICIT);
106 2
        $response->setInResponseTo(
107 2
            $authnRequest->getId()
108
        );
109 2
        $response->setStatus(
110
            [
111 2
                'Code' => Constants::STATUS_SUCCESS,
112
            ]
113
        );
114 2
        $response->setIssueInstant(
115 2
            (new \DateTime())->getTimestamp()
116
        );
117 2
        $response->setRelayState(
118 2
            $authnRequest->getRelayState()
119
        );
120
121 2
        return $response;
122
    }
123
124
125
    /**
126
     * @throws \flipbox\saml\core\exceptions\InvalidMetadata
127
     */
128
    public function createAndSendFromSession()
129
    {
130
        if (! $authnRequest = Saml::getInstance()->getSession()->getAuthnRequest()) {
131
            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
            $authnRequest,
154
            $identityProvider,
155
            $serviceProvider,
156
            Saml::getInstance()->getSettings()
157
        );
158
159
        Factory::send($response, $serviceProvider);
160
    }
161
162
    /**
163
     * Utils
164
     */
165
166
    /**
167
     * @param User $user
168
     * @param AbstractProvider $serviceProvider
169
     * @return bool
170
     */
171 2
    protected function isAllowed(User $user, AbstractProvider $serviceProvider): bool
172
    {
173 2
        $options = $serviceProvider->getGroupOptions();
174 2
        if ($options->shouldDenyNoGroupAssigned($user)) {
175
            return false;
176
        }
177
178 2
        foreach ($user->getGroups() as $group) {
179 2
            if (! $options->shouldAllow($group->id)) {
180 2
                return false;
181
            }
182
        }
183 2
        return true;
184
    }
185
}
186