src/Controller/masteradminController/SecurityController.php line 42

Open in your IDE?
  1. <?php
  2. namespace App\Controller\masteradminController;
  3. use App\Controller\oAuthLoginController\LoginController;
  4. use App\Entity\User;
  5. use App\Entity\UserProfil;
  6. use App\Repository\FirebaseNotificationRepository;
  7. use App\Repository\UserRepository;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Psr\Log\LoggerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Cookie;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Mailer\MailerInterface;
  17. use Symfony\Component\Mime\Email;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  21. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  22. use Symfony\Component\Security\Core\Security;
  23. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  24. use Symfony\Component\Uid\Uuid;
  25. use Symfony\Contracts\HttpClient\HttpClientInterface;
  26. class SecurityController extends AbstractController
  27. {
  28.     #[Route(path'/login'name'app_login')]
  29.     public function login(AuthenticationUtils $authenticationUtilsRequest $request): Response
  30.     {
  31.         // if ($this->getUser()) {
  32.         //     return $this->redirectToRoute('target_path');
  33.         // }
  34.         // get the login error if there is one
  35.         $error $authenticationUtils->getLastAuthenticationError();
  36.         // last username entered by the user
  37.         $lastUsername $authenticationUtils->getLastUsername();
  38.         $loginError $request->hasSession() ? $request->getSession()->get('login_error''') : '';
  39.         $request->getSession()->remove('login_error');
  40.         return $this->render('security/login.html.twig',
  41.             [
  42.                 'last_username' => $lastUsername,
  43.                 'error' => $error,
  44.                 'login_error' => $loginError
  45.             ]
  46.         );
  47.     }
  48.     #[Route(path'/app-login'name'smartphone_app_login')]
  49.     public function app_login(Request $request,
  50.                               FirebaseNotificationRepository $firebaseNotificationRepository,
  51.                               TokenStorageInterface $tokenStorage,
  52.                               LoginController $loginController,
  53.                               LoggerInterface $logger): Response
  54.     {
  55.         $token $request->query->get('token');
  56.         $model $request->query->get('model');
  57.         $goUrl $request->query->get('goUrl');
  58.         $request->getSession()->set('appUser'true);
  59.         $logger->error('Token:' $token);
  60.         $logger->error('model:' $model);
  61.         $logger->error('goUrl:' $goUrl);
  62.         $url $_ENV["WEBSITE_URL"] . '/user/start';
  63.         $url2 $_ENV["WEBSITE_URL"] . '/logout';
  64.         $url3 $_ENV["WEBSITE_URL"] . '/user/firma/startseite/0/info';
  65.         if(strlen($goUrl) > 5) {
  66.             $url $goUrl;
  67.         }
  68.         if(strlen($token) < 10 || strlen($model) < 3) {
  69.             return $this->redirect($url);
  70.         }
  71.         $logger->error('erfolgreich 1');
  72.         $firebaseToken $firebaseNotificationRepository->findOneBy(['token' => $token]);
  73.         if($firebaseToken == null) {
  74.             return $this->redirect($url);
  75.         }
  76.         $logger->error('erfolgreich 2');
  77.         $differenz $firebaseToken->getDatum()->diff(new \DateTime('now', new \DateTimeZone('Europe/Berlin')));
  78.         if($differenz->days 365) {
  79.             return $this->redirect($url);
  80.         }
  81.         $logger->error('erfolgreich 3');
  82.         /*
  83.                 $deviceInformation = json_decode($firebaseToken->getDeviceInformation(), true);
  84.                 if($deviceInformation['model'] != $model) {
  85.                     return $this->redirectToRoute('user_start');
  86.                 }
  87.                 */
  88.         $tokenEinstellungen json_decode($firebaseToken->getEinstellungen(), true);
  89.         if($tokenEinstellungen['auto-login'] != 1) {
  90.             return $this->redirect($url2);
  91.         }
  92.         $logger->error('erfolgreich 4');
  93.         $request->getSession()->set('appUserTyp'$firebaseToken->getTyp());
  94.         //Login
  95.         $loginController->loginUser($firebaseToken->getUser(), $tokenStorage$request);
  96.         $request->getSession()->set('firebaseToken'$firebaseToken->getToken());
  97.         if(strlen($goUrl) < 6) {
  98.             if ($firebaseToken->getUser()->getFirmenProfil() != null) {
  99.                 $url $url3;
  100.             }
  101.         }
  102.         $logger->error('Login erfolgreich');
  103.         return $this->redirect($url);
  104.     }
  105.     #[Route(path'/login/registrierung'name'app_login_registrierung')]
  106.     public function registerAccount(Request                     $request,
  107.                                     UserRepository              $userRepository,
  108.                                     EntityManagerInterface      $entityManager,
  109.                                     UserPasswordHasherInterface $passwordHasherEncoder,
  110.                                     MailerInterface             $mailer,
  111.                                     UrlGeneratorInterface       $urlGenerator,
  112.                                     HttpClientInterface         $client): Response
  113.     {
  114.         $responseData = [];
  115.         $responseData['success'] = false;
  116.         $responseData['message'] = '';
  117.         //Validierung
  118.         $vorname $request->get('vorname');
  119.         $nachname $request->get('nachname');
  120.         $email $request->get('email');
  121.         $password $request->get('password');
  122.         $newsletter $request->get('newsletter');
  123.         if ($vorname == null || strlen($vorname) < 1) {
  124.             $responseData['message'] = 'Bitte Vorname angeben!';
  125.             return new JsonResponse($responseData);
  126.         }
  127.         if ($nachname == null || strlen($nachname) < 1) {
  128.             $responseData['message'] = 'Bitte Nachname angeben!';
  129.             return new JsonResponse($responseData);
  130.         }
  131.         if ($email == null || !filter_var($emailFILTER_VALIDATE_EMAIL)) {
  132.             $responseData['message'] = 'Bitte gültige E-Mail angeben!';
  133.             return new JsonResponse($responseData);
  134.         }
  135.         if ($password == null || strlen($password) < 6) {
  136.             $responseData['message'] = 'Bitte längeres Kennwort!';
  137.             return new JsonResponse($responseData);
  138.         }
  139.         if (!is_numeric($newsletter)) {
  140.             $newsletter 1;
  141.         }
  142.         //Validierung ReCaptcha
  143.         $recaptchaResponse $client->request('POST''https://www.google.com/recaptcha/api/siteverify', [
  144.             'body' => [
  145.                 'secret' => $_ENV["RECAPTCHA_SECRET"],
  146.                 'response' => $request->get('g-recaptcha-response')
  147.             ]
  148.         ])->toArray();
  149.         if ($recaptchaResponse['success'] !== true || $recaptchaResponse['hostname'] !== $_SERVER['SERVER_NAME']) {
  150.             $responseData['message'] = 'Bitte Captcha neu ausführen';
  151.             return new JsonResponse($responseData);
  152.         }
  153.         //TODO Check AGB
  154.         //Prüfe ob Email schon vergeben
  155.         $emailCheckUser $userRepository->findOneBy(['email' => $email]);
  156.         if ($emailCheckUser != null) {
  157.             $responseData['message'] = 'Diese E-Mail Adresse wurde bereits registriert!';
  158.             return new JsonResponse($responseData);
  159.         }
  160.         //Benutzer anlegen
  161.         $userID $this->kontoErstellen($vorname$nachname$email$password0$newsletter$userRepository$entityManager$passwordHasherEncoder);
  162.         $userNeu $userRepository->findOneBy(['id' => $userID]);
  163.         //Optin Email Versenden
  164.         $this->sendOptinEmail($userNeu$urlGenerator$mailer);
  165.         /*$optinLink = $urlGenerator->generate('login_registrierung_ok', ['guid' => $userNeu->getGuid()], UrlGeneratorInterface::ABSOLUTE_URL);
  166.         $email = (new Email())
  167.             ->from($_ENV["MAILER_SENDER"])
  168.             ->to($email)
  169.             ->subject('handwerkXcampus Bestätigungsemail')
  170.             ->html('<p>Bestätigungstext</p><br><a href="' . $optinLink . '">Bestätigungslink</a>');
  171.         $mailer->send($email);*/
  172.         $responseData['success'] = true;
  173.         return new JsonResponse($responseData);
  174.     }
  175.     #[Route(path'/login/registrierung/ok/{guid}'name'login_registrierung_ok')]
  176.     public function registrierungOK($guidUserRepository $userRepositoryEntityManagerInterface $entityManager): Response
  177.     {
  178.         $error '';
  179.         $guidRichtig $userRepository->findOneBy(['guid' => $guid]);
  180.         if ($guidRichtig != null) {
  181.             $guidRichtig->setFreigeschaltet(1);
  182.             $guidRichtig->setGuid(null);
  183.             $entityManager->persist($guidRichtig);
  184.             $entityManager->flush();
  185.         } else {
  186.             $error 'Falscher Bestätigungscode!';
  187.         }
  188.         return $this->render('security/registrierung_ok.html.twig', ['error' => $error]);
  189.     }
  190.     #[Route(path'/user/neue/mailadresse/{guid}'name'user_neue_mailadresse')]
  191.     public function login_neue_mailadresse($guidUserRepository $userRepositoryEntityManagerInterface $entityManager): Response
  192.     {
  193.         $error '';
  194.         $ergebnis '';
  195.         $user $userRepository->findOneBy(['guid' => $guid]);
  196.         if ($user != null) {
  197.             $neueMail $user->getAenderung();
  198.             $aenderungsIndex $user->getAenderungsindex();
  199.             if ($aenderungsIndex == 1) {
  200.                 $ergebnis 'Die neue E-Mail Adresse für den Login wurde übernommen.';
  201.                 $user->setEmail($neueMail);
  202.                 $user->setProvisorischerMitarbeiter(null);
  203.             }
  204.             $user->setAenderung(null);
  205.             $user->setAenderungsindex(null);
  206.             $user->setGuid(null);
  207.             $entityManager->persist($user);
  208.             $entityManager->flush();
  209.             if ($aenderungsIndex == 2) {
  210.                 $ergebnis 'Die neue Benachrichtigungs E-Mail Adresse wurde übernommen.';
  211.                 $userProfil $user->getUserProfil();
  212.                 $userProfil->setMailversand($neueMail);
  213.                 $entityManager->persist($userProfil);
  214.                 $entityManager->flush();
  215.             }
  216.         } else {
  217.             $error 'Falscher Bestätigungscode, oder Änderungen wurden bereits übernommen!';
  218.         }
  219.         return $this->render('security/neue_email_adresse.html.twig', ['error' => $error'ergebnis' => $ergebnis]);
  220.     }
  221.     public function sendOptinEmail(User $userUrlGeneratorInterface $urlGeneratorMailerInterface $mailer)
  222.     {
  223.         $optinLink $urlGenerator->generate('login_registrierung_ok', ['guid' => $user->getGuid()], UrlGeneratorInterface::ABSOLUTE_URL);
  224.         $emailHTML $this->render('emails/registrierung.html.twig', [
  225.             'preheader' => 'Bestätigung deiner Registrierung im handwerkXcampus',
  226.             'optinLink' => $optinLink,
  227.             'user' => $user,
  228.         ])->getContent();
  229.         $email = (new Email())
  230.             ->from($_ENV["MAILER_SENDER_NO_REPLY"])
  231.             ->to($user->getEmail())
  232.             ->subject('handwerkXcampus Registrierung')
  233.             ->html($emailHTML);
  234.         $mailer->send($email);
  235.     }
  236.     public function sendNeueMailadresseEmail(User $userUrlGeneratorInterface $urlGeneratorMailerInterface $mailer)
  237.     {
  238.         $optinLink $urlGenerator->generate('user_neue_mailadresse', ['guid' => $user->getGuid()], UrlGeneratorInterface::ABSOLUTE_URL);
  239.         $emailHTML $this->render('emails/neue_login_mailadresse.html.twig', [
  240.             'preheader' => 'Du möchtest deine E-Mail Adresse für den Login ändern?',
  241.             'optinLink' => $optinLink,
  242.             'user' => $user,
  243.         ])->getContent();
  244.         $email = (new Email())
  245.             ->from($_ENV["MAILER_SENDER_NO_REPLY"])
  246.             ->to($user->getAenderung())
  247.             ->subject('handwerkXcampus Änderung der Login E-Mail Adresse')
  248.             ->html($emailHTML);
  249.         $mailer->send($email);
  250.     }
  251.     public function sendNeueVersandmailadresseEmail(User $userUrlGeneratorInterface $urlGeneratorMailerInterface $mailer)
  252.     {
  253.         $optinLink $urlGenerator->generate('user_neue_mailadresse', ['guid' => $user->getGuid()], UrlGeneratorInterface::ABSOLUTE_URL);
  254.         $emailHTML $this->render('emails/neue_benachrichtigungs_mailadresse.html.twig', [
  255.             'preheader' => 'Du möchtest deine E-Mail Adresse für Benachrichtigungen ändern?',
  256.             'optinLink' => $optinLink,
  257.             'user' => $user,
  258.         ])->getContent();
  259.         $email = (new Email())
  260.             ->from($_ENV["MAILER_SENDER_NO_REPLY"])
  261.             ->to($user->getAenderung())
  262.             ->subject('handwerkXcampus Änderung der Benachrichtigungs E-Mail Adresse')
  263.             ->html($emailHTML);
  264.         $mailer->send($email);
  265.     }
  266.     public function sendKennwortVergessenEmail(User $userUrlGeneratorInterface $urlGeneratorMailerInterface $mailer)
  267.     {
  268.         $optinLink $urlGenerator->generate('user_kennwort_neu', ['guid' => $user->getGuid()], UrlGeneratorInterface::ABSOLUTE_URL);
  269.         $emailHTML $this->render('emails/kennwort_vergessen.html.twig', [
  270.             'preheader' => 'Du möchtest dein Kennwort für den handwerkXcampus zurücksetzen?',
  271.             'optinLink' => $optinLink,
  272.             'user' => $user,
  273.         ])->getContent();
  274.         $email = (new Email())
  275.             ->from($_ENV["MAILER_SENDER_NO_REPLY"])
  276.             ->to($user->getEmail())
  277.             ->subject('handwerkXcampus Kennwort zurücksetzen')
  278.             ->html($emailHTML);
  279.         $mailer->send($email);
  280.     }
  281.     #[Route(path'/user/kennwort/neu/{guid}'name'user_kennwort_neu')]
  282.     public function user_kennwort_neu($guidUserRepository $userRepositoryEntityManagerInterface $entityManager): Response
  283.     {
  284.         $user null;
  285.         $neueGuid null;
  286.         if ($guid == 'kennwort_neu') {
  287.             $neueGuid Uuid::v4();
  288.             $user $userRepository->findOneBy(['id' => $this->getUser()->getId()]);
  289.             if ($user == null) {
  290.                 return $this->redirectToRoute('user_start');
  291.             }
  292.             $user->setGuid($neueGuid);
  293.             $entityManager->persist($user);
  294.             $entityManager->flush();
  295.         } else {
  296.             $user $userRepository->findOneBy(['guid' => $guid]);
  297.             $neueGuid $user?->getGuid();
  298.         }
  299.         return $this->render('security/kennwort_zuruecksetzen.html.twig', ['user' => $user'guid' => $neueGuid]);
  300.     }
  301.     public function kontoErstellen($vorname$nachname$email$password$freigeschaltet$newsletter,
  302.                                    UserRepository $userRepository,
  303.                                    EntityManagerInterface $entityManager,
  304.                                    UserPasswordHasherInterface $passwordHasherEncoder): int
  305.     {
  306.         $datum = new \DateTime('now', new \DateTimeZone('Europe/Berlin'));
  307.         $user = new User();
  308.         $user->setEmail(strtolower($email));
  309.         $user->setFreigeschaltet($freigeschaltet);
  310.         $user->setGuid(Uuid::v4());
  311.         $user->setAngelegtAm($datum);
  312.         $user->setLetzterLogin($datum);
  313.         $user->setFirmenProfil(null);
  314.         $user->setZweiFaktor(0);
  315.         $user->setNeueRoles(null);
  316.         $hashedPassword '';
  317.         if (strlen($password) > 0) {
  318.             $hashedPassword $passwordHasherEncoder->hashPassword($user$password);
  319.         }
  320.         $user->setPassword($hashedPassword);
  321.         $user->setRoles((array)["ROLE_MITGLIED"]);
  322.         $entityManager->persist(($user));
  323.         $entityManager->flush();
  324.         $neueID $user->getId();
  325.         $userProfil = new UserProfil();
  326.         $userNeu $userRepository->findOneBy(['id' => $neueID]);
  327.         $userProfil->setUser($userNeu);
  328.         $userProfil->setVorname($vorname);
  329.         $userProfil->setNachname($nachname);
  330.         $userProfil->setMailversand(strtolower($email));
  331.         $userProfil->setNewsletter($newsletter);
  332.         $entityManager->persist(($userProfil));
  333.         $entityManager->flush();
  334.         return $neueID;
  335.     }
  336.     #[Route(path'/logout_intern'name'app_logout_intern')]
  337.     public function logout_intern(): void
  338.     {
  339.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  340.     }
  341.     #[Route(path'/logout'name'app_logout')]
  342.     public function logout (Request $request,  FirebaseNotificationRepository $firebaseNotificationRepositoryEntityManagerInterface $entityManager): RedirectResponse
  343.     {
  344.         $redirectResponse $this->redirectToRoute('app_logout_intern');
  345.         $firebaseToken $request->getSession()->get('firebaseToken');
  346.         if($firebaseToken != null) {
  347.             $firebaseTokenObj $firebaseNotificationRepository->findOneBy(['token' => $firebaseToken'user' => $this->getUser()]);
  348.             if($firebaseTokenObj != null) {
  349.                 $firebaseEinstellungen json_decode($firebaseTokenObj->getEinstellungen(), true);
  350.                 $firebaseEinstellungen['auto-login'] = 0;
  351.                 $firebaseTokenObj->setEinstellungen(json_encode($firebaseEinstellungen));
  352.                 $entityManager->persist($firebaseTokenObj);
  353.                 $entityManager->flush();
  354.                 $redirectResponse->headers->setCookie(Cookie::create('app_user'true));
  355.             }
  356.         }
  357.         return $redirectResponse;
  358.     }
  359.     #[Route(path'/after-logout'name'app_logout_after')]
  360.     public function after_logout (Request $request): RedirectResponse
  361.     {
  362.         if($request->cookies->get('app_user')) {
  363.             $request->getSession()->set('appUser'true);
  364.         }
  365.         return $this->redirectToRoute('user_start');
  366.     }
  367. }