src/Controller/SecurityController.php line 77

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: karg
  5.  * Date: 2019-03-27
  6.  * Time: 09:23
  7.  */
  8. namespace App\Controller;
  9. use App\Entity\School;
  10. use App\Entity\User;
  11. use App\Entity\UserHasSchool;
  12. use App\Form\ActivateType;
  13. use App\Form\CreateNewPasswordType;
  14. use App\Form\PasswordFormType;
  15. use App\Form\ProfileType;
  16. use App\Form\ResetPasswordType;
  17. use App\Form\TempPasswordChangeType;
  18. use App\Repository\UserHasSchoolRepository;
  19. use App\Repository\UserRepository;
  20. use Doctrine\ORM\NonUniqueResultException;
  21. use Knp\Menu\MenuItem;
  22. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  23. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  24. use Symfony\Component\HttpFoundation\Request;
  25. use Symfony\Component\HttpFoundation\Response;
  26. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  27. use Symfony\Component\Mailer\MailerInterface;
  28. use Symfony\Component\Mime\Address;
  29. use Symfony\Component\Routing\Annotation\Route;
  30. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  31. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  32. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  33. class SecurityController extends AbstractController
  34. {
  35.     public string $logo;
  36.     public function __construct()
  37.     {
  38.         $logo "/img/logo_" $_ENV["APP_STATE_COUNTRY"] . ".jpg";
  39.         $this->logo = \file_exists("../public" $logo) ? $logo "/img/logo.svg";
  40.     }
  41.     /**
  42.      * @Route("/login", name="login")
  43.      * @param AuthenticationUtils $authenticationUtils
  44.      * @return Response
  45.      */
  46.     public function index(AuthenticationUtils $authenticationUtils): Response
  47.     {
  48.         if ($this->getUser()) {
  49.             return $this->redirect('/');
  50.         }
  51.         // get the login error if there is one
  52.         $error $authenticationUtils->getLastAuthenticationError();
  53.         // last username entered by the user
  54.         $lastUsername $authenticationUtils->getLastUsername();
  55.         return $this->render('security/login.html.twig', [
  56.             'last_username' => $lastUsername,
  57.             'error' => $error,
  58.             'logo' => $this->logo,
  59.         ]);
  60.     }
  61.     /**
  62.      * @Route("/reset", name="reset")
  63.      * @param Request $request
  64.      * @param MailerInterface $mailer
  65.      * @return Response
  66.      * @throws TransportExceptionInterface
  67.      */
  68.     public function reset(Request $requestMailerInterface $mailer): Response
  69.     {
  70.         $form $this->createForm(ResetPasswordType::class);
  71.         $form->handleRequest($request);
  72.         if ($form->isSubmitted() && $form->isValid()) {
  73.             $em $this->getDoctrine()->getManager();
  74.             $user $em->getRepository(User::class)->loadUserByUsername($form->getData()['email']);
  75.             if (\is_object($user)) {
  76.                 // create token expiration date
  77.                 $hashCreatedAt = \date_create(\date('Y-m-d H:i:s'));
  78.                 $hashExpDate $hashCreatedAt->modify('+ 1 day');
  79.                 $user->setHashExpirationDate($hashExpDate);
  80.                 // create pw reset token
  81.                 $hash = \md5($user->getEmail() . $user->getCreatedAt()->format('Y-m-d H:i:s'));
  82.                 $user->setResetPasswordHash($hash);
  83.                 $em->persist($user);
  84.                 $em->flush();
  85.                 $email = (new TemplatedEmail())
  86.                     ->subject('Unser Schulessen - Setzen Sie Ihr Passwort zurück. ')
  87.                     ->from(new Address('bb@unser-schulessen.de''Unser Schulessen'))
  88.                     ->to($form->getData()['email'])
  89.                     ->htmlTemplate('emails/reset_password.html.twig')
  90.                     ->context(
  91.                         [
  92.                             'name' => $user->getDisplayName(),
  93.                             'user' => $user,
  94.                             'link' => $this->generateUrl('login_token', [
  95.                                 'token' => \md5(
  96.                                     $user->getEmail() . $user->getCreatedAt()->format('Y-m-d H:i:s')
  97.                                 )
  98.                             ], UrlGeneratorInterface::ABSOLUTE_URL)
  99.                         ]
  100.                     );
  101.                 $mailer->send($email);
  102.             }
  103.             $this->getSuccessMessage('Eine Mail mit dem Aktivierungslink für ein neues Passwort wurde an Sie verschickt.');
  104.             return $this->redirect('login');
  105.         }
  106.         return $this->render('security/reset.html.twig', [
  107.             'form' => $form->createView(),
  108.             'logo' => $this->logo,
  109.         ]);
  110.     }
  111.     /**
  112.      * @Route("/login/{token}", name="login_token")
  113.      * @param string $token
  114.      * @param Request $request
  115.      * @param UserPasswordEncoderInterface $encoder
  116.      * @return Response
  117.      * @throws NonUniqueResultException
  118.      */
  119.     public function createNewPassword(string $tokenRequest $requestUserPasswordEncoderInterface $encoder): Response
  120.     {
  121.         $em $this->getDoctrine()->getManager();
  122.         $user $em->getRepository(User::class)->findUserByToken($token);
  123.         $form $this->createForm(CreateNewPasswordType::class, $user);
  124.         $form->handleRequest($request);
  125.         $today = \date_create(\date('Y-m-d'));
  126.         // Check if hash is expired & if it belongs to an user
  127.         if (\is_object($user) && ! \is_null($user->getHashExpirationDate()) && $today <= $user->getHashExpirationDate()) {
  128.             if ($form->isSubmitted() && $form->isValid()) {
  129.                 //save new password
  130.                 $encoded $encoder->encodePassword($user$user->getPassword());
  131.                 $user->setPassword($encoded);
  132.                 $user->setResetPasswordHash(null);
  133.                 $user->setHashExpirationDate(null);
  134.                 $em->persist($user);
  135.                 $em->flush();
  136.                 $this->getSuccessMessage('Ihr neues Passwort wurde gespeichert. Sie können sich jetzt damit einloggen.');
  137.                 return $this->redirectToRoute('login');
  138.             }
  139.             return $this->render('security/create_password.html.twig', [
  140.                 'form' => $form->createView(),
  141.                 'logo' => $this->logo,
  142.             ]);
  143.         }
  144.         $this->getErrorMessage(
  145.             'Zeit zum Passwort zurücksetzen überschritten oder falschen Link in Adressleiste eingegeben. 
  146.             Überprüfen sie den Link oder lassen Sie einen neuen generieren.'
  147.         );
  148.         return $this->redirectToRoute('login');
  149.     }
  150.     /**
  151.      * @IsGranted("ROLE_USER")
  152.      * @Route("/profile", name="profile")
  153.      * @param Request $request
  154.      * @param MenuItem $menu
  155.      * @return Response
  156.      */
  157.     public function profile(Request $requestMenuItem $menu): Response
  158.     {
  159.         $menu['dashboard']->addChild("Profil", [
  160.             'route' => 'profile'
  161.         ]);
  162.         $user $this->getUser();
  163.         $form $this->createForm(ProfileType::class, $user->getPerson(), []);
  164.         $form->handleRequest($request);
  165.         if ($form->isSubmitted() && $form->isValid()) {
  166.             $this->getSuccessMessage('Ihr Profil wurde erfolgreich gespeichert');
  167.             /*
  168.             if (! empty($form->get('profile')->get('new_password')->getData())) {
  169.                 $user->setPassword($encoder->encodePassword($user, $form->get('user')->get('new_password')->getData()));
  170.             }*/
  171.             $entityManager $this->getDoctrine()->getManager();
  172.             $entityManager->persist($user);
  173.             $entityManager->flush();
  174.             return $this->redirectToRoute('home');
  175.         }
  176.         return $this->render('security/profile.html.twig', [
  177.             'user' => $user,
  178.             'form' => $form->createView()
  179.         ]);
  180.     }
  181.     /**
  182.      * @IsGranted("ROLE_USER")
  183.      * @Route("/change-password", name="change_password")
  184.      * @param Request $request
  185.      * @param MenuItem $menu
  186.      * @param UserPasswordEncoderInterface $encoder
  187.      * @return Response
  188.      */
  189.     public function changePassword(Request $requestUserPasswordEncoderInterface $encoder): Response
  190.     {
  191.         $user $this->getUser();
  192.         $form $this->createForm(PasswordFormType::class, $user, []);
  193.         $form->handleRequest($request);
  194.         $oldPassword $form->get('oldPassword')->getData();
  195.         if ($form->isSubmitted() && $form->isValid() && $encoder->isPasswordValid($user$oldPassword)) {
  196.             $newPassword $encoder->encodePassword($user$form->get('newPassword')->getData());
  197.             $user->setPassword($newPassword);
  198.             $entityManager $this->getDoctrine()->getManager();
  199.             $entityManager->persist($user);
  200.             $entityManager->flush();
  201.             $this->getSuccessMessage('Ihr Passwort wurde erfolgreich gespeichert!');
  202.             return $this->redirectToRoute('home');
  203.         } elseif (! \is_null($oldPassword) && ! $encoder->isPasswordValid($user$oldPassword)) {
  204.             $this->getErrorMessage('Sie haben ihr altes Passwort falsch eingegeben!');
  205.         }
  206.         return $this->render('security/change_password.html.twig', [
  207.             'user' => $user,
  208.             'form' => $form->createView(),
  209.             'logo' => $this->logo,
  210.         ]);
  211.     }
  212.     /**
  213.      * @Route("/invitation/{token}/{user}/{school}", name="invitation")
  214.      * @param string $token
  215.      * @param User $user
  216.      * @param School $school
  217.      * @param Request $request
  218.      * @param UserPasswordEncoderInterface $encoder
  219.      * @return Response
  220.      * @throws NonUniqueResultException
  221.      */
  222.     public function invitation(
  223.         string $token,
  224.         User $user,
  225.         School $school,
  226.         Request $request,
  227.         UserPasswordEncoderInterface $encoder
  228.     ): Response {
  229.         /** @var UserRepository $ur */
  230.         $ur $this->getDoctrine()->getRepository(User::class);
  231.         /** @var UserHasSchoolRepository $uhsr */
  232.         $uhsr $this->getDoctrine()->getRepository(UserHasSchool::class);
  233.         $userByToken $ur->findUserByToken($token);
  234.         if ($user !== $userByToken) {
  235.             throw $this->createAccessDeniedException('User not match!');
  236.         }
  237.         $uhs $uhsr->find(['user' => $userByToken'school' => $school]);
  238.         $error null;
  239.         if (\is_null($uhs)) {
  240.             $error 'Die Einladung wurde zurückgezogen!';
  241.         } elseif ($uhs->getState() === UserHasSchool::STATE_ACCEPTED) {
  242.             $error 'Sie haben die Einladung bereits angenommen!';
  243.         } elseif ($uhs->getState() === UserHasSchool::STATE_REJECTED) {
  244.             $error 'Sie haben die Einladung bereits abgelehnt!';
  245.         } elseif ($user->getState() === User::STATE_BLOCKED) {
  246.             $error 'Sie wurden blockiert!';
  247.         }
  248.         if ($error) {
  249.             $this->getErrorMessage($error);
  250.             return $this->redirect('/login');
  251.         }
  252.         if ($user->getState() === User::STATE_NOT_ACTIVATED) {
  253.             $form $this->createForm(ActivateType::class, $user, []);
  254.             $form->handleRequest($request);
  255.             if ($form->isSubmitted() && $form->isValid()) {
  256.                 $user->setPassword($encoder->encodePassword($user$user->getPassword()));
  257.                 $user->setState(User::STATE_ACTIVE);
  258.                 $uhs->setRespondedAt(new \DateTime());
  259.                 $uhs->setState(UserHasSchool::STATE_ACCEPTED);
  260.                 $em $this->getDoctrine()->getManager();
  261.                 $em->flush();
  262.                 $this->getSuccessMessage('Ihr Account wurde erfolgreich aktiviert.');
  263.                 return $this->redirect('/login');
  264.             }
  265.         } elseif ($user->getState() === User::STATE_ACTIVE) {
  266.             // Form mit Buttons zum an und ablehnen rendern
  267.             if ($this->getUser()) {
  268.                 return $this->redirect('/');
  269.             }
  270.         }
  271.         return $this->render('security/invitation.html.twig', [
  272.             'user' => $user,
  273.             'school' => $school,
  274.             'form' => isset($form) ? $form->createView() : null,
  275.             'logo' => $this->logo,
  276.         ]);
  277.     }
  278.     /**
  279.      * @IsGranted("ROLE_USER")
  280.      * @Route("/change-temp-password", name="change_temp_password")
  281.      * @param Request $request
  282.      * @param MenuItem $menu
  283.      * @param UserPasswordEncoderInterface $encoder
  284.      * @return Response
  285.      */
  286.     public function changeTempPassword(Request $requestUserPasswordEncoderInterface $encoder): Response
  287.     {
  288.         $user $this->getUser();
  289.         $form $this->createForm(TempPasswordChangeType::class, $user, []);
  290.         $form->handleRequest($request);
  291.         if ($form->isSubmitted() && $form->isValid()) {
  292.             $newPassword $encoder->encodePassword($user$user->getNewPassword());
  293.             $user->setPassword($newPassword);
  294.             $user->setTempPassword(false);
  295.             $entityManager $this->getDoctrine()->getManager();
  296.             $entityManager->persist($user);
  297.             $entityManager->flush();
  298.             $this->getSuccessMessage('Ihr Passwort wurde erfolgreich gespeichert!');
  299.             return $this->redirectToRoute('home');
  300.         }
  301.         return $this->render('security/change_temp_password.html.twig', [
  302.             'user' => $user,
  303.             'form' => $form->createView(),
  304.             'logo' => $this->logo,
  305.         ]);
  306.     }
  307. }