src/Controller/UserController.php line 145

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\Security\Core\User\UserInterface;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Symfony\Contracts\Translation\TranslatorInterface;
  10. use Knp\Component\Pager\PaginatorInterface;
  11. use Scheb\TwoFactorBundle\Security\TwoFactor\Provider\Google\GoogleAuthenticatorInterface;
  12. use Endroid\QrCode\QrCode;
  13. use App\Form\UserSettingsFormType;
  14. use App\Form\User2FAFormType;
  15. use App\Form\UserSearchFormType;
  16. use App\Form\UserRolesFormType;
  17. use App\Entity\User;
  18. use App\Entity\UserProfile;
  19. use App\Repository\UserRepository;
  20. class UserController extends AbstractController
  21. {
  22.     public function __construct(TranslatorInterface $translator)
  23.     {
  24.         $this->translator $translator;
  25.     }
  26.     /**
  27.      * @Route("/settings/", name="user")
  28.      */
  29.     public function profile(UserInterface $userRequest $requestEntityManagerInterface $emTranslatorInterface $translatorGoogleAuthenticatorInterface $googleAuthenticatorService)
  30.     {
  31.         $this->denyAccessUnlessGranted('ROLE_USER');
  32.         $this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
  33.         $repository $this->getDoctrine()->getRepository(User::class);
  34.         $user $repository->findOneBy(array('id' => $user->getId()));
  35.         $repository $this->getDoctrine()->getRepository(UserProfile::class);
  36.         $userprofile $repository->findOneBy(array('user' => $user->getId()));
  37.         $newsletter_form $this->createForm(UserSettingsFormType::class, $user);
  38.         $newsletter_form->handleRequest($request);
  39.         if ($newsletter_form->isSubmitted() && $newsletter_form->isValid()){
  40.             $user $newsletter_form->getData();
  41.             $em->persist($user);
  42.             $em->flush();
  43.             $this->addFlash('success'$translator->trans("Nieuwsbrief instelling opgeslagen"));
  44.         }
  45.         $forumdb_conn $this->getDoctrine()->getConnection('forumdb');
  46.         $forumprofile_query $forumdb_conn->prepare("SELECT `user_regdate`,`user_lastmark`,`user_posts` FROM `phpbb_users` WHERE `user_id` = '".$this->getUser()->getId()."' LIMIT 1");
  47.         $forumprofile_query->execute();
  48.         $forumprofile $forumprofile_query->fetchAll()[0];
  49.         $profileflairs_query $forumdb_conn->prepare("SELECT phpbb_flair.flair_id, phpbb_flair.flair_icon, phpbb_flair.flair_color, phpbb_flair.flair_icon_color, phpbb_flair.flair_name FROM phpbb_user_group, phpbb_flair_groups, phpbb_flair WHERE phpbb_user_group.group_id = phpbb_flair_groups.group_id AND phpbb_flair_groups.flair_id = phpbb_flair.flair_id AND phpbb_user_group.user_id = '".$this->getUser()->getId()."'");
  50.         $profileflairs_query->execute();
  51.         $profileflairs $profileflairs_query->fetchAll();
  52.         // 2FA start
  53.         $repository $this->getDoctrine()->getRepository(User::class);
  54.         $user $repository->findOneBy(array('id' => $this->getUser()->getId()));
  55.         $mfa_form $this->createForm(User2FAFormType::class);
  56.         $mfa_form->handleRequest($request);
  57.         if ($mfa_form->isSubmitted() && $mfa_form->isValid()) {
  58.             $code $mfa_form->getData()['code'];
  59.             $mode $request->getSession()->get('2famode''none');
  60.             $secret $request->getSession()->get('2fasecret'null);
  61.             if($mode == 'add') {
  62.                 $user->setGoogleAuthenticatorSecret($secret);
  63.                 $validation $googleAuthenticatorService->checkCode($user$code);
  64.                 if($validation) {
  65.                     $em->persist($user);
  66.                     $em->flush();
  67.                     $this->addFlash('success'$this->translator->trans('2 staps authenticatie aangezet'));
  68.                 } else {
  69.                     $this->addFlash('success'$this->translator->trans('Foutieve validatiecode'));
  70.                 }
  71.             }
  72.             elseif($mode == 'remove') {
  73.                 $validation $googleAuthenticatorService->checkCode($user$code);
  74.                 if($validation) {
  75.                     $user->setGoogleAuthenticatorSecret(NULL);
  76.                     $em->persist($user);
  77.                     $em->flush();
  78.                     $this->addFlash('success'$this->translator->trans('2 staps authenticatie uitgezet'));
  79.                 } else {
  80.                     $this->addFlash('success'$this->translator->trans('Foutieve validatiecode'));
  81.                 }
  82.             } else {
  83.                 dd("2fa mode error");
  84.             }
  85.             $request->getSession()->set('2fasecret'null);
  86.             return $this->redirectToRoute('user');
  87.         } else {
  88.             if(empty($user->getGoogleAuthenticatorSecret())) {
  89.                 $user_2fa false;
  90.     
  91.                 $secret $googleAuthenticatorService->generateSecret();
  92.                 $request->getSession()->set('2famode''add');
  93.                 $request->getSession()->set('2fasecret'$secret);
  94.                 $user->setGoogleAuthenticatorSecret($secret);
  95.     
  96.                 $qrCode = new QrCode($googleAuthenticatorService->getQRContent($user));
  97.                 $qrPNGBase64 base64_encode($qrCode->writeString());
  98.                 $user->setGoogleAuthenticatorSecret(null);
  99.             } else {
  100.                 $user_2fa true;
  101.                 $qrPNGBase64 null;
  102.                 $request->getSession()->set('2famode''remove');
  103.                 $request->getSession()->set('2fasecret'null);
  104.             }
  105.         }
  106.         return $this->render('user_profile.html.twig' , [
  107.             'avatar' => $user->getAvatar(),
  108.             'userprofile' => $userprofile,
  109.             'newsletter_form' => $newsletter_form->createView(),
  110.             'forumprofile' => $forumprofile,
  111.             'profileflairs' => $profileflairs,
  112.             'user_2fa' => $user_2fa,
  113.             'qrcode' => $qrPNGBase64,
  114.             'mfa_form' => $mfa_form->createView()
  115.         ]);
  116.     }
  117.     /**
  118.      * @Route("/user/{username}", name="user_profile_public")
  119.      */
  120.     public function user_profile_public(string $usernameEntityManagerInterface $em)
  121.     {
  122.         $this->denyAccessUnlessGranted('ROLE_USER');
  123.         $repository $this->getDoctrine()->getRepository(User::class);
  124.         $user $repository->findOneBy(array('username' => $username));
  125.         $repository $this->getDoctrine()->getRepository(UserProfile::class);
  126.         $userprofile $repository->findOneBy(array('user' => $user->getId()));
  127.         $forumdb_conn $this->getDoctrine()->getConnection('forumdb');
  128.         $forumprofile_query $forumdb_conn->prepare("SELECT `user_regdate`,`user_lastmark`,`user_posts` FROM `phpbb_users` WHERE `user_id` = '".$user->getId()."' LIMIT 1");
  129.         $forumprofile_query->execute();
  130.         $forumprofile $forumprofile_query->fetchAll()[0];
  131.         $profileflairs_query $forumdb_conn->prepare("SELECT phpbb_flair.flair_id, phpbb_flair.flair_icon, phpbb_flair.flair_color, phpbb_flair.flair_icon_color, phpbb_flair.flair_name FROM phpbb_user_group, phpbb_flair_groups, phpbb_flair WHERE phpbb_user_group.group_id = phpbb_flair_groups.group_id AND phpbb_flair_groups.flair_id = phpbb_flair.flair_id AND phpbb_user_group.user_id = '".$user->getId()."'");
  132.         $profileflairs_query->execute();
  133.         $profileflairs $profileflairs_query->fetchAll();
  134.         return $this->render('user_profile_public.html.twig' , [
  135.             'avatar' => $user->getAvatar(),
  136.             'userid' => $user->getId(),
  137.             'username' => $user->getUsername(),
  138.             'userprofile' => $userprofile,
  139.             'forumprofile' => $forumprofile,
  140.             'profileflairs' => $profileflairs,
  141.         ]);
  142.     }
  143.     /**
  144.      * @Route("/moderate/users", name="users_moderate")
  145.      */
  146.     public function users_moderate(Request $requestTranslatorInterface $translatorEntityManagerInterface $emPaginatorInterface $paginator)
  147.     {
  148.         $this->denyAccessUnlessGranted('ROLE_MOD_USER');
  149.         $filter = array();
  150.         $form $this->createForm(UserSearchFormType::class);
  151.         $form->handleRequest($request);
  152.         if ($form->isSubmitted() && $form->isValid()){
  153.             $filter $form->getData();
  154.         } else {
  155.             if(!$request->query->get('page')){
  156.                 $form->get('user')->setData("");
  157.             } elseif($request->query->get('page') && $request->query->get('filter')) {
  158.                 $filter $request->query->get('filter');
  159.                 if(isset($filter['user']) && $filter['user'] != '') { $form->get('user')->setData($filter['user']); } else { $form->get('user')->setData(null); $filter['user'] = null;};
  160.             }
  161.         }
  162.         $qb $em->createQueryBuilder('u')
  163.             ->from('App\Entity\User''u')
  164.             ->addSelect('u')
  165.             ->orderBy('u.username','ASC')
  166.         ;
  167.         if(!empty($filter['user'])) {
  168.             $qb->andWhere("u.username LIKE :user")
  169.                 ->setParameter('user'str_replace("*","%",$filter['user']))
  170.             ;
  171.         }
  172.         $result $paginator->paginate(
  173.             $qb/* query NOT result */
  174.             $request->query->getInt('page'1), /*page number*/
  175.             10 /*limit per page*/
  176.         );
  177.         $result->setParam('filter'$filter);
  178.         $result->setCustomParameters([
  179.             'align' => 'right'# center|right (for template: twitter_bootstrap_v4_pagination)
  180.         ]);
  181.         return $this->render('user_moderate.html.twig', [
  182.             'form' => $form->createView(),
  183.             'result' => $result
  184.         ]);
  185.     }
  186.     /**
  187.      * @Route("/moderate/users/rights/{user}", name="users_moderate_editrights")
  188.      */
  189.     public function users_moderate_editrights(User $userRequest $requestTranslatorInterface $translatorEntityManagerInterface $em)
  190.     {
  191.         $this->denyAccessUnlessGranted('ROLE_ADMIN');
  192.         $roles=array();
  193.         foreach ($user->getRoles() as $i => $role) {
  194.             if($role != ""){
  195.                 $roles[$i] = $role;
  196.             }
  197.         }
  198.         $total count($roles);
  199.         $i=0;
  200.         $groups "";
  201.         foreach ($roles as $role) {
  202.             if($role == "ROLE_USER") { $role ""; }
  203.             elseif($role == "ROLE_ADMIN") { $role $translator->trans("Beheerder"); }
  204.             elseif($role == "ROLE_SUPER_MOD") { $role $translator->trans("Super moderator"); }
  205.             elseif($role == "ROLE_FOSSILDB_MOD") { $role $translator->trans("Fossieldatabase moderator"); }
  206.             elseif($role == "ROLE_LOCATION_MOD") { $role $translator->trans("Locatiedatabase moderator"); }
  207.             $groups=$groups.$role;
  208.             $i++;
  209.             if($i<$total){ $groups=$groups.","; }
  210.         }
  211.         $form $this->createForm(UserRolesFormType::class);
  212.         $form->handleRequest($request);
  213.         if ($form->isSubmitted() && $form->isValid()){
  214.             $formdata $form->getData();
  215.             $formdata json_decode($formdata["groups"]);
  216.             $user_roles = array();
  217.             $user_roles[]="ROLE_USER";
  218.             if($formdata){
  219.                 foreach ($formdata as $item) {
  220.                     if($item->value == $translator->trans("Beheerder")) { $user_roles[]="ROLE_ADMIN"; }
  221.                     elseif($item->value == $translator->trans("Super moderator")) { $user_roles[]="ROLE_SUPER_MOD"; }
  222.                     elseif($item->value == $translator->trans("Fossieldatabase moderator")) { $user_roles[]="ROLE_FOSSILDB_MOD"; }
  223.                     elseif($item->value == $translator->trans("Locatiedatabase moderator")) { $user_roles[]="ROLE_LOCATION_MOD"; }
  224.                 }
  225.             }
  226.             $user->setRoles($user_roles);
  227.             $em->persist($user);
  228.             $em->flush();
  229.             $this->addFlash('success'"Gebruikers rechten bijgewerkt");
  230.             
  231.             return $this->redirectToRoute('users_moderate_editrights',array('user' => $user->getId()));
  232.         }
  233.         $form->get('groups')->setData($groups);
  234.         return $this->render('user_moderate_roles.html.twig', [
  235.             'form' => $form->createView(),
  236.             'role' => $role,
  237.             'username' => $user->getUsername()
  238.         ]);
  239.     }
  240.     /**
  241.      * @Route("/api/v1/user/getuser", methods="GET", name="api_getuser")
  242.      */
  243.     public function api_getuser(UserRepository $userRepositoryRequest $request)
  244.     {
  245.         $users $userRepository->findAllMatching($request->query->get('query'));
  246.         return $this->json($users200, [], ['groups' => ['main']]);
  247.     }
  248. }