add filters for retrieving ip

This commit is contained in:
Pig Fang 2020-03-02 15:02:39 +08:00
parent c4ce144be2
commit 9d624fd299
2 changed files with 39 additions and 6 deletions

View File

@ -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;

View File

@ -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',