Firewall   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 4

Importance

Changes 0
Metric Value
wmc 11
lcom 2
cbo 4
dl 0
loc 87
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 2
A trusted() 0 6 1
A untrusted() 0 6 1
C __invoke() 0 27 7
1
<?php
2
3
namespace Psr7Middlewares\Middleware;
4
5
use RuntimeException;
6
use Psr7Middlewares\Utils;
7
use M6Web\Component\Firewall\Firewall as IpFirewall;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Psr\Http\Message\ResponseInterface;
10
11
/**
12
 * Middleware to filter request by ip.
13
 */
14
class Firewall
15
{
16
    use Utils\AttributeTrait;
17
18
    /**
19
     * @var array|null Trusted ips
20
     */
21
    private $trusted;
22
23
    /**
24
     * @var array|null Untrusted ips
25
     */
26
    private $untrusted;
27
28
    /**
29
     * Constructor. Set the trusted ips.
30
     *
31
     * @param array|null $trusted
32
     */
33
    public function __construct(array $trusted = null)
34
    {
35
        if ($trusted !== null) {
36
            $this->trusted($trusted);
37
        }
38
    }
39
40
    /**
41
     * Set trusted ips.
42
     *
43
     * @return self
44
     */
45
    public function trusted(array $trusted)
46
    {
47
        $this->trusted = $trusted;
48
49
        return $this;
50
    }
51
52
    /**
53
     * Set untrusted ips.
54
     *
55
     * @return self
56
     */
57
    public function untrusted(array $untrusted)
58
    {
59
        $this->untrusted = $untrusted;
60
61
        return $this;
62
    }
63
64
    /**
65
     * Execute the middleware.
66
     *
67
     * @param ServerRequestInterface $request
68
     * @param ResponseInterface      $response
69
     * @param callable               $next
70
     *
71
     * @return ResponseInterface
72
     */
73
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
74
    {
75
        if (!self::hasAttribute($request, ClientIp::KEY)) {
76
            throw new RuntimeException('Firewall middleware needs ClientIp executed before');
77
        }
78
79
        $ips = ClientIp::getIps($request) ?: [];
80
        $firewall = new IpFirewall();
81
82
        if (!empty($this->trusted)) {
83
            $firewall->addList($this->trusted, 'trusted', true);
84
        }
85
86
        if (!empty($this->untrusted)) {
87
            $firewall->addList($this->untrusted, 'untrusted', false);
88
        }
89
90
        foreach ($ips as $ip) {
91
            $ok = $firewall->setIpAddress($ip)->handle();
92
93
            if (!$ok) {
94
                return $response->withStatus(403);
95
            }
96
        }
97
98
        return $next($request, $response);
99
    }
100
}
101