<?php
namespace User;
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Form\FormError;
use User\Forms\PasswordForgetForm;
use User\Forms\PasswordResetForm;
use Support\ApiConnector;
use Flagship\Components\Auth\Objects\Nonce;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use User\Objects\User;
class SecurityController
{
public function getToggleLogin(Request $request, Application $app)
{
//check what the session value is and replace it with the opposite language
$locale = $app['session']->get('_locale') == 'en' ? 'fr' : 'en';
$app['session']->set('_locale', $locale);
$app['translator']->setLocale($locale);
return $app->redirect($request->headers->get('referer'));
}
// public function getSsoLogin(Request $request, Application $app, $sso)
// {
// list($userId, $nonce) = explode('|', $sso);
// $impersonator = $request->query->get('impersonator', null);
// if (!Nonce::verify($nonce, $app['smartship.private_key'].$userId.$impersonator.'ssologin', 1800)) {
// return $app->abort(419);
// }
// $request->getSession()->set('_security_secured', null);
// // We log the selected user in.
// $app['security.user_provider.secured']->setSecurityProviderForUserId($userId);
// $app['session']->set('_locale', $request->query->get('lang', 'en'));
// $app['translator']->setLocale($request->query->get('lang', 'en'));
// //in the event of there being an impersonator flag in the session when there shouldn't be one
// if (!$request->query->has('impersonator') && $request->getSession()->has('_impersonator')) {
// $request->getSession()->remove('_impersonator');
// }
// if ($request->query->has('impersonator')) {
// $request->getSession()->set('_impersonator', $request->query->get('impersonator'));
// // We make sure all URLS are now generated for that userID
// $app['url_generator']->setCurrentImpersonate($userId);
// // We save which client keys are useable in the session for the impersonator.
// $app['security.user_provider.secured']->addAllowedToImpersonate($userId);
// return $app->redirect($request->query->get('redirect', '/').'?impersonating='.$userId);
// }
// return $app->redirect($request->query->get('redirect', '/'));
// }
public function getPostPasswordForget(Request $request, Application $app)
{
$inIframe = $request->query->get('iframe') == 'true' ? 'true' : 'false';
$form = $app['form.factory']->createBuilder(PasswordForgetForm::class, null, ['app' => $app])
->setAction($app['url_generator']->generate('security.get.password_forgot', ['iframe' => $inIframe]))
->setMethod('post')
->getForm();
$form->handleRequest($request);
if (!$form->isSubmitted() || !$form->isValid()) {
return $app['twig']->render('security/password_forgot.html.twig', ['form' => $form->createView()]);
}
$formData = $form->getNormData();
$results = $app['user.repositories.user']->findBy(['email_address' => $formData['email']]);
if (!$results) {
$form->get('email')->addError(new FormError($app['translator']->trans('This email is invalid', [], 'validators')));
return $app['twig']->render('security/password_forgot.html.twig', ['form' => $form->createView()]);
}
$user = reset($results);
$app['helpers.apiheaders_service']->setUser($user);
$app['helpers.apiheaders_service']->setUserHeader($user['id']);
$ac = new ApiConnector($app);
$response = $ac->post('/users/'.$user['id'].'/password-reset');
if ($response == false) {
return $app['twig']->render('security/password_forgot.html.twig', ['form' => $form->createView()]);
}
$app['session']->getFlashBag()->add('notifications', ['class' => 'success', 'message' => $app['translator']->trans('USER.GEN.CHECK_EMAIL')]);
return $app['twig']->render('security/password_forgot.html.twig', ['form' => $form->createView()]);
}
public function getPostPasswordReset(Request $request, Application $app, $key)
{
$results = $app['user.repositories.forgot_password']->findBy(['unique_key' => $key]);
//redirect back to login page if the the key is invalid or the record has expired
if (!$results) {
$app['session']->getFlashBag()->add('notifications', ['class' => 'danger', 'message' => $app['translator']->trans('USER.ERROR.KEY_EXPIRED')]);
return $app->redirect($app['url_generator']->generate('user.login'));
}
if (date('Y-m-d H:i:s') > reset($results)['expires_at']) {
$app['session']->getFlashBag()->add('notifications', ['class' => 'danger', 'message' => $app['translator']->trans('USER.ERROR.KEY_EXPIRED')]);
$app['user.repositories.forgot_password']->delete(reset($results)['id']);
return $app->redirect($app['url_generator']->generate('user.login'));
}
$form = $app['form.factory']->createBuilder(PasswordResetForm::class, null, [])
->setAction($app['url_generator']->generate('security.get.password_reset', ['key' => $key]))
->setMethod('post')
->getForm();
$user = $app['user.repositories.user']->find(reset($results)['user_id']);
$form->handleRequest($request);
if (!$form->isSubmitted() || !$form->isValid()) {
return $app['twig']->render('security/password_reset.html.twig', ['form' => $form->createView(), 'user' => $user]);
}
$data = $form->getNormData();
$app['helpers.apiheaders_service']->setUser($user);
$app['helpers.apiheaders_service']->setUserHeader($user['id']);
$ac = new ApiConnector($app);
$response = $ac->setPayload($data)->put('/users/'.$user['id'].'/edit');
if (!$response) {
return $app['twig']->render('security/password_reset.html.twig', ['form' => $form->createView(), 'user' => $user]);
}
$app['session']->getFlashBag()->add('notifications', ['class' => 'success', 'message' => $app['translator']->trans('USER.SUCCESS.RESET_PASSWORD')]);
//delete the record once the reset link has been used
$app['user.repositories.forgot_password']->delete(reset($results)['id']);
return $app->redirect($app['url_generator']->generate('user.login'));
}
public function postSwitchAccount(Request $request, Application $app)
{
$newAccountId = $request->request->get('company_id');
$userData = $app['user']->getUser();
$newCompany = $userData['companies'][$newAccountId] ?? null;
if (!$newCompany) {
return new Response(null, 401);
}
$request->getSession()->clear();
$userData = array_merge($userData, $newCompany);
$userData['password_hash'] = $app['user']->getPassword();
$request->getSession()->set('_security_secured', null);
$newUser = new User($userData);
$token = new UsernamePasswordToken($newUser, null, 'secured', $newUser->getRoles());
$app['security.token_storage']->setToken($token);
$app['session']->set('_security_secured', serialize($token));
return $app->redirect($app['url_generator']->generate('homepage'));
}
}