hasTooManyLoginAttempts($request)) { $this->fireLockoutEvent($request); $this->sendLockoutResponse($request); } try { $username = $request->input('user'); /** @var \Pterodactyl\Models\User $user */ $user = User::query()->where($this->getField($username), $username)->firstOrFail(); } catch (ModelNotFoundException) { $this->sendFailedLoginResponse($request); } // Ensure that the account is using a valid username and password before trying to // continue. Previously this was handled in the 2FA checkpoint, however that has // a flaw in which you can discover if an account exists simply by seeing if you // can proceed to the next step in the login process. if (!password_verify($request->input('password'), $user->password)) { $this->sendFailedLoginResponse($request, $user); } // Return early if the user does not have 2FA enabled, otherwise we will require them // to complete a secondary challenge before they can log in. if (!$user->has2FAEnabled()) { return $this->sendLoginResponse($user, $request); } Activity::event('auth:checkpoint')->withRequestMetadata()->subject($user)->log(); $request->session()->put('auth_confirmation_token', [ 'user_id' => $user->id, 'token_value' => $token = Str::random(64), 'expires_at' => CarbonImmutable::now()->addMinutes(5), ]); $response = [ 'complete' => false, 'methods' => array_values(array_filter([ $user->use_totp ? self::METHOD_TOTP : null, $user->securityKeys->isNotEmpty() ? self::METHOD_WEBAUTHN : null, ])), 'confirm_token' => $token, ]; if ($user->securityKeys->isNotEmpty()) { $key = $this->webauthnServerRepository->generatePublicKeyCredentialRequestOptions($user); $request->session()->put(SecurityKey::PK_SESSION_NAME, $key); $request['webauthn'] = ['public_key' => $key]; } return new JsonResponse($response); } }