accountRepo = $repo; $this->authService = $authService; } /** * @param array $data * * @return mixed */ public function validator(array $data) { return Validator::make($data, [ 'name' => 'required|max:255', 'email' => 'required|email|max:255|unique:users', 'password' => 'required|confirmed|min:6', ]); } /** * Create a new user instance after a valid registration. * * @param array $data * * @return User */ public function create(array $data) { return User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); } /** * @param $provider * @param Request $request * * @return \Illuminate\Http\RedirectResponse */ public function authLogin($provider, Request $request) { return $this->authService->execute($provider, $request->has('code')); } /** * @return \Illuminate\Http\RedirectResponse */ public function authUnlink() { $this->accountRepo->unlinkUserFromOauth(Auth::user()); Session::flash('message', trans('texts.updated_settings')); return redirect()->to('/settings/' . ACCOUNT_USER_DETAILS); } /** * @return \Illuminate\Http\Response */ public function getLoginWrapper() { if (auth()->check()) { return redirect('/'); } if (! Utils::isNinja() && ! User::count()) { return redirect()->to('/setup'); } if (Utils::isNinja() && ! Utils::isTravis()) { // make sure the user is on SITE_URL/login to ensure OAuth works $requestURL = request()->url(); $loginURL = SITE_URL . '/login'; $subdomain = Utils::getSubdomain(request()->url()); if ($requestURL != $loginURL && ! strstr($subdomain, 'webapp-')) { return redirect()->to($loginURL); } } return self::getLogin(); } /** * @param Request $request * * @return \Illuminate\Http\Response */ public function postLoginWrapper(Request $request) { $userId = Auth::check() ? Auth::user()->id : null; $user = User::where('email', '=', $request->input('email'))->first(); if ($user && $user->failed_logins >= MAX_FAILED_LOGINS) { Session::flash('error', trans('texts.invalid_credentials')); return redirect()->to('login'); } $response = self::postLogin($request); if (Auth::check()) { /* $users = false; // we're linking a new account if ($request->link_accounts && $userId && Auth::user()->id != $userId) { $users = $this->accountRepo->associateAccounts($userId, Auth::user()->id); Session::flash('message', trans('texts.associated_accounts')); // check if other accounts are linked } else { $users = $this->accountRepo->loadAccounts(Auth::user()->id); } */ } elseif ($user) { error_log('login failed'); $user->failed_logins = $user->failed_logins + 1; $user->save(); } return $response; } /** * Send the post-authentication response. * * @param \Illuminate\Http\Request $request * @param \Illuminate\Contracts\Auth\Authenticatable $user * @return \Illuminate\Http\Response */ private function authenticated(Request $request, Authenticatable $user) { if ($user->google_2fa_secret) { Auth::logout(); $request->session()->put('2fa:user:id', $user->id); return redirect('/validate_two_factor/' . $user->account->account_key); } Event::fire(new UserLoggedIn()); return redirect()->intended($this->redirectTo); } /** * * @return \Illuminate\Http\Response */ public function getValidateToken() { if (session('2fa:user:id')) { return view('auth.two_factor'); } return redirect('login'); } /** * * @param App\Http\Requests\ValidateSecretRequest $request * @return \Illuminate\Http\Response */ public function postValidateToken(ValidateTwoFactorRequest $request) { //get user id and create cache key $userId = $request->session()->pull('2fa:user:id'); $key = $userId . ':' . $request->totp; //use cache to store token to blacklist Cache::add($key, true, 4); //login and redirect user Auth::loginUsingId($userId); Event::fire(new UserLoggedIn()); return redirect()->intended($this->redirectTo); } /** * @return \Illuminate\Http\Response */ public function getLogoutWrapper() { if (Auth::check() && ! Auth::user()->registered) { if (request()->force_logout) { $account = Auth::user()->account; $this->accountRepo->unlinkAccount($account); if (! $account->hasMultipleAccounts()) { $account->company->forceDelete(); } $account->forceDelete(); } else { return redirect('/'); } } $response = self::getLogout(); Session::flush(); $reason = htmlentities(request()->reason); if (!empty($reason) && Lang::has("texts.{$reason}_logout")) { Session::flash('warning', trans("texts.{$reason}_logout")); } return $response; } }