Completed
Push — master ( 6f82e1...da4611 )
by Andrii
14:52
created

UserRealIpMiddleware::prepare()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.7333
c 0
b 0
f 0
cc 4
nc 3
nop 1
1
<?php
2
3
namespace hiapi\Core\Http\Psr15\Middleware;
4
5
use hiapi\Core\Utils\CIDR;
6
use Psr\Http\Message\ResponseInterface;
7
use Psr\Http\Message\ServerRequestInterface;
8
use Psr\Http\Server\MiddlewareInterface;
9
use Psr\Http\Server\RequestHandlerInterface;
10
11
class UserRealIpMiddleware implements MiddlewareInterface
12
{
13
    public const ATTRIBUTE_NAME = 'user-real-ip';
14
    /**
15
     * @var array
16
     */
17
    private $nets;
18
19
    public $ipAttribute = self::ATTRIBUTE_NAME;
20
21
    public function __construct(array $nets)
22
    {
23
        $this->nets = $nets;
24
    }
25
26
    /**
27
     * @inheritDoc
28
     */
29
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
30
    {
31
        return $handler->handle($this->prepare($request));
32
    }
33
34
    private function prepare(ServerRequestInterface $request): ServerRequestInterface
35
    {
36
        $oldip = $this->getIp($request);
37
        $request = $request->withAttribute($this->ipAttribute, $oldip);
38
39
        if (!CIDR::matchBulk($oldip, $this->nets)) {
40
            return $request;
41
        }
42
43
        $newip = $this->getNewIp($request);
44
        if (empty($newip) || $newip == $oldip) {
45
            return $request;
46
        }
47
48
        return $this->setNewIp($request, $newip);
49
    }
50
51
    private function getIp(ServerRequestInterface $request): string
52
    {
53
        return $request->getServerParams()['REMOTE_ADDR'] ?? '';
54
    }
55
56
    private function getNewIp(ServerRequestInterface $request): string
57
    {
58
        $change = $request->getHeaderLine('X-User-Ip') ?: $this->getParam($request, 'auth_ip') ?? null;
59
60
        return filter_var($change, FILTER_VALIDATE_IP) ?: '';
61
    }
62
63
    private function setNewIp(ServerRequestInterface $request, string $ip)
64
    {
65
        /// legacy compatibility
66
        unset($_REQUEST['auth_ip']);
67
        $_SERVER['REMOTE_ADDR'] = $ip;
68
69
        # XXX TODO withServerParams NOT DEFINED !!!
70
        #$params = $request->getServerParams();
71
        #$params['REMOTE_ADDR'] = $ip;
72
        #return $request->withServerParams($params);
73
74
        return $request->withAttribute($this->ipAttribute, $ip);
75
    }
76
77
    public function getParam(ServerRequestInterface $request, string $name): ?string
78
    {
79
        return $request->getParsedBody()[$name] ?? $request->getQueryParams()[$name] ?? null;
80
    }
81
}
82