AuthBasicMiddleware::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 5
ccs 0
cts 4
cp 0
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 2
crap 2
1
<?php
2
namespace Staticus\Auth;
3
4
use Staticus\Acl\Roles;
5
use Staticus\Config\ConfigInterface;
6
use Psr\Http\Message\ResponseInterface;
7
use Psr\Http\Message\ServerRequestInterface;
8
use Zend\Diactoros\Response\EmptyResponse;
9
use Zend\Stratigility\MiddlewareInterface;
10
11
/**
12
 * http-auth layer, look into auth.global.php
13
 */
14
class AuthBasicMiddleware implements MiddlewareInterface
15
{
16
    protected $config;
17
18
    /**
19
     * @var User|UserInterface
20
     */
21
    protected $user;
22
23
    public function __construct(ConfigInterface $config, UserInterface $user)
24
    {
25
        $this->config = $config->get('auth.basic');
26
        $this->user = $user;
27
    }
28
29
    /**
30
     * @param ServerRequestInterface $request
31
     * @param ResponseInterface $response
32
     * @param callable|null $next
33
     * @return EmptyResponse
34
     * @throws \Exception
35
     */
36
    public function __invoke(
37
        ServerRequestInterface $request,
38
        ResponseInterface $response,
39
        callable $next = null
40
    )
41
    {
42
        if ($this->isAdminAuthentication($request)) {
43
            $this->user->addRoles([Roles::ADMIN]);
44
        }
45
46
        return $next($request, $response);
47
    }
48
49
    /**
50
     * @param string $login
51
     * @param string $pass
52
     * @return bool
53
     */
54
    protected function checkCredentials($login, $pass)
55
    {
56
        foreach ($this->config['users'] as $user) {
57
            if (array_key_exists('name', $user) && array_key_exists('pass', $user)
58
                && $login === $user['name']
59
                && $pass === $user['pass']
60
            ) {
61
62
                return true;
63
            }
64
        }
65
66
        return false;
67
    }
68
69
    /**
70
     * @param string $authHeader
71
     * @return bool
72
     */
73
    protected function checkHeader($authHeader)
74
    {
75
        if ($authHeader) {
76
            $authToken = str_replace('Basic ', '', $authHeader);
77
            foreach ($this->config['users'] as $user) {
78
                if (isset($user['name']) && isset($user['pass'])
79
                    && $authToken === base64_encode($user['name'] . ':' . $user['pass'])
80
                ) {
81
82
                    return true;
83
                }
84
            }
85
        }
86
87
        return false;
88
    }
89
90
    /**
91
     * @param ServerRequestInterface $request
92
     * @return bool
93
     */
94
    protected function isAdminAuthentication(ServerRequestInterface $request)
95
    {
96
        $server = $request->getServerParams();
97
        return (
98
            (
99
                isset($server['PHP_AUTH_USER'])
100
                && isset($server['PHP_AUTH_PW'])
101
                && $this->checkCredentials($server['PHP_AUTH_USER'], $server['PHP_AUTH_PW'])
102
            )
103
            || $this->checkHeader($request->getHeaderLine('authorization'))
104
        );
105
    }
106
}
107