Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
Provider
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 6
182
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
12
 setHttpClient
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 createResourceOwner
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getResourceOwnerData
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
20
 getOptionsFromJsonFile
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
6
 getBasicOptionsFromJsonFile
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace BO\Slim\Middleware\OAuth\Keycloak;
4
5use Stevenmaguire\OAuth2\Client\Provider\Keycloak;
6use BO\Zmsclient\PSR7\Client;
7use League\OAuth2\Client\Token\AccessToken;
8use BO\Zmsentities\Useraccount;
9
10/**
11 * @SuppressWarnings(PHPMD)
12 */
13
14class Provider extends Keycloak
15{
16    const PROVIDERNAME = 'keycloak';
17
18    protected $oauthService;
19
20    /**
21     * Sets the config options for keycloak access from json file.
22     *
23     * @param array $options An array of options to set on this provider.
24     *     Options include `clientId`, `clientSecret`, `redirectUri`, `authServerurl` and `realm`.
25     *     Individual providers may introduce more options, as needed.
26     * @return void
27     */
28    public function __construct($client = null, ?\BO\Zmsclient\OAuthService $oauthService = null)
29    {
30        $this->oauthService = $oauthService ?: new \BO\Zmsclient\OAuthService(\App::$http, \App::CONFIG_SECURE_TOKEN);
31        $client = ((null === $client)) ? new Client() : $client;
32        $options = $this->getOptionsFromJsonFile();
33        return parent::__construct($options, ['httpClient' => $client]);
34    }
35
36    /**
37     * Sets the HTTP client instance.
38     *
39     * @param \BO\Zmsclient\Psr7\Client $client
40     * @return self
41     */
42    #[\Override]
43    public function setHttpClient($client)
44    {
45        $this->httpClient = $client;
46        return $this;
47    }
48
49    /**
50     * Generate a user object from a successful user details request.
51     *
52     * @param array $response
53     * @param AccessToken $token
54     * @return ResourceOwner
55     */
56    #[\Override]
57    protected function createResourceOwner(array $response, AccessToken $token): ResourceOwner
58    {
59        return new ResourceOwner($response);
60    }
61
62    /**
63     * Requests and returns the resource owner data of given access token.
64     *
65     * @param  AccessToken $token
66     * @return array
67     */
68    public function getResourceOwnerData(AccessToken $token): Useraccount
69    {
70        $resourceOwner = $this->getResourceOwner($token);
71        $config = $this->oauthService->readConfig();
72        $ownerData['username'] = $resourceOwner->getName() . '@' . static::PROVIDERNAME;
73        if (1 == $config->getPreference('oidc', 'onlyVerifiedMail')) {
74            $email = $resourceOwner->getEmail();
75            if ($email && $resourceOwner->toArray()['email_verified'] ?? false) {
76                $ownerData['email'] = $email;
77            }
78        } else {
79            $ownerData['email'] = $resourceOwner->getEmail();
80        }
81        return new Useraccount($ownerData);
82    }
83
84    private function getOptionsFromJsonFile(): array
85    {
86        $config_data = file_get_contents(\App::APP_PATH . '/' . static::PROVIDERNAME . '.json');
87        if (gettype($config_data) === 'string') {
88            $config_data = json_decode($config_data, true);
89        }
90        $realmData = $this->getBasicOptionsFromJsonFile();
91        $realmData['clientSecret'] = $config_data['credentials']['secret'];
92        $realmData['authServerUrl'] = $config_data['auth-server-url'];
93        $realmData['verify'] = $config_data['ssl-verify'] ?? true;
94        return $realmData;
95    }
96
97    public function getBasicOptionsFromJsonFile(): array
98    {
99        $config_data = file_get_contents(\App::APP_PATH . '/' . static::PROVIDERNAME . '.json');
100        if (gettype($config_data) === 'string') {
101            $config_data = json_decode($config_data, true);
102        }
103        $realmData['realm'] = $config_data['realm'];
104        $realmData['clientId'] = $config_data['clientId'];
105        $realmData['clientName'] = $config_data['clientName'];
106        $realmData['redirectUri'] = $config_data['auth-redirect-url'];
107        $realmData['logoutUri'] = $config_data['logout-redirect-url'];
108        $realmData['version'] = $config_data['version'];
109        $realmData['accessRole'] = $config_data['access-role'];
110        return $realmData;
111    }
112}