src/User/SecurityController.php line 63

Open in your IDE?
  1. <?php
  2. namespace User;
  3. use Silex\Application;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Form\FormError;
  6. use User\Forms\PasswordForgetForm;
  7. use User\Forms\PasswordResetForm;
  8. use Support\ApiConnector;
  9. use Flagship\Components\Auth\Objects\Nonce;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  12. use User\Objects\User;
  13. class SecurityController
  14. {
  15.     public function getToggleLogin(Request $requestApplication $app)
  16.     {
  17.         //check what the session value is and replace it with the opposite language
  18.         $locale $app['session']->get('_locale') == 'en' 'fr' 'en';
  19.         $app['session']->set('_locale'$locale);
  20.         $app['translator']->setLocale($locale);
  21.         return $app->redirect($request->headers->get('referer'));
  22.     }
  23.     // public function getSsoLogin(Request $request, Application $app, $sso)
  24.     // {
  25.     //     list($userId, $nonce) = explode('|', $sso);
  26.     //     $impersonator = $request->query->get('impersonator', null);
  27.     //     if (!Nonce::verify($nonce, $app['smartship.private_key'].$userId.$impersonator.'ssologin', 1800)) {
  28.     //         return $app->abort(419);
  29.     //     }
  30.     //     $request->getSession()->set('_security_secured', null);
  31.     //     // We log the selected user in.
  32.     //     $app['security.user_provider.secured']->setSecurityProviderForUserId($userId);
  33.     //     $app['session']->set('_locale', $request->query->get('lang', 'en'));
  34.     //     $app['translator']->setLocale($request->query->get('lang', 'en'));
  35.     //     //in the event of there being an impersonator flag in the session when there shouldn't be one
  36.     //     if (!$request->query->has('impersonator') && $request->getSession()->has('_impersonator')) {
  37.     //         $request->getSession()->remove('_impersonator');
  38.     //     }
  39.     //     if ($request->query->has('impersonator')) {
  40.     //         $request->getSession()->set('_impersonator', $request->query->get('impersonator'));
  41.     //         // We make sure all URLS are now generated for that userID
  42.     //         $app['url_generator']->setCurrentImpersonate($userId);
  43.     //         // We save which client keys are useable in the session for the impersonator.
  44.     //         $app['security.user_provider.secured']->addAllowedToImpersonate($userId);
  45.     //         return $app->redirect($request->query->get('redirect', '/').'?impersonating='.$userId);
  46.     //     }
  47.     //     return $app->redirect($request->query->get('redirect', '/'));
  48.     // }
  49.     public function getPostPasswordForget(Request $requestApplication $app)
  50.     {
  51.         $inIframe $request->query->get('iframe') == 'true' 'true' 'false';
  52.         $form $app['form.factory']->createBuilder(PasswordForgetForm::class, null, ['app' => $app])
  53.             ->setAction($app['url_generator']->generate('security.get.password_forgot', ['iframe' => $inIframe]))
  54.             ->setMethod('post')
  55.             ->getForm();
  56.         $form->handleRequest($request);
  57.         if (!$form->isSubmitted() || !$form->isValid()) {
  58.             return $app['twig']->render('security/password_forgot.html.twig', ['form' => $form->createView()]);
  59.         }
  60.         $formData $form->getNormData();
  61.         $results $app['user.repositories.user']->findBy(['email_address' => $formData['email']]);
  62.         if (!$results) {
  63.             $form->get('email')->addError(new FormError($app['translator']->trans('This email is invalid', [], 'validators')));
  64.             return $app['twig']->render('security/password_forgot.html.twig', ['form' => $form->createView()]);
  65.         }
  66.         $user reset($results);
  67.         $app['helpers.apiheaders_service']->setUser($user);
  68.         $app['helpers.apiheaders_service']->setUserHeader($user['id']);
  69.         $ac = new ApiConnector($app);
  70.         $response $ac->post('/users/'.$user['id'].'/password-reset');
  71.         if ($response == false) {
  72.             return $app['twig']->render('security/password_forgot.html.twig', ['form' => $form->createView()]);
  73.         }
  74.         $app['session']->getFlashBag()->add('notifications', ['class' => 'success''message' => $app['translator']->trans('USER.GEN.CHECK_EMAIL')]);
  75.         return $app['twig']->render('security/password_forgot.html.twig', ['form' => $form->createView()]);
  76.     }
  77.     public function getPostPasswordReset(Request $requestApplication $app$key)
  78.     {
  79.         $results $app['user.repositories.forgot_password']->findBy(['unique_key' => $key]);
  80.         //redirect back to login page if the the key is invalid or the record has expired
  81.         if (!$results) {
  82.             $app['session']->getFlashBag()->add('notifications', ['class' => 'danger''message' => $app['translator']->trans('USER.ERROR.KEY_EXPIRED')]);
  83.             return $app->redirect($app['url_generator']->generate('user.login'));
  84.         }
  85.         if (date('Y-m-d H:i:s') > reset($results)['expires_at']) {
  86.             $app['session']->getFlashBag()->add('notifications', ['class' => 'danger''message' => $app['translator']->trans('USER.ERROR.KEY_EXPIRED')]);
  87.             $app['user.repositories.forgot_password']->delete(reset($results)['id']);
  88.             return $app->redirect($app['url_generator']->generate('user.login'));
  89.         }
  90.         $form $app['form.factory']->createBuilder(PasswordResetForm::class, null, [])
  91.             ->setAction($app['url_generator']->generate('security.get.password_reset', ['key' => $key]))
  92.             ->setMethod('post')
  93.             ->getForm();
  94.         $user $app['user.repositories.user']->find(reset($results)['user_id']);
  95.         $form->handleRequest($request);
  96.         if (!$form->isSubmitted() || !$form->isValid()) {
  97.             return $app['twig']->render('security/password_reset.html.twig', ['form' => $form->createView(), 'user' => $user]);
  98.         }
  99.         $data $form->getNormData();
  100.         $app['helpers.apiheaders_service']->setUser($user);
  101.         $app['helpers.apiheaders_service']->setUserHeader($user['id']);
  102.         $ac = new ApiConnector($app);
  103.         $response $ac->setPayload($data)->put('/users/'.$user['id'].'/edit');
  104.         if (!$response) {
  105.             return $app['twig']->render('security/password_reset.html.twig', ['form' => $form->createView(), 'user' => $user]);
  106.         }
  107.         $app['session']->getFlashBag()->add('notifications', ['class' => 'success''message' => $app['translator']->trans('USER.SUCCESS.RESET_PASSWORD')]);
  108.         //delete the record once the reset link has been used
  109.         $app['user.repositories.forgot_password']->delete(reset($results)['id']);
  110.         return $app->redirect($app['url_generator']->generate('user.login'));
  111.     }
  112.     public function postSwitchAccount(Request $requestApplication $app)
  113.     {
  114.         $newAccountId $request->request->get('company_id');
  115.         $userData $app['user']->getUser();
  116.         $newCompany $userData['companies'][$newAccountId] ?? null;
  117.         if (!$newCompany) {
  118.             return new Response(null401);
  119.         }
  120.         $request->getSession()->clear();
  121.         $userData array_merge($userData$newCompany);
  122.         $userData['password_hash'] = $app['user']->getPassword();
  123.         $request->getSession()->set('_security_secured'null);
  124.         $newUser = new User($userData);
  125.         $token = new UsernamePasswordToken($newUsernull'secured'$newUser->getRoles());
  126.         $app['security.token_storage']->setToken($token);
  127.         $app['session']->set('_security_secured'serialize($token));
  128.         return $app->redirect($app['url_generator']->generate('homepage'));
  129.     }
  130. }