Skip to content

Commit

Permalink
feat: first time load blocks when not loaded (#232)
Browse files Browse the repository at this point in the history
  • Loading branch information
asbiin authored Jan 15, 2022
1 parent 0b4dc24 commit e63ba67
Show file tree
Hide file tree
Showing 11 changed files with 127 additions and 81 deletions.
8 changes: 0 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,6 @@ Another option is to extend the `App\Http\Middleware\TrustProxies` class to `Mon
...
```

3. Load list of Cloudflare IP blocks

Run the `cloudflare:reload` artisan command to load the Cloudflare IP blocks:

```sh
php artisan cloudflare:reload
```


# How it works

Expand Down
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"phpstan/phpstan-strict-rules": "^1.0",
"phpunit/phpunit": "^8.0 || ^9.0",
"thecodingmachine/phpstan-safe-rule": "^1.0",
"vimeo/psalm": "^3.9 || ^4.0"
"vimeo/psalm": "^4.0"
},
"autoload": {
"psr-4": {
Expand All @@ -52,7 +52,7 @@
}
},
"suggest": {
"guzzlehttp/guzzle": "Required to get cloudflares ip addresses (^6.5.5|^7.0.1)."
"guzzlehttp/guzzle": "Required to get cloudflares ip addresses (^6.5.5|^7.0)."
},
"config": {
"sort-packages": true,
Expand Down
6 changes: 1 addition & 5 deletions src/CloudflareProxies.php
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,11 @@ protected function retrieve($name): array
try {
$url = Str::of($this->config->get('laravelcloudflare.url'))->finish('/').$name;

$response = $this->http->get($url);
$response = $this->http->get($url)->throw();
} catch (\Exception $e) {
throw new UnexpectedValueException('Failed to load trust proxies from Cloudflare server.', 1, $e);
}

if ($response->status() != 200) {
throw new UnexpectedValueException('Failed to load trust proxies from Cloudflare server.');
}

return array_filter(explode("\n", $response->body()));
}
}
9 changes: 6 additions & 3 deletions src/Commands/Reload.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
namespace Monicahq\Cloudflare\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;
use Illuminate\Contracts\Cache\Factory;
use Illuminate\Contracts\Config\Repository;
use Monicahq\Cloudflare\CloudflareProxies;

class Reload extends Command
Expand All @@ -25,14 +26,16 @@ class Reload extends Command
/**
* Execute the console command.
*
* @param Factory $cache
* @param Repository $config
* @return void
*/
public function handle()
public function handle(Factory $cache, Repository $config)
{
/** @var CloudflareProxies */
$loader = $this->laravel->make(CloudflareProxies::class);

Cache::forever($this->laravel->make('config')->get('laravelcloudflare.cache'), $loader->load());
$cache->store()->forever($config->get('laravelcloudflare.cache'), $loader->load());

$this->info('Cloudflare\'s IP blocks have been reloaded.');
}
Expand Down
9 changes: 6 additions & 3 deletions src/Commands/View.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
namespace Monicahq\Cloudflare\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;
use Illuminate\Contracts\Cache\Factory;
use Illuminate\Contracts\Config\Repository;

