44
55use Illuminate \Http \Request ;
66use Illuminate \Auth \AuthManager ;
7+ use Illuminate \Http \JsonResponse ;
78use PragmaRX \Google2FA \Google2FA ;
89use Illuminate \Auth \Events \Failed ;
9- use Illuminate \ Http \ RedirectResponse ;
10+ use Pterodactyl \ Exceptions \ DisplayException ;
1011use Pterodactyl \Http \Controllers \Controller ;
1112use Illuminate \Contracts \Auth \Authenticatable ;
1213use Illuminate \Contracts \Encryption \Encrypter ;
@@ -106,11 +107,12 @@ public function __construct(
106107 * Handle a login request to the application.
107108 *
108109 * @param \Illuminate\Http\Request $request
109- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response
110+ * @return \Illuminate\Http\JsonResponse
110111 *
112+ * @throws \Pterodactyl\Exceptions\DisplayException
111113 * @throws \Illuminate\Validation\ValidationException
112114 */
113- public function login (Request $ request )
115+ public function login (Request $ request ): JsonResponse
114116 {
115117 $ username = $ request ->input (self ::USER_INPUT_FIELD );
116118 $ useColumn = $ this ->getField ($ username );
@@ -128,37 +130,28 @@ public function login(Request $request)
128130
129131 $ validCredentials = password_verify ($ request ->input ('password ' ), $ user ->password );
130132 if ($ user ->use_totp ) {
131- $ token = str_random (64 );
132- $ this ->cache ->put ($ token , ['user_id ' => $ user ->id , 'valid_credentials ' => $ validCredentials ], 5 );
133-
134- return redirect ()->route ('auth.totp ' )->with ('authentication_token ' , $ token );
133+ $ token = str_random (128 );
134+ $ this ->cache ->put ($ token , [
135+ 'user_id ' => $ user ->id ,
136+ 'valid_credentials ' => $ validCredentials ,
137+ 'request_ip ' => $ request ->ip (),
138+ ], 5 );
139+
140+ return response ()->json ([
141+ 'complete ' => false ,
142+ 'token ' => $ token ,
143+ ]);
135144 }
136145
137146 if ($ validCredentials ) {
138147 $ this ->auth ->guard ()->login ($ user , true );
139148
140- return $ this -> sendLoginResponse ( $ request );
149+ return response ()-> json ([ ' complete ' => true ] );
141150 }
142151
143152 return $ this ->sendFailedLoginResponse ($ request , $ user );
144153 }
145154
146- /**
147- * Handle a TOTP implementation page.
148- *
149- * @param \Illuminate\Http\Request $request
150- * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
151- */
152- public function totp (Request $ request )
153- {
154- $ token = $ request ->session ()->get ('authentication_token ' );
155- if (is_null ($ token ) || $ this ->auth ->guard ()->user ()) {
156- return redirect ()->route ('auth.login ' );
157- }
158-
159- return view ('auth.totp ' , ['verify_key ' => $ token ]);
160- }
161-
162155 /**
163156 * Handle a login where the user is required to provide a TOTP authentication
164157 * token. In order to add additional layers of security, users are not
@@ -167,27 +160,29 @@ public function totp(Request $request)
167160 *
168161 * @param \Illuminate\Http\Request $request
169162 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response
163+ *
164+ * @throws \Pterodactyl\Exceptions\DisplayException
170165 */
171- public function loginUsingTotp (Request $ request )
166+ public function loginCheckpoint (Request $ request )
172167 {
173- if (is_null ($ request ->input ('verify_token ' ))) {
168+ if (is_null ($ request ->input ('confirmation_token ' )) || is_null ( $ request -> input ( ' authentication_code ' ))) {
174169 return $ this ->sendFailedLoginResponse ($ request );
175170 }
176171
177172 try {
178- $ cache = $ this ->cache ->pull ($ request ->input ('verify_token ' ), []);
173+ $ cache = $ this ->cache ->pull ($ request ->input ('confirmation_token ' ), []);
179174 $ user = $ this ->repository ->find (array_get ($ cache , 'user_id ' , 0 ));
180175 } catch (RecordNotFoundException $ exception ) {
181176 return $ this ->sendFailedLoginResponse ($ request );
182177 }
183178
184- if (is_null ( $ request -> input ( ' 2fa_token ' )) || ! array_get ($ cache , 'valid_credentials ' )) {
179+ if (! array_get ( $ cache , ' valid_credentials ' ) || array_get ($ cache , 'request_ip ' ) !== $ request -> ip ( )) {
185180 return $ this ->sendFailedLoginResponse ($ request , $ user );
186181 }
187182
188183 if (! $ this ->google2FA ->verifyKey (
189184 $ this ->encrypter ->decrypt ($ user ->totp_secret ),
190- $ request ->input ('2fa_token ' ),
185+ $ request ->input ('authentication_code ' ),
191186 $ this ->config ->get ('pterodactyl.auth.2fa.window ' )
192187 )) {
193188 return $ this ->sendFailedLoginResponse ($ request , $ user );
@@ -203,24 +198,35 @@ public function loginUsingTotp(Request $request)
203198 *
204199 * @param \Illuminate\Http\Request $request
205200 * @param \Illuminate\Contracts\Auth\Authenticatable|null $user
206- * @return \Illuminate\Http\RedirectResponse
201+ *
202+ * @throws \Pterodactyl\Exceptions\DisplayException
207203 */
208- protected function sendFailedLoginResponse (Request $ request , Authenticatable $ user = null ): RedirectResponse
204+ protected function sendFailedLoginResponse (Request $ request , Authenticatable $ user = null )
209205 {
210206 $ this ->incrementLoginAttempts ($ request );
211207 $ this ->fireFailedLoginEvent ($ user , [
212208 $ this ->getField ($ request ->input (self ::USER_INPUT_FIELD )) => $ request ->input (self ::USER_INPUT_FIELD ),
213209 ]);
214210
215- $ errors = [self ::USER_INPUT_FIELD => trans ('auth.failed ' )];
211+ throw new DisplayException (trans ('auth.failed ' ));
212+ }
216213
217- if ($ request ->expectsJson ()) {
218- return response ()->json ($ errors , 422 );
219- }
214+ /**
215+ * Send the response after the user was authenticated.
216+ *
217+ * @param \Illuminate\Http\Request $request
218+ * @return \Illuminate\Http\Response
219+ */
220+ protected function sendLoginResponse (Request $ request )
221+ {
222+ $ request ->session ()->regenerate ();
223+
224+ $ this ->clearLoginAttempts ($ request );
220225
221- return redirect ()->route ('auth.login ' )
222- ->withInput ($ request ->only (self ::USER_INPUT_FIELD ))
223- ->withErrors ($ errors );
226+ return $ this ->authenticated ($ request , $ this ->guard ()->user ())
227+ ?: response ()->json ([
228+ 'intended ' => $ this ->redirectPath (),
229+ ]);
224230 }
225231
226232 /**
0 commit comments