LoginController.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Lib\Backend;
  4. use App\Models\AppSession;
  5. use App\Models\CompanyPro;
  6. use App\Models\PotentialPro;
  7. use App\Models\Pro;
  8. use App\Models\ProHrInvitation;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Cookie;
  11. class LoginController extends Controller
  12. {
  13. public function login(Request $request){
  14. return view('login');
  15. }
  16. public function sendSmsAuthToken(Request $request){
  17. $cellNumber = $request->get('cell_number');
  18. $cellNumber = preg_replace("/[^0-9]/", "", $cellNumber);
  19. // $request->validate([
  20. // 'g-recaptcha-response' => 'required|recaptcha'
  21. // ]);
  22. $javaResponse = $this->callJava($request, '/potentialPro/createAndSendSmsAuthToken', [
  23. 'cellNumber'=>$cellNumber
  24. ]);
  25. if(!$javaResponse['success']){
  26. return redirect()->back()->withInput($request->input())->with('message', $javaResponse['message']);
  27. }
  28. Cookie::queue('current_cell_number', $cellNumber, 300);
  29. return redirect()->to(route('confirm-auth-token'));
  30. }
  31. public function resendSmsAuthToken(Request $request){
  32. $cellNumber = $request->cookie('current_cell_number');
  33. $javaResponse = $this->callJava($request, '/potentialPro/createAndSendSmsAuthToken', [
  34. 'cellNumber'=>$cellNumber
  35. ]);
  36. if(!$javaResponse['success']){
  37. return $this->fail($javaResponse['message']);
  38. }
  39. return $this->pass();
  40. }
  41. public function confirmAuthToken(Request $request){
  42. $cellNumber = $request->cookie('current_cell_number');
  43. $maskedCellNumber = str_pad(substr($cellNumber, -4), strlen($cellNumber), '*', STR_PAD_LEFT);
  44. return view('confirm-auth-token',compact('maskedCellNumber'));
  45. }
  46. public function processConfirmAuthToken(Request $request){
  47. $confirmationToken = $request->get('confirmation_token');
  48. $cellNumber = $request->cookie('current_cell_number');
  49. $javaResponse = $this->callJava($request, '/potentialPro/confirmSmsAuthToken', [
  50. 'confirmationToken'=>$confirmationToken,
  51. 'cellNumber' => $cellNumber,
  52. ]);
  53. if(!$javaResponse['success']){
  54. return redirect()->back()->withInput($request->input())->with('message', $javaResponse['message']);
  55. }
  56. Cookie::queue('current_confirmation_token', $confirmationToken, 300);
  57. $potentialPro = PotentialPro::where('cell_number_confirmation_token', $confirmationToken)->first();
  58. //if potential pro -> account-setup
  59. if($potentialPro){
  60. return redirect()->to(route('account-setup'));
  61. }
  62. $existingPro = Pro::where('cell_number', $cellNumber)->first();
  63. $existingProAppSession = AppSession::where('pro_id', $existingPro->id)->where('two_step_sms_auth_token', $confirmationToken)->first();
  64. return redirect()->to(config('stag.authUrl').'/pro_log_in_with_session_key/'.$existingProAppSession->session_key);
  65. }
  66. public function accountSetup(Request $request){
  67. $cellNumber = $request->cookie('current_cell_number');
  68. $token = $request->cookie('current_confirmation_token');
  69. $potentialPro = PotentialPro::where('cell_number_confirmation_token', $token)->first();
  70. if(!$potentialPro){
  71. return redirect()->to(route('login'));
  72. }
  73. return view('account-setup');
  74. }
  75. //submitAccoutnSetup -> setup security questions //create the actual pro and log the pro in without security questions set
  76. public function submitAccountSetup(Request $request){
  77. $request->validate([
  78. 'first_name'=>'required',
  79. 'last_name'=>'required',
  80. 'email_address' => 'required|email',
  81. 'password'=>'required'
  82. ]);
  83. $cellNumber = $request->cookie('current_cell_number');
  84. $token = $request->cookie('current_confirmation_token');
  85. $potentialPro = PotentialPro::where('cell_number_confirmation_token', $token)->get();
  86. if(!$potentialPro){
  87. abort(404, 'Not found');
  88. }
  89. $javaResponse = $this->callJava($request, '/session/proLogInAsPotentialPro', [
  90. 'confirmationToken'=>$token,
  91. 'cellNumber' => $cellNumber,
  92. 'firstName' => $request->get('first_name'),
  93. 'lastName' => $request->get('last_name'),
  94. 'emailAddress' => $request->get('email_address'),
  95. 'password'=>$request->get('password'),
  96. ]);
  97. if(!$javaResponse['success']){
  98. return redirect()->back()->withInput($request->input())->with('message', $javaResponse['message']);
  99. }
  100. $proSessionKey = $javaResponse['data'];
  101. return redirect()->to(config('stag.authUrl').'/pro_log_in_with_session_key/'.$proSessionKey);
  102. }
  103. public function logInWithHrInvitationToken(Request $request, $hrInvitationToken){
  104. //check that token is available
  105. if(!$hrInvitationToken){
  106. return redirect()->to('/');
  107. }
  108. //check that token is valid
  109. $proHrInvitation = ProHrInvitation::where('invitation_token', $hrInvitationToken)->first();
  110. if(!$proHrInvitation || !$proHrInvitation->is_active){
  111. return redirect()->to('/');
  112. }
  113. //send auth token for company pro and return sessionKey and store session key in cookie
  114. $javaResponse = $this->callJava($request, '/potentialPro/createAndSendSmsAuthToken', [
  115. 'cellNumber'=>$proHrInvitation->pro->cell_number
  116. ]);
  117. if(!$javaResponse['success']){
  118. return redirect()->back()->withInput($request->input())->with('message', $javaResponse['message']);
  119. }
  120. Cookie::queue('current_cell_number', $proHrInvitation->pro->cell_number, 300);
  121. return redirect()->to(route('confirm-auth-token'));
  122. }
  123. public function logout(Request $request)
  124. {
  125. $api = new Backend();
  126. try {
  127. //$apiResponse = $api->get('session/logOut?sessionKey=' . $request->cookie('sessionKey'));
  128. $apiResponse = $api->sendRequest(
  129. 'session/logOut',
  130. 'GET',
  131. [
  132. 'headers' => [
  133. 'sessionKey' => $request->cookie('sessionKey')
  134. ]
  135. ]
  136. );
  137. $data = json_decode($apiResponse->getContents());
  138. if (!property_exists($data, 'success') || !$data->success) {
  139. //TODO: throw message to log
  140. throw new Exception('Failed to log out of backend');
  141. }
  142. } catch (Exception $e) {
  143. // TODO: Log message
  144. // TODO: Never fail on logout. Just delete cookie.
  145. } finally {
  146. Cookie::queue(Cookie::forget('sessionKey'));
  147. }
  148. return redirect()->route('login');
  149. }
  150. }