Skip to content

Commit

Permalink
NetworkResolver yiisoft#119
Browse files Browse the repository at this point in the history
  • Loading branch information
Somogyi Márton committed Oct 9, 2019
1 parent 3398f9b commit dc71c52
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 1 deletion.
22 changes: 21 additions & 1 deletion src/Middleware/IpFilter.php
@@ -1,21 +1,40 @@
<?php

namespace Yiisoft\Yii\Web\Middleware;

use Psr\Http\Message\ResponseFactoryInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Yiisoft\Yii\Web\NetworkResolver\BasicNetworkResolver;
use Yiisoft\Yii\Web\NetworkResolver\NetworkResolverInterface;

final class IpFilter implements MiddlewareInterface
{
private $allowedIp;
private $responseFactory;
/**
* If not configured, then BasicNetworkResolver is used.
* @var NetworkResolverInterface
*/
private $networkResolver;

public function __construct(string $allowedIp, ResponseFactoryInterface $responseFactory)
{
$this->allowedIp = $allowedIp;
$this->responseFactory = $responseFactory;
$this->networkResolver = new BasicNetworkResolver();
}

/**
* @return static
*/
public function withNetworkResolver(NetworkResolverInterface $networkResolver)
{
$new = clone $this;
$new->networkResolver = $networkResolver;
return $new;
}

/**
Expand All @@ -27,7 +46,8 @@ public function __construct(string $allowedIp, ResponseFactoryInterface $respons
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
if ($request->getServerParams()['REMOTE_ADDR'] !== $this->allowedIp) {
$networkResolver = $this->networkResolver->withServerRequest($request);
if ($networkResolver->getUserIp() !== $this->allowedIp) {
$response = $this->responseFactory->createResponse(403);
$response->getBody()->write('Access denied!');
return $response;
Expand Down
35 changes: 35 additions & 0 deletions src/NetworkResolver/BasicNetworkResolver.php
@@ -0,0 +1,35 @@
<?php
declare(strict_types=1);

namespace Yiisoft\Yii\Web\NetworkResolver;


use Psr\Http\Message\ServerRequestInterface;

class BasicNetworkResolver implements NetworkResolverInterface
{
/**
* @var ServerRequestInterface|null
*/
private $serverRequest;

public function getRemoteIp(): string
{
if($this->serverRequest === null) {
throw new \RuntimeException('ServerRequest doesn\'t set, see NetworkResolverInterface::withServerRequest()!');
}
return $this->serverRequest->getServerParams()['REMOTE_ADDR'];
}

public function getUserIp(): string
{
return $this->getRemoteIp();
}

public function withServerRequest(ServerRequestInterface $serverRequest)
{
$new = clone $this;
$new->serverRequest = $serverRequest;
return $new;
}
}
19 changes: 19 additions & 0 deletions src/NetworkResolver/NetworkResolverInterface.php
@@ -0,0 +1,19 @@
<?php


namespace Yiisoft\Yii\Web\NetworkResolver;


use Psr\Http\Message\ServerRequestInterface;

interface NetworkResolverInterface
{
public function getRemoteIp(): string;

public function getUserIp(): string;

/**
* @return static
*/
public function withServerRequest(ServerRequestInterface $serverRequest);
}

0 comments on commit dc71c52

Please sign in to comment.