Authentication   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 7
Bugs 2 Features 0
Metric Value
wmc 10
c 7
b 2
f 0
lcom 1
cbo 5
dl 0
loc 118
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 10 1
B authenticate() 0 55 9
1
<?php
2
/**
3
 * For the full copyright and license information, please view the LICENSE
4
 * file that was distributed with this source code.
5
 *
6
 * @author Nikita Vershinin <[email protected]>
7
 * @license MIT
8
 */
9
namespace OpenStackStorage;
10
11
/**
12
 * Authentication instances are used to interact with the remote authentication
13
 * service, retrieving storage system routing information and session tokens.
14
 */
15
class Authentication
16
{
17
18
    /**
19
     * The information about the authentication URL.
20
     *
21
     * @var array
22
     */
23
    protected $urlInfo = array();
24
25
    /**
26
     * Request headers with username, API key and User-Agent.
27
     *
28
     * @var array
29
     */
30
    protected $headers = array();
31
32
    /**
33
     * User-Agent for request.
34
     *
35
     * @var string
36
     */
37
    protected $userAgent = null;
38
39
    /**
40
     * Request timeout.
41
     *
42
     * @var integer
43
     */
44
    protected $timeout = 5;
45
46
    /**
47
     * The class constructor.
48
     *
49
     * @param string  $username
50
     * @param string  $apiKey
51
     * @param string  $url
52
     * @param string  $userAgent
53
     * @param integer $timeout
54
     */
55
    public function __construct($username, $apiKey, $url, $userAgent, $timeout = 5)
56
    {
57
        $this->urlInfo   = Utils::parseUrl($url);
58
        $this->userAgent = $userAgent;
59
        $this->timeout   = intval($timeout);
60
        $this->headers   = array(
61
            'x-auth-user' => $username,
62
            'x-auth-key'  => $apiKey,
63
        );
64
    }
65
66
    /**
67
     * Initiates authentication with the remote service and returns a
68
     * array containing the storage system URL, CDN URL (can be empty)
69
     * and session token.
70
     *
71
     * @return array
72
     * @throws \Exception|\OpenStackStorage\Exceptions\ResponseError
73
     * @throws \OpenStackStorage\Exceptions\AuthenticationError
74
     * @throws \OpenStackStorage\Exceptions\AuthenticationFailed
75
     * @throws \Exception
76
     */
77
    public function authenticate()
78
    {
79
        $client = new Client(array('timeout' => $this->timeout));
80
        $client->setBaseURL(sprintf(
81
            '%s://%s:%d/',
82
            $this->urlInfo['scheme'],
83
            $this->urlInfo['host'],
84
            $this->urlInfo['port']
85
        ));
86
        $client->setUserAgent($this->userAgent);
87
88
        try {
89
            $response = $client->get($this->urlInfo['path'], null, $this->headers);
90
        } catch (Exceptions\ResponseError $e) {
91
            if (401 == $e->getCode()) {
92
                // A status code of 401 indicates that the supplied credentials
93
                // were not accepted by the authentication service.
94
                throw new Exceptions\AuthenticationFailed();
95
            }
96
97
            throw $e;
98
        }
99
100
        if (isset($response['headers']['x-auth-token'])) {
101
            $authToken = $response['headers']['x-auth-token'];
102
        } elseif (isset($response['headers']['x-storage-token'])) {
103
            $authToken = $response['headers']['x-storage-token'];
104
        } else {
105
            $authToken = null;
106
        }
107
108
        if (isset($response['headers']['x-storage-url'])) {
109
            $storageUrl = $response['headers']['x-storage-url'];
110
        } else {
111
            $storageUrl = null;
112
        }
113
114
        if (!($authToken && $storageUrl)) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $authToken of type string|null is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
Bug Best Practice introduced by
The expression $storageUrl of type string|null is loosely compared to false; this is ambiguous if the string can be empty. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
115
            throw new Exceptions\AuthenticationError(
116
                'Invalid response from the authentication service.'
117
            );
118
        }
119
120
        if (isset($response['headers']['x-cdn-management-url'])) {
121
            $cdnUrl = $response['headers']['x-cdn-management-url'];
122
        } else {
123
            $cdnUrl = null;
124
        }
125
126
        return array(
127
            $storageUrl,
128
            $cdnUrl,
129
            $authToken
130
        );
131
    }
132
}
133