Failed Conditions
Push — master ( 201942...116909 )
by Guilherme
05:41
created

ClientCredentials::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * This file is part of the login-cidadao project or it's bundles.
4
 *
5
 * (c) Guilherme Donato <guilhermednt on github>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace LoginCidadao\OpenIDBundle\Storage;
12
13
use Doctrine\ORM\EntityManagerInterface;
14
use LoginCidadao\OAuthBundle\Model\ClientInterface;
15
use OAuth2\ServerBundle\Storage\ClientCredentials as BaseClass;
16
17
class ClientCredentials extends BaseClass
18
{
19
    private $em;
20
21 9
    public function __construct(EntityManagerInterface $EntityManager)
0 ignored issues
show
Coding Style introduced by
$EntityManager does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
Coding Style Naming introduced by
The parameter $EntityManager is not named in camelCase.

This check marks parameter names that have not been written in camelCase.

In camelCase names are written without any punctuation, the start of each new word being marked by a capital letter. Thus the name database connection string becomes databaseConnectionString.

Loading history...
22
    {
23 9
        $this->em = $EntityManager;
0 ignored issues
show
Coding Style introduced by
$EntityManager does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
24 9
    }
25
26
    /**
27
     * Make sure that the client credentials is valid.
28
     *
29
     * @param $client_id
30
     * Client identifier to be check with.
31
     * @param $client_secret
32
     * (optional) If a secret is required, check that they've given the right one.
33
     *
34
     * @return TRUE if the client credentials are valid, and MUST return FALSE if it isn't.
0 ignored issues
show
Documentation introduced by
Should the return type not be boolean?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
35
     * @endcode
36
     *
37
     * @see http://tools.ietf.org/html/rfc6749#section-3.1
38
     *
39
     * @ingroup oauth2_section_3
40
     */
41 3
    public function checkClientCredentials($client_id, $client_secret = null)
0 ignored issues
show
Coding Style Naming introduced by
The parameter $client_id is not named in camelCase.

This check marks parameter names that have not been written in camelCase.

In camelCase names are written without any punctuation, the start of each new word being marked by a capital letter. Thus the name database connection string becomes databaseConnectionString.

Loading history...
Coding Style Naming introduced by
The parameter $client_secret is not named in camelCase.

This check marks parameter names that have not been written in camelCase.

In camelCase names are written without any punctuation, the start of each new word being marked by a capital letter. Thus the name database connection string becomes databaseConnectionString.

Loading history...
42
    {
43 3
        $client = $this->getClient($client_id);
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
44
45
        // If client exists check secret
46 3
        if ($client) {
47 2
            return $client->getClientSecret() === $client_secret;
0 ignored issues
show
Coding Style introduced by
$client_secret does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
48
        }
49
50 1
        return false;
51
    }
52
53
    /**
54
     * Get client details corresponding client_id.
55
     *
56
     * OAuth says we should store request URIs for each registered client.
57
     * Implement this function to grab the stored URI for a given client id.
58
     *
59
     * @param $client_id
60
     * Client identifier to be check with.
61
     *
62
     * @return array
0 ignored issues
show
Documentation introduced by
Should the return type not be false|array?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
63
     *               Client details. The only mandatory key in the array is "redirect_uri".
64
     *               This function MUST return FALSE if the given client does not exist or is
65
     *               invalid. "redirect_uri" can be space-delimited to allow for multiple valid uris.
66
     * @code
67
     *               return array(
68
     *               "redirect_uri" => REDIRECT_URI,      // REQUIRED redirect_uri registered for the client
69
     *               "client_id"    => CLIENT_ID,         // OPTIONAL the client id
70
     *               "grant_types"  => GRANT_TYPES,       // OPTIONAL an array of restricted grant types
71
     *               );
72
     * @endcode
73
     *
74
     * @ingroup oauth2_section_4
75
     */
76 2
    public function getClientDetails($client_id)
0 ignored issues
show
Coding Style Naming introduced by
The parameter $client_id is not named in camelCase.

This check marks parameter names that have not been written in camelCase.

In camelCase names are written without any punctuation, the start of each new word being marked by a capital letter. Thus the name database connection string becomes databaseConnectionString.

Loading history...
77
    {
78 2
        $client = $this->getClient($client_id);
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
79
80 2
        if (!$client) {
81 1
            return false;
0 ignored issues
show
Bug Best Practice introduced by
The return type of return false; (false) is incompatible with the return type declared by the interface OAuth2\Storage\ClientInterface::getClientDetails of type array.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
82
        }
83
84
        return [
85 1
            'redirect_uri' => implode(' ', $client->getRedirectUris()),
86 1
            'client_id' => $client->getPublicId(),
87 1
            'grant_types' => $client->getAllowedGrantTypes(),
88
        ];
89
    }
90
91
    /**
92
     * Determine if the client is a "public" client, and therefore
93
     * does not require passing credentials for certain grant types
94
     *
95
     * @param $client_id
96
     * Client identifier to be check with.
97
     *
98
     * @return TRUE if the client is public, and FALSE if it isn't.
0 ignored issues
show
Documentation introduced by
Should the return type not be boolean?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
99
     * @endcode
100
     *
101
     * @see http://tools.ietf.org/html/rfc6749#section-2.3
102
     * @see https://github.com/bshaffer/oauth2-server-php/issues/257
103
     *
104
     * @ingroup oauth2_section_2
105
     */
106 2
    public function isPublicClient($client_id)
0 ignored issues
show
Coding Style Naming introduced by
The parameter $client_id is not named in camelCase.

This check marks parameter names that have not been written in camelCase.

In camelCase names are written without any punctuation, the start of each new word being marked by a capital letter. Thus the name database connection string becomes databaseConnectionString.

Loading history...
107
    {
108 2
        $client = $this->getClient($client_id);
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
109
110 2
        if (!$client) {
111 1
            return false;
112
        }
113
114 1
        $secret = $client->getClientSecret();
115
116 1
        return empty($secret);
117
    }
118
119
    /**
120
     * Get the scope associated with this client
121
     *
122
     * @return STRING the space-delineated scope list for the specified client_id
0 ignored issues
show
Documentation introduced by
Should the return type not be false|string?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
123
     */
124 2
    public function getClientScope($client_id)
0 ignored issues
show
Coding Style Naming introduced by
The parameter $client_id is not named in camelCase.

This check marks parameter names that have not been written in camelCase.

In camelCase names are written without any punctuation, the start of each new word being marked by a capital letter. Thus the name database connection string becomes databaseConnectionString.

Loading history...
125
    {
126 2
        $client = $this->getClient($client_id);
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
127
128 2
        if (!$client) {
129 1
            return false;
130
        }
131
132 1
        return implode(' ', $client->getAllowedScopes());
133
    }
134
135
    /**
136
     * @param $client_id mixed
137
     * @return null|ClientInterface
0 ignored issues
show
Documentation introduced by
Should the return type not be object?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
138
     */
139 9
    private function getClient($client_id)
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
Coding Style Naming introduced by
The parameter $client_id is not named in camelCase.

This check marks parameter names that have not been written in camelCase.

In camelCase names are written without any punctuation, the start of each new word being marked by a capital letter. Thus the name database connection string becomes databaseConnectionString.

Loading history...
140
    {
141 9
        $randomId = null;
142 9
        if (strstr($client_id, '_') !== false) {
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
143 7
            $parts = explode('_', $client_id);
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
144 7
            $client_id = $parts[0];
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
145 7
            $randomId = $parts[1];
146
        }
147
148 9
        $repo = $this->em->getRepository('LoginCidadaoOAuthBundle:Client');
149
150 9
        if ($randomId) {
151 7
            $client = $repo->findOneBy([
152 7
                'id' => $client_id,
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
153 7
                'randomId' => $randomId,
154
            ]);
155
        } else {
156 2
            $client = $repo->find($client_id);
0 ignored issues
show
Coding Style introduced by
$client_id does not seem to conform to the naming convention (^[a-z][a-zA-Z0-9]*$).

This check examines a number of code elements and verifies that they conform to the given naming conventions.

You can set conventions for local variables, abstract classes, utility classes, constant, properties, methods, parameters, interfaces, classes, exceptions and special methods.

Loading history...
157
        }
158
159 9
        return $client;
160
    }
161
}
162