22
33namespace Pterodactyl \Http \Controllers \Auth ;
44
5+ use Illuminate \Support \Str ;
56use Illuminate \Http \Request ;
7+ use Illuminate \Auth \AuthManager ;
68use Illuminate \Http \JsonResponse ;
79use Illuminate \Contracts \View \View ;
10+ use Illuminate \Contracts \Config \Repository ;
11+ use Illuminate \Contracts \View \Factory as ViewFactory ;
12+ use Illuminate \Contracts \Cache \Repository as CacheRepository ;
13+ use Pterodactyl \Contracts \Repository \UserRepositoryInterface ;
814use Pterodactyl \Exceptions \Repository \RecordNotFoundException ;
915
1016class LoginController extends AbstractLoginController
1117{
18+ /**
19+ * @var \Illuminate\Contracts\View\Factory
20+ */
21+ private $ view ;
22+
23+ /**
24+ * @var \Illuminate\Contracts\Cache\Repository
25+ */
26+ private $ cache ;
27+
28+ /**
29+ * @var \Pterodactyl\Contracts\Repository\UserRepositoryInterface
30+ */
31+ private $ repository ;
32+
33+ /**
34+ * LoginController constructor.
35+ *
36+ * @param \Illuminate\Auth\AuthManager $auth
37+ * @param \Illuminate\Contracts\Config\Repository $config
38+ * @param \Illuminate\Contracts\Cache\Repository $cache
39+ * @param \Pterodactyl\Contracts\Repository\UserRepositoryInterface $repository
40+ * @param \Illuminate\Contracts\View\Factory $view
41+ */
42+ public function __construct (
43+ AuthManager $ auth ,
44+ Repository $ config ,
45+ CacheRepository $ cache ,
46+ UserRepositoryInterface $ repository ,
47+ ViewFactory $ view
48+ ) {
49+ parent ::__construct ($ auth , $ config );
50+
51+ $ this ->view = $ view ;
52+ $ this ->cache = $ cache ;
53+ $ this ->repository = $ repository ;
54+ }
55+
1256 /**
1357 * Handle all incoming requests for the authentication routes and render the
1458 * base authentication view component. Vuejs will take over at this point and
@@ -18,7 +62,7 @@ class LoginController extends AbstractLoginController
1862 */
1963 public function index (): View
2064 {
21- return view ('templates/auth.core ' );
65+ return $ this -> view -> make ('templates/auth.core ' );
2266 }
2367
2468 /**
@@ -55,85 +99,19 @@ public function login(Request $request): JsonResponse
5599 }
56100
57101 if ($ user ->use_totp ) {
58- $ token = str_random (64 );
59- $ this ->cache ->put ($ token , ['user_id ' => $ user ->id , 'valid_credentials ' => true ], 5 );
60-
61- return redirect ()->route ('auth.totp ' )->with ('authentication_token ' , $ token );
102+ $ token = Str::random (64 );
103+ $ this ->cache ->put ($ token , $ user ->id , 5 );
104+
105+ return JsonResponse::create ([
106+ 'data ' => [
107+ 'complete ' => false ,
108+ 'confirmation_token ' => $ token ,
109+ ],
110+ ]);
62111 }
63112
64113 $ this ->auth ->guard ()->login ($ user , true );
65114
66115 return $ this ->sendLoginResponse ($ user , $ request );
67116 }
68-
69- /**
70- * Handle a TOTP implementation page.
71- *
72- * @param \Illuminate\Http\Request $request
73- * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
74- */
75- public function totp (Request $ request )
76- {
77- $ token = $ request ->session ()->get ('authentication_token ' );
78- if (is_null ($ token ) || $ this ->auth ->guard ()->user ()) {
79- return redirect ()->route ('auth.login ' );
80- }
81-
82- return view ('auth.totp ' , ['verify_key ' => $ token ]);
83- }
84-
85- /**
86- * Handle a login where the user is required to provide a TOTP authentication
87- * token.
88- *
89- * @param \Illuminate\Http\Request $request
90- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response
91- *
92- * @throws \PragmaRX\Google2FA\Exceptions\IncompatibleWithGoogleAuthenticatorException
93- * @throws \PragmaRX\Google2FA\Exceptions\InvalidCharactersException
94- * @throws \PragmaRX\Google2FA\Exceptions\SecretKeyTooShortException
95- * @throws \Pterodactyl\Exceptions\DisplayException
96- */
97- public function loginUsingTotp (Request $ request )
98- {
99- if (is_null ($ request ->input ('verify_token ' ))) {
100- return $ this ->sendFailedLoginResponse ($ request );
101- }
102-
103- try {
104- $ cache = $ this ->cache ->pull ($ request ->input ('verify_token ' ), []);
105- $ user = $ this ->repository ->find (array_get ($ cache , 'user_id ' , 0 ));
106- } catch (RecordNotFoundException $ exception ) {
107- return $ this ->sendFailedLoginResponse ($ request );
108- }
109-
110- if (is_null ($ request ->input ('2fa_token ' ))) {
111- return $ this ->sendFailedLoginResponse ($ request , $ user );
112- }
113-
114- if (! $ this ->google2FA ->verifyKey (
115- $ this ->encrypter ->decrypt ($ user ->totp_secret ),
116- $ request ->input ('2fa_token ' ),
117- $ this ->config ->get ('pterodactyl.auth.2fa.window ' )
118- )) {
119- return $ this ->sendFailedLoginResponse ($ request , $ user );
120- }
121-
122- // If the user is using 2FA we do not actually log them in at this step, we return
123- // a one-time token to link the 2FA credentials to this account via the UI.
124- if ($ user ->use_totp ) {
125- $ token = str_random (128 );
126- $ this ->cache ->put ($ token , [
127- 'user_id ' => $ user ->id ,
128- 'request_ip ' => $ request ->ip (),
129- ], 5 );
130-
131- return response ()->json ([
132- 'complete ' => false ,
133- 'login_token ' => $ token ,
134- ]);
135- }
136-
137- return $ this ->sendLoginResponse ($ user , $ request );
138- }
139117}
0 commit comments