src/Controller/RegistrierungController.php line 627

  1. <?php
  2. namespace App\Controller;
  3. use App\AppHelper\Helper;
  4. use App\AppHelper\Settings;
  5. use App\Entity\EmailTemplates;
  6. use App\Entity\SentEmails;
  7. use App\Entity\SystemSettings;
  8. use App\Entity\User;
  9. use App\Entity\UserDetails;
  10. use App\Entity\UserRegister;
  11. use App\PhpMailer\Templates;
  12. use App\Services\SiteLogManager;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use ImagickException;
  15. use PHPMailer\PHPMailer\Exception;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  18. use Symfony\Component\Form\Extension\Core\Type\PasswordType;
  19. use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
  20. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  21. use Symfony\Component\Form\Extension\Core\Type\TextType;
  22. use Symfony\Component\HttpFoundation\Request;
  23. use Symfony\Component\HttpFoundation\RequestStack;
  24. use Symfony\Component\HttpFoundation\Response;
  25. use Symfony\Component\HttpKernel\KernelInterface;
  26. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  27. use Symfony\Component\Routing\Annotation\Route;
  28. use Symfony\Component\Uid\Ulid;
  29. use Symfony\Component\Uid\UuidV1;
  30. use Symfony\Component\Validator\Constraints\Email;
  31. use Symfony\Component\Validator\Constraints\Length;
  32. use Symfony\Component\Validator\Constraints\NotBlank;
  33. use Symfony\Component\Validator\Validator\ValidatorInterface;
  34. use Symfony\Contracts\Translation\TranslatorInterface;
  35. #[Route('/register'name'app_register')]
  36. class RegistrierungController extends AbstractController
  37. {
  38.     use Settings;
  39.     private array $site_settings;
  40.     public function __construct(
  41.         private readonly EntityManagerInterface $em,
  42.         private readonly KernelInterface        $kernel,
  43.         private RequestStack                    $requestStack,
  44.         private readonly TranslatorInterface    $translator,
  45.         private readonly SiteLogManager         $logger
  46.     )
  47.     {
  48.         $this->requestStack $requestStack;
  49.         $this->site_settings $this->em->getRepository(SystemSettings::class)->getSettings('site_settings')->record;
  50.     }
  51.     /**
  52.      * @throws Exception
  53.      * @throws ImagickException
  54.      */
  55.     #[Route('/registrierung'name'_account_register')]
  56.     public function register_user(Request $requestUserPasswordHasherInterface $passEncoderValidatorInterface $validator): Response
  57.     {
  58.         $siteSettings $this->em->getRepository(SystemSettings::class)->getSettings('site_settings')->record;
  59.         $emailSettings $this->em->getRepository(SystemSettings::class)->getSettings('email_settings')->record;
  60.         $helper Helper::instance();
  61.         if (!$siteSettings['registrierung_aktiv']) {
  62.             return $this->redirect($this->generateUrl('app_main'));
  63.         }
  64.         $regform $this->createFormBuilder()
  65.             ->add('email'EmailType::class, [
  66.                 'constraints' => [new NotBlank(), new Email(
  67.                     [
  68.                         'message' => $this->translator->trans('profil.The email {{ value }} is not a valid email address.'),
  69.                         'mode' => 'strict',
  70.                     ]
  71.                 )],
  72.             ])
  73.             ->add('register_btn'SubmitType::class)
  74.             ->getForm();
  75.         if ($siteSettings['registrierung_option'] != 1) {
  76.             $regform->add('passwort'RepeatedType::class, [
  77.                 'type' => PasswordType::class,
  78.                 'required' => true,
  79.                 'constraints' => [new NotBlank(),
  80.                     new Length([
  81.                             'min' => 8,
  82.                             'minMessage' => $this->translator->trans('profil.The password must be at least {{ limit }} characters long'),
  83.                         ]
  84.                     )],
  85.                 'first_options' => [
  86.                     'label' => $this->translator->trans('profil.Password') . ' <sup class="small-lg">(min 8)</sup>',
  87.                     'label_html' => true,
  88.                     'row_attr' => [
  89.                         'class' => 'form-floating pe-xl-2 mb-3 col-xl-6 col-12'
  90.                     ],
  91.                     'attr' => [
  92.                         'class' => 'no-blur',
  93.                         'placeholder' => $this->translator->trans('profil.Password'),
  94.                         'min' => 8,
  95.                     ],
  96.                 ],
  97.                 'second_options' => [
  98.                     'label' => $this->translator->trans('profil.Repeat password') . ' <sup class="small-lg">(min 8)</sup>',
  99.                     'label_html' => true,
  100.                     'row_attr' => [
  101.                         'class' => 'form-floating ps-xl-2 mb-3 col-xl-6 col-12'
  102.                     ],
  103.                     'attr' => [
  104.                         'class' => 'no-blur',
  105.                         'placeholder' => $this->translator->trans('profil.Repeat password'),
  106.                     ],
  107.                 ],
  108.             ]);
  109.         }
  110.         if ($siteSettings['form_firma_option'] != 1) {
  111.             $siteSettings['form_firma_option'] == $required false $required true;
  112.             $regform->add('company'TextType::class, [
  113.                 'required' => $required
  114.             ]);
  115.         }
  116.         if ($siteSettings['form_title_option'] != 1) {
  117.             $siteSettings['form_title_option'] == $required false $required true;
  118.             $regform->add('title'TextType::class, [
  119.                 'required' => $required
  120.             ]);
  121.         }
  122.         if ($siteSettings['form_name_option'] != 1) {
  123.             $siteSettings['form_name_option'] == $required false $required true;
  124.             $regform
  125.                 ->add('first_name'TextType::class, [
  126.                     'required' => $required
  127.                 ])
  128.                 ->add('last_name'TextType::class, [
  129.                     'required' => $required
  130.                 ]);
  131.         }
  132.         if ($siteSettings['form_street_hnr_option'] != 1) {
  133.             $siteSettings['form_street_hnr_option'] == $required false $required true;
  134.             $regform
  135.                 ->add('street'TextType::class, [
  136.                     'required' => $required
  137.                 ])
  138.                 ->add('hnr'TextType::class, [
  139.                     'required' => $required
  140.                 ]);
  141.         }
  142.         if ($siteSettings['form_zip_city_option'] != 1) {
  143.             $siteSettings['form_zip_city_option'] == $required false $required true;
  144.             $regform
  145.                 ->add('zip'TextType::class, [
  146.                     'required' => $required
  147.                 ])
  148.                 ->add('country'TextType::class, [
  149.                     'required' => $required
  150.                 ]);
  151.         }
  152.         if ($siteSettings['form_telefon_option'] != 1) {
  153.             $siteSettings['form_telefon_option'] == $required false $required true;
  154.             $regform->add('phone'TextType::class, [
  155.                 'required' => $required
  156.             ]);
  157.         }
  158.         if ($siteSettings['form_mobil_option'] != 1) {
  159.             $siteSettings['form_mobil_option'] == $required false $required true;
  160.             $regform->add('mobil'TextType::class, [
  161.                 'required' => $required
  162.             ]);
  163.         }
  164.         $regform->handleRequest($request);
  165.         if ($regform->isSubmitted() && $regform->isValid()) {
  166.             $appAdmin $this->em->getRepository(User::class)->findByRole('Admin');
  167.             if ($appAdmin) {
  168.                 $appAdmin $appAdmin[0];
  169.             }
  170.             $daten $regform->getData();
  171.             $checkEmail $this->em->getRepository(User::class)->findOneBy(['email' => $daten['email']]);
  172.             if ($checkEmail) {
  173.                 $this->addFlash('reg-error''E-Mail-Adresse "<span class="fw-semibold">' $daten['email'] . '</span>" schon vorhanden! ');
  174.                 return $this->render('registrierung/registrierung.html.twig', [
  175.                     'title' => $this->translator->trans('Registration'),
  176.                     'regForm' => $regform->createView(),
  177.                     'show' => true
  178.                 ]);
  179.             }
  180.             $user = new User();
  181.             $user->setRoles([$siteSettings['new_register_level']]);
  182.             $user->setEmail($daten['email']);
  183.             $user->setLocale('de_DE');
  184.             $user->setUuid(new UuidV1());
  185.             if ($siteSettings['registrierung_option'] == 1) {
  186.                 $daten['passwort'] = $helper->generate_callback_pw(1626);
  187.             }
  188.             $user->setPassword(
  189.                 $passEncoder->hashPassword($user$daten['passwort'])
  190.             );
  191.             if ($siteSettings['pw_leak_checker_aktiv']) {
  192.                 $user->setRawPassword($daten['passwort']);
  193.                 $errors $validator->validate($user);
  194.                 if (count($errors) > 0) {
  195.                     foreach ($errors as $err) {
  196.                         $this->addFlash('reg-error'$err->getMessage());
  197.                     }
  198.                     return $this->render('registrierung/registrierung.html.twig', [
  199.                         'title' => $this->translator->trans('Registration'),
  200.                         'regForm' => $regform->createView(),
  201.                         'show' => true
  202.                     ]);
  203.                 }
  204.             }
  205.             $aktiv true;
  206.             if ($siteSettings['registrierung_option'] != 4) {
  207.                 $aktiv false;
  208.             }
  209.             $must_validated false;
  210.             if ($siteSettings['registrierung_option'] == 3) {
  211.                 $must_validated true;
  212.             }
  213.             $userDetails = new UserDetails();
  214.             $userDetails->setImgId(0);
  215.             $userDetails->setRegisterIp($request->getClientIp());
  216.             if ($siteSettings['form_firma_option'] != 1) {
  217.                 $userDetails->setCompany($daten['company']);
  218.             }
  219.             if ($siteSettings['form_title_option'] != 1) {
  220.                 $userDetails->setTitle($daten['title']);
  221.             }
  222.             if ($siteSettings['form_name_option'] != 1) {
  223.                 $userDetails->setFirstName($daten['first_name']);
  224.                 $userDetails->setLastName($daten['last_name']);
  225.             }
  226.             if ($siteSettings['form_street_hnr_option'] != 1) {
  227.                 $userDetails->setStreet($daten['street']);
  228.                 $userDetails->setHnr($daten['hnr']);
  229.             }
  230.             if ($siteSettings['form_zip_city_option'] != 1) {
  231.                 $userDetails->setZip($daten['zip']);
  232.                 $userDetails->setCountry($daten['country']);
  233.             }
  234.             if ($siteSettings['form_telefon_option'] != 1) {
  235.                 $userDetails->setPhone($daten['phone']);
  236.             }
  237.             if ($siteSettings['form_mobil_option'] != 1) {
  238.                 $userDetails->setMobil($daten['mobil']);
  239.             }
  240.             $userDetails->setAktiv($aktiv);
  241.             $userDetails->setChangePw(true);
  242.             $userDetails->setMustValidated($must_validated);
  243.             $user->setUserdetails($userDetails);
  244.             $this->em->persist($user);
  245.             $this->em->flush();
  246.             $clientSecret $helper->generate_callback_pw(128064);
  247.             $uuid = new Ulid();
  248.             $id $uuid->toBase32();
  249.             $clientId $helper->generate_identifier($id);
  250.             $redirectUris = ['http://localhost:8080/callback'];
  251.             $grantTypes = ['authorization_code''refresh_token''client_credentials'];
  252.             $scope 'BASIC';
  253.             $oauth_aktiv 1;
  254.             $conn $this->em->getConnection();
  255.             try {
  256.                 $conn->insert('oauth2_client', [
  257.                     'identifier' => $clientId,
  258.                     'secret' => $clientSecret,
  259.                     'name' => $user->getEmail(),
  260.                     'redirect_uris' => implode(' '$redirectUris),
  261.                     'grants' => implode(' '$grantTypes),
  262.                     'scopes' =>$scope,
  263.                     'active' => $oauth_aktiv,
  264.                     'allow_plain_text_pkce' => 0,
  265.                 ]);
  266.             } catch (Exception $e){
  267.                 $this->em->remove($user);
  268.                 $this->em->flush();
  269.                 exit($e->getMessage());
  270.             }
  271.             if ($siteSettings['log_registrierung_aktiv']) {
  272.                 $msg sprintf('neue Registrierung: User: %s | IP: %s'$user->getEmail(), $userDetails->getRegisterIp());
  273.                 $this->logger->log_message('registrierung'$msg);
  274.             }
  275.             $flashMessage '';
  276.             if ($siteSettings['registrierung_option'] == 3) {
  277.                 $flashMessage '<p>Vielen Dank für die Registrierung. Ihr Account wird nach einer Überprüfung <b>aktiviert</b>. Viel Spaß und Erfolg auf unseren Seiten.</p>';
  278.                 if ($emailSettings['smtp_aktiv'] && $siteSettings['send_notification_aktiv'] && $siteSettings['notifications_email'] && $siteSettings['template_aktivierungs_link']) {
  279.                     $newUser $this->em->getRepository(User::class)->getUserProfil($user->getId());
  280.                     $newUser $helper->arrayToObject($newUser);
  281.                     $newUser->signature_id $siteSettings['signature_aktivierungs_link'];
  282.                     $newUser->template_id $siteSettings['template_aktivierungs_link'];
  283.                     $newUser->send_to_email $siteSettings['notifications_email'];
  284.                     $newUser->register_time date('d.m.Y') . ' um ' date('H:i:s') . ' Uhr';
  285.                     $newUser->clean_passwort $daten['passwort'];
  286.                     $newUser->betreff 'neue Anmeldung';
  287.                     $sendEmail = new Templates($this->em$this->kernel$this->logger);
  288.                     $sendEmail->send_email_template($newUser$request);
  289.                     if ($emailSettings['email_save_confirmation_admin']) {
  290.                         if ($appAdmin) {
  291.                             $admin_id $appAdmin->getId();
  292.                         } else {
  293.                             $admin_id 1;
  294.                         }
  295.                         $emailTemplate $this->em->getRepository(EmailTemplates::class)->find((int)$siteSettings['template_aktivierungs_link']);
  296.                         $saveContent $sendEmail->placeholder_data(html_entity_decode($emailTemplate->getContent()), $newUser$request);
  297.                         $saveEmail = new SentEmails();
  298.                         $saveEmail->setUserId($admin_id);
  299.                         $saveEmail->setType('system');
  300.                         $saveEmail->setSendFrom('system@app.de');
  301.                         $saveEmail->setSendTo($siteSettings['notifications_email']);
  302.                         $saveEmail->setBetreff($newUser->betreff);
  303.                         $saveEmail->setContent($helper->escape($saveContent['template']));
  304.                         $saveEmail->setIfShow(false);
  305.                         $this->em->persist($saveEmail);
  306.                         $this->em->flush();
  307.                     }
  308.                 }
  309.             }
  310.             if ($siteSettings['registrierung_option'] == || $siteSettings['registrierung_option'] == 2) {
  311.                 $helper Helper::instance();
  312.                 $sendCode $helper->generate_callback_pw(32016);
  313.                 $userRegister = new UserRegister();
  314.                 $userRegister->setUserId($user->getId());
  315.                 $userRegister->setRegistercode(sha1($sendCode));
  316.                 if ($emailSettings['smtp_aktiv'] && $siteSettings['notifications_email'] && $siteSettings['template_aktivierungs_link']) {
  317.                     $newUser $this->em->getRepository(User::class)->getUserProfil($user->getId());
  318.                     $newUser $helper->arrayToObject($newUser);
  319.                     if ($siteSettings['registrierung_option'] == 1) {
  320.                         $newUser->signature_id $siteSettings['signature_pw_link'];
  321.                         $newUser->template_id $siteSettings['template_pw_link'];
  322.                         $linkTime $siteSettings['passwort_erstellen_link_time'];
  323.                         $uri sprintf('%s/register/%s/passwort-erstellen'$helper->get_base_url($request), $sendCode);
  324.                         $newUser->register_passwort_link $uri;
  325.                         $userRegister->setCodeTime(strtotime(sprintf("+%d hour"$linkTime)));
  326.                         $flashMessage '<h5 class="card-title">Vielen Dank für Ihre Registrierung</h5>
  327.                                <hr>
  328.                                <p class="card-text px-5">
  329.                                 Ein Link zum Passwort erstellen wurde Ihnen per <b>E-Mail</b> gesendet.<br>
  330.                                 Sollten Sie keine E-Mail bekommen, überprüfen Sie Ihren Spam-Ordner!
  331.                                 </p>
  332.                                 <hr>
  333.                                 <div class="card-footer text-muted">
  334.                                 Der Link zum Passwort erstellen ist bis <b>' date("d.m.Y H:i"strtotime(sprintf("+%d hour"$linkTime))) . ' Uhr</b>
  335.                                 gültig.
  336.                                 </div>';
  337.                     }
  338.                     if ($siteSettings['registrierung_option'] == 2) {
  339.                         $newUser->signature_id $siteSettings['signature_aktivierungs_link'];
  340.                         $newUser->template_id $siteSettings['template_aktivierungs_link'];
  341.                         $linkTime $siteSettings['aktivierungs_link_time'];
  342.                         $uri sprintf('%s/register/%s/activate'$helper->get_base_url($request), $sendCode);
  343.                         $newUser->aktivierungs_link $uri;
  344.                         $userRegister->setCodeTime(strtotime(sprintf("+%d hour"$linkTime)));
  345.                         $flashMessage '<h5 class="card-title">Vielen Dank für Ihre Registrierung</h5>
  346.                                <hr>
  347.                                <p class="card-text px-5">
  348.                                 Ein Bestätigungslink wurde Ihnen per <b>E-Mail</b> gesendet.<br>
  349.                                 Bitte <b>bestätigen</b> Sie diesen Link! Sollten Sie keine
  350.                                 E-Mail bekommen, überprüfen Sie Ihren Spam-Ordner!
  351.                                 </p>
  352.                                 <hr>
  353.                                 <div class="card-footer text-muted">
  354.                                 Der Bestätigungslink ist bis <b>' date("d.m.Y H:i"strtotime(sprintf("+%d hour"$linkTime))) . ' Uhr</b>
  355.                                 gültig.
  356.                                 </div>';
  357.                     }
  358.                     $userRegister->setIsNew(1);
  359.                     $user->setRegister($userRegister);
  360.                     $this->em->persist($user);
  361.                     $this->em->flush();
  362.                     $newUser->send_to_email $user->getEmail();
  363.                     $newUser->register_time date('d.m.Y') . ' um ' date('H:i:s') . ' Uhr';
  364.                     $newUser->clean_passwort $daten['passwort'];
  365.                     $newUser->link_ablauf_zeit date('d.m.Y'$userRegister->getCodeTime()) . ' um ' date('H:i'$userRegister->getCodeTime());
  366.                     $sendEmail = new Templates($this->em$this->kernel$this->logger);
  367.                     $sendEmail->send_email_template($newUser$request);
  368.                     if ($siteSettings['send_notification_aktiv']) {
  369.                         $newUser->betreff 'neue Anmeldung';
  370.                         $newUser->send_to_email $siteSettings['notifications_email'];
  371.                         $sendEmail = new Templates($this->em$this->kernel$this->logger);
  372.                         $sendEmail->send_email_template($newUser$request);
  373.                     }
  374.                     if ($emailSettings['email_save_confirmation']) {
  375.                         if ($appAdmin) {
  376.                             $admin_id $appAdmin->getId();
  377.                         } else {
  378.                             $admin_id 1;
  379.                         }
  380.                         $template $siteSettings['template_aktivierungs_link'];
  381.                         if ($siteSettings['registrierung_option'] == 1) {
  382.                             $template $siteSettings['template_pw_link'];
  383.                         }
  384.                         $emailTemplate $this->em->getRepository(EmailTemplates::class)->find((int)$template);
  385.                         $saveContent $sendEmail->placeholder_data(html_entity_decode($emailTemplate->getContent()), $newUser$request);
  386.                         $content str_replace('[signature]'''$helper->escape($saveContent['template']));
  387.                         $setEmail strtolower($helper->generate_callback_pw(603));
  388.                         $saveEmail = new SentEmails();
  389.                         $saveEmail->setUserId($admin_id);
  390.                         $saveEmail->setType('system');
  391.                         $saveEmail->setSendFrom(sprintf('%s@app.de'$setEmail));
  392.                         $saveEmail->setSendTo($user->getEmail());
  393.                         $saveEmail->setBetreff($emailTemplate->getSubject());
  394.                         $saveEmail->setContent($content);
  395.                         $saveEmail->setIfShow(false);
  396.                         $this->em->persist($saveEmail);
  397.                         $this->em->flush();
  398.                     }
  399.                 }
  400.             }
  401.             if (!$siteSettings['registrierung_option'] == 4) {
  402.                 $flashMessage '<p>Vielen Dank für die Registrierung. Ihr Account wurde <b>aktiviert</b>. Viel Spaß und Erfolg auf unseren Seiten.</p>';
  403.             }
  404.             $this->addFlash('reg-success'$flashMessage);
  405.             return $this->render('registrierung/registrierung.html.twig', [
  406.                 'title' => $this->translator->trans('Registration'),
  407.                 'show' => false
  408.             ]);
  409.         }
  410.         return $this->render('registrierung/registrierung.html.twig', [
  411.             'title' => $this->translator->trans('Registration'),
  412.             'regForm' => $regform->createView(),
  413.             'show' => true
  414.         ]);
  415.     }
  416.     #[Route('/{hash}/passwort-erstellen'name'_app_email_passwort_erstellen')]
  417.     public function activate_by_passwort_erstellen(Request $requestUserPasswordHasherInterface $passEncoderValidatorInterface $validator): Response
  418.     {
  419.         $hash $request->get('hash');
  420.         $sshHash sha1($hash);
  421.         $regUser $this->em->getRepository(UserRegister::class)->findOneBy(['registercode' => $sshHash]);
  422.         if (!$regUser) {
  423.             $errMsg $this->translator->trans('system.The <b>link</b> is no longer valid. Contact the <b>administrator!</b>');
  424.             $this->addFlash('pw-create-error'$errMsg);
  425.             return $this->render('registrierung/formular-passwort-erstellen.html.twig', [
  426.                 'title' => $this->translator->trans('profil.Create password'),
  427.                 'name' => '',
  428.                 'show' => false
  429.             ]);
  430.         }
  431.         $regform $this->createFormBuilder()
  432.             ->add('email'EmailType::class, [
  433.                 'constraints' => [new NotBlank(), new Email(
  434.                     [
  435.                         'message' => $this->translator->trans('profil.The email {{ value }} is not a valid email address.'),
  436.                         'mode' => 'strict',
  437.                     ]
  438.                 )],
  439.                 'attr' => array(
  440.                     'autofocus' => true
  441.                 )
  442.             ])
  443.             ->add('passwort'RepeatedType::class, [
  444.                 'type' => PasswordType::class,
  445.                 'required' => true,
  446.                 'constraints' => [new NotBlank(),
  447.                     new Length([
  448.                             'min' => 8,
  449.                             'minMessage' => $this->translator->trans('profil.The password must be at least {{ limit }} characters long'),
  450.                         ]
  451.                     )],
  452.                 'first_options' => [
  453.                     'label' => $this->translator->trans('profil.Password') . ' <sup class="small-lg">(min 8)</sup>',
  454.                     'label_html' => true,
  455.                     'row_attr' => [
  456.                         'class' => 'form-floating mb-3'
  457.                     ],
  458.                     'attr' => [
  459.                         'class' => 'no-blur',
  460.                         'placeholder' => $this->translator->trans('profil.Password'),
  461.                         'min' => 8,
  462.                     ],
  463.                 ],
  464.                 'second_options' => [
  465.                     'label' => $this->translator->trans('profil.Repeat password') . ' <sup class="small-lg">(min 8)</sup>',
  466.                     'label_html' => true,
  467.                     'row_attr' => [
  468.                         'class' => 'form-floating mb-3'
  469.                     ],
  470.                     'attr' => [
  471.                         'class' => 'no-blur',
  472.                         'placeholder' => $this->translator->trans('profil.Repeat password'),
  473.                     ],
  474.                 ],
  475.             ])
  476.             ->add('register_btn'SubmitType::class, [
  477.                 'label' => '<i class="bi bi-incognito me-2"></i>' $this->translator->trans('profil.Create password'),
  478.                 'row_attr' => [
  479.                     'class' => 'mb-0'
  480.                 ],
  481.             ])
  482.             ->getForm();
  483.         $regform->handleRequest($request);
  484.         if ($regform->isSubmitted() && $regform->isValid()) {
  485.             $siteSettings $this->em->getRepository(SystemSettings::class)->getSettings('site_settings')->record;
  486.             $daten $regform->getData();
  487.             $regUser->getUser()->setPassword(
  488.                 $passEncoder->hashPassword($regUser->getUser(), $daten['passwort'])
  489.             );
  490.             if ($siteSettings['pw_leak_checker_aktiv']) {
  491.                 $regUser->getUser()->setRawPassword($daten['passwort']);
  492.                 $errors $validator->validate($regUser->getUser());
  493.                 if (count($errors) > 0) {
  494.                     foreach ($errors as $err) {
  495.                         $this->addFlash('pw-create-error'$err->getMessage());
  496.                     }
  497.                     return $this->render('registrierung/formular-passwort-erstellen.html.twig', [
  498.                         'title' => $this->translator->trans('profil.Create password'),
  499.                         'name' => $regUser->getUser()->getUserdetails()->getFirstName() . ' ' $regUser->getUser()->getUserdetails()->getLastName(),
  500.                         'show' => true,
  501.                         'createPwForm' => $regform->createView()
  502.                     ]);
  503.                 }
  504.             }
  505.             $regUser->getUser()->getUserdetails()->setAktiv(true);
  506.             $regUser->setRegistercode('');
  507.             $regUser->setCodeTime('');
  508.             $this->em->persist($regUser);
  509.             $this->em->flush();
  510.             $msg $this->translator->trans('system.The password was successfully saved and the account was activated.');
  511.             $this->addFlash('pw-create-success'$msg);
  512.             if ($siteSettings['log_passwort_erstellt_aktiv']) {
  513.                 $msg sprintf('Passwort erstellt: User: %s'$regUser->getUser()->getEmail());
  514.                 $this->logger->log_message('registrierung'$msg);
  515.             }
  516.             return $this->render('registrierung/formular-passwort-erstellen.html.twig', [
  517.                 'title' => $this->translator->trans('profil.Create password'),
  518.                 'name' => $regUser->getUser()->getUserdetails()->getFirstName() . ' ' $regUser->getUser()->getUserdetails()->getLastName(),
  519.                 'show' => false
  520.             ]);
  521.         }
  522.         return $this->render('registrierung/formular-passwort-erstellen.html.twig', [
  523.             'title' => $this->translator->trans('profil.Create password'),
  524.             'name' => $regUser->getUser()->getUserdetails()->getFirstName() . ' ' $regUser->getUser()->getUserdetails()->getLastName(),
  525.             'show' => true,
  526.             'createPwForm' => $regform->createView()
  527.         ]);
  528.     }
  529.     #[Route('/{hash}/activate'name'_app_email_user_activate')]
  530.     public function activate_by_hash(Request $request): Response
  531.     {
  532.         $hash $request->get('hash');
  533.         $sshHash sha1($hash);
  534.         $regUser $this->em->getRepository(UserRegister::class)->findOneBy(['registercode' => $sshHash]);
  535.         if (!$regUser) {
  536.             $errMsg $this->translator->trans('system.The <b>unlock</b> code is <b>no longer valid</b>. Please register again.');
  537.             $this->addFlash('validate-error'$errMsg);
  538.             return $this->render('registrierung/registrierung-activate.html.twig', [
  539.                 'title' => $this->translator->trans('system.Activate account'),
  540.                 'success' => false,
  541.             ]);
  542.         }
  543.         $siteSettings $this->em->getRepository(SystemSettings::class)->getSettings('site_settings')->record;
  544.         $linkTime $siteSettings['aktivierungs_link_time'];
  545.         $codeTime $regUser->getCodeTime();
  546.         $time strtotime(sprintf("%s +%s hour"date('d-m-Y H:i:s'$codeTime), $linkTime));
  547.         if ($time time()) {
  548.             $errMsg $this->translator->trans('system.The <b>link</b> is no longer valid. Contact the <b>administrator!</b>');
  549.             $this->addFlash('validate-error'$errMsg);
  550.             return $this->render('registrierung/registrierung-activate.html.twig', [
  551.                 'title' => $this->translator->trans('system.Activate account'),
  552.                 'success' => false,
  553.             ]);
  554.         }
  555.         $regUser->getUser()->getRegister()->setActivatedTime(time());
  556.         $regUser->getUser()->getRegister()->setRegistercode('');
  557.         $regUser->getUser()->getRegister()->setCodeTime('');
  558.         $regUser->getUser()->getUserdetails()->setAktiv(true);
  559.         $regUser->getUser()->getRegister()->setActivatedTime(time());
  560.         $regUser->getUser()->getRegister()->setRegistercode('');
  561.         $regUser->getUser()->getRegister()->setCodeTime('');
  562.         $this->em->persist($regUser);
  563.         $this->em->flush();
  564.         if ($siteSettings['log_konto_aktiviert_aktiv']) {
  565.             $msg sprintf('Konto aktiviert - %s - E-Mail bestätigt'$regUser->getUser()->getEmail());
  566.             $this->logger->log_message('registrierung'$msg);
  567.         }
  568.         return $this->render('registrierung/registrierung-activate.html.twig', [
  569.             'title' => $this->translator->trans('Activate'),
  570.             'success' => true,
  571.         ]);
  572.     }
  573.     /**
  574.      * @throws Exception
  575.      * @throws ImagickException
  576.      */
  577.     #[Route('/passwort-vergessen'name'_passwort_vergessen')]
  578.     public function passwort_vergessen(Request $request): Response
  579.     {
  580.         $siteSettings $this->em->getRepository(SystemSettings::class)->getSettings('site_settings')->record;
  581.         $emailSettings $this->em->getRepository(SystemSettings::class)->getSettings('email_settings')->record;
  582.         $helper Helper::instance();
  583.         if (!$siteSettings['show_pw_vergessen']) {
  584.             return $this->redirect($this->generateUrl('app_main'));
  585.         }
  586.         $regform $this->createFormBuilder()
  587.             ->add('email'EmailType::class, [
  588.                 'constraints' => [new NotBlank(), new Email(
  589.                     [
  590.                         'message' => $this->translator->trans('profil.The email {{ value }} is not a valid email address.'),
  591.                         'mode' => 'strict',
  592.                     ]
  593.                 )],
  594.                 'attr' => array(
  595.                     'autofocus' => true
  596.                 )
  597.             ])
  598.             ->add('register_btn'SubmitType::class, [
  599.                 'label' => '<i class="bi bi-envelope-plus me-2"></i>' $this->translator->trans('Send email')
  600.             ])
  601.             ->getForm();
  602.         $emailTemplate $this->em->getRepository(EmailTemplates::class)->find((int)$siteSettings['template_pw_vergessen']);
  603.         if (!$emailSettings['smtp_aktiv'] || !$emailTemplate) {
  604.             $errMsg $this->translator->trans('system.At the moment this service cannot be performed.');
  605.             $this->addFlash('pw-forgot-error'$errMsg);
  606.             return $this->render('registrierung/passwort-vergessen.html.twig', [
  607.                 'title' => $this->translator->trans('Password forgotten'),
  608.                 'show' => false,
  609.                 'pwForm' => $regform->createView(),
  610.             ]);
  611.         }
  612.         $regform->handleRequest($request);
  613.         if ($regform->isSubmitted() && $regform->isValid()) {
  614.             $appAdmin $this->em->getRepository(User::class)->findByRole('Admin');
  615.             if ($appAdmin) {
  616.                 $appAdmin $appAdmin[0];
  617.             }
  618.             $daten $regform->getData();
  619.             $user $this->em->getRepository(User::class)->findOneBy(['email' => $daten['email']]);
  620.             if (!$user) {
  621.                 $this->addFlash('pw-forgot-error'$this->translator->trans('system.The e-mail address is not known.'));
  622.                 return $this->render('registrierung/passwort-vergessen.html.twig', [
  623.                     'title' => $this->translator->trans('Password forgotten'),
  624.                     'show' => true,
  625.                     'pwForm' => $regform->createView()
  626.                 ]);
  627.             }
  628.             $linkTime $siteSettings['email_password_forgotten_time'];
  629.             $sendCode $helper->generate_callback_pw(32016);
  630.             $codeTime strtotime(sprintf("+%d hour"$linkTime));
  631.             if (!$user->getRegister()) {
  632.                 $newRegisterCode = new UserRegister();
  633.                 $newRegisterCode->setCodeTime($codeTime);
  634.                 $newRegisterCode->setPasswordcode(sha1($sendCode));
  635.                 $newRegisterCode->setUserId($user->getId());
  636.                 $newRegisterCode->setIsNew(false);
  637.                 $user->setRegister($newRegisterCode);
  638.             } else {
  639.                 $user->getRegister()->setCodeTime($codeTime);
  640.                 $user->getRegister()->setPasswordcode(sha1($sendCode));
  641.                 $user->getRegister()->setUserId($user->getId());
  642.             }
  643.             $this->em->persist($user);
  644.             $this->em->flush();
  645.             $sendUser $this->em->getRepository(User::class)->getUserProfil($user->getId());
  646.             $sendUser $helper->arrayToObject($sendUser);
  647.             $sendUser->signature_id $siteSettings['signature_pw_vergessen'];
  648.             $sendUser->template_id $siteSettings['template_pw_vergessen'];
  649.             $sendUser->send_to_email $user->getEmail();
  650.             $sendUser->link_ablauf_zeit date('d.m.Y'$user->getRegister()->getCodeTime()) . ' um ' date('H:i'$user->getRegister()->getCodeTime());
  651.             $uri sprintf('%s/register/%s/passwort-vergessen'$helper->get_base_url($request), $sendCode);
  652.             $sendUser->passwort_vergessen_link $uri;
  653.             $sendEmail = new Templates($this->em$this->kernel$this->logger);
  654.             $sendEmail->send_email_template($sendUser$request);
  655.             if ($emailSettings['email_save_confirmation']) {
  656.                 if ($appAdmin) {
  657.                     $admin_id $appAdmin->getId();
  658.                 } else {
  659.                     $admin_id 1;
  660.                 }
  661.                 $saveContent $sendEmail->placeholder_data(html_entity_decode($emailTemplate->getContent()), $sendUser$request);
  662.                 $saveContent str_replace('[signature]'''$helper->escape($saveContent['template']));
  663.                 $saveEmail = new SentEmails();
  664.                 $saveEmail->setUserId($admin_id);
  665.                 $saveEmail->setType('system');
  666.                 $saveEmail->setSendFrom('system@app.de');
  667.                 $saveEmail->setSendTo($user->getEmail());
  668.                 $saveEmail->setBetreff($emailTemplate->getSubject());
  669.                 $saveEmail->setContent($saveContent);
  670.                 $saveEmail->setIfShow(false);
  671.                 $this->em->persist($saveEmail);
  672.                 $this->em->flush();
  673.                 if ($siteSettings['log_konto_aktiviert_aktiv']) {
  674.                     $msg sprintf('Passwort vergessen - %s - E-Mail gesendet'$user->getEmail());
  675.                     $this->logger->log_message('registrierung'$msg);
  676.                 }
  677.             }
  678.             $flashMessage '<h5 class="card-title">Link zum Passwort ändern gesendet.</h5>
  679.                                <hr>
  680.                                <p class="card-text px-5">
  681.                                 Ein Link zum ändern des Passworts wurde Ihnen per <b>E-Mail</b> gesendet.
  682.                                 Sollten Sie keine E-Mail bekommen, überprüfen Sie Ihren Spam-Ordner!
  683.                                 </p>
  684.                                 <hr>
  685.                                 <div class="card-footer border rounded text-center text-muted">
  686.                                 Der Link ist bis <b>' date("d.m.Y H:i"strtotime(sprintf("+%d hour"$linkTime))) . ' Uhr</b>
  687.                                 gültig.
  688.                                 </div>';
  689.             $this->addFlash('pw-forgot-success'$flashMessage);
  690.             return $this->render('registrierung/passwort-vergessen.html.twig', [
  691.                 'title' => $this->translator->trans('Password forgotten'),
  692.                 'pwForm' => $regform->createView(),
  693.                 'show' => false
  694.             ]);
  695.         }
  696.         return $this->render('registrierung/passwort-vergessen.html.twig', [
  697.             'title' => $this->translator->trans('Password forgotten'),
  698.             'pwForm' => $regform->createView(),
  699.             'show' => true
  700.         ]);
  701.     }
  702.     #[Route('/{hash}/passwort-vergessen'name'_form_passwort_vergessen')]
  703.     public function form_passwort_vergessen(Request $requestUserPasswordHasherInterface $passEncoderValidatorInterface $validator): Response
  704.     {
  705.         $regUser $this->em->getRepository(UserRegister::class)->findOneBy(['passwordcode' => sha1($request->get('hash'))]);
  706.         if (!$regUser) {
  707.             $errMsg $this->translator->trans('system.The <b>link</b> is no longer valid. Contact the <b>administrator!</b>');
  708.             $this->addFlash('pw-forgot-error'$errMsg);
  709.             return $this->render('registrierung/formular-passwort-vergessen.html.twig', [
  710.                 'title' => $this->translator->trans('Password forgotten'),
  711.                 'show' => false,
  712.                 'validate' => false,
  713.                 'name' => ''
  714.             ]);
  715.         }
  716.         $siteSettings $this->em->getRepository(SystemSettings::class)->getSettings('site_settings')->record;
  717.         $linkTime $siteSettings['email_password_forgotten_time'];
  718.         $codeTime $regUser->getCodeTime();
  719.         $time strtotime(sprintf("%s +%s hour"date('d-m-Y H:i:s'$codeTime), $linkTime));
  720.         if ($time time()) {
  721.             $errMsg $this->translator->trans('system.The <b>link</b> is no longer valid. Contact the <b>administrator!</b>');
  722.             $this->addFlash('pw-forgot-error'$errMsg);
  723.             $regUser->setPasswordcode('');
  724.             $regUser->setCodeTime('');
  725.             $this->em->persist($regUser);
  726.             $this->em->flush();
  727.             return $this->render('registrierung/formular-passwort-vergessen.html.twig', [
  728.                 'title' => $this->translator->trans('Password forgotten'),
  729.                 'show' => false,
  730.                 'validate' => false,
  731.                 'name' => ''
  732.             ]);
  733.         }
  734.         $regform $this->createFormBuilder()
  735.             ->add('passwort'RepeatedType::class, [
  736.                 'type' => PasswordType::class,
  737.                 'required' => true,
  738.                 'constraints' => [new NotBlank(),
  739.                     new Length([
  740.                             'min' => 8,
  741.                             'minMessage' => $this->translator->trans('profil.The password must be at least {{ limit }} characters long'),
  742.                         ]
  743.                     )],
  744.                 'first_options' => [
  745.                     'label' => $this->translator->trans('profil.Password') . ' <sup class="small-lg">(min 8)</sup>',
  746.                     'label_html' => true,
  747.                     'row_attr' => [
  748.                         'class' => 'form-floating mb-3'
  749.                     ],
  750.                     'attr' => [
  751.                         'class' => 'no-blur',
  752.                         'placeholder' => $this->translator->trans('profil.Password'),
  753.                         'min' => 8,
  754.                         'autofocus' => true
  755.                     ],
  756.                 ],
  757.                 'second_options' => [
  758.                     'label' => $this->translator->trans('profil.Repeat password') . ' <sup class="small-lg">(min 8)</sup>',
  759.                     'label_html' => true,
  760.                     'row_attr' => [
  761.                         'class' => 'form-floating mb-3'
  762.                     ],
  763.                     'attr' => [
  764.                         'class' => 'no-blur',
  765.                         'placeholder' => $this->translator->trans('profil.Repeat password'),
  766.                     ],
  767.                 ],
  768.             ])
  769.             ->add('register_btn'SubmitType::class, [
  770.                 'label' => '<i class="bi bi-incognito me-2"></i>' $this->translator->trans('profil.Change Password')
  771.             ])
  772.             ->getForm();
  773.         $regform->handleRequest($request);
  774.         if ($regform->isSubmitted() && $regform->isValid()) {
  775.             $siteSettings $this->em->getRepository(SystemSettings::class)->getSettings('site_settings')->record;
  776.             $daten $regform->getData();
  777.             $regUser->getUser()->setPassword(
  778.                 $passEncoder->hashPassword($regUser->getUser(), $daten['passwort'])
  779.             );
  780.             $name $regUser->getUser()->getUserdetails()->getFirstName() . ' ' $regUser->getUser()->getUserdetails()->getLastName();
  781.             if ($siteSettings['pw_leak_checker_aktiv']) {
  782.                 $regUser->getUser()->setRawPassword($daten['passwort']);
  783.                 $errors $validator->validate($regUser->getUser());
  784.                 if (count($errors) > 0) {
  785.                     foreach ($errors as $err) {
  786.                         $this->addFlash('pw-forgot-error'$err->getMessage());
  787.                     }
  788.                     return $this->render('registrierung/formular-passwort-vergessen.html.twig', [
  789.                         'title' => $this->translator->trans('Password forgotten'),
  790.                         'pwForgottenForm' => $regform->createView(),
  791.                         'show' => true,
  792.                         'validate' => false,
  793.                         'name' => $name
  794.                     ]);
  795.                 }
  796.             }
  797.             $regUser->setPasswordcode('');
  798.             $regUser->setCodeTime('');
  799.             $this->em->persist($regUser);
  800.             $this->em->flush();
  801.             if ($siteSettings['log_pw_change_aktiv']) {
  802.                 $msg sprintf('Passwort geändert - %s ',$regUser->getUser()->getEmail());
  803.                 $this->logger->log_message('registrierung'$msg);
  804.             }
  805.             return $this->render('registrierung/formular-passwort-vergessen.html.twig', [
  806.                 'title' => $this->translator->trans('Password forgotten'),
  807.                 'show' => false,
  808.                 'validate' => true,
  809.                 'name' => $name
  810.             ]);
  811.         }
  812.         $name $regUser->getUser()->getUserdetails()->getFirstName() . ' ' $regUser->getUser()->getUserdetails()->getLastName();
  813.         return $this->render('registrierung/formular-passwort-vergessen.html.twig', [
  814.             'title' => $this->translator->trans('Password forgotten'),
  815.             'pwForgottenForm' => $regform->createView(),
  816.             'show' => true,
  817.             'validate' => false,
  818.             'name' => $name
  819.         ]);
  820.     }
  821. }