src/Controller/UserController.php line 245

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Psr\Log\LoggerInterface;
  4. use App\Entity\User;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  9. use App\Entity\UserAction;
  10. use Pagerfanta\Pagerfanta;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. use Symfony\Component\Mailer\MailerInterface;
  13. use Symfony\Component\Mime\Email;
  14. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  15. use Pagerfanta\Doctrine\ORM\QueryAdapter;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  17. class UserController  extends AbstractController
  18. {
  19.     /**
  20.      * @Route("/user/create", name="user_create")
  21.      */
  22.     public function indexAction(Request $requestTranslatorInterface $translator)
  23.     {
  24.         return $this->render('users/create.html.twig', [
  25.             'page_title' => $translator->trans('Add User'),
  26.             'box_title' => '<i class="fa fa-plus-circle fa-fw"></i> '.$translator->trans('Add new'),
  27.         ]);
  28.     }
  29.     /**
  30.      * @IsGranted("ROLE_SUPER_ADMIN")
  31.      * @Route("/user/create/process", name="user_create_process")
  32.      */
  33.     public function createAction(Request $requestLoggerInterface $loggerTranslatorInterface $translatorMailerInterface $mailerUserPasswordHasherInterface $passwordHasher)
  34.     {
  35.         $email $request->request->get('email');
  36.         $username $request->request->get('username');
  37.         $password $request->request->get('pwd');
  38.         
  39.         // $userManager = $this->get('fos_user.user_manager');
  40.         // $user = $userManager->createUser();
  41.         $user = new User();
  42.         $user->setUsername($username);
  43.         $user->setEmail($email );
  44.         // $user->setEmailCanonical($email );
  45.         $user->setEnabled(1);
  46.         // $password = bin2hex(openssl_random_pseudo_bytes(4));
  47.         $user->setPassword($passwordHasher->hashPassword($user,$password));
  48.         $user->addRole($request->request->get('role'));
  49.         $user->setOldPasswords($this->my_simple_crypt($password"e"));
  50.         $user->setRappel$request->request->get('rappel') ? 0);
  51.         $user->setPasswordUpdatedAt(new \DateTime());
  52.         $em $this->getDoctrine()->getManager();
  53.         $em->persist($user);
  54.         $em->flush();
  55.         // $userManager->updateUser($user);
  56.         // send email using swiftmailer
  57.         $mailFrom $this->getParameter('email_from'"fiberlink.m6@gmail.com");
  58.         $appName $this->getParameter('app_name');
  59.         $loginUrl $this->getParameter('base_url');
  60.         $subject $appName." Account created";
  61.         $htmlContent $this->renderView(
  62.             'email/registration.html.twig', array(
  63.                 'username' => $username,
  64.                 'password' => $password,
  65.                 'login_url' => $loginUrl,
  66.                 'app_name' => $appName
  67.             )
  68.         );
  69.         $email = (new Email())
  70.                             ->from($mailFrom)
  71.                             ->to($email)
  72.                             ->subject($subject)
  73.                             ->html($htmlContent);
  74.         // $message = (new \Swift_Message($subject));
  75.         // $message->setFrom($mailFrom)
  76.         // ->setTo($email)
  77.         // ->setBody(
  78.         //     $htmlContent,
  79.         //     'text/html'
  80.         // );
  81.         try {
  82.             $mailer->send($email);
  83.             // $https['ssl']['verify_peer'] = FALSE;
  84.             // $https['ssl']['verify_peer_name'] = FALSE;
  85.             // // $transport = \Swift_SmtpTransport::newInstance($this->getParameter('mailer_host'), $this->getParameter('mailer_port'),  $this->getParameter('mailer_encryption'))
  86.             // //     ->setUsername($this->getParameter('mailer_user'))
  87.             // //     ->setPassword($this->getParameter('mailer_password'))
  88.             // //     ->setStreamOptions($https)
  89.             // // ;
  90.             // $transport = new \Swift_SmtpTransport($this->container->getParameter('mailer_host'), $this->container->getParameter('mailer_port'),  $this->container->getParameter('mailer_encryption'));
  91.             // $transport->setUsername($this->container->getParameter('mailer_user'));
  92.             // $transport->setPassword($this->container->getParameter('mailer_password'));
  93.             // $transport->setStreamOptions($https);
  94.             // $res = $this->get('mailer')->newInstance($transport)->send($message);
  95.             $logger->info("message envoyé");
  96.             // $this->get('mailer')->send($message);
  97.         } catch (\Exception $e) {
  98.         }
  99.         // send email via sendgrid
  100.         // require __DIR__.'/../Services/sendgrid-php/vendor/autoload.php';
  101.         //
  102.         // $mailFrom = $this->getParameter('email_noreply');
  103.         // $appName = $this->getParameter('app_name');
  104.         // $loginUrl = $this->getParameter('base_url');
  105.         //
  106.         // $htmlContent = $this->renderView(
  107.         //     'email/registration.html.twig', array(
  108.         //         'username' => $username,
  109.         //         'password' => $password,
  110.         //         'login_url' => $loginUrl,
  111.         //         'app_name' => $appName
  112.         //     )
  113.         // );
  114.         //
  115.         // $from = new \SendGrid\Email($appName, $mailFrom);
  116.         // $subject = $appName." Account created";
  117.         // $to = new \SendGrid\Email($username, $email);
  118.         // $content = new \SendGrid\Content("text/html", $htmlContent);
  119.         //
  120.         // $mail = new \SendGrid\Mail($from, $subject, $to, $content);
  121.         // $apiKey = $this->getParameter('sendgrid_api_key');
  122.         // $sg = new \SendGrid($apiKey);
  123.         // $sg->client->mail()->send()->post($mail);
  124.         return $this->redirectToRoute('user_list');
  125.     }
  126.     /**
  127.      * @Route("/user/list", name="user_list")
  128.      */
  129.     public function listAction(Request $requestTranslatorInterface $translator)
  130.     {
  131.         $list $this->getDoctrine()->getRepository('App\Entity\User')->findAll();
  132.         return $this->render('users/list.html.twig', [
  133.             'page_title' => $translator->trans('List Users'),
  134.             'list' => $list
  135.         ]);
  136.     }
  137.     /**
  138.      * @Route("/user/view/{id}", name="user_view")
  139.      */
  140.     public function viewAction($idTranslatorInterface $translator)
  141.     {
  142.         $user $this->getDoctrine()->getRepository('App\Entity\User')->findOneById($id);
  143.         return $this->render('users/view.html.twig', [
  144.             'page_title' => $translator->trans('View User'),
  145.             'box_title' => '<i class="fa fa-edit fa-fw"></i> '.$translator->trans('Edit'),
  146.             'user' => $user
  147.         ]);
  148.     }
  149.     /**
  150.      * @IsGranted("ROLE_SUPER_ADMIN")
  151.      * @Route("/user/edit", name="user_edit_process")
  152.      */
  153.     public function editAction(Request $requestTranslatorInterface $translator)
  154.     {
  155.         $em $this->getDoctrine()->getManager();
  156.         $user $this->getDoctrine()->getRepository('App\Entity\User')->findOneById($request->request->get('id'));
  157.         $username $user->getUsername();
  158.         $user->setEmail($request->request->get('email'));
  159.         // $user->setEmailCanonical($request->request->get('email'));
  160.         $user->setRappel$request->request->get('rappel') ? 0);
  161.         if ($username != 'superadmin'){
  162.             if (isset($_POST['enabled'])) {
  163.                 $user->setEnabled(1);
  164.             } else {
  165.                 $user->setEnabled(0);
  166.             }
  167.             $roles $user->getRoles();
  168.             foreach ($roles as $role){
  169.                 $user->removeRole($role);
  170.             }
  171.             $user->addRole($request->request->get('role'));
  172.         }
  173.         $em->persist($user);
  174.         $em->flush();
  175.         return $this->redirectToRoute('user_list');
  176.     }
  177.     /**
  178.      * @Route("/user/check/new", name="ajax_check_new_user")
  179.      */
  180.     public function checkNewUserAction(Request $requestTranslatorInterface $translator)
  181.     {
  182.         $usernameExists $this->getDoctrine()->getRepository('App\Entity\User')->findOneByUsername($_POST['username']);
  183.         $emailExists $this->getDoctrine()->getRepository('App\Entity\User')->findOneByEmail($_POST['email']);
  184.         $response['username'] = ($usernameExists) ? 0;
  185.         $response['email'] = ($emailExists) ? 0;
  186.         return $this->json($response);
  187.     }
  188.     /**
  189.      * @Route("/user/check/edit", name="ajax_check_edit_user")
  190.      */
  191.     public function checkEditUserAction(Request $request)
  192.     {
  193.         $username $_POST['username'];
  194.         $email $_POST['email'];
  195.         $response $this->getDoctrine()->getRepository('App\Entity\User')->checkOtherMail($username$email);
  196.         return $this->json($response);
  197.     }
  198.     /**
  199.      * @Route("/change-password", name="change_password")
  200.      */
  201.     public function changePasswordAction(Request $requestTranslatorInterface $translatorUserPasswordHasherInterface $passwordHasher)
  202.     {
  203.         $user $this->getUser();
  204.         $username $user->getUsername();
  205.         $email $user->getEmail();
  206.         if (null !== $request->request->get('pwd')){
  207.             $new_pwd $request->request->get('pwd');
  208.             $em $this->getDoctrine()->getManager();
  209.             $oldPasswordsTemp explode($this->getParameter("password.delimiter"), $user->getOldPasswords());
  210.             $oldPasswords = array();
  211.             foreach ($oldPasswordsTemp as $value) {
  212.                 $oldPasswords[] = $this->my_simple_crypt($value"d");
  213.             }
  214.             if (in_array($new_pwd$oldPasswords)) {
  215.                 $info $translator->trans('le mot de passe ne doit être identique au trois précédents');
  216.             }
  217.             else {
  218.                 //tweak - have to make other change in db
  219.                 $now = new \DateTime();
  220.                 $user->setLastLogin($now);
  221.                 // now set pwd
  222.                 $user->setPassword($passwordHasher->hashPassword($user,$new_pwd));
  223.                 for ($i=0$i count($oldPasswords); $i++) {
  224.                     $oldPasswords[$i] = $this->my_simple_crypt($oldPasswords[$i], "e");
  225.                 }
  226.                 if (count($oldPasswords) < 3) {
  227.                     $oldPasswords[] = $this->my_simple_crypt($new_pwd"e");
  228.                 }
  229.                 else {
  230.                     $oldPasswords[0] = $oldPasswords[1];
  231.                     $oldPasswords[1] = $oldPasswords[2];
  232.                     $oldPasswords[2] = $this->my_simple_crypt($new_pwd"e");
  233.                 }
  234.                 $user->setOldPasswords(implode($this->getParameter("password.delimiter"), $oldPasswords));
  235.                 $user->setPasswordUpdatedAt(new \DateTime());
  236.                 $user->setOneWeekRemainderSent(0);
  237.                 $user->setTwoWeekRemainderSent(0);
  238.                 $em->persist($user);
  239.                 $em->flush();
  240.                 $info $translator->trans('Password changed successfully');
  241.             }
  242.         } else {
  243.             $info '';
  244.         }
  245.         return $this->render('users/change_password.html.twig', array(
  246.             'page_title' => $translator->trans('Change Password'),
  247.             'box_title' => '<i class="fa fa-unlock fa-fw"></i> '$translator->trans('Change Password'),
  248.             'info' => $info,
  249.             "username" => $username,
  250.             "email" => $email,
  251.         ));
  252.     }
  253.     /**
  254.      * @Route("/reset-password", name="reset_password")
  255.      */
  256.     public function resetPasswordAction(Request $requestLoggerInterface $loggerTranslatorInterface $translatorMailerInterface $mailerUserPasswordHasherInterface $passwordHasher)
  257.     {
  258.         if (null !== $request->request->get('user')){
  259.             $em $this->getDoctrine()->getManager();
  260.             $query $request->request->get('user');
  261.             // try to find by email
  262.             $user $this->getDoctrine()->getRepository('App\Entity\User')->findOneByEmail($query);
  263.             // try to find by username
  264.             if (!$user){
  265.                 $user $this->getDoctrine()->getRepository('App\Entity\User')->findOneByUsername($query);
  266.             }
  267.             // user found
  268.             if($user){
  269.                 $oldPasswords explode($this->getParameter("password.delimiter"), $user->getOldPasswords());
  270.                 if (count($oldPasswords) == && !$oldPasswords[0]) {
  271.                     $oldPasswords = array();
  272.                 }
  273.                 //tweak - have to make other change in db
  274.                 $now = new \DateTime();
  275.                 $user->setLastLogin($now);
  276.                 // now set pwd
  277.                 $pwd $this->generateStrongPassword($length 8$add_dashes false$available_sets 'lud');
  278.                 // $pwd = bin2hex(openssl_random_pseudo_bytes(8));
  279.                 $user->setPassword($passwordHasher->hashPassword($user,$pwd));
  280.                 if (count($oldPasswords) < 3) {
  281.                     $oldPasswords[] = $this->my_simple_crypt($pwd"e");
  282.                 }
  283.                 else {
  284.                     $oldPasswords[0] = $oldPasswords[1];
  285.                     $oldPasswords[1] = $oldPasswords[2];
  286.                     $oldPasswords[2] = $this->my_simple_crypt($pwd"e");
  287.                 }
  288.                 $user->setOldPasswords(implode($this->getParameter("password.delimiter"), $oldPasswords));
  289.                 $user->setPasswordUpdatedAt(new \DateTime());
  290.                 $user->setOneWeekRemainderSent(0);
  291.                 $user->setTwoWeekRemainderSent(0);
  292.                 $em->persist($user);
  293.                 $em->flush();
  294.                 // send email using swiftmailer
  295.                 $mailFrom $this->getParameter('email_from'"fiberlink.m6@gmail.com");
  296.                 $username $user->getUsername();
  297.                 $baseUrl $this->getParameter('base_url');
  298.                 $appName $this->getParameter('app_name');
  299.                 $mailTo $user->getEmail();
  300.                 $subject $appName." Password reset";
  301.                 $htmlContent $this->renderView(
  302.                     'email/reset_password.html.twig', array('username' => $username'password' => $pwd'base_url' => $baseUrl)
  303.                 );
  304.                 $email = (new Email())
  305.                             ->from($mailFrom)
  306.                             ->to($mailTo)
  307.                             ->subject($subject)
  308.                             ->html($htmlContent);
  309.                 // $message = (new \Swift_Message($subject));
  310.                 // $message->setFrom($mailFrom)
  311.                 // ->setTo($mailTo)
  312.                 // ->setBody(
  313.                 //     $htmlContent,
  314.                 //     'text/html'
  315.                 // );
  316.                 try {
  317.                     $mailer->send($email);
  318.                     // $https['ssl']['verify_peer'] = FALSE;
  319.                     // $https['ssl']['verify_peer_name'] = FALSE;
  320.                     // // $transport = \Swift_SmtpTransport::newInstance($this->getParameter('mailer_host'), $this->getParameter('mailer_port'),  $this->getParameter('mailer_encryption'))
  321.                     // //     ->setUsername($this->getParameter('mailer_user'))
  322.                     // //     ->setPassword($this->getParameter('mailer_password'))
  323.                     // //     ->setStreamOptions($https)
  324.                     // // ;
  325.                     // $transport = new \Swift_SmtpTransport($this->container->getParameter('mailer_host'), $this->container->getParameter('mailer_port'),  $this->container->getParameter('mailer_encryption'));
  326.                     // $transport->setUsername($this->container->getParameter('mailer_user'));
  327.                     // $transport->setPassword($this->container->getParameter('mailer_password'));
  328.                     // $transport->setStreamOptions($https);
  329.                     // $res = $this->get('mailer')->newInstance($transport)->send($message);
  330.                     $logger->info("message envoyé");
  331.                     // $this->get('mailer')->send($message);
  332.                 } catch (\Exception $e) {
  333.                 }
  334.                 // send email
  335.                 // require __DIR__.'/../Services/sendgrid-php/vendor/autoload.php';
  336.                 //
  337.                 // $username = $user->getUsername();
  338.                 // $baseUrl = $this->getParameter('base_url');
  339.                 // $appName = $this->getParameter('app_name');
  340.                 //
  341.                 //
  342.                 // $htmlContent = $this->renderView(
  343.                 //     'email/reset_password.html.twig', array('username' => $username, 'password' => $pwd, 'base_url' => $baseUrl)
  344.                 // );
  345.                 //
  346.                 // $mailTo = $user->getEmail();
  347.                 // $mailFrom = $this->getParameter('email_noreply');
  348.                 //
  349.                 // $from = new \SendGrid\Email($appName, $mailFrom);
  350.                 // $subject = $appName." Password reset";
  351.                 // $to = new \SendGrid\Email($username, $mailTo);
  352.                 // $content = new \SendGrid\Content("text/html", $htmlContent);
  353.                 // $mail = new \SendGrid\Mail($from, $subject, $to, $content);
  354.                 //
  355.                 // $apiKey = $this->getParameter('sendgrid_api_key');
  356.                 // $sg = new \SendGrid($apiKey);
  357.                 //
  358.                 // $sg->client->mail()->send()->post($mail);
  359.                 // send info to view
  360.                 $info $translator->trans('Password reset successfully. Check your email for new password.');
  361.                 // not found
  362.             } else {
  363.                 $info $translator->trans('User not found');
  364.             }
  365.         } else {
  366.             $info '';
  367.         }
  368.         return $this->render('security/reset.html.twig', array(
  369.             'info' => $info,
  370.         ));
  371.     }
  372.     /**
  373.      * @Route("/trace_actions_list", name="trace_actions_list")
  374.      */
  375.     public function traceActionsList(Request $requestTranslatorInterface $translator)
  376.     {
  377.         // $list = $this->getDoctrine()->getRepository(UserAction::class)->findAll();
  378.         $em $this->getDoctrine()->getManager();
  379.         $queryBuilder $em->createQueryBuilder()
  380.         ->select('ua')
  381.         ->from('App\Entity\UserAction''ua')
  382.         ->orderBy("ua.id""DESC");
  383.         // $adapter = new DoctrineORMAdapter($queryBuilder);
  384.         // $pagerfanta = new Pagerfanta($adapter);
  385.         $pagerfanta = new Pagerfanta(
  386.             new QueryAdapter($queryBuilder)
  387.         );
  388.         $pageLength $request->query->get("pageLength"$this->getParameter("ua.maxPerPage"));
  389.         if ($pageLength == "Tout") {
  390.           $qb $em->createQueryBuilder()
  391.           ->select('COUNT(ua.id)')
  392.           ->from('App\Entity\UserAction''ua');
  393.           $count $qb->getQuery()->getSingleScalarResult();
  394.           $pagerfanta->setMaxPerPage($count); // 10 by default
  395.         }
  396.         else {
  397.           $pagerfanta->setMaxPerPage($pageLength); // 10 by default
  398.         }
  399.         $page $request->query->get("page"1);
  400.         $pagerfanta->setCurrentPage($page);
  401.         return $this->render('users/trace_actions_list.html.twig', [
  402.             'page_title' => $translator->trans('Historique des Actions'),
  403.             'box_title' => $translator->trans('Historique des Actions'),
  404.             // 'list' => $list,
  405.             'my_pager' => $pagerfanta,
  406.             'pageLength' => $pageLength,
  407.         ]);
  408.     }
  409.     public function my_simple_crypt$string$action 'e' ) {
  410.         // you may change these values to your own
  411.         $secret_key 'fiberlink m6 key';
  412.         $secret_iv 'fiberlink m6 key';
  413.         $output false;
  414.         $encrypt_method "AES-256-CBC";
  415.         $key hash'sha256'$secret_key );
  416.         $iv substrhash'sha256'$secret_iv ), 016 );
  417.         if( $action == 'e' ) {
  418.             $output base64_encodeopenssl_encrypt$string$encrypt_method$key0$iv ) );
  419.         }
  420.         else if( $action == 'd' ){
  421.             $output openssl_decryptbase64_decode$string ), $encrypt_method$key0$iv );
  422.         }
  423.         return $output;
  424.     }
  425.     function generateStrongPassword($length 8$add_dashes false$available_sets 'luds')
  426.     {
  427.         $sets = array();
  428.         if(strpos($available_sets'l') !== false)
  429.             $sets[] = 'abcdefghjkmnpqrstuvwxyz';
  430.         if(strpos($available_sets'u') !== false)
  431.             $sets[] = 'ABCDEFGHJKMNPQRSTUVWXYZ';
  432.         if(strpos($available_sets'd') !== false)
  433.             $sets[] = '23456789';
  434.         if(strpos($available_sets's') !== false)
  435.             $sets[] = '!@#$%&*?';
  436.         $all '';
  437.         $password '';
  438.         foreach($sets as $set)
  439.         {
  440.             $password .= $set[array_rand(str_split($set))];
  441.             $all .= $set;
  442.         }
  443.         $all str_split($all);
  444.         for($i 0$i $length count($sets); $i++)
  445.             $password .= $all[array_rand($all)];
  446.         $password str_shuffle($password);
  447.         if(!$add_dashes)
  448.             return $password;
  449.         $dash_len floor(sqrt($length));
  450.         $dash_str '';
  451.         while(strlen($password) > $dash_len)
  452.         {
  453.             $dash_str .= substr($password0$dash_len) . '-';
  454.             $password substr($password$dash_len);
  455.         }
  456.         $dash_str .= $password;
  457.         return $dash_str;
  458.     }
  459. }