From 9d624fd299693ccdcbceb7baa16e53680422f0e7 Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Mon, 2 Mar 2020 15:02:39 +0800 Subject: [PATCH] add filters for retrieving ip --- app/Http/Controllers/AuthController.php | 20 ++++++++++----- .../ControllersTest/AuthControllerTest.php | 25 +++++++++++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 18fb9816..4136843d 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -9,6 +9,7 @@ use App\Models\Player; use App\Models\User; use App\Rules; use Auth; +use Blessing\Filter; use Cache; use Carbon\Carbon; use Illuminate\Contracts\Events\Dispatcher; @@ -18,14 +19,14 @@ use Mail; use Session; use URL; use Vectorface\Whip\Whip; -use View; class AuthController extends Controller { - public function login() + public function login(Filter $filter) { $whip = new Whip(); $ip = $whip->getValidIpAddress(); + $ip = $filter->apply('client_ip', $ip); return view('auth.login', [ 'extra' => [ @@ -39,7 +40,8 @@ class AuthController extends Controller public function handleLogin( Request $request, Rules\Captcha $captcha, - Dispatcher $dispatcher + Dispatcher $dispatcher, + Filter $filter ) { $this->validate($request, [ 'identification' => 'required', @@ -64,6 +66,7 @@ class AuthController extends Controller // Require CAPTCHA if user fails to login more than 3 times $whip = new Whip(); $ip = $whip->getValidIpAddress(); + $ip = $filter->apply('client_ip', $ip); $loginFailsCacheKey = sha1('login_fails_'.$ip); $loginFails = (int) Cache::get($loginFailsCacheKey, 0); @@ -130,7 +133,8 @@ class AuthController extends Controller public function handleRegister( Request $request, Rules\Captcha $captcha, - Dispatcher $dispatcher + Dispatcher $dispatcher, + Filter $filter ) { if (!option('user_can_register')) { return json(trans('auth.register.close'), 7); @@ -163,6 +167,7 @@ class AuthController extends Controller // then reject the register. $whip = new Whip(); $ip = $whip->getValidIpAddress(); + $ip = $filter->apply('client_ip', $ip); if (User::where('ip', $ip)->count() >= option('regs_per_ip')) { return json(trans('auth.register.max', ['regs' => option('regs_per_ip')]), 7); } @@ -220,7 +225,8 @@ class AuthController extends Controller public function handleForgot( Request $request, Rules\Captcha $captcha, - Dispatcher $dispatcher + Dispatcher $dispatcher, + Filter $filter ) { $data = $this->validate($request, [ 'email' => 'required|email', @@ -237,6 +243,7 @@ class AuthController extends Controller $rateLimit = 180; $whip = new Whip(); $ip = $whip->getValidIpAddress(); + $ip = $filter->apply('client_ip', $ip); $lastMailCacheKey = sha1('last_mail_'.$ip); $remain = $rateLimit + Cache::get($lastMailCacheKey, 0) - time(); if ($remain > 0) { @@ -352,7 +359,7 @@ class AuthController extends Controller return Socialite::driver($driver)->redirect(); } - public function oauthCallback(Dispatcher $dispatcher, $driver) + public function oauthCallback(Dispatcher $dispatcher, Filter $filter, $driver) { $remoteUser = Socialite::driver($driver)->user(); @@ -365,6 +372,7 @@ class AuthController extends Controller if (!$user) { $whip = new Whip(); $ip = $whip->getValidIpAddress(); + $ip = $filter->apply('client_ip', $ip); $user = new User(); $user->email = $email; diff --git a/tests/HttpTest/ControllersTest/AuthControllerTest.php b/tests/HttpTest/ControllersTest/AuthControllerTest.php index 49f9b71c..7f803fee 100644 --- a/tests/HttpTest/ControllersTest/AuthControllerTest.php +++ b/tests/HttpTest/ControllersTest/AuthControllerTest.php @@ -15,6 +15,7 @@ use Illuminate\Support\Facades\URL; use Illuminate\Support\Str; use Laravel\Socialite\AbstractUser; use Laravel\Socialite\Facades\Socialite; +use Tests\Fakes\Filter; use Vectorface\Whip\Whip; class AuthControllerTest extends TestCase @@ -98,6 +99,7 @@ class AuthControllerTest extends TestCase $this->flushSession(); Event::fake(); + $filter = Filter::fake(); $whip = new Whip(); $ip = $whip->getValidIpAddress(); $loginFailsCacheKey = sha1('login_fails_'.$ip); @@ -114,6 +116,11 @@ class AuthControllerTest extends TestCase 'data' => ['login_fails' => 1], ] ); + $filter->assertApplied('client_ip', function ($value) use ($ip) { + $this->assertEquals($ip, $value); + + return true; + }); $this->assertTrue(Cache::has($loginFailsCacheKey)); Event::assertDispatched('auth.login.attempt', function ($event, $payload) use ($user) { $this->assertEquals($user->email, $payload[0]); @@ -227,6 +234,7 @@ class AuthControllerTest extends TestCase public function testHandleRegister() { Event::fake(); + $filter = Filter::fake(); $whip = new Whip(); $ip = $whip->getValidIpAddress(); @@ -408,6 +416,11 @@ class AuthControllerTest extends TestCase 'code' => 0, 'message' => trans('auth.register.success'), ]); + $filter->assertApplied('client_ip', function ($value) use ($ip) { + $this->assertEquals($ip, $value); + + return true; + }); $this->assertTrue($newUser->verifyPassword('12345678')); $this->assertDatabaseHas('users', [ 'email' => 'a@b.c', @@ -479,6 +492,7 @@ class AuthControllerTest extends TestCase { Event::fake(); Mail::fake(); + $filter = Filter::fake(); // Should be forbidden if "forgot password" is closed config(['mail.driver' => '']); @@ -504,6 +518,11 @@ class AuthControllerTest extends TestCase 'code' => 2, 'message' => trans('auth.forgot.frequent-mail'), ]); + $filter->assertApplied('client_ip', function ($value) use ($ip) { + $this->assertEquals($ip, $value); + + return true; + }); Event::assertDispatched('auth.forgot.attempt', function ($event, $payload) { $this->assertEquals('nope@nope.net', $payload[0]); @@ -747,6 +766,7 @@ class AuthControllerTest extends TestCase public function testOAuthCallback() { Event::fake(); + $filter = Filter::fake(); $whip = new Whip(); $ip = $whip->getValidIpAddress(); @@ -788,6 +808,11 @@ class AuthControllerTest extends TestCase ->assertSee('Unsupported'); $this->get('/auth/login/github/callback')->assertRedirect('/user'); + $filter->assertApplied('client_ip', function ($value) use ($ip) { + $this->assertEquals($ip, $value); + + return true; + }); $this->assertDatabaseHas('users', [ 'email' => 'a@b.c', 'nickname' => 'abc',