class View extends Command
{
Expand All @@ -24,11 +25,13 @@ class View extends Command
/**
* Execute the console command.
*
* @param Factory $cache
* @param Repository $config
* @return void
*/
public function handle()
public function handle(Factory $cache, Repository $config)
{
$proxies = Cache::get($this->laravel->make('config')->get('laravelcloudflare.cache'), []);
$proxies = $cache->store()->get($config->get('laravelcloudflare.cache'), []);

$rows = array_map(function ($value): array {
return [
Expand Down
12 changes: 9 additions & 3 deletions src/Http/Middleware/TrustProxies.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use Monicahq\Cloudflare\CloudflareProxies;

class TrustProxies extends Middleware
{
Expand All @@ -16,10 +17,15 @@ class TrustProxies extends Middleware
*/
protected function setTrustedProxyIpAddresses(Request $request)
{
$proxies = Cache::get(Config::get('laravelcloudflare.cache'), []);
$cachedProxies = Cache::get(Config::get('laravelcloudflare.cache'), function () {
/** @var CloudflareProxies $cloudflareProxies */
$cloudflareProxies = app(CloudflareProxies::class);

if (is_array($proxies) && count($proxies) > 0) {
$this->proxies = array_merge((array) $this->proxies, $proxies);
return $cloudflareProxies->load();
});

if (is_array($cachedProxies) && count($cachedProxies) > 0) {
$this->proxies = array_merge((array) $this->proxies, $cachedProxies);
}

parent::setTrustedProxyIpAddresses($request);
Expand Down
6 changes: 0 additions & 6 deletions tests/FeatureTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@

namespace Monicahq\Cloudflare\Tests;

use Illuminate\Http\Request;
use Monicahq\Cloudflare\TrustedProxyServiceProvider;
use Orchestra\Testbench\TestCase;

class FeatureTestCase extends TestCase
{
protected function getEnvironmentSetUp($app)
{
$app['config']->set('trustedproxy.headers', Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO);
}

protected function getPackageProviders($app)
{
return [
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,30 @@
<?php

namespace Monicahq\Cloudflare\Tests\Unit;
namespace Monicahq\Cloudflare\Tests\Unit\Commands;

use Illuminate\Http\Client\Factory as HttpClient;
use Illuminate\Support\Facades\Http;
use Mockery\MockInterface;
use Monicahq\Cloudflare\CloudflareProxies;
use Monicahq\Cloudflare\Tests\FeatureTestCase;

class ReloadCommandTest extends FeatureTestCase
class ReloadTest extends FeatureTestCase
{
/** @test */
public function it_loads_proxies()
{
$this->mock(CloudflareProxies::class, function (MockInterface $mock) {
$mock->shouldReceive('load')
->andReturn(['expect']);
});

$this->artisan('cloudflare:reload')
->expectsOutput('Cloudflare\'s IP blocks have been reloaded.')
->assertExitCode(0);

$this->assertEquals(['expect'], $this->app['cache']->get('cloudflare.proxies'));
}

/** @test */
public function it_saves_address_in_cache()
{
Expand All @@ -17,8 +34,6 @@ public function it_saves_address_in_cache()
'https://fake/ips-v6' => Http::response('::1/32', 200),
]);

$this->withoutMockingConsoleOutput();

$this->artisan('cloudflare:reload');

$this->assertEquals(['0.0.0.0/20', '::1/32'], $this->app['cache']->get('cloudflare.proxies'));
Expand Down
19 changes: 19 additions & 0 deletions tests/Unit/Commands/ViewTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace Monicahq\Cloudflare\Tests\Unit\Commands;

use Illuminate\Support\Facades\Cache;
use Monicahq\Cloudflare\Tests\FeatureTestCase;

class ViewTest extends FeatureTestCase
{
/** @test */
public function it_displays_addresses()
{
Cache::forever('cloudflare.proxies', ['expect']);

$this->artisan('cloudflare:view')
->expectsTable(['Address'], [['expect']])
->assertExitCode(0);
}
}
65 changes: 65 additions & 0 deletions tests/Unit/Http/Middleware/TrustProxiesTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

namespace Monicahq\Cloudflare\Tests\Unit\Http\Middleware;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Mockery\MockInterface;
use Monicahq\Cloudflare\CloudflareProxies;
use Monicahq\Cloudflare\Http\Middleware\TrustProxies;
use Monicahq\Cloudflare\Tests\FeatureTestCase;

class TrustProxiesTest extends FeatureTestCase
{
/** @test */
public function it_sets_trusted_proxies()
{
Cache::shouldReceive('get')
->with('cloudflare.proxies', \Closure::class)
->andReturn(['expect']);

$request = new Request();

$this->app->make(TrustProxies::class)->handle($request, function () {
});

$proxies = $request->getTrustedProxies();

$this->assertEquals(['expect'], $proxies);
}

/** @test */
public function it_does_not_sets_trusted_proxies()
{
Cache::shouldReceive('get')
->with('cloudflare.proxies', \Closure::class)
->andReturn([]);

$request = new Request();

$this->app->make(TrustProxies::class)->handle($request, function () {
});

$proxies = $request->getTrustedProxies();

$this->assertEquals([], $proxies);
}

/** @test */
public function it_load_trustproxies()
{
$this->mock(CloudflareProxies::class, function (MockInterface $mock) {
$mock->shouldReceive('load')
->andReturn(['expect']);
});

$request = new Request();

$this->app->make(TrustProxies::class)->handle($request, function () {
});

$proxies = $request->getTrustedProxies();

$this->assertEquals(['expect'], $proxies);
}
}
47 changes: 0 additions & 47 deletions tests/Unit/MiddlewareTest.php

This file was deleted.

0 comments on commit e63ba67

Please sign in to comment.