src/Controller/LoginController.php line 38

  1. <?php
  2. namespace App\Controller;
  3. use App\Controller\WebserviceController;
  4. use App\Entity\Auswahllisten;
  5. use App\Entity\Mailtexte;
  6. use App\Entity\News;
  7. use App\Entity\Portaleinstellungen;
  8. use App\Entity\Portalsettings;
  9. use App\Entity\Settings;
  10. use App\Entity\Texte;
  11. use App\Entity\User;
  12. use Doctrine\ORM\EntityManager;
  13. use Symfony\Bridge\Twig\Mime\BodyRenderer;
  14. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  15. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpFoundation\Session\Session;
  20. use Symfony\Component\Mailer\Mailer;
  21. use Symfony\Component\Mailer\MailerInterface;
  22. use Symfony\Component\Mailer\Transport;
  23. use Symfony\Component\Mime\Address;
  24. use Symfony\Component\Mime\Email;
  25. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  26. use Symfony\Component\Routing\Annotation\Route;
  27. use Symfony\Component\Security\Core\Signature\SignatureHasher;
  28. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  29. use Doctrine\ORM\EntityManagerInterface;
  30. use Doctrine\Persistence\ManagerRegistry;
  31. use Twig\Environment;
  32. use Twig\Loader\FilesystemLoader;
  33. use App\Service\PasswordValidator;
  34. use Symfony\Component\RateLimiter\RateLimiterFactory;
  35. use Symfony\Component\DependencyInjection\Attribute\Autowire;
  36. class LoginController extends AbstractController
  37. {
  38.     #[Route('/'name'login')]
  39.     public function index(AuthenticationUtils $authenticationUtilsRequest $requestManagerRegistry $doctrineEntityManagerInterface $entityManager): Response
  40.     {
  41.         // Settings
  42.         $o2FA                    $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "2fa"]);
  43.         $oWartung                $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "wartungsarbeiten"]);
  44.         $oOffline                $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalonline"]);
  45.         $oWartungText            $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalwartungtext"]);
  46.         $oOnlineText             $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalonlinetext"]);
  47.         $oAuth                   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierung"]);
  48.         $oAuthZ                  $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierungz"]);
  49.         $oOutput                 $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "output"]);
  50.         $oLinkWiderruf           $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "widerruf"]);
  51.         $oLinkImpressum          $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
  52.         $oLinkDatenschutz        $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
  53.         $oLinkSatzung            $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "satzung"]);
  54.         $oLinkBarrierefreiheit   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
  55.         $oZeigeBarrierefreiheit  $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheitanzeigen"]);
  56.         $oZaehlerstandMelden     $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "zaehlerstandmelden_abgemeldet"]);
  57.         $oCaptcha                $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "captcha"]);
  58.         // Portalsettings
  59.         $oZSMeldenAktivText      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlerstandsmeldung_aktiv_text"]);
  60.         $oZSMeldenAktivStart     $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlerstandsmeldung_aktiv_startdatum"]);
  61.         $oZSMeldenAktivEnde      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlerstandsmeldung_aktiv_enddatum"]);
  62.         $oLogo                   $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  63.         $oLogoGraustufen         $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen"]);
  64.         $oLogoSchwarzWeiss       $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss"]);
  65.         $oLogoDruckenDialog      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-print"]);
  66.         $oFavicon                $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "favicon"]);
  67.         $oLogoPositionStartseite $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-position-startseite"]);
  68.         $oAnzahlLogosStartseite  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "anzahl-logos-startseite"]);
  69.         
  70.         
  71.         // Texte
  72.         $aTexte                  $doctrine->getRepository(Texte::class)->findAll();
  73.         $oDatenschutzText        $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "datenschutz_text"]);
  74.         $oDatenschutzMail        $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "datenschutz_mail"]);
  75.         $oZaehlerMeldenText      $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "zaehler_melden_text"]);
  76.         $oBegriffPasswortVergessen $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "begriff_passwortvergessen"]);
  77.         // Auswahllisten
  78.         $aAuswahllisten          $doctrine->getRepository(Auswahllisten::class)->findBy(["type" => "abschlagsaenderung"]);
  79.         // Zustellarten
  80.         $aZustellarten           = array("Abruf im Kundenportal","Zustellung per E-Mail");
  81.         $oMailversand            $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "zaehlerstand-email-deaktiviert"]);
  82.         $bMailversand            true;
  83.         if($oMailversand && $oMailversand->getMetavalue() == "on")
  84.         {
  85.             $bMailversand false;
  86.         }
  87.         $session                 = new Session();
  88.         $oWebservice             = new WebserviceController();
  89.         $oClient                 null;
  90.         if($oWebservice->checkWsConnection($doctrine))
  91.         {
  92.             $oClient $oWebservice->getClient($doctrine);
  93.         }
  94.         $aAbrufarten = array();
  95.         if($oClient)
  96.         {
  97.             $aResult        $oClient->GetInitialData(array(
  98.                 "v_InitialData" => 1
  99.             ));
  100.             if($aResult->return_value)
  101.             {
  102.                 if(property_exists($aResult->v_InitialData"OutputCategoriesOM"))
  103.                 {
  104.                     if(property_exists($aResult->v_InitialData->OutputCategoriesOM"OutputCategoryOM"))
  105.                     {
  106.                         $aAbrufarten $aResult->v_InitialData->OutputCategoriesOM->OutputCategoryOM;
  107.                         if($aAbrufarten && !is_array($aAbrufarten))
  108.                         {
  109.                             $aAbrufarten= array($aAbrufarten);
  110.                         }
  111.                     }
  112.                 }
  113.             }
  114.         }
  115.         $oNachrichtenCheck $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "nachrichten-funktion"]);
  116.         $session->set('nachrichten-funktion',false);
  117.         if($oNachrichtenCheck)
  118.         {
  119.             if($oNachrichtenCheck->getMetavalue() == "on")
  120.             {
  121.                 $session->set('nachrichten-funktion'true);
  122.             }
  123.         }
  124.         $oNewsCheck $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "news-funktion"]);
  125.         $session->set('news-funktion',false);
  126.         $aTemp          = array();
  127.         $oNeuesteNews   false;
  128.         if($oNewsCheck)
  129.         {
  130.             if($oNewsCheck->getMetavalue() == "on")
  131.             {
  132.                 $session->set('news-funktion',true);
  133.                 $aNewsList  $doctrine->getRepository(News::class)->findBy([], ['start' => 'DESC']);
  134.                 foreach($aNewsList as $iKey => $oNews)
  135.                 {
  136.                     if($iKey == 0)
  137.                     {
  138.                         $oNeuesteNews $oNews;
  139.                     }
  140.                     if($oNews->getEnde())
  141.                     {
  142.                         if($oNews->getEnde() < new \DateTime())
  143.                         {
  144.                             continue;
  145.                         }
  146.                     }
  147.                     // wenn die News Ã¤lter als 1 Jahr sind, dann nicht mehr anzeigen
  148.                     if($oNews->getStart() < new \DateTime('-1 year'))
  149.                     {
  150.                         continue;
  151.                     }
  152.                     $aTemp[] = $oNews;
  153.                 }
  154.             }
  155.         }
  156.         $aNews $aTemp;
  157.         // $oInhalteController = new InhalteController;
  158.         // $aTexte             = $oInhalteController->getTexte($doctrine);
  159.         // Impressum
  160.         $sImpressum "";
  161.         if($oLinkImpressum)
  162.         {
  163.             $sImpressum $oLinkImpressum->getMetavalue();
  164.         }
  165.         $session->set('impressum',$sImpressum);
  166.         // Datenschutz
  167.         $sDatenschutz       "";
  168.         if($oLinkDatenschutz)
  169.         {
  170.             $sDatenschutz $oLinkDatenschutz->getMetavalue();
  171.         }
  172.         $session->set('datenschutz',$sDatenschutz);
  173.         // Satzung
  174.         $sSatzung "";
  175.         if($oLinkSatzung)
  176.         {
  177.             $sSatzung $oLinkSatzung->getMetavalue();
  178.         }
  179.         $session->set('satzung',$sSatzung);
  180.         // Barrierefreiheit
  181.         $sBarrierefreiheit  "";
  182.         if($oLinkBarrierefreiheit)
  183.         {
  184.             $sBarrierefreiheit $oLinkBarrierefreiheit->getMetavalue();
  185.         }
  186.         $session->set('barrierefreiheit',$sBarrierefreiheit);
  187.         // Status Barrierefreiheit anzeigen / nicht anzeigen
  188.         $sZeigeBarrierefreiheit "on";
  189.         if($oZeigeBarrierefreiheit)
  190.         {
  191.             $sZeigeBarrierefreiheit $oZeigeBarrierefreiheit->getMetavalue();
  192.         }
  193.         $session->set('barrierefreiheitanzeigen'$sZeigeBarrierefreiheit);
  194.         if(!$request->getSession())
  195.         {
  196.             $session->start();
  197.         }
  198.         // Laden des Kundenlogos, wenn vorhanden
  199.         if ($oLogo)
  200.         {
  201.             $session->set('logo'$oLogo->getMetavalue());
  202.         }
  203.         else
  204.         {
  205.             $session->set('logo''');
  206.         }
  207.         if($oLogoGraustufen)
  208.         {
  209.             $session->set('logo-graustufen'$oLogoGraustufen->getMetavalue());
  210.         }
  211.         else{
  212.             $session->set('logo-graustufen''');
  213.         }
  214.         if($oLogoSchwarzWeiss)
  215.         {
  216.             $session->set('logo-schwarzweiss'$oLogoSchwarzWeiss->getMetavalue());
  217.         }
  218.         else
  219.         {
  220.             $session->set('logo-schwarzweiss''');
  221.         }
  222.         if($oLogoDruckenDialog)
  223.         {
  224.             $session->set('logo-print'$oLogoDruckenDialog->getMetavalue());
  225.         }
  226.         else
  227.         {
  228.             $session->set('logo-print''');
  229.         }
  230.         if($oFavicon && $oFavicon->getMetavalue())
  231.         {
  232.             $session->set('favicon'$oFavicon->getMetavalue());
  233.         }
  234.         else
  235.         {
  236.             $session->set('favicon''');
  237.         }
  238.         // Anzahl der Logos auf Startseite ermitteln
  239.         $iAnzahlLogosStartseite 1;
  240.         if($oAnzahlLogosStartseite && $oAnzahlLogosStartseite->getMetavalue())
  241.         {
  242.             $iAnzahlLogosStartseite $oAnzahlLogosStartseite->getMetavalue();
  243.         }
  244.         // Logos & Satzungen
  245.         $aLogos     = array();
  246.         $aSatzungen = array();
  247.         // Verzeichnis der Logos
  248.         $sVerzeichnis "/customerdata/";
  249.         for($i 0$i $iAnzahlLogosStartseite$i++)
  250.         {
  251.             $sKeyname "";
  252.             if($i 0)
  253.             {
  254.                 $sKeyname "-" $i;
  255.             }
  256.             // Logos & Satzung ermitteln
  257.             $oLogo                  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo".$sKeyname]);
  258.             $oLogoGraustufen        $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen".$sKeyname]);
  259.             $oLogoSchwarzWeiss      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss".$sKeyname]);
  260.             $oLogoDruckenDialog     $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-print".$sKeyname]);
  261.             $oSatzung               $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "satzung".$sKeyname]);
  262.             // Logo Graustufen
  263.             $sLogoGraustufen "";
  264.             if($oLogoGraustufen && $oLogoGraustufen->getMetavalue())
  265.             {
  266.                 $sLogoGraustufen $sVerzeichnis $oLogoGraustufen->getMetavalue();
  267.             }
  268.             // Logo Schwarz-Weiss
  269.             $sLogoSchwarzWeiss "";
  270.             if($oLogoSchwarzWeiss && $oLogoSchwarzWeiss->getMetavalue())
  271.             {
  272.                 $sLogoSchwarzWeiss $sVerzeichnis $oLogoSchwarzWeiss->getMetavalue();
  273.             }
  274.             // Logo Drucken-Dialog
  275.             $sLogoDruckenDialog "";
  276.             if($oLogoDruckenDialog && $oLogoDruckenDialog->getMetavalue())
  277.             {
  278.                 $sLogoDruckenDialog $sVerzeichnis $oLogoDruckenDialog->getMetavalue();
  279.             }
  280.             // Logo Farbe
  281.             $sLogo "";
  282.             if($oLogo && $oLogo->getMetavalue())
  283.             {
  284.                 $sLogo $sVerzeichnis $oLogo->getMetavalue();
  285.                 // Fallbacks wenn Logos nicht vorhanden
  286.                 if(!$sLogoGraustufen)
  287.                 {
  288.                     $sLogoGraustufen $sLogo;
  289.                 }
  290.                 if(!$sLogoSchwarzWeiss)
  291.                 {
  292.                     $sLogoSchwarzWeiss $sLogo;
  293.                 }
  294.                 if(!$sLogoDruckenDialog)
  295.                 {
  296.                     $sLogoDruckenDialog $sLogo;
  297.                 }
  298.             }
  299.             // Satzung
  300.             $sSatzung "";
  301.             if($oSatzung && $oSatzung->getMetavalue())
  302.             {
  303.                 $sSatzung $oSatzung->getMetavalue();
  304.             }
  305.             $aSatzungen[] = $sSatzung;
  306.             $aLogos[] = array(
  307.                 "logo-farbe" => [
  308.                     'key'   => "logo".$sKeyname,
  309.                     'value' => $sLogo,
  310.                 ],
  311.                 "logo-graustufen" => [
  312.                     'key'   => "logo-graustufen".$sKeyname,
  313.                     'value' => $sLogoGraustufen,
  314.                 ],
  315.                 "logo-schwarzweiss" => [
  316.                     'key'   => "logo-schwarzweiss".$sKeyname,
  317.                     'value' => $sLogoSchwarzWeiss,
  318.                 ],
  319.                 "logo-print" => [
  320.                     'key'   => "logo-print".$sKeyname,
  321.                     'value' => $sLogoDruckenDialog,
  322.                 ],
  323.             );
  324.             // // Key f?r Linktext aller Fooerlogos ermitteln
  325.             // $sFooterLogoTextSlotKeyname = "footer_logo_text_slot_" . $i + 1;
  326.             // if(!array_key_exists($sFooterLogoTextSlotKeyname, $aTexte) || !$aTexte[$sFooterLogoTextSlotKeyname])
  327.             // {
  328.             //     $aTexte[$sFooterLogoTextSlotKeyname] = "Aktuelle Satzung";
  329.             // }
  330.         }
  331.         $session->set('texte',$aTexte);
  332.         $session->set('logos'$aLogos);
  333.         $session->set('satzungen'$aSatzungen);
  334.         if($oLogoPositionStartseite)
  335.         {
  336.             $session->set('logo-position-startseite'$oLogoPositionStartseite->getMetavalue());
  337.         }
  338.         $sZaehlerstandMelden "on";
  339.         if($oZaehlerstandMelden)
  340.         {
  341.             $sZaehlerstandMelden $oZaehlerstandMelden->getMetavalue();
  342.         }
  343.         $session->set('zaehlerstandmelden_abgemeldet'$sZaehlerstandMelden);
  344.         if(!empty($request->get('drucken')))
  345.         {
  346.             $session->set('zaehlerstandmelden_abgemeldet'false);
  347.         }
  348.         // Zählerstand inaktiv Text, Start- und Enddatum
  349.         $sZählerstandAktivText    "";
  350.         $sZählerstandAktivStart   "";
  351.         $sZählerstandAktivEnde    "";
  352.         if($oZSMeldenAktivText && trim($oZSMeldenAktivText->getMetavalue()))
  353.         {
  354.             $sZählerstandAktivText    $oZSMeldenAktivText->getMetavalue();
  355.         }
  356.         if($oZSMeldenAktivStart && trim($oZSMeldenAktivStart->getMetavalue()))
  357.         {
  358.             $sZählerstandAktivStart   $oZSMeldenAktivStart->getMetavalue();
  359.             $sZählerstandAktivText    str_replace("#startdatum#"$sZählerstandAktivStart$sZählerstandAktivText);
  360.         }
  361.         if($oZSMeldenAktivEnde && trim($oZSMeldenAktivEnde->getMetavalue()))
  362.         {
  363.             $sZählerstandAktivEnde    $oZSMeldenAktivEnde->getMetavalue();
  364.             $sZählerstandAktivText    str_replace("#enddatum#"$sZählerstandAktivEnde$sZählerstandAktivText);
  365.         }
  366.         $sZaehlerMeldenText 'Hier können Sie Ihre Zählerstände melden. Wenn Sie zu einem Zähler keinen Stand melden wollen, lassen Sie das Feld neuer Zählerstand bitte leer.';
  367.         if($oZaehlerMeldenText && !empty(trim($oZaehlerMeldenText->getMetavalue())))
  368.         {
  369.             $sZaehlerMeldenText $oZaehlerMeldenText->getMetavalue();
  370.         }
  371.         $bBegriffPasswortVergessen 'Passwort vergessen?';
  372.         if($oBegriffPasswortVergessen && !empty(trim($oBegriffPasswortVergessen->getMetavalue())))
  373.         {
  374.             $bBegriffPasswortVergessen $oBegriffPasswortVergessen->getMetavalue();
  375.         }
  376.         // Fallback Text
  377.         $sDatenschutzText   "Ich habe die Datenschutzerklärung zur Kenntnis genommen und stimme zu, dass meine personenbezogenen Daten entsprechend der Datenschutzerklärung verarbeitet werden. Hinweis: Sie können Ihre Einwilligung jederzeit für die Zukunft per E-Mail an #datenschutz_mail# widerrufen.";
  378.         // Fallback Mail
  379.         $sDatenschutzMail "kundenportal@msu-solutions.de";
  380.         // Text für Datenschutzerklärung
  381.         if($oDatenschutzText && $oDatenschutzText->getMetavalue())
  382.         {
  383.             $sDatenschutzText $oDatenschutzText->getMetavalue();
  384.         }
  385.         // E-Mail-Adresse für Datenschutzerklärung
  386.         if($oDatenschutzMail && $oDatenschutzMail->getMetavalue())
  387.         {
  388.             $sDatenschutzMail $oDatenschutzMail->getMetavalue();
  389.         }
  390.         $sDatenschutzMail   "<a href='mailto:".$sDatenschutzMail."'>".$sDatenschutzMail."</a>";
  391.         $sDatenschutzText   str_replace("#datenschutz_mail#"$sDatenschutzMail$sDatenschutzText);
  392.         // Widerruf
  393.         if($oLinkWiderruf)
  394.         {
  395.             $sLinkWiderruf "";
  396.             if($oLinkWiderruf->getMetavalue())
  397.             {
  398.                 $sLinkWiderruf $oLinkWiderruf->getMetavalue();
  399.             }
  400.             $sLinkWiderruf       "<a href='".$sLinkWiderruf."' target='_blank' title='Link zum Widerruf'>".$sLinkWiderruf."</a>";
  401.             $sDatenschutzText   str_replace("#widerruf#"$sLinkWiderruf$sDatenschutzText);
  402.         }
  403.         $sDatenschutzText str_replace("  "" "$sDatenschutzText);
  404.         // Wartungsarbeiten
  405.         $bWartung false;
  406.         if($oWartung->getMetavalue() && $oWartung->getMetavalue() == "on")
  407.         {
  408.             $bWartung true;
  409.         }
  410.         // Portal online/offline
  411.         $bOnline false;
  412.         if($oOffline && $oOffline->getMetavalue() == "on")
  413.         {
  414.             $bOnline true;
  415.         }
  416.         $aTemp  = array();
  417.         foreach($aTexte as $iKey => $oText)
  418.         {
  419.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  420.         }
  421.         $aTexte $aTemp;
  422.         $bShowHinweisLogin false;
  423.         if (!empty($aTexte['hinweis_startseite']) && !$session->get('hinweis_startseite_shown')) {
  424.             $bShowHinweisLogin true;
  425.             $session->set('hinweis_startseite_shown'true);
  426.         }
  427.         if(!array_key_exists("portalname",$aTexte))
  428.         {
  429.             $aTexte["portalname"] = "Wasserportal";
  430.         }
  431.         if(!array_key_exists("bezeichn_kundennummer_AuthwithHash",$aTexte))
  432.         {
  433.             $aTexte["bezeichn_kundennummer_AuthwithHash"] = "Kundennummer";
  434.         }
  435.         $session->set('texte',$aTexte);
  436.         $sEmail "";
  437.          // prüfen ob webid im request vorhanden ist und wenn ja user Ã¼ber die webid aus der datenbank ermitteln
  438.         if($request->get('webid'))
  439.         {
  440.             $oUser $doctrine->getRepository(User::class)->findOneBy(["webid" => $request->get('webid')]);
  441.             if($oUser)
  442.             {
  443.                 $sEmail $oUser->getEmail();
  444.             }
  445.         }
  446.         $oUser null;
  447.         if($this->getUser())
  448.         {
  449.             $oUser $doctrine->getRepository(User::class)->find($this->getUser()->getId());
  450.         }
  451.         if($oUser)
  452.         {
  453.             if(in_array("ROLE_ADMIN"$oUser->getRoles()))
  454.             {
  455.                 $session->set('nutzername',"AD");
  456.                 if(!empty($request->get('edit')))
  457.                 {
  458.                     $aReturn = array(
  459.                         'zustellarten'      => $aZustellarten,
  460.                         'impressum'         => $sImpressum,
  461.                         'datenschutz'       => $sDatenschutz,
  462.                         'barrierefreiheit'  => $sBarrierefreiheit,
  463.                         'satzung'           => $sSatzung,
  464.                         'auswahllisten'     => $aAuswahllisten,
  465.                         'error'             => '',
  466.                         'neu'               => '',
  467.                         'twofa'             => '',
  468.                         'auth'              => $oAuth,
  469.                         'authz'             => $oAuthZ,
  470.                         'output'            => $oOutput,
  471.                         'webservice'        => $oWebservice->checkWsConnection($doctrine),
  472.                         'abrufarten'        => $aAbrufarten,
  473.                         'texte'             => $aTexte,
  474.                         'email'             => $sEmail,
  475.                         'datenschutzText'   => $sDatenschutzText,
  476.                         'hinweis_startseite'=> $bShowHinweisLogin,
  477.                         'begriff_passwortvergessen' => $bBegriffPasswortVergessen,
  478.                     );
  479.                     return $this->render('login/index.html.twig'$aReturn);
  480.                 }
  481.                 $session->set('webservice'true);
  482.                 $oLogo              $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  483.                 $oLogoGraustufen    $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen"]);
  484.                 $oLogoSchwarzWeiss  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss"]);
  485.                 if($oLogo)
  486.                 {
  487.                     $session->set('logo'$oLogo->getMetavalue());
  488.                 }
  489.                 if($oLogoGraustufen)
  490.                 {
  491.                     $session->set('logo-graustufen'$oLogoGraustufen->getMetavalue());
  492.                 }
  493.                 if($oLogoSchwarzWeiss)
  494.                 {
  495.                     $session->set('logo-schwarzweiss'$oLogoSchwarzWeiss->getMetavalue());
  496.                 }
  497.                 return $this->redirectToRoute('dashboard');
  498.             }
  499.             else
  500.             {
  501.                 $iCustomerId $oUser->getKundennummer();
  502.                 if($oClient)
  503.                 {
  504.                     $aUserdata  $oClient->GetCustomerInternalsByNo(array('p_No' => $iCustomerId'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals->CustomerInternal;
  505.                     $sFirst     substr($aUserdata->Name01);
  506.                     $sLast      substr($aUserdata->Name201);
  507.                     $session->set('nutzername'$sFirst "" $sLast);
  508.                     $session->set('name'$aUserdata->Name " " $aUserdata->Name2);
  509.                     $session->set('webservice'true);
  510.                 }
  511.                 else
  512.                 {
  513.                     $session->set('webservice'false);
  514.                 }
  515.                 return $this->redirectToRoute('vertraege',["code" => $request->get('code')]);
  516.             }
  517.         }
  518.         $bCpatcha false;
  519.         if($oCaptcha)
  520.         {
  521.             if($oCaptcha->getMetavalue() == "on")
  522.             {
  523.                 $bCpatcha true;
  524.             }
  525.         }
  526.         $oPortalvariante $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "portalvariante"]);
  527.         $sPortalvariante "";
  528.         if ($oPortalvariante)
  529.         {
  530.             if ($oPortalvariante->getMetavalue() == "zaehlerstand")
  531.             {
  532.                 $sTargetAction 'zaehlerstand_melden';
  533.             }
  534.             else if ($oPortalvariante->getMetavalue() == "komplett")
  535.             {
  536.                 $sTargetAction 'komplett';
  537.             }
  538.             $sPortalvariante $oPortalvariante->getMetavalue();
  539.         }
  540.         // get the login error if there is one
  541.         $error $authenticationUtils->getLastAuthenticationError();
  542.         // last username entered by the user
  543.         $lastUsername $authenticationUtils->getLastUsername();
  544.         $aReturn = array(
  545.             'controller_name'           => 'LoginController',
  546.             'last_username'             => $lastUsername,
  547.             'error'                     => $error,
  548.             'zustellarten'              => $aZustellarten,
  549.             'abrufarten'                => $aAbrufarten,
  550.             'impressum'                 => $sImpressum,
  551.             'datenschutz'               => $sDatenschutz,
  552.             'satzung'                   => $sSatzung,
  553.             'target_action'             => $request->get('target_action') ? $request->get('target_action') : $sTargetAction,
  554.             'texte'                     => $aTexte,
  555.             'zaehlerstandAktivText'     => $sZählerstandAktivText,
  556.             'zaehlerstandAktivStart'    => $sZählerstandAktivStart,
  557.             'zaehlerstandAktivEnde'     => $sZählerstandAktivEnde,
  558.             'barrierefreiheit'          => $sBarrierefreiheit,
  559.             'portalvariante'            => $sPortalvariante,
  560.             'auswahllisten'             => $aAuswahllisten,
  561.             'wartungsarbeiten'          => $bWartung,
  562.             'online'                    => $bOnline,
  563.             'output'                    => $oOutput,
  564.             'webservice'                => $oWebservice->checkWsConnection($doctrine),
  565.             'datenschutzText'           => $sDatenschutzText,
  566.             'email'                     => $sEmail,
  567.             'captcha'                   => $bCpatcha,
  568.             'wartungstext'              => $oWartungText $oWartungText->getMetavalue() : '',
  569.             'onlinetext'                => $oOnlineText  $oOnlineText->getMetavalue()  : '',
  570.             'zaehlerMeldenText'         => $sZaehlerMeldenText,
  571.             'hinweis_startseite'        => $bShowHinweisLogin,
  572.             'begriff_passwortvergessen' => $bBegriffPasswortVergessen,
  573.         );
  574.         $b2FA   false;
  575.         // 2FA
  576.         if($o2FA->getMetavalue() && $o2FA->getMetavalue() == "on")
  577.         {
  578.             $b2FA true;
  579.         }
  580.         $aReturn["twofa"]       = $b2FA;
  581.         $aReturn["auth"]        = $oAuth;
  582.         $aReturn["authz"]       = $oAuthZ;
  583.         $aReturn["news"]        = $aNews;
  584.         $aReturn["neuestenews"] = $oNeuesteNews;
  585.         // Anzeige drucken Dialog
  586.         if($request->get('drucken'))
  587.         {
  588.             $aReturn["drucken"]     = true;
  589.             $aReturn["zaehler"]     = $request->get('zaehler');
  590.             $aReturn["ablesedatum"] = $request->get('ablesedatum');
  591.             $aReturn["ablesestand"] = $request->get('ablesestand');
  592.         }
  593.         return $this->render('login/index.html.twig'$aReturn);
  594.     }
  595.     #[Route('/passwort-vergessen/'name'passwort-vergessen')]
  596.     public function passwordForget(Request $requestManagerRegistry $doctrineEntityManagerInterface $entityManager,  UserPasswordHasherInterface $userPasswordHasher, #[Autowire(service'limiter.password_reset')] RateLimiterFactory $passwordResetLimiter)
  597.     {
  598.         $session = new Session();
  599.         if ($this->getUser())
  600.         {
  601.             return $this->redirectToRoute('dashboard');
  602.         }
  603.         $oWebservice            = new WebserviceController();
  604.         $oMailer                = new MailController();
  605.         $oMailer                $oMailer->getMailer($doctrine);
  606.         // Settings
  607.         $oLinkImpressum         $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
  608.         $oLinkDatenschutz       $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
  609.         $oLinkSatzung           $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "satzung"]);
  610.         $oLinkBarrierefreiheit  $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
  611.         $oZeigeBarrierefreiheit $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheitanzeigen"]);
  612.         // Portalsettings
  613.         $oLogo                  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  614.         $oFavicon               $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "favicon"]);
  615.         $oAbsender              $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  616.         // Texte
  617.         $aTexte                 $doctrine->getRepository(Texte::class)->findAll();
  618.         $oClient            null;
  619.         if($oWebservice->checkWsConnection($doctrine))
  620.         {
  621.             $oClient $oWebservice->getClient($doctrine);
  622.         }
  623.         $sImpressum "";
  624.         if($oLinkImpressum)
  625.         {
  626.             $sImpressum $oLinkImpressum->getMetavalue();
  627.         }
  628.         $session->set('impressum',$sImpressum);
  629.         $sDatenschutz "";
  630.         if($oLinkDatenschutz)
  631.         {
  632.             $sDatenschutz $oLinkDatenschutz->getMetavalue();
  633.         }
  634.         $session->set('datenschutz',$sDatenschutz);
  635.         // Satzung
  636.         $sSatzung "";
  637.         if($oLinkSatzung)
  638.         {
  639.             $sSatzung $oLinkSatzung->getMetavalue();
  640.         }
  641.         $session->set('satzung',$sSatzung);
  642.         $sBarrierefreiheit "";
  643.         if($oLinkBarrierefreiheit)
  644.         {
  645.             $sBarrierefreiheit $oLinkBarrierefreiheit->getMetavalue();
  646.         }
  647.         $session->set('barrierefreiheit',$sBarrierefreiheit);
  648.         // Status Barrierefreiheit anzeigen / nicht anzeigen
  649.         $sZeigeBarrierefreiheit "on";
  650.         if($oZeigeBarrierefreiheit)
  651.         {
  652.             $sZeigeBarrierefreiheit $oZeigeBarrierefreiheit->getMetavalue();
  653.         }
  654.         $session->set('barrierefreiheitanzeigen'$sZeigeBarrierefreiheit);
  655.         $aTemp  = array();
  656.         foreach($aTexte as $iKey => $oText)
  657.         {
  658.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  659.         }
  660.         $aTexte $aTemp;
  661.         if(!array_key_exists("portalname",$aTexte))
  662.         {
  663.             $aTexte["portalname"] = "Energieportal";
  664.         }
  665.         if($oFavicon && $oFavicon->getMetavalue())
  666.         {
  667.             $session->set('favicon'$oFavicon->getMetavalue());
  668.         }
  669.         else
  670.         {
  671.             $session->set('favicon''');
  672.         }
  673.         $session->set('texte',$aTexte);
  674.         $aReturn = array(
  675.             'error'             => "",
  676.             'impressum'         => $sImpressum,
  677.             'datenschutz'       => $sDatenschutz,
  678.             'satzung'           => $sSatzung,
  679.             'barrierefreiheit'  => $sBarrierefreiheit,
  680.             'texte'             => $aTexte
  681.         );
  682.         // CSS für Mailvorlage ermitteln
  683.         $sStyle     "";
  684.         $sFile      "css/email.css";
  685.         if(file_exists($sFile))
  686.         {
  687.             $sStyle file_get_contents($sFile);
  688.         }
  689.         $sFile      "css/customer.css";
  690.         if(file_exists($sFile))
  691.         {
  692.             $sStyle .= file_get_contents($sFile);
  693.         }
  694.         // Absender
  695.         $sFrom 'portal.support@msu-solutions.de';
  696.         if($oAbsender)
  697.         {
  698.             $sFrom trim($oAbsender->getMetavalue());
  699.         }
  700.         // Mailsignatur
  701.         $oInhalte  = new InhalteController();
  702.         $sSignatur $oInhalte->getMailSignatur($doctrine);
  703.         if($request->get('email'))
  704.         {
  705.             // SECURITY FIX: Finding 2.8 - Rate Limiting für Passwort-Reset
  706.             $limiter $passwordResetLimiter->create($request->get('email'));
  707.             if (false === $limiter->consume(1)->isAccepted()) {
  708.                 $this->addFlash(
  709.                     'error',
  710.                     'Sie haben zu viele Passwort-Reset-Anfragen gestellt. Bitte versuchen Sie es in einer Stunde erneut.'
  711.                 );
  712.                 return $this->redirectToRoute('passwort-vergessen');
  713.             }
  714.             $oUser $doctrine->getRepository(User::class)->findOneBy(["email" => $request->get('email')]);
  715.             if(!$oUser)
  716.             {
  717.                 $aReturn['error'] = "Bitte prüfen Sie Ihre Eingabe.";
  718.                 return $this->render('login/password-lost.html.twig'$aReturn);
  719.             }
  720.             $sHash substr(md5(time()), 010);
  721.             $sTokenDuration 3600 60;
  722.             $sTokenDuration += 120;
  723.             $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  724.             $oUser->setHash($sHash);
  725.             $oUser->setTokenduration($sTokenDuration);
  726.             $entityManager->persist($oUser);
  727.             $entityManager->flush();
  728.             // Empfänger
  729.             $sTo        trim($request->get('email'));
  730.             // Textvorlage
  731.             $oText      $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "password_reset_request"]);
  732.             $sText      "";
  733.             // Betreff
  734.             $sSubject   "Passwort vergessen";
  735.             $sAnrede    "";
  736.             if($oClient && $oUser->getKundennummer())
  737.             {
  738.                 $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $oUser->getKundennummer(), 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  739.                 if(property_exists($aResult"CustomerInternal"))
  740.                 {
  741.                     $aResult $aResult->CustomerInternal;
  742.                     if(is_array($aResult))
  743.                     {
  744.                         $sAnrede $aResult[0]->SalutationFormal;
  745.                     }
  746.                     else
  747.                     {
  748.                         $sAnrede $aResult->SalutationFormal;
  749.                     }
  750.                 }
  751.             }
  752.             if(!$sAnrede)
  753.             {
  754.                 // Standardanrede ermitteln
  755.                 $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  756.                 $sAnrede "Sehr geehrte Damen und Herren";
  757.                 if($oAnrede && $oAnrede->getMetavalue())
  758.                 {
  759.                     $sAnrede $oAnrede->getMetavalue();
  760.                 }
  761.             }
  762.             if($oText)
  763.             {
  764.                 // Betreff ermitteln
  765.                 if($oText->getBetreff())
  766.                 {
  767.                     $sSubject $oText->getBetreff();
  768.                 }
  769.                 // Inhalt ermitteln
  770.                 $sText $oText->getInhalt();
  771.             }
  772.             // URL
  773.             $sUrl   $_SERVER['REQUEST_SCHEME'] . '://' $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  774.             // HTML-Link
  775.             $sLink  $sUrl."?hash=".$sHash;
  776.             $sLink  '<a href="'$sLink .'" target="_blank" title="Passwort zurücksetzen">' $sLink '</a>';
  777.             $sText  str_replace("#anrede#"$sAnrede$sText);
  778.             $sText  str_replace("#link#"$sLink$sText);
  779.             $sText  str_replace("#tokenduration#"$sTokenDuration$sText);
  780.             $oMail = (new TemplatedEmail())
  781.                 ->from($sFrom)
  782.                 ->to($sTo)
  783.                 ->subject($sSubject)
  784.                 // path of the Twig template to render
  785.                 ->htmlTemplate('emails/password.html.twig')
  786.                 // pass variables (name => value) to the template
  787.                 ->context([
  788.                     "subject"   => $sSubject,
  789.                     "text"      => $sText,
  790.                     "style"     => $sStyle,
  791.                     "signatur"  => $sSignatur
  792.                 ]);
  793.             $loader             = new FilesystemLoader('../templates/');
  794.             $twigEnv            = new Environment($loader);
  795.             $twigBodyRenderer   = new BodyRenderer($twigEnv);
  796.             $twigBodyRenderer->render($oMail);
  797.             try
  798.             {
  799.                 $oMailer->send($oMail);
  800.                 $this->addFlash(
  801.                     'neu',
  802.                     "Sie erhalten in Kürze eine E-Mail mit Informationen zum Zurücksetzen Ihres Passwortes. Bitte prüfen Sie auch den Posteingang in Ihrem Spam-Ordner."
  803.                 );
  804.             }
  805.             catch(\Exception $exception)
  806.             {
  807.                 $this->addFlash(
  808.                     'error',
  809.                     "Die Mail konnte leider nicht versendet werden."
  810.                 );
  811.             }
  812.             return $this->redirectToRoute('login');
  813.         }
  814.         if($request->get('hash'))
  815.         {
  816.             $sHash $request->get('hash');
  817.             $oUser $doctrine->getRepository(User::class)->findOneBy(["hash" => $sHash]);
  818.             if($oUser)
  819.             {
  820.                 // Prüfung Token-Laufzeit
  821.                 $sTokenDuration          $oUser->getTokenduration();
  822.                 $sTokenDurationTimestamp strtotime("- 120 minutes"strtotime($sTokenDuration));
  823.                 if(time() > $sTokenDurationTimestamp)
  824.                 {
  825.                     $oUser->setTokenduration(null);
  826.                     $entityManager->persist($oUser);
  827.                     $entityManager->flush();
  828.                     $this->addFlash(
  829.                         'error',
  830.                         "Der Link zum Zurücksetzen Ihres Passworts ist abgelaufen."
  831.                     );
  832.                     return $this->redirectToRoute('login');
  833.                 }
  834.                 $aReturn['newpassword'] = $request->get('hash');
  835.             }
  836.             return $this->render('login/password-lost.html.twig'$aReturn);
  837.         }
  838.         if($request->get('password-first') == $request->get('password-second') AND !empty($request->get('password-first')))
  839.         {
  840.             // SECURITY FIX: Finding 2.10 - Serverseitige Passwort-Policy
  841.             $passwordValidation PasswordValidator::validate($request->get('password-first'));
  842.             if (!$passwordValidation['valid']) {
  843.                 $this->addFlash('error'$passwordValidation['error']);
  844.                 return $this->redirectToRoute('passwort-vergessen', ['newhash' => $request->get('newhash')]);
  845.             }
  846.             $oUser $doctrine->getRepository(User::class)->findOneBy(["hash" => $request->get("newhash")]);
  847.             $this->addFlash(
  848.                 'neu',
  849.                 'Das Passwort wurde gespeichert. Sie können sich nun anmelden.'
  850.             );
  851.             $oUser->setPassword(
  852.                 $userPasswordHasher->hashPassword(
  853.                     $oUser,
  854.                     $request->get('password-first')
  855.                 )
  856.             );
  857.             $oUser->setTokenduration(null);
  858.             $entityManager->persist($oUser);
  859.             $entityManager->flush();
  860.             // Empfänger
  861.             $sTo $oUser->getEmail();
  862.             // Textvorlage
  863.             $oText      $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "password_reset_successfully"]);
  864.             $sText      "";
  865.             // Betreff
  866.             $sSubject   "Passwort geändert";
  867.             $sAnrede    "";
  868.             if($oClient && $oUser->getKundennummer())
  869.             {
  870.                 $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $oUser->getKundennummer(), 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  871.                 if(property_exists($aResult"CustomerInternal"))
  872.                 {
  873.                     $aResult $aResult->CustomerInternal;
  874.                     if(is_array($aResult))
  875.                     {
  876.                         $sAnrede $aResult[0]->SalutationFormal;
  877.                     }
  878.                     else
  879.                     {
  880.                         $sAnrede $aResult->SalutationFormal;
  881.                     }
  882.                 }
  883.             }
  884.             if(!$sAnrede)
  885.             {
  886.                 // Standardanrede ermitteln
  887.                 $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  888.                 $sAnrede "Sehr geehrte Damen und Herren";
  889.                 if($oAnrede && $oAnrede->getMetavalue())
  890.                 {
  891.                     $sAnrede $oAnrede->getMetavalue();
  892.                 }
  893.             }
  894.             if($oText)
  895.             {
  896.                 // Betreff ermitteln
  897.                 if($oText->getBetreff())
  898.                 {
  899.                     $sSubject $oText->getBetreff();
  900.                 }
  901.                 // Inhalt ermitteln
  902.                 $sText $oText->getInhalt();
  903.             }
  904.             // Aktuelles Datum & Uhrzeit
  905.             $sDatum     date("d.m.Y"time());
  906.             $sUhrzeit   date("H:i:s"time());
  907.             $sText str_replace("#anrede#"$sAnrede$sText);
  908.             $sText str_replace("#datum#"$sDatum$sText);
  909.             $sText str_replace("#uhrzeit#"$sUhrzeit$sText);
  910.             $oMail = (new TemplatedEmail())
  911.                 ->from($sFrom)
  912.                 ->to($sTo)
  913.                 ->subject($sSubject)
  914.                 // path of the Twig template to render
  915.                 ->htmlTemplate('emails/password.html.twig')
  916.                 // pass variables (name => value) to the template
  917.                 ->context([
  918.                     "subject"   => $sSubject,
  919.                     "text"      => $sText,
  920.                     "style"     => $sStyle,
  921.                     "signatur"  => $sSignatur
  922.                 ]);
  923.             $loader             = new FilesystemLoader('../templates/');
  924.             $twigEnv            = new Environment($loader);
  925.             $twigBodyRenderer   = new BodyRenderer($twigEnv);
  926.             $twigBodyRenderer->render($oMail);
  927.             try
  928.             {
  929.                 $oMailer->send($oMail);
  930.                 $this->addFlash(
  931.                     'neu',
  932.                     "Sie haben Ihr Passwort erfolgreich geändert und erhalten in Kürze eine Bestätigung per E-Mail. Bitte prüfen Sie auch den Posteingang in Ihrem Spam-Ordner."
  933.                 );
  934.             }
  935.             catch(\Exception $exception)
  936.             {
  937.                 $this->addFlash(
  938.                     'error',
  939.                     "Sie haben Ihr Passwort erfolgreich geändert. Beim Senden der Bestätigung per E-Mail ist ein Fehler aufgetreten."
  940.                 );
  941.             }
  942.             return $this->redirectToRoute('login');
  943.         }
  944.         return $this->render('login/password-lost.html.twig'$aReturn);
  945.     }
  946.     #[Route('/zugangbeantragen/'name'zugangbeantragen')]
  947.     public function addUser(Request $requestUserPasswordHasherInterface $userPasswordHasherEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  948.     {
  949.         $oWebservice        = new WebserviceController();
  950.         $oMailer            = new MailController();
  951.         $oMailer            $oMailer->getMailer($doctrine);
  952.         $aPortalSettings    $doctrine->getRepository(Mailtexte::class)->findAll();
  953.         $oClient            null;
  954.         $aTemp              = array();
  955.         foreach($aPortalSettings as $iKey => $oSetting)
  956.         {
  957.             $aTemp[$oSetting->getMetakey()] = $oSetting;
  958.         }
  959.         $aPortalSettings $aTemp;
  960.         // CSRF prüfen
  961.         $submittedToken $request->request->get('_csrf_token');
  962.         if (!$this->isCsrfTokenValid('zugang_beantragen'$submittedToken)) {
  963.             return $this->redirectToRoute('login');
  964.         }
  965.         // E-Mail-Format prüfen
  966.         $sEmail trim($request->get('email'));
  967.         if (!filter_var($sEmailFILTER_VALIDATE_EMAIL)) {
  968.             return $this->redirectToRoute('login');
  969.         }
  970.         if($sEmail && $request->get('passwort'))
  971.         {
  972.             // Abruf Webservice zum Prüfen, ob Kundennummer und Leistungsobjektnummer vorhanden sind
  973.             $sKundennummer          $request->get('kundennummer');
  974.             $sLeistungsobjektnummer $request->get('leistungsobjektnummer');
  975.             // lokales Nutzerobjekt
  976.             $oUser = new User();
  977.             $oUser->setEmail($sEmail);
  978.             $oUser->setRoles(array("ROLE_USER"));
  979.             $oUser->setZustellart($request->get('zustellart'));
  980.             $oUser->setAktiv(0);
  981.             $oUser->setKundennummer($sKundennummer);
  982.             $oUser->setLeistungsobjektnummer($sLeistungsobjektnummer);
  983.             $oUser->setDatenschutz(1);
  984.             $sHash bin2hex(random_bytes(5));
  985.             $oUser->setHash($sHash);
  986.             $iWebId     null;
  987.             $oKeyLength $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "webid_key_length","type" => "konto"]);
  988.             if($oKeyLength)
  989.             {
  990.                 $iLength    $oKeyLength->getMetavalue();
  991.             }
  992.             else
  993.             {
  994.                 $iLength 6;
  995.             }
  996.             $iWebId     bin2hex(random_bytes($iLength));
  997.             $oUser->setWebid($iWebId);
  998.             $oTokenDauer    $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "token_duration_stunden"]);
  999.             $iTokenStunden  = ($oTokenDauer && (int)$oTokenDauer->getMetavalue() > 0) ? (int)$oTokenDauer->getMetavalue() : 3;
  1000.             $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$iTokenStunden." hours"time()));
  1001.             $oUser->setTokenduration($sTokenDuration);
  1002.             $oUser->setPassword(
  1003.                 $userPasswordHasher->hashPassword(
  1004.                     $oUser,
  1005.                     $request->get('passwort')
  1006.                 )
  1007.             );
  1008.             // Kundennummer im GV-Backend prüfen VOR dem Speichern
  1009.             $sAnrede "";
  1010.             if($oWebservice->checkWsConnection($doctrine))
  1011.             {
  1012.                 $oClient $oWebservice->getClient($doctrine);
  1013.             }
  1014.             if($oClient)
  1015.             {
  1016.                 $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $sKundennummer'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  1017.                 if(!property_exists($aResult"CustomerInternal"))
  1018.                 {
  1019.                     return $this->redirectToRoute('login');
  1020.                 }
  1021.                 $aResult $aResult->CustomerInternal;
  1022.                 $sAnrede is_array($aResult) ? $aResult[0]->SalutationFormal $aResult->SalutationFormal;
  1023.             }
  1024.             else
  1025.             {
  1026.                 return $this->redirectToRoute('login');
  1027.             }
  1028.             $entityManager->persist($oUser);
  1029.             $entityManager->flush();
  1030.             $sMessage "Ihr Zugang wurde erfolgreich beantragt! In Kürze erhalten Sie eine E-Mail mit einem Verifizierungslink. Erst nach Bestätigung des Links kann die Registrierung abgeschlossen werden.";
  1031.             // Mailversand
  1032.             try
  1033.             {
  1034.                 $oMail      $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zugang_beantrag_an_kunde"]);
  1035.                 $oCompany   $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  1036.                 // CSS für Mailvorlage ermitteln
  1037.                 $sStyle     "";
  1038.                 $sFile      "css/email.css";
  1039.                 if(file_exists($sFile))
  1040.                 {
  1041.                     $sStyle file_get_contents($sFile);
  1042.                 }
  1043.                 $sFile      "css/customer.css";
  1044.                 if(file_exists($sFile))
  1045.                 {
  1046.                     $sStyle .= file_get_contents($sFile);
  1047.                 }
  1048.                 $sSubject   "";
  1049.                 $sThema     "";
  1050.                 if(!$sAnrede)
  1051.                 {
  1052.                     $sAnrede "Sehr geehrte Damen und Herren";
  1053.                     $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1054.                     if($oAnrede && $oAnrede->getMetavalue())
  1055.                     {
  1056.                         $sAnrede $oAnrede->getMetavalue();
  1057.                     }
  1058.                 }
  1059.                 // Betreff ermitteln
  1060.                 $sSubject   $oMail->getBetreff();
  1061.                 $sSubject   str_replace("#company_title#",$oCompany->getMetavalue(), $sSubject);
  1062.                 if(!$sSubject)
  1063.                 {
  1064.                     $sSubject $request->get('kontaktgrund');
  1065.                 }
  1066.                 // Aktivierungslink
  1067.                 $sLink $_SERVER['REQUEST_SCHEME'] . '://'$_SERVER['SERVER_NAME'] .'/zugang/aktivieren/'.$sHash.'/';
  1068.                 // Mailsignatur
  1069.                 $oInhalte  = new InhalteController();
  1070.                 $sSignatur $oInhalte->getMailSignatur($doctrine);
  1071.                 // Nachricht
  1072.                 $sThema     $oMail->getInhalt();
  1073.                 $sThema     str_replace("#anrede#"$sAnrede$sThema);
  1074.                 $sThema     str_replace("#kundennummer#"$sKundennummer$sThema);
  1075.                 $sThema     str_replace("#link#"$sLink$sThema);
  1076.                 $sThema     str_replace("#datum#"$sTokenDuration$sThema);
  1077.                 $sThema     str_replace("#signatur#"$sSignatur$sThema);
  1078.                 // Sender & Empfänger ermitteln
  1079.                 $sTo        $request->get('email');
  1080.                 $sFrom      'portal.support@msu-solutions.de';
  1081.                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1082.                 if($oAbsender)
  1083.                 {
  1084.                     $sFrom  trim($oAbsender->getMetavalue());
  1085.                 }
  1086.                 $oMail = (new TemplatedEmail())
  1087.                     ->from($sFrom)
  1088.                     ->to($sTo)
  1089.                     ->subject($sSubject)
  1090.                     // path of the Twig template to render
  1091.                     ->htmlTemplate('emails/zugang.html.twig')
  1092.                     // pass variables (name => value) to the template
  1093.                     ->context([
  1094.                         "context"   => $sThema,
  1095.                         "hash"      => $sHash,
  1096.                         "code"      => $iWebId,
  1097.                         "style"     => $sStyle,
  1098.                         "signatur"  => $sSignatur
  1099.                     ]);
  1100.                 $loader             = new FilesystemLoader('../templates/');
  1101.                 $twigEnv            = new Environment($loader);
  1102.                 $twigBodyRenderer   = new BodyRenderer($twigEnv);
  1103.                 $twigBodyRenderer->render($oMail);
  1104.                 $oMailer->send($oMail);
  1105.             }
  1106.             catch (\Throwable $th)
  1107.             {
  1108.                 $sMessage "Ihr Zugang wurde beantragt! Beim Senden Ihrer Bestätigung per E-Mail-Adresse ist ein Fehler aufgetreten. Bitte wenden Sie sich an uns!";
  1109.             }
  1110.             $this->addFlash(
  1111.                 'neu',
  1112.                 $sMessage
  1113.             );
  1114.             $session = new Session();
  1115.             $session->set('email'$request->get('email'));
  1116.         }
  1117.         $bWebId false;
  1118.         if($oUser->getAktiv() == 1)
  1119.         {
  1120.             $bWebId true;
  1121.         }
  1122.         return $this->redirectToRoute('login', ["webid" => $bWebId]);
  1123.     }
  1124.     #[Route('/admin'name'login_admin')]
  1125.     public function loginAdmin(AuthenticationUtils $authenticationUtilsRequest $requestManagerRegistry $doctrineEntityManagerInterface $entityManagerSession $session): Response
  1126.     {
  1127.         // Settings
  1128.         $oLinkImpressum          $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "impressum"]);
  1129.         $oLinkDatenschutz        $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "datenschutz"]);
  1130.         $oLinkSatzung            $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "satzung"]);
  1131.         $oLinkBarrierefreiheit   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheit"]);
  1132.         $oZeigeBarrierefreiheit  $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "barrierefreiheitanzeigen"]);
  1133.         // Portalsettings
  1134.         $oLogo                   $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo"]);
  1135.         $oLogoGraustufen         $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-graustufen"]);
  1136.         $oLogoSchwarzWeiss       $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-schwarzweiss"]);
  1137.         $oLogoDruckenDialog      $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-print"]);
  1138.         $oFavicon                $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "favicon"]);
  1139.         $oLogoPositionStartseite $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "logo-position-startseite"]);
  1140.         if(!$request->getSession())
  1141.         {
  1142.             $session->start();
  1143.         }
  1144.         // Texte
  1145.         $aTexte                  $doctrine->getRepository(Texte::class)->findAll();
  1146.         $aTemp  = array();
  1147.         foreach($aTexte as $iKey => $oText)
  1148.         {
  1149.             $aTemp[$oText->getMetakey()] = $oText->getMetavalue();
  1150.         }
  1151.         $aTexte $aTemp;
  1152.         if(!array_key_exists("portalname",$aTexte))
  1153.         {
  1154.             $aTexte["portalname"] = "Wasserportal";
  1155.         }
  1156.         $session->get('texte',$aTexte);
  1157.         $sTitel "Administratoren-Login";
  1158.         if(array_key_exists("login-13"$aTexte) && $aTexte["login-13"])
  1159.         {
  1160.             $sTitel $aTexte["login-13"];
  1161.         }
  1162.         // Impressum
  1163.         $sImpressum "";
  1164.         if($oLinkImpressum)
  1165.         {
  1166.             $sImpressum $oLinkImpressum->getMetavalue();
  1167.         }
  1168.         $session->set('impressum',$sImpressum);
  1169.         // Datenschutz
  1170.         $sDatenschutz       "";
  1171.         if($oLinkDatenschutz)
  1172.         {
  1173.             $sDatenschutz $oLinkDatenschutz->getMetavalue();
  1174.         }
  1175.         $session->set('datenschutz',$sDatenschutz);
  1176.         // Satzung
  1177.         $sSatzung "";
  1178.         if($oLinkSatzung)
  1179.         {
  1180.             $sSatzung $oLinkSatzung->getMetavalue();
  1181.         }
  1182.         $session->set('satzung',$sSatzung);
  1183.         // Barrierefreiheit
  1184.         $sBarrierefreiheit  "";
  1185.         if($oLinkBarrierefreiheit)
  1186.         {
  1187.             $sBarrierefreiheit $oLinkBarrierefreiheit->getMetavalue();
  1188.         }
  1189.         $session->set('barrierefreiheit',$sBarrierefreiheit);
  1190.         // Status Barrierefreiheit anzeigen / nicht anzeigen
  1191.         $sZeigeBarrierefreiheit "on";
  1192.         if($oZeigeBarrierefreiheit)
  1193.         {
  1194.             $sZeigeBarrierefreiheit $oZeigeBarrierefreiheit->getMetavalue();
  1195.         }
  1196.         $session->set('barrierefreiheitanzeigen'$sZeigeBarrierefreiheit);
  1197.         // Laden des Kundenlogos, wenn vorhanden
  1198.         if ($oLogo)
  1199.         {
  1200.             $session->set('logo'$oLogo->getMetavalue());
  1201.         }
  1202.         else
  1203.         {
  1204.             $session->set('logo''');
  1205.         }
  1206.         if($oLogoGraustufen)
  1207.         {
  1208.             $session->set('logo-graustufen'$oLogoGraustufen->getMetavalue());
  1209.         }
  1210.         else{
  1211.             $session->set('logo-graustufen''');
  1212.         }
  1213.         if($oLogoSchwarzWeiss)
  1214.         {
  1215.             $session->set('logo-schwarzweiss'$oLogoSchwarzWeiss->getMetavalue());
  1216.         }
  1217.         else
  1218.         {
  1219.             $session->set('logo-schwarzweiss''');
  1220.         }
  1221.         if($oLogoDruckenDialog)
  1222.         {
  1223.             $session->set('logo-print'$oLogoDruckenDialog->getMetavalue());
  1224.         }
  1225.         else
  1226.         {
  1227.             $session->set('logo-print''');
  1228.         }
  1229.         if($oLogoPositionStartseite)
  1230.         {
  1231.             $session->set('logo-position-startseite'$oLogoPositionStartseite->getMetavalue());
  1232.         }
  1233.         $oCaptcha                $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "captcha"]);
  1234.         $bCpatcha false;
  1235.         if($oCaptcha)
  1236.         {
  1237.             if($oCaptcha->getMetavalue() == "on")
  1238.             {
  1239.                 $bCpatcha true;
  1240.             }
  1241.         }
  1242.         $aReturn = array(
  1243.             'titel'             => $sTitel,
  1244.             'texte'             => $aTexte,
  1245.             'impressum'         => $sImpressum,
  1246.             'datenschutz'       => $sDatenschutz,
  1247.             'barrierefreiheit'  => $sBarrierefreiheit,
  1248.             'satzung'           => $sSatzung,
  1249.             'error' => "",
  1250.             'captcha' => $bCpatcha
  1251.         );
  1252.         return $this->render('login/index_admin.html.twig'$aReturn);
  1253.     }
  1254.     #[Route('/zaehlerstand/{rahmenvertrag}/{leistungsobjektnr}/'name'zaehlerstand_link')]
  1255.     public function zaehlerstandlink(Request $requestEntityManagerInterface $entityManagerManagerRegistry $doctrine$rahmenvertrag$leistungsobjektnr)
  1256.     {
  1257.         $session = new Session();
  1258.         if($rahmenvertrag and $leistungsobjektnr)
  1259.         {
  1260.             $session->set('rahmenvertrag',$rahmenvertrag);
  1261.             $session->set('leistungsobjektnr',$leistungsobjektnr);
  1262.             return $this->redirectToRoute('login',["rahmenvertrag" => $rahmenvertrag]);
  1263.         }
  1264.     }
  1265.     #[Route('/zugang/aktivieren/{hash}/'name'zugangaktivieren')]
  1266.     public function activeAccount(Request $requestUserPasswordHasherInterface $userPasswordHasherMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine$hash)
  1267.     {
  1268.         $session    = new Session();
  1269.         $oUser      $doctrine->getRepository(User::class)->findOneBy(["hash" => $hash]);
  1270.         if(!$oUser)
  1271.         {
  1272.             $this->addFlash(
  1273.                 'error',
  1274.                 'Der Code ist leider falsch.'
  1275.             );
  1276.         }
  1277.         else
  1278.         {
  1279.             // Prüfen, ob Tokenduration in der Vergangenheit liegt
  1280.             $sTokenDuration $oUser->getTokenduration();
  1281.             // Mail mit Aktivierungslink wird erneut versendet wenn Token abgelaufen ist
  1282.             if(time() > strtotime($sTokenDuration))
  1283.             {
  1284.                 // Mailversand
  1285.                 $sLink $_SERVER['REQUEST_SCHEME'] . '://' $_SERVER['SERVER_NAME'] .'/zugang/aktivieren/'.$oUser->getHash().'/';
  1286.                 $sStyle     "";
  1287.                 $sFile      "css/email.css";
  1288.                 if(file_exists($sFile))
  1289.                 {
  1290.                     $sStyle file_get_contents($sFile);
  1291.                 }
  1292.                 $sFile      "css/customer.css";
  1293.                 if(file_exists($sFile))
  1294.                 {
  1295.                     $sStyle .= file_get_contents($sFile);
  1296.                 }
  1297.                 // Mailsignatur
  1298.                 $oInhalte  = new InhalteController();
  1299.                 $sSignatur $oInhalte->getMailSignatur($doctrine);
  1300.                 $oMail    $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zugang_beantrag_an_kunde"]);
  1301.                 $oCompany $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  1302.                 $sThema   "";
  1303.                 $oWebservice        = new WebserviceController();
  1304.                 $oClient            null;
  1305.                 if($oWebservice->checkWsConnection($doctrine))
  1306.                 {
  1307.                     $oClient $oWebservice->getClient($doctrine);
  1308.                 }
  1309.                 $sAnrede "Sehr geehrte Damen und Herren";
  1310.                 if($oClient)
  1311.                 {
  1312.                     $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $oUser->getKundennummer(), 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  1313.                     if(property_exists($aResult"CustomerInternal"))
  1314.                     {
  1315.                         $aResult $aResult->CustomerInternal;
  1316.                         if(is_array($aResult))
  1317.                         {
  1318.                             $sAnrede $aResult[0]->SalutationFormal;
  1319.                         }
  1320.                         else
  1321.                         {
  1322.                             $sAnrede $aResult->SalutationFormal;
  1323.                         }
  1324.                     }
  1325.                 }
  1326.                 if($oMail)
  1327.                 {
  1328.                     $oTokenDauer    $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "token_duration_stunden"]);
  1329.                     $iTokenStunden  = ($oTokenDauer && (int)$oTokenDauer->getMetavalue() > 0) ? (int)$oTokenDauer->getMetavalue() : 3;
  1330.                     $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$iTokenStunden." hours"time()));
  1331.                     $oUser->setTokenduration($sTokenDuration);
  1332.                     $entityManager->persist($oUser);
  1333.                     $entityManager->flush();
  1334.                     $sSubject   $oMail->getBetreff();
  1335.                     $sSubject   str_replace("#company_title#",$oCompany->getMetavalue(), $sSubject);
  1336.                     $sThema     $oMail->getInhalt();
  1337.                     $sThema     str_replace("#anrede#",$sAnrede$sThema);
  1338.                     $sThema     str_replace("#kundennummer#",$oUser->getKundennummer(), $sThema);
  1339.                     $sThema     str_replace("#link#",$sLink$sThema);
  1340.                     $sThema     str_replace("#datum#",$sTokenDuration$sThema);
  1341.                     $sThema     str_replace("#signatur#",$sSignatur$sThema);
  1342.                 }
  1343.                 if(empty($sSubject))
  1344.                 {
  1345.                     $sSubject $request->get('kontaktgrund');
  1346.                 }
  1347.                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1348.                 $sMail      'portal.support@msu-solutions.de';
  1349.                 if($oAbsender)
  1350.                 {
  1351.                     $sMail trim($oAbsender->getMetavalue());
  1352.                 }
  1353.                 $email = (new TemplatedEmail())
  1354.                     ->from($sMail)
  1355.                     ->to($oUser->getEmail())
  1356.                     ->subject($sSubject)
  1357.                     // path of the Twig template to render
  1358.                     ->htmlTemplate('emails/zugang.html.twig')
  1359.                     // pass variables (name => value) to the template
  1360.                     ->context([
  1361.                         "context" => $sThema,
  1362.                         "hash" => $oUser->getHash(),
  1363.                         "code" => $oUser->getWebid(),
  1364.                         "style" => $sStyle,
  1365.                         "signatur" => $sSignatur
  1366.                     ]);
  1367.                 $mailer->send($email);
  1368.                 $this->addFlash(
  1369.                     'neu',
  1370.                     'Ihr Zugang wurde erfolgreich beantragt! In Kürze erhalten Sie eine E-Mail mit einem Verifizierungslink. Erst nach Bestätigung des Links kann die Registrierung abgeschlossen werden.'
  1371.                 );
  1372.             }
  1373.             else
  1374.             {
  1375.                 if($oUser->getAktiv() != 1)
  1376.                 {
  1377.                     $oWebservice        = new WebserviceController();
  1378.                     $oClient            null;
  1379.                     if($oWebservice->checkWsConnection($doctrine))
  1380.                     {
  1381.                         $oClient $oWebservice->getClient($doctrine);
  1382.                     }
  1383.                     if($oClient)
  1384.                     {
  1385.                         $sKundennummer  $oUser->getKundennummer();
  1386.                         $iWebId         $oUser->getWebid();
  1387.                         $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $sKundennummer'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals;
  1388.                         if(property_exists($aResult"CustomerInternal"))
  1389.                         {
  1390.                             $aResult $aResult->CustomerInternal;
  1391.                             if(property_exists($aResult->AccountingContracts"AccountingContract"))
  1392.                             {
  1393.                                 if(is_array($aResult->AccountingContracts->AccountingContract))
  1394.                                 {
  1395.                                     $sContractNo $aResult->AccountingContracts->AccountingContract[0]->No;
  1396.                                     $sZaehlerNo  $aResult->AccountingContracts->AccountingContract[0]->ServiceObjects->ServiceObject->Code;
  1397.                                 }
  1398.                                 else
  1399.                                 {
  1400.                                     $sContractNo    $aResult->AccountingContracts->AccountingContract->No;
  1401.                                     $sZaehlerNo     $aResult->AccountingContracts->AccountingContract->ServiceObjects->ServiceObject->Code;
  1402.                                 }
  1403.                                 // Prüfen, ob in Settings der metavalue auf on steht beim metakey output
  1404.                                 $oOutput $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "output"]);
  1405.                                 $aTempData = array(
  1406.                                     "ZB_ADNUMMER"     => $sKundennummer,
  1407.                                     "ZB_AVERTRAG"     => $sContractNo,
  1408.                                     "ZB_ZNUMMER"      => $sZaehlerNo,
  1409.                                     "ZB_NUTZERNAME"   => $oUser->getEmail(),
  1410.                                     "ZB_WEBID"        => $iWebId,
  1411.                                     "ZB_ANMELD_EMAIL" => $oUser->getEmail()
  1412.                                 );
  1413.                                 if($oOutput->getMetavalue() == "on")
  1414.                                 {
  1415.                                     $aTempData["ZB_OM_KATEGORIE"] = $oUser->getZustellart();
  1416.                                 }
  1417.                                 $aResult $oWebservice->sendData($doctrine"ZUGANG_BEANT"$sKundennummer$aTempData);
  1418.                                 if($aResult->return_value)
  1419.                                 {
  1420.                                     $oUser->setAktiv(1);
  1421.                                     $entityManager->persist($oUser);
  1422.                                     $entityManager->flush();
  1423.                                 }
  1424.                             }
  1425.                             else
  1426.                             {
  1427.                                 $this->addFlash(
  1428.                                     'error',
  1429.                                     'Bei der Aktivierung Ihres Zugangs ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.'
  1430.                                 );
  1431.                                 return $this->redirectToRoute('login');
  1432.                             }
  1433.                         }
  1434.                     }
  1435.                     if($oUser->getWebid() && $oUser->getWebid() != 0)
  1436.                     {
  1437.                         // Verifizierung per Web-Id ausstehend
  1438.                         $this->addFlash(
  1439.                             'neu',
  1440.                             'Ihre E-Mail-Adresse wurde erfolgreich validiert. Bevor Sie sich das erste Mal in unser Kundenportal einloggen können, erhalten Sie postalisch eine spezielle Web-ID. Dies dient zur Sicherheit Ihrer Daten.'
  1441.                         );
  1442.                         return $this->redirectToRoute('login');
  1443.                     }
  1444.                     else
  1445.                     {
  1446.                         $session->set('emailtwofa'"");
  1447.                         $session->set('passwordtwofa'"");
  1448.                         $this->addFlash(
  1449.                             'neu',
  1450.                             'Ihr Zugang wurde erfolgreich aktiviert.'
  1451.                         );
  1452.                     }
  1453.                 }
  1454.                 else
  1455.                 {
  1456.                     if($oUser->getWebid() == 0)
  1457.                     {
  1458.                         // Verifizierung per Web-ID abgeschlossen
  1459.                         $this->addFlash(
  1460.                             'neu',
  1461.                             'Ihr Zugang ist bereits aktiv.'
  1462.                         );
  1463.                     }
  1464.                     else
  1465.                     {
  1466.                         // Verifizierung per Web-ID ausstehend
  1467.                         $this->addFlash(
  1468.                             'neu',
  1469.                             'Ihre E-Mail-Adresse wurde erfolgreich validiert. Bevor Sie sich das erste Mal in unser Kundenportal einloggen können, erhalten Sie postalisch eine spezielle Web-ID. Dies dient zur Sicherheit Ihrer Daten.'
  1470.                         );
  1471.                     }
  1472.                 }
  1473.             }
  1474.         }
  1475.         return $this->redirectToRoute('login');
  1476.     }
  1477.     #[Route('/zaehlerstand/'name'zaehlerstandzeigen')]
  1478.     public function zaehlerstandzeigen(Request $requestManagerRegistry $doctrine)
  1479.     {
  1480.         $oHinweisZaehler $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "hinweis""type" => "zaehlerstandsmeldung"]);
  1481.         if($oHinweisZaehler)
  1482.         {
  1483.             if(strtotime($oHinweisZaehler->getMetavalue()) < time())
  1484.             {
  1485.                 $oHinweisZaehler null;
  1486.             }
  1487.         }
  1488.         return $this->redirectToRoute('login',['target_action' => 'zaehlerstand_melden'"hinweiszaehler" => $oHinweisZaehler]);
  1489.     }
  1490.     #[Route('/zaehlerstanderfassen/'name'zaehlerstanderfassen')]
  1491.     public function zaehlerstanderfassen(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  1492.     {
  1493.         $aZaehlernummern    $request->get('zaehlernr');
  1494.         $oWebservice        = new WebserviceController();
  1495.         $oClient            null;
  1496.         $oErlaubeNachkommastellen $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "zaehlerstandsmeldung_nachkommastellen_zulassen""type" => "zaehlerstandsmeldung"]); 
  1497.         $sErlaubeNachkommastellen false;
  1498.         if($oErlaubeNachkommastellen && $oErlaubeNachkommastellen->getMetavalue() == 1)
  1499.         {
  1500.             $sErlaubeNachkommastellen true;
  1501.         }
  1502.         if($oWebservice->checkWsConnection($doctrine))
  1503.         {
  1504.             $oClient $oWebservice->getClient($doctrine);
  1505.         }
  1506.         $sBusinessPartnerNo $request->get('kundennummer');
  1507.         $sBaseContractNo    $request->get('basecontractnr');
  1508.         $sLeistungsobjektNr $request->get('leistungsobjektnummerajax');
  1509.         $aSettings      $doctrine->getRepository(Settings::class)->findAll();
  1510.         $oCheckConfig   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "authentifizierungz"]);
  1511.         if($oCheckConfig->getMetavalue() == "hashz")
  1512.         {
  1513.             $aResult $oClient->AuthenticateWithHash(array('p_ServiceObject' => $sLeistungsobjektNr'p_Hash' => $sBusinessPartnerNo,'v_ExportCustomerInternals' => array()));
  1514.             $sBusinessPartnerNo $aResult->v_ExportCustomerInternals->CustomerInternal->No;
  1515.         }
  1516.         $aTempSettings  = array();
  1517.         foreach($aSettings as $iKey => $oSetting)
  1518.         {
  1519.             $aTempSettings[$oSetting->getMetakey()] = $oSetting->getMetavalue();
  1520.         }
  1521.         $aSettings $aTempSettings;
  1522.         if(!array_key_exists("zaehlerstand-email-deaktiviert"$aSettings))
  1523.         {
  1524.             $aSettings["zaehlerstand-email-deaktiviert"] = "";
  1525.             
  1526.         }
  1527.         $bDrucken           false;
  1528.         // Prüfen ob in den settings der metakey fotoupload auf on steht
  1529.         $oSettingsFoto $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "fotoupload"]);
  1530.         $sData         "";
  1531.         $sAnrede            "Sehr geehrte Damen und Herren";
  1532.         $oAnrede            $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1533.         if($oAnrede)
  1534.         {
  1535.             $sAnrede        $oAnrede->getMetavalue();
  1536.         }
  1537.         $sEmailkontakt      $request->get('emailkontakt');
  1538.         $sTelefonKontakt    $request->get('telefonkontakt');
  1539.         $aResult            = array();
  1540.         $sTempNr 0;
  1541.         $sMailText "";
  1542.         // Serverseitige Validierung Telefonnummer
  1543.         if ($sTelefonKontakt && !preg_match('/^[+\d][\d\s\-\/().]{4,19}$/'$sTelefonKontakt)) {
  1544.             $this->addFlash('error''Bitte geben Sie eine gültige Telefonnummer ein.');
  1545.             return $this->redirectToRoute('zaehlerstandzeigen');
  1546.         }
  1547.         $aTempData["ZS_EMAIL"]  = $sEmailkontakt;
  1548.         $aTempData["ZS_TEL"]    = $sTelefonKontakt;
  1549.         // $aTempData["ZS_EMAIL"]  = $sEmailkontakt;
  1550.         // $aTempData["ZS_TEL"]    = $sTelefonKontakt;
  1551.         $aFotos                 = array();
  1552.         $iDokument              1;
  1553.         foreach($aZaehlernummern as $iKey => $sZaehlerNr)
  1554.         {
  1555.             $sFileBase64 "";
  1556.             # var_dump($request->get('zaehlerstandneu')[$iKey]);
  1557.             if(empty($request->get('zaehlerstandneu')[$iKey]) and "0" != $request->get('zaehlerstandneu')[$iKey])
  1558.             {
  1559.                continue;
  1560.             }
  1561.             $dAblesedatum     $request->get('ablesedatum')[$iKey];
  1562.             $dAblesedatum     date_create($dAblesedatum);
  1563.             $dAblesedatum     date_format($dAblesedatum,"d.m.Y");
  1564.             $iZaehlerstandNeu $request->get('zaehlerstandneu')[$iKey];
  1565.             if($sErlaubeNachkommastellen)
  1566.             {
  1567.                 $iZaehlerstandNeu str_replace(".",",",$iZaehlerstandNeu);
  1568.             }
  1569.             
  1570.             $iZaehlerNo       $request->get('zaehlernr')[$iKey];
  1571.             $sAccountNr       $request->get('AccountingContractNo')[$iKey];
  1572.             if($sTempNr != $sZaehlerNr)
  1573.             {
  1574.                 $aTempData[$iKey] = array(
  1575.                     "ZS_ZNUMMER"            => $iZaehlerNo,
  1576.                     "ZS_ABLDATUM"           => $dAblesedatum,
  1577.                     "ZS_ABLSTAND"           => $iZaehlerstandNeu,
  1578.                     "ZS_LOBJEKT"            => $sLeistungsobjektNr,
  1579.                     "ZS_REASON"             => "",
  1580.                     "ZS_METERREGIDX"        => $request->get('ZS_METERREGIDX')[$iKey],
  1581.                 );
  1582.                 $sTempNr $sZaehlerNr;
  1583.             }
  1584.             else
  1585.             {
  1586.                 $iTemp $iKey;
  1587.                 $iTemp--;
  1588.                 $aTempData[$iTemp]['ZS_METERREGIDX']    = $request->get('ZS_METERREGIDX')[$iKey];
  1589.                 $aTempData[$iTemp]['ZS_ABLSTAND']       = $iZaehlerstandNeu;
  1590.             }
  1591.             $sGrund "";
  1592.             if($request->get('zaehlerstandfoto-filedata'))
  1593.             {
  1594.                 if(array_key_exists($iKey$request->get('zaehlerstandfoto-filedata')))
  1595.                 {
  1596.                     // Prüfen ob im request zaehlerstandfoto mitgesendet wurde
  1597.                     if($request->get('zaehlerstandfoto-filedata')[$iKey])
  1598.                     {
  1599.                         $sFileBase64    $request->get('zaehlerstandfoto-filedata')[$iKey];
  1600.                         $sFileName      $request->get('zaehlerstandfoto-filename')[$iKey];
  1601.                         $sFileType      $request->get('zaehlerstandfoto-filetype')[$iKey];
  1602.                         $aTempData[$iKey]["ZS_DOCUMENT".$iDokument]        = $sFileBase64;
  1603.                         $aTempData[$iKey]["ZS_FILEFORMAT".$iDokument]      = $sFileType;
  1604.                         $aTempData[$iKey]["ZS_FILEDESCRIPTION".$iDokument] = $sFileName;
  1605.                         
  1606.                         $aFotos[$sZaehlerNr]                               = $sFileBase64;
  1607.                         $iDokument++;
  1608.                     }
  1609.                 }
  1610.             // #if($oSettingsFoto && $oSettingsFoto->getMetavalue() == "on")
  1611.             // if($request->files->get('zaehlerstandfoto'))
  1612.             // {
  1613.             //     if(array_key_exists($iKey, $request->files->get('zaehlerstandfoto')))
  1614.             //     {
  1615.             //         // Prüfen ob im request zaehlerstandfoto mitgesendet wurde
  1616.             //         if($request->files->get('zaehlerstandfoto')[$iKey])
  1617.             //         {
  1618.             //             // Datei aus dem $_FILES request direkt in base64 umwandeln
  1619.             //             #$sData = base64_encode(file_get_contents($request->files->get('zaehlerstandfoto')[$iKey]));
  1620.             //             $file = $request->files->get('zaehlerstandfoto')[$iKey];
  1621.             //             $tempPath = $file->getPathname();
  1622.             //             // Lese das Bild in PHP mit GD
  1623.             //             $source = imagecreatefromstring(file_get_contents($tempPath));
  1624.             //             // Bestimme neue Größe
  1625.             //             list($width, $height) = getimagesize($tempPath);
  1626.             //             $newWidth = 500;
  1627.             //             $newHeight = ($height / $width) * $newWidth;
  1628.             //             // Erstelle ein neues Bild mit neuer Größe
  1629.             //             $newImage = imagecreatetruecolor($newWidth, $newHeight);
  1630.             //             // Skaliere das Original-Bild in das neue Bild
  1631.             //             imagecopyresampled($newImage, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
  1632.             //             // Speicher das neue Bild als PNG-Datei
  1633.             //             imagepng($newImage, 'customerdata/new_image.png');
  1634.             //             // Lösche die Bilder aus dem Speicher
  1635.             //             imagedestroy($source);
  1636.             //             imagedestroy($newImage);
  1637.             //             $sData = base64_encode(file_get_contents('customerdata/new_image.png'));
  1638.             //             unlink('customerdata/new_image.png');
  1639.             //             // Dateiname ermitteln
  1640.             //             $sFileName = $request->files->get('zaehlerstandfoto')[$iKey]->getClientOriginalName();
  1641.             //             // Dateityp ermitteln
  1642.             //             $sFileType = $request->files->get('zaehlerstandfoto')[$iKey]->getClientOriginalExtension();
  1643.             //             $aTempData[$iKey]["ZS_DOCUMENT".$iDokument]        = $sData;
  1644.             //             $aTempData[$iKey]["ZS_FILEFORMAT".$iDokument]      = $sFileType;
  1645.             //             $aTempData[$iKey]["ZS_FILEDESCRIPTION".$iDokument] = $sFileName;
  1646.             //             $aFotos[$sZaehlerNr]                               = $sData;
  1647.             //             $iDokument++;
  1648.             //         }
  1649.             //     }
  1650.                 // Prüfen ob in den settings der metakey fotoupload auf on steht
  1651.                 $oSettingsFotoPflicht $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "fotouploadpflicht"]);
  1652.                 if($oSettingsFotoPflicht)
  1653.                 {
  1654.                     if($oSettingsFotoPflicht->getMetavalue() == 0)
  1655.                     {
  1656.                         if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] == 'Anderer Grund')
  1657.                         {
  1658.                             $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzgrundtext')[$iKey];
  1659.                             $sGrund $request->get('toleranzgrundtext')[$iKey];
  1660.                         }
  1661.                         if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] != 'Anderer Grund')
  1662.                         {
  1663.                             $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzart')[$iKey];
  1664.                             $sGrund $request->get('toleranzart')[$iKey];
  1665.                         }
  1666.                     }
  1667.                 }
  1668.             }
  1669.             else
  1670.             {
  1671.                 if($request->get('toleranzart') && array_key_exists($iKey$request->get('toleranzart')))
  1672.                 {
  1673.                     if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] == 'Anderer Grund')
  1674.                     {
  1675.                         $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzgrundtext')[$iKey];
  1676.                         $sGrund $request->get('toleranzgrundtext')[$iKey];
  1677.                     }
  1678.                     if ($request->get('toleranzart')[$iKey] && $request->get('toleranzart')[$iKey] != 'Anderer Grund')
  1679.                     {
  1680.                         $aTempData[$iKey]["ZS_REASON"] = $request->get('toleranzart')[$iKey];
  1681.                         $sGrund $request->get('toleranzart')[$iKey];
  1682.                     }
  1683.                 }
  1684.             }
  1685.             $iZaehlerstandNeu str_replace(",",".",$iZaehlerstandNeu);
  1686.             $sMailText .= "Zählernummer: ".$sZaehlerNr."<br>";
  1687.             #$sMailText .= "Zählerstand: ".number_format($iZaehlerstandNeu,"2",",",".")."<br>";
  1688.             $sMailText .= "Zählerstand: ".$iZaehlerstandNeu."<br>";
  1689.             $sMailText .= "Ablesedatum: ".date("d.m.Y",strtotime($dAblesedatum))."<br>";
  1690.             if(!empty($sGrund))
  1691.             {
  1692.                 $sMailText .= "Änderung: ".$sGrund."<br>";
  1693.             }
  1694.             if(!empty($sData))
  1695.             {
  1696.                 $sMailText .= "<img src='data:image/jpeg;base64,".$sData."' alt='Zählerstandfoto'><br>";
  1697.             }
  1698.             $sMailText .= "<br><br>";
  1699.         }
  1700.         if($oClient)
  1701.         {
  1702.             try {
  1703.                 $oResult $oWebservice->sendData($doctrine"ZAEHLER_ERFASS"$sBusinessPartnerNo$aTempData$sAccountNr);
  1704.                 $mailok true;
  1705.                 if($oResult->return_value)
  1706.                 {
  1707.                     if($aSettings["zaehlerstand-email-deaktiviert"]!=='on')
  1708.                     {
  1709.                             if($sEmailkontakt)
  1710.                             {
  1711.                                 $mailok false;
  1712.                                 $sTo $sEmailkontakt;
  1713.                                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1714.                                 $sMail      'portal.support@msu-solutions.de';
  1715.                                 if($oAbsender)
  1716.                                 {
  1717.                                     $sMail trim($oAbsender->getMetavalue());
  1718.                                 }
  1719.                                 $sStyle     "";
  1720.                                 $sFile      "css/email.css";
  1721.                                 if(file_exists($sFile))
  1722.                                 {
  1723.                                     $sStyle file_get_contents($sFile);
  1724.                                 }
  1725.                                 $sFile      "css/customer.css";
  1726.                                 if(file_exists($sFile))
  1727.                                 {
  1728.                                     $sStyle .= file_get_contents($sFile);
  1729.                                 }
  1730.                                 $oAbsender  $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1731.                                 $sAnrede    "Sehr geehrte Damen und Herren";
  1732.                                 $oAnrede    $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1733.                                 if($oAnrede)
  1734.                                 {
  1735.                                     $sAnrede $oAnrede->getMetavalue();
  1736.                                 }
  1737.                                 $aResult $oClient->GetCustomerInternalsByNo(array('p_No' => $sBusinessPartnerNo'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals->CustomerInternal;
  1738.                                 if(is_array($aResult))
  1739.                                 {
  1740.                                     $sAnrede $aResult[0]->SalutationFormal;
  1741.                                 }
  1742.                                 else
  1743.                                 {
  1744.                                     $sAnrede $aResult->SalutationFormal;
  1745.                                 }
  1746.                                 $sMail 'portal.support@msu-solutions.de';
  1747.                                 if($oAbsender)
  1748.                                 {
  1749.                                     $sMail trim($oAbsender->getMetavalue());
  1750.                                 }
  1751.                                 $oMail $doctrine->getRepository(Mailtexte::class)->findOneBy(["metakey" => "zaeherstand_gemeldet_nologin"]);
  1752.                                 if($oMail)
  1753.                                 {
  1754.                                     $sSubject   $oMail->getBetreff();
  1755.                                     $sSubject   str_replace("#objectno#"$sLeistungsobjektNr$sSubject);
  1756.                                     $sSubject   str_replace("#vertragsnr#"$sAccountNr$sSubject);
  1757.                                     $sThema     $oMail->getInhalt();
  1758.                                     $sThema     str_replace("#anrede#"$sAnrede$sThema);
  1759.                                     $sThema     str_replace("#objectno#"$sLeistungsobjektNr$sThema);
  1760.                                     $sThema     str_replace("#vertragsnr#"$sAccountNr$sThema);
  1761.                                     $sThema     str_replace("#stand#"$sMailText$sThema);
  1762.                                 }
  1763.                                 $sTo    $sEmailkontakt;
  1764.                                 //Mailsignatur
  1765.                                 $oInhalte  = new InhalteController();
  1766.                                 $sSignatur $oInhalte->getMailSignatur($doctrine);
  1767.                                 $oMail = (new TemplatedEmail())
  1768.                                     ->from($sMail)
  1769.                                     ->to($sTo)
  1770.                                     ->subject($sSubject)
  1771.                                     //path of the Twig template to render
  1772.                                     ->htmlTemplate('emails/zaehlerstandmelden.html.twig')
  1773.                                     //pass variables (name => value) to the template
  1774.                                     ->context([
  1775.                                         "text" => $sThema,
  1776.                                         "signatur" => $sSignatur,
  1777.                                         "style" => $sStyle
  1778.                                     ]);
  1779.                             $loader = new FilesystemLoader('../templates/');
  1780.                             $twigEnv = new Environment($loader);
  1781.                             $twigBodyRenderer = new BodyRenderer($twigEnv);
  1782.                             $twigBodyRenderer->render($oMail);
  1783.                                 $oCustomMailer = new MailController();
  1784.                                 $oCustomMailer $oCustomMailer->getMailer($doctrine);
  1785.                                 try
  1786.                                 {
  1787.                                     $oCustomMailer->send($oMail);
  1788.                                     $mailok true;
  1789.                                 }
  1790.                                 catch(\Exception $exception)
  1791.                                 {
  1792.                                     // $this->addFlash(
  1793.                                     //     'error',
  1794.                                     //     "Die Mail konnte leider nicht versendet werden."
  1795.                                     // );
  1796.                                 }
  1797.                             }
  1798.                     }
  1799.                     if( $mailok == false)
  1800.                     {
  1801.                         $this->addFlash(
  1802.                             'neu',
  1803.                             'Der Zählerstand wurde gesendet. Die E-Mail mit der Bestätigung konnte nicht versendet werden.'
  1804.                         );
  1805.                         $bDrucken true;
  1806.                     }
  1807.                     else
  1808.                     {
  1809.                          $this->addFlash(
  1810.                             'neu',
  1811.                             'Der Zählerstand wurde gesendet.'
  1812.                         );
  1813.                         $bDrucken true
  1814.                     }
  1815.                 }
  1816.                 else
  1817.                 {
  1818.                     $this->addFlash(
  1819.                         'error',
  1820.                         'Ihr Zählerstand wurde nicht Ã¼bertragen.'
  1821.                     );
  1822.                 }
  1823.             } catch (\Throwable $th) {
  1824.                 if($mailok == false)
  1825.                 {
  1826.                     $this->addFlash(
  1827.                     'neu',
  1828.                     'Der Zählerstand wurde gesendet. Die E-Mail mit der Bestätigung konnte nicht versendet werden.'
  1829.                 );
  1830.                 } else {
  1831.                     $this->addFlash(
  1832.                     'error',
  1833.                     'Die Ãœbermittlung Ihres Zählerstands ist zur Zeit nicht möglich. Bitte versuchen Sie es später erneut.'
  1834.                 );
  1835.                 }
  1836.             }
  1837.             $session = new Session();
  1838.             $session->set('zaehler',$aZaehlernummern);
  1839.             $session->set('staende',$request->get('zaehlerstandneu'));
  1840.             $session->set('ablesedatum',$request->get('ablesedatum'));
  1841.             $session->set('einheit',$request->get('einheit'));
  1842.             $session->set('fotos',$aFotos);
  1843.             $session->set('toleranzart',$request->get('toleranzart'));
  1844.             $session->set('toleranzarttext',$request->get('toleranzgrundtext'));
  1845.             return $this->redirectToRoute('login',["drucken" => $bDrucken]);
  1846.         }
  1847.         else
  1848.         {
  1849.             $this->addFlash(
  1850.                 'error',
  1851.                 'Die Ãœbermittlung Ihres Zählerstands ist zur Zeit nicht möglich. Bitte versuchen Sie es später erneut.'
  1852.             );
  1853.             return $this->redirectToRoute('login');
  1854.         }
  1855.     }
  1856.     #[Route('/login/twofa/'name'login_twofa')]
  1857.     public function logintwofa(Request $requestMailerInterface $mailerEntityManagerInterface $entityManagerManagerRegistry $doctrine)
  1858.     {
  1859.         if($request->get('emailtwofa'))
  1860.         {
  1861.             $session            = new Session();
  1862.             $session->set('email'$request->get('emailtwofa'));
  1863.             $session->set('passwordtwofa'$request->get('passwordtwofa'));
  1864.             $oUser $doctrine->getRepository(User::class)->findOneBy(["email" => $request->get('emailtwofa')]);
  1865.             if(!$oUser)
  1866.             {
  1867.                 return $this->redirectToRoute('login');
  1868.             }
  1869.             // Prüfung Token-Laufzeit
  1870.             $sTokenDuration          $oUser->getTokenduration();
  1871.             $sTokenDurationTimestamp strtotime("- 120 minutes"strtotime($sTokenDuration));
  1872.             if(time() > $sTokenDurationTimestamp)
  1873.             {
  1874.                 $oWebservice        = new WebserviceController();
  1875.                 $oClient            null;
  1876.                 if($oWebservice->checkWsConnection($doctrine))
  1877.                 {
  1878.                     $oClient $oWebservice->getClient($doctrine);
  1879.                 }
  1880.                 $aTemp       = array();
  1881.                 $sTo         $request->get('emailtwofa');
  1882.                 $sAnrede     "Sehr geehrte Damen und Herren";
  1883.                 $oAnrede     $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1884.                 if($oAnrede)
  1885.                 {
  1886.                     $sAnrede $oAnrede->getMetavalue();
  1887.                 }
  1888.                 // Mailsignatur
  1889.                 $oInhalte  = new InhalteController();
  1890.                 $sSignatur $oInhalte->getMailSignatur($doctrine);
  1891.                 $sTokenDuration 3600;
  1892.                 $sTokenLength   12;
  1893.                 $oTokenDuration $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_duration"]);
  1894.                 $oTokenLength   $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "regist_token_length"]);
  1895.                 if ($oTokenDuration)
  1896.                 {
  1897.                     $sTokenDuration = (int) $oTokenDuration->getMetavalue();
  1898.                 }
  1899.                 if ($oTokenLength)
  1900.                 {
  1901.                     $sTokenLength = (int) $oTokenLength->getMetavalue();
  1902.                 }
  1903.                 if(empty($sTokenDuration))
  1904.                 {
  1905.                     $sTokenDuration 3600;
  1906.                 }
  1907.                 if(empty($sTokenLength))
  1908.                 {
  1909.                     $sTokenLength 12;
  1910.                 }
  1911.                 $sTokenDuration $sTokenDuration 60;
  1912.                 $sTokenDuration += 120;
  1913.                 $sTokenDuration date("d.m.Y H:i:s"strtotime("+".$sTokenDuration." minutes"time()));
  1914.                 // Mailvorlage
  1915.                 $aMailvorlage $doctrine->getRepository(Mailtexte::class)->findAll();
  1916.                 $aTemp = array();
  1917.                 foreach ($aMailvorlage as $iKey => $oSetting) {
  1918.                     $aTemp[$oSetting->getMetakey()] = $oSetting;
  1919.                 }
  1920.                 $aMailvorlage $aTemp;
  1921.                 $sAnrede  "Sehr geehrte Damen und Herrren";
  1922.                 if(in_array("ROLE_ADMIN",$oUser->getRoles()))
  1923.                 {
  1924.                     $oAnrede $doctrine->getRepository(Settings::class)->findOneBy(["metakey" => "Standardanrede"]);
  1925.                     if($oAnrede)
  1926.                     {
  1927.                         $sAnrede $oAnrede->getMetavalue();
  1928.                     }
  1929.                 }
  1930.                 else
  1931.                 {
  1932.                     if($oClient)
  1933.                     {
  1934.                         $aResult         $oClient->GetCustomerInternalsByNo(array('p_No' => $oUser->getKundennummer(), 'v_ExportCustomerInternals' => array()))->v_ExportCustomerInternals->CustomerInternal;
  1935.                         if(is_array($aResult))
  1936.                         {
  1937.                             $sAnrede $aResult[0]->SalutationFormal;
  1938.                         }
  1939.                         else
  1940.                         {
  1941.                             $sAnrede $aResult->SalutationFormal;
  1942.                         }
  1943.                     }
  1944.                 }
  1945.                 $sHash substr(md5(time()), 05);
  1946.                 $oUser->setHash($sHash);
  1947.                 $oUser->setTokenduration($sTokenDuration);
  1948.                 $entityManager->persist($oUser);
  1949.                 $entityManager->flush();
  1950.                 $sSubject  $aMailvorlage["token_sendet"]->getBetreff();
  1951.                 $sMailBody $aMailvorlage["token_sendet"]->getInhalt();
  1952.                 $sAbsender $aMailvorlage["token_sendet"]->getAbsender();
  1953.                 if(empty($sAbsender))
  1954.                 {
  1955.                     $oAbsender $doctrine->getRepository(Portalsettings::class)->findOneBy(["metakey" => "standardabsender"]);
  1956.                     if($oAbsender)
  1957.                     {
  1958.                         $sAbsender trim($oAbsender->getMetavalue());
  1959.                     }
  1960.                 }
  1961.                 $sReplacedMailBody str_replace(array(
  1962.                     "#anrede#""#code#""#tokenduration#"
  1963.                 ), array(
  1964.                     $sAnrede$sHash$sTokenDuration
  1965.                 ), $sMailBody);
  1966.                 $sStyle     "";
  1967.                 $sFile      "css/email.css";
  1968.                 if(file_exists($sFile))
  1969.                 {
  1970.                     $sStyle file_get_contents($sFile);
  1971.                 }
  1972.                 $sFile      "css/customer.css";
  1973.                 if(file_exists($sFile))
  1974.                 {
  1975.                     $sStyle .= file_get_contents($sFile);
  1976.                 }
  1977.                 $oSystem    $doctrine->getRepository(Texte::class)->findOneBy(["metakey" => "login-0"]);
  1978.                 $oMail = (new TemplatedEmail())
  1979.                     ->from($sAbsender)
  1980.                     ->to($sTo)
  1981.                     ->subject($sSubject)
  1982.                     // path of the Twig template to render
  1983.                     ->htmlTemplate('emails/twofa.html.twig')
  1984.                     // pass variables (name => value) to the template
  1985.                     ->context([
  1986.                         "context" => $sReplacedMailBody,
  1987.                         "betreff" => $sSubject,
  1988.                         "signatur" => $sSignatur,
  1989.                         "style" => $sStyle,
  1990.                         "system" => $oSystem->getMetavalue()
  1991.                     ]);
  1992.                 $loader             = new FilesystemLoader('../templates/');
  1993.                 $twigEnv            = new Environment($loader);
  1994.                 $twigBodyRenderer   = new BodyRenderer($twigEnv);
  1995.                 $twigBodyRenderer->render($oMail);
  1996.                 $oMailer  = new MailController();
  1997.                 $oMailer  $oMailer->getMailer($doctrine);
  1998.                 $session = new Session();
  1999.                 $session->set("emailtwofa",$request->get('emailtwofa'));
  2000.                 $session->set("pwtwofa",$request->get('pwtwofa'));
  2001.                 try
  2002.                 {
  2003.                     $oMailer->send($oMail);
  2004.                     $this->addFlash(
  2005.                         'neu',
  2006.                         'Wir haben Ihnen einen Logincode per E-Mail zugesendet.'
  2007.                     );
  2008.                 }
  2009.                 catch(\Exception $exception)
  2010.                 {
  2011.                     $this->addFlash(
  2012.                         'error',
  2013.                         "Die Mail konnte leider nicht versendet werden."
  2014.                     );
  2015.                 }
  2016.             }
  2017.         }
  2018.         return $this->redirectToRoute('login',["twofa" => true]);
  2019.     }
  2020. }