X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/47d82a1ac2ec323295eb57ffe3beaf513e841496..refs/pull/2023/head:/app/Http/Controllers/Auth/RegisterController.php diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 9a23fe2a1..0bdeef9e6 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -2,20 +2,15 @@ namespace BookStack\Http\Controllers\Auth; -use BookStack\Exceptions\ConfirmationEmailException; -use BookStack\Exceptions\SocialSignInException; +use BookStack\Auth\Access\RegistrationService; +use BookStack\Auth\Access\SocialAuthService; +use BookStack\Auth\User; use BookStack\Exceptions\UserRegistrationException; -use BookStack\Repos\UserRepo; -use BookStack\Services\EmailConfirmationService; -use BookStack\Services\SocialAuthService; -use BookStack\SocialAccount; -use BookStack\User; -use Exception; -use Illuminate\Http\Request; -use Illuminate\Http\Response; -use Validator; use BookStack\Http\Controllers\Controller; use Illuminate\Foundation\Auth\RegistersUsers; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Hash; +use Validator; class RegisterController extends Controller { @@ -33,8 +28,7 @@ class RegisterController extends Controller use RegistersUsers; protected $socialAuthService; - protected $emailConfirmationService; - protected $userRepo; + protected $registrationService; /** * Where to redirect users after login / registration. @@ -46,79 +40,69 @@ class RegisterController extends Controller /** * Create a new controller instance. - * - * @param SocialAuthService $socialAuthService - * @param EmailConfirmationService $emailConfirmationService - * @param UserRepo $userRepo */ - public function __construct(SocialAuthService $socialAuthService, EmailConfirmationService $emailConfirmationService, UserRepo $userRepo) + public function __construct(SocialAuthService $socialAuthService, RegistrationService $registrationService) { - $this->middleware('guest')->except(['socialCallback', 'detachSocialAccount']); + $this->middleware('guest'); + $this->middleware('guard:standard'); + $this->socialAuthService = $socialAuthService; - $this->emailConfirmationService = $emailConfirmationService; - $this->userRepo = $userRepo; - $this->redirectTo = baseUrl('/'); - $this->redirectPath = baseUrl('/'); + $this->registrationService = $registrationService; + + $this->redirectTo = url('/'); + $this->redirectPath = url('/'); parent::__construct(); } /** * Get a validator for an incoming registration request. * - * @param array $data * @return \Illuminate\Contracts\Validation\Validator */ protected function validator(array $data) { return Validator::make($data, [ - 'name' => 'required|max:255', + 'name' => 'required|min:2|max:255', 'email' => 'required|email|max:255|unique:users', - 'password' => 'required|min:6', + 'password' => 'required|min:8', ]); } - /** - * Check whether or not registrations are allowed in the app settings. - * @throws UserRegistrationException - */ - protected function checkRegistrationAllowed() - { - if (!setting('registration-enabled')) { - throw new UserRegistrationException(trans('auth.registrations_disabled'), '/login'); - } - } - /** * Show the application registration form. - * @return Response + * @throws UserRegistrationException */ public function getRegister() { - $this->checkRegistrationAllowed(); + $this->registrationService->ensureRegistrationAllowed(); $socialDrivers = $this->socialAuthService->getActiveDrivers(); - return view('auth.register', ['socialDrivers' => $socialDrivers]); + return view('auth.register', [ + 'socialDrivers' => $socialDrivers, + ]); } /** * Handle a registration request for the application. - * @param Request|\Illuminate\Http\Request $request - * @return Response * @throws UserRegistrationException - * @throws \Illuminate\Validation\ValidationException */ public function postRegister(Request $request) { - $this->checkRegistrationAllowed(); - $validator = $this->validator($request->all()); + $this->registrationService->ensureRegistrationAllowed(); + $this->validator($request->all())->validate(); + $userData = $request->all(); - if ($validator->fails()) { - $this->throwValidationException( - $request, $validator - ); + try { + $user = $this->registrationService->registerUser($userData); + auth()->login($user); + } catch (UserRegistrationException $exception) { + if ($exception->getMessage()) { + $this->showErrorNotification($exception->getMessage()); + } + return redirect($exception->redirectLocation); } - $userData = $request->all(); - return $this->registerUser($userData); + $this->showSuccessNotification(trans('auth.register_success')); + return redirect($this->redirectPath()); } /** @@ -131,169 +115,8 @@ class RegisterController extends Controller return User::create([ 'name' => $data['name'], 'email' => $data['email'], - 'password' => bcrypt($data['password']), - ]); - } - - /** - * The registrations flow for all users. - * @param array $userData - * @param bool|false|SocialAccount $socialAccount - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - * @throws UserRegistrationException - * @throws ConfirmationEmailException - */ - protected function registerUser(array $userData, $socialAccount = false) - { - if (setting('registration-restrict')) { - $restrictedEmailDomains = explode(',', str_replace(' ', '', setting('registration-restrict'))); - $userEmailDomain = $domain = substr(strrchr($userData['email'], "@"), 1); - if (!in_array($userEmailDomain, $restrictedEmailDomains)) { - throw new UserRegistrationException(trans('auth.registration_email_domain_invalid'), '/register'); - } - } - - $newUser = $this->userRepo->registerNew($userData); - if ($socialAccount) { - $newUser->socialAccounts()->save($socialAccount); - } - - if (setting('registration-confirmation') || setting('registration-restrict')) { - $newUser->save(); - - try { - $this->emailConfirmationService->sendConfirmation($newUser); - } catch (Exception $e) { - session()->flash('error', trans('auth.email_confirm_send_error')); - } - - return redirect('/register/confirm'); - } - - auth()->login($newUser); - session()->flash('success', trans('auth.register_success')); - return redirect($this->redirectPath()); - } - - /** - * Show the page to tell the user to check their email - * and confirm their address. - */ - public function getRegisterConfirmation() - { - return view('auth/register-confirm'); - } - - /** - * Confirms an email via a token and logs the user into the system. - * @param $token - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - * @throws UserRegistrationException - */ - public function confirmEmail($token) - { - $confirmation = $this->emailConfirmationService->getEmailConfirmationFromToken($token); - $user = $confirmation->user; - $user->email_confirmed = true; - $user->save(); - auth()->login($user); - session()->flash('success', trans('auth.email_confirm_success')); - $this->emailConfirmationService->deleteConfirmationsByUser($user); - return redirect($this->redirectPath); - } - - /** - * Shows a notice that a user's email address has not been confirmed, - * Also has the option to re-send the confirmation email. - * @return \Illuminate\View\View - */ - public function showAwaitingConfirmation() - { - return view('auth/user-unconfirmed'); - } - - /** - * Resend the confirmation email - * @param Request $request - * @return \Illuminate\View\View - */ - public function resendConfirmation(Request $request) - { - $this->validate($request, [ - 'email' => 'required|email|exists:users,email' + 'password' => Hash::make($data['password']), ]); - $user = $this->userRepo->getByEmail($request->get('email')); - - try { - $this->emailConfirmationService->sendConfirmation($user); - } catch (Exception $e) { - session()->flash('error', trans('auth.email_confirm_send_error')); - return redirect('/register/confirm'); - } - - $this->emailConfirmationService->sendConfirmation($user); - session()->flash('success', trans('auth.email_confirm_resent')); - return redirect('/register/confirm'); - } - - /** - * Redirect to the social site for authentication intended to register. - * @param $socialDriver - * @return mixed - */ - public function socialRegister($socialDriver) - { - $this->checkRegistrationAllowed(); - session()->put('social-callback', 'register'); - return $this->socialAuthService->startRegister($socialDriver); - } - - /** - * The callback for social login services. - * @param $socialDriver - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - * @throws SocialSignInException - */ - public function socialCallback($socialDriver) - { - if (!session()->has('social-callback')) { - throw new SocialSignInException(trans('errors.social_no_action_defined'), '/login'); - } - - $action = session()->pull('social-callback'); - if ($action == 'login') return $this->socialAuthService->handleLoginCallback($socialDriver); - if ($action == 'register') return $this->socialRegisterCallback($socialDriver); - return redirect()->back(); - } - - /** - * Detach a social account from a user. - * @param $socialDriver - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - */ - public function detachSocialAccount($socialDriver) - { - return $this->socialAuthService->detachSocialAccount($socialDriver); - } - - /** - * Register a new user after a registration callback. - * @param $socialDriver - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - * @throws UserRegistrationException - */ - protected function socialRegisterCallback($socialDriver) - { - $socialUser = $this->socialAuthService->handleRegistrationCallback($socialDriver); - $socialAccount = $this->socialAuthService->fillSocialAccount($socialDriver, $socialUser); - - // Create an array of the user data to create a new user instance - $userData = [ - 'name' => $socialUser->getName(), - 'email' => $socialUser->getEmail(), - 'password' => str_random(30) - ]; - return $this->registerUser($userData, $socialAccount); } -} \ No newline at end of file +}