2016-07-21 22:01:57 +08:00
|
|
|
<?php
|
|
|
|
|
2016-08-28 10:05:21 +08:00
|
|
|
namespace App\Http\Controllers;
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2018-07-18 11:04:34 +08:00
|
|
|
use URL;
|
2016-11-07 22:34:34 +08:00
|
|
|
use Log;
|
2016-07-21 22:01:57 +08:00
|
|
|
use Mail;
|
|
|
|
use View;
|
2016-08-06 19:38:37 +08:00
|
|
|
use Utils;
|
2018-08-16 17:57:24 +08:00
|
|
|
use Cache;
|
2016-08-28 10:05:21 +08:00
|
|
|
use Session;
|
2016-11-17 17:32:12 +08:00
|
|
|
use App\Events;
|
2016-09-04 15:35:12 +08:00
|
|
|
use App\Models\User;
|
2018-07-15 17:42:03 +08:00
|
|
|
use App\Mail\ForgotPassword;
|
2016-09-04 15:35:12 +08:00
|
|
|
use Illuminate\Http\Request;
|
2018-07-20 14:42:43 +08:00
|
|
|
use Illuminate\Support\Facades\Auth;
|
2016-09-04 15:35:12 +08:00
|
|
|
use App\Exceptions\PrettyPageException;
|
2016-10-23 11:41:52 +08:00
|
|
|
use App\Services\Repositories\UserRepository;
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2016-09-03 23:50:55 +08:00
|
|
|
class AuthController extends Controller
|
2016-07-21 22:01:57 +08:00
|
|
|
{
|
2016-10-23 11:41:52 +08:00
|
|
|
public function handleLogin(Request $request, UserRepository $users)
|
2016-07-21 22:01:57 +08:00
|
|
|
{
|
2016-09-03 23:50:55 +08:00
|
|
|
$this->validate($request, [
|
2016-10-02 20:30:27 +08:00
|
|
|
'identification' => 'required',
|
2018-02-24 16:05:07 +08:00
|
|
|
'password' => 'required|min:6|max:32'
|
2016-09-03 23:50:55 +08:00
|
|
|
]);
|
|
|
|
|
2016-10-02 20:30:27 +08:00
|
|
|
$identification = $request->input('identification');
|
|
|
|
|
2018-02-16 17:31:04 +08:00
|
|
|
// Guess type of identification
|
|
|
|
$authType = (validate($identification, 'email')) ? "email" : "username";
|
2016-09-03 23:50:55 +08:00
|
|
|
|
2018-02-16 17:31:04 +08:00
|
|
|
event(new Events\UserTryToLogin($identification, $authType));
|
2016-10-17 17:51:51 +08:00
|
|
|
|
2016-10-23 11:41:52 +08:00
|
|
|
// Get user instance from repository.
|
|
|
|
// If the given identification is not registered yet,
|
|
|
|
// it will return a null value.
|
2018-02-16 17:31:04 +08:00
|
|
|
$user = $users->get($identification, $authType);
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2018-08-16 17:57:24 +08:00
|
|
|
// Require CAPTCHA if user fails to login more than 3 times
|
|
|
|
$loginFailsCacheKey = sha1('login_fails_'.Utils::getClientIp());
|
|
|
|
$loginFails = (int) Cache::get($loginFailsCacheKey, 0);
|
|
|
|
|
|
|
|
if ($loginFails > 3) {
|
2018-07-21 08:17:16 +08:00
|
|
|
$this->validate($request, ['captcha' => 'required|captcha']);
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
|
2018-02-16 17:31:04 +08:00
|
|
|
if (! $user) {
|
2016-09-15 09:20:02 +08:00
|
|
|
return json(trans('auth.validation.user'), 2);
|
2016-07-21 22:01:57 +08:00
|
|
|
} else {
|
2017-01-08 12:49:32 +08:00
|
|
|
if ($user->verifyPassword($request->input('password'))) {
|
2016-09-03 23:50:55 +08:00
|
|
|
Session::forget('login_fails');
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2018-07-20 14:42:43 +08:00
|
|
|
Auth::login($user, $request->input('keep') == 'true');
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2016-11-17 17:32:12 +08:00
|
|
|
event(new Events\UserLoggedIn($user));
|
2016-10-17 17:51:51 +08:00
|
|
|
|
2018-08-16 17:57:24 +08:00
|
|
|
Cache::forget($loginFailsCacheKey);
|
2017-06-28 20:42:51 +08:00
|
|
|
|
2018-07-20 14:42:43 +08:00
|
|
|
return json(trans('auth.login.success'), 0);
|
2016-07-21 22:01:57 +08:00
|
|
|
} else {
|
2018-08-16 17:57:24 +08:00
|
|
|
// Increase the counter
|
|
|
|
Cache::put($loginFailsCacheKey, ++$loginFails);
|
2016-08-16 13:27:06 +08:00
|
|
|
|
2016-10-02 20:30:27 +08:00
|
|
|
return json(trans('auth.validation.password'), 1, [
|
2018-08-16 17:57:24 +08:00
|
|
|
'login_fails' => $loginFails
|
2016-07-21 22:01:57 +08:00
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-20 14:42:43 +08:00
|
|
|
public function logout()
|
2016-07-21 22:01:57 +08:00
|
|
|
{
|
2018-07-20 14:42:43 +08:00
|
|
|
if (Auth::check()) {
|
|
|
|
Auth::logout();
|
|
|
|
return json(trans('auth.logout.success'), 0);
|
2016-07-21 22:01:57 +08:00
|
|
|
} else {
|
2016-10-06 17:57:07 +08:00
|
|
|
return json(trans('auth.logout.fail'), 1);
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function register()
|
|
|
|
{
|
2016-10-23 11:41:52 +08:00
|
|
|
if (option('user_can_register')) {
|
2016-08-28 10:05:21 +08:00
|
|
|
return view('auth.register');
|
2016-07-27 18:31:59 +08:00
|
|
|
} else {
|
2016-09-15 09:20:02 +08:00
|
|
|
throw new PrettyPageException(trans('auth.register.close'), 7);
|
2016-07-27 18:31:59 +08:00
|
|
|
}
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
|
2018-07-20 14:42:43 +08:00
|
|
|
public function handleRegister(Request $request)
|
2016-07-21 22:01:57 +08:00
|
|
|
{
|
2018-07-20 14:42:43 +08:00
|
|
|
$data = $this->validate($request, [
|
|
|
|
'email' => 'required|email|unique:users',
|
2018-02-24 16:05:07 +08:00
|
|
|
'password' => 'required|min:8|max:32',
|
2018-07-20 14:42:43 +08:00
|
|
|
'nickname' => 'required|no_special_chars|max:255',
|
|
|
|
'captcha' => 'required'.(app()->environment('testing') ? '' : '|captcha')
|
2016-09-03 23:50:55 +08:00
|
|
|
]);
|
|
|
|
|
2018-02-16 17:31:04 +08:00
|
|
|
if (! option('user_can_register')) {
|
2016-10-23 11:41:52 +08:00
|
|
|
return json(trans('auth.register.close'), 7);
|
|
|
|
}
|
|
|
|
|
|
|
|
// If amount of registered accounts of IP is more than allowed amounts,
|
2018-07-20 14:42:43 +08:00
|
|
|
// reject the registration.
|
|
|
|
if (User::where('ip', Utils::getClientIp())->count() < option('regs_per_ip')) {
|
|
|
|
$user = new User;
|
|
|
|
$user->email = $data['email'];
|
|
|
|
$user->nickname = $data['nickname'];
|
|
|
|
$user->score = option('user_initial_score');
|
|
|
|
$user->avatar = 0;
|
|
|
|
$user->password = User::getEncryptedPwdFromEvent($data['password'], $user)
|
|
|
|
?: app('cipher')->hash($data['password'], config('secure.salt'));
|
|
|
|
$user->ip = Utils::getClientIp();
|
|
|
|
$user->permission = User::NORMAL;
|
|
|
|
$user->register_at = Utils::getTimeFormatted();
|
|
|
|
$user->last_sign_at = Utils::getTimeFormatted(time() - 86400);
|
|
|
|
|
|
|
|
$user->save();
|
2016-10-23 11:41:52 +08:00
|
|
|
|
2016-11-17 17:32:12 +08:00
|
|
|
event(new Events\UserRegistered($user));
|
|
|
|
|
2018-07-20 14:42:43 +08:00
|
|
|
Auth::login($user);
|
|
|
|
|
2016-10-23 11:41:52 +08:00
|
|
|
return json([
|
2017-11-05 19:48:11 +08:00
|
|
|
'errno' => 0,
|
2018-07-20 14:42:43 +08:00
|
|
|
'msg' => trans('auth.register.success')
|
|
|
|
]);
|
2016-10-23 11:41:52 +08:00
|
|
|
|
2016-07-21 22:01:57 +08:00
|
|
|
} else {
|
2016-10-23 11:41:52 +08:00
|
|
|
return json(trans('auth.register.max', ['regs' => option('regs_per_ip')]), 7);
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function forgot()
|
|
|
|
{
|
2018-07-15 18:18:56 +08:00
|
|
|
if (config('mail.driver') != "") {
|
2016-08-28 10:05:21 +08:00
|
|
|
return view('auth.forgot');
|
2016-08-06 19:12:39 +08:00
|
|
|
} else {
|
2016-09-15 09:20:02 +08:00
|
|
|
throw new PrettyPageException(trans('auth.forgot.close'), 8);
|
2016-08-06 19:12:39 +08:00
|
|
|
}
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
|
2016-10-23 11:41:52 +08:00
|
|
|
public function handleForgot(Request $request, UserRepository $users)
|
2016-07-21 22:01:57 +08:00
|
|
|
{
|
2018-08-12 16:00:21 +08:00
|
|
|
$this->validate($request, [
|
|
|
|
'captcha' => 'required'.(app()->environment('testing') ? '' : '|captcha')
|
|
|
|
]);
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2018-07-15 18:18:56 +08:00
|
|
|
if (config('mail.driver') == "")
|
2016-09-15 09:20:02 +08:00
|
|
|
return json(trans('auth.forgot.close'), 1);
|
2016-08-06 19:12:39 +08:00
|
|
|
|
2016-09-04 16:15:11 +08:00
|
|
|
if (Session::has('last_mail_time') && (time() - session('last_mail_time')) < 60)
|
2016-09-15 09:20:02 +08:00
|
|
|
return json(trans('auth.forgot.frequent-mail'), 1);
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2018-02-16 17:31:04 +08:00
|
|
|
// Get user instance
|
2016-10-23 11:41:52 +08:00
|
|
|
$user = $users->get($request->input('email'), 'email');
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2018-02-16 17:31:04 +08:00
|
|
|
if (! $user)
|
2016-09-15 09:20:02 +08:00
|
|
|
return json(trans('auth.forgot.unregistered'), 1);
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2018-07-18 11:04:34 +08:00
|
|
|
$url = URL::temporarySignedRoute('auth.reset', now()->addHour(), ['uid' => $user->uid]);
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2016-09-04 16:15:11 +08:00
|
|
|
try {
|
2018-07-18 11:04:34 +08:00
|
|
|
Mail::to($request->input('email'))->send(new ForgotPassword($url));
|
2018-07-15 18:15:55 +08:00
|
|
|
} catch (\Exception $e) {
|
2018-07-22 11:36:00 +08:00
|
|
|
report($e);
|
2018-07-15 18:15:55 +08:00
|
|
|
|
2016-09-15 09:20:02 +08:00
|
|
|
return json(trans('auth.mail.failed', ['msg' => $e->getMessage()]), 2);
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
|
2016-09-04 16:15:11 +08:00
|
|
|
Session::put('last_mail_time', time());
|
|
|
|
|
2016-09-15 09:20:02 +08:00
|
|
|
return json(trans('auth.mail.success'), 0);
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
|
2018-07-18 11:04:34 +08:00
|
|
|
public function reset($uid, UserRepository $users)
|
2016-07-21 22:01:57 +08:00
|
|
|
{
|
2018-07-18 11:04:34 +08:00
|
|
|
return view('auth.reset')->with('user', $users->get($uid));
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
|
2018-07-18 11:04:34 +08:00
|
|
|
public function handleReset($uid, Request $request, UserRepository $users)
|
2016-07-21 22:01:57 +08:00
|
|
|
{
|
2018-07-18 11:04:34 +08:00
|
|
|
$validated = $this->validate($request, [
|
2018-02-24 16:05:07 +08:00
|
|
|
'password' => 'required|min:8|max:32',
|
2016-09-03 23:50:55 +08:00
|
|
|
]);
|
2016-07-21 22:01:57 +08:00
|
|
|
|
2018-07-19 10:31:44 +08:00
|
|
|
$users->get($uid)->changePassword($validated['password']);
|
2016-11-07 22:34:34 +08:00
|
|
|
|
2016-09-15 09:20:02 +08:00
|
|
|
return json(trans('auth.reset.success'), 0);
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|
|
|
|
|
2017-01-07 22:16:30 +08:00
|
|
|
protected function checkCaptcha($request)
|
2016-10-23 11:41:52 +08:00
|
|
|
{
|
|
|
|
return (strtolower($request->input('captcha')) == strtolower(session('phrase')));
|
|
|
|
}
|
|
|
|
|
2016-07-21 22:01:57 +08:00
|
|
|
}
|