<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Knp\Component\Pager\PaginatorInterface;
use Scheb\TwoFactorBundle\Security\TwoFactor\Provider\Google\GoogleAuthenticatorInterface;
use Endroid\QrCode\QrCode;
use App\Form\UserSettingsFormType;
use App\Form\User2FAFormType;
use App\Form\UserSearchFormType;
use App\Form\UserRolesFormType;
use App\Entity\User;
use App\Entity\UserProfile;
use App\Repository\UserRepository;
class UserController extends AbstractController
{
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
/**
* @Route("/settings/", name="user")
*/
public function profile(UserInterface $user, Request $request, EntityManagerInterface $em, TranslatorInterface $translator, GoogleAuthenticatorInterface $googleAuthenticatorService)
{
$this->denyAccessUnlessGranted('ROLE_USER');
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
$repository = $this->getDoctrine()->getRepository(User::class);
$user = $repository->findOneBy(array('id' => $user->getId()));
$repository = $this->getDoctrine()->getRepository(UserProfile::class);
$userprofile = $repository->findOneBy(array('user' => $user->getId()));
$newsletter_form = $this->createForm(UserSettingsFormType::class, $user);
$newsletter_form->handleRequest($request);
if ($newsletter_form->isSubmitted() && $newsletter_form->isValid()){
$user = $newsletter_form->getData();
$em->persist($user);
$em->flush();
$this->addFlash('success', $translator->trans("Nieuwsbrief instelling opgeslagen"));
}
$forumdb_conn = $this->getDoctrine()->getConnection('forumdb');
$forumprofile_query = $forumdb_conn->prepare("SELECT `user_regdate`,`user_lastmark`,`user_posts` FROM `phpbb_users` WHERE `user_id` = '".$this->getUser()->getId()."' LIMIT 1");
$forumprofile_query->execute();
$forumprofile = $forumprofile_query->fetchAll()[0];
$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()."'");
$profileflairs_query->execute();
$profileflairs = $profileflairs_query->fetchAll();
// 2FA start
$repository = $this->getDoctrine()->getRepository(User::class);
$user = $repository->findOneBy(array('id' => $this->getUser()->getId()));
$mfa_form = $this->createForm(User2FAFormType::class);
$mfa_form->handleRequest($request);
if ($mfa_form->isSubmitted() && $mfa_form->isValid()) {
$code = $mfa_form->getData()['code'];
$mode = $request->getSession()->get('2famode', 'none');
$secret = $request->getSession()->get('2fasecret', null);
if($mode == 'add') {
$user->setGoogleAuthenticatorSecret($secret);
$validation = $googleAuthenticatorService->checkCode($user, $code);
if($validation) {
$em->persist($user);
$em->flush();
$this->addFlash('success', $this->translator->trans('2 staps authenticatie aangezet'));
} else {
$this->addFlash('success', $this->translator->trans('Foutieve validatiecode'));
}
}
elseif($mode == 'remove') {
$validation = $googleAuthenticatorService->checkCode($user, $code);
if($validation) {
$user->setGoogleAuthenticatorSecret(NULL);
$em->persist($user);
$em->flush();
$this->addFlash('success', $this->translator->trans('2 staps authenticatie uitgezet'));
} else {
$this->addFlash('success', $this->translator->trans('Foutieve validatiecode'));
}
} else {
dd("2fa mode error");
}
$request->getSession()->set('2fasecret', null);
return $this->redirectToRoute('user');
} else {
if(empty($user->getGoogleAuthenticatorSecret())) {
$user_2fa = false;
$secret = $googleAuthenticatorService->generateSecret();
$request->getSession()->set('2famode', 'add');
$request->getSession()->set('2fasecret', $secret);
$user->setGoogleAuthenticatorSecret($secret);
$qrCode = new QrCode($googleAuthenticatorService->getQRContent($user));
$qrPNGBase64 = base64_encode($qrCode->writeString());
$user->setGoogleAuthenticatorSecret(null);
} else {
$user_2fa = true;
$qrPNGBase64 = null;
$request->getSession()->set('2famode', 'remove');
$request->getSession()->set('2fasecret', null);
}
}
return $this->render('user_profile.html.twig' , [
'avatar' => $user->getAvatar(),
'userprofile' => $userprofile,
'newsletter_form' => $newsletter_form->createView(),
'forumprofile' => $forumprofile,
'profileflairs' => $profileflairs,
'user_2fa' => $user_2fa,
'qrcode' => $qrPNGBase64,
'mfa_form' => $mfa_form->createView()
]);
}
/**
* @Route("/user/{username}", name="user_profile_public")
*/
public function user_profile_public(string $username, EntityManagerInterface $em)
{
$this->denyAccessUnlessGranted('ROLE_USER');
$repository = $this->getDoctrine()->getRepository(User::class);
$user = $repository->findOneBy(array('username' => $username));
$repository = $this->getDoctrine()->getRepository(UserProfile::class);
$userprofile = $repository->findOneBy(array('user' => $user->getId()));
$forumdb_conn = $this->getDoctrine()->getConnection('forumdb');
$forumprofile_query = $forumdb_conn->prepare("SELECT `user_regdate`,`user_lastmark`,`user_posts` FROM `phpbb_users` WHERE `user_id` = '".$user->getId()."' LIMIT 1");
$forumprofile_query->execute();
$forumprofile = $forumprofile_query->fetchAll()[0];
$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()."'");
$profileflairs_query->execute();
$profileflairs = $profileflairs_query->fetchAll();
return $this->render('user_profile_public.html.twig' , [
'avatar' => $user->getAvatar(),
'userid' => $user->getId(),
'username' => $user->getUsername(),
'userprofile' => $userprofile,
'forumprofile' => $forumprofile,
'profileflairs' => $profileflairs,
]);
}
/**
* @Route("/moderate/users", name="users_moderate")
*/
public function users_moderate(Request $request, TranslatorInterface $translator, EntityManagerInterface $em, PaginatorInterface $paginator)
{
$this->denyAccessUnlessGranted('ROLE_MOD_USER');
$filter = array();
$form = $this->createForm(UserSearchFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$filter = $form->getData();
} else {
if(!$request->query->get('page')){
$form->get('user')->setData("");
} elseif($request->query->get('page') && $request->query->get('filter')) {
$filter = $request->query->get('filter');
if(isset($filter['user']) && $filter['user'] != '') { $form->get('user')->setData($filter['user']); } else { $form->get('user')->setData(null); $filter['user'] = null;};
}
}
$qb = $em->createQueryBuilder('u')
->from('App\Entity\User', 'u')
->addSelect('u')
->orderBy('u.username','ASC')
;
if(!empty($filter['user'])) {
$qb->andWhere("u.username LIKE :user")
->setParameter('user', str_replace("*","%",$filter['user']))
;
}
$result = $paginator->paginate(
$qb, /* query NOT result */
$request->query->getInt('page', 1), /*page number*/
10 /*limit per page*/
);
$result->setParam('filter', $filter);
$result->setCustomParameters([
'align' => 'right', # center|right (for template: twitter_bootstrap_v4_pagination)
]);
return $this->render('user_moderate.html.twig', [
'form' => $form->createView(),
'result' => $result
]);
}
/**
* @Route("/moderate/users/rights/{user}", name="users_moderate_editrights")
*/
public function users_moderate_editrights(User $user, Request $request, TranslatorInterface $translator, EntityManagerInterface $em)
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
$roles=array();
foreach ($user->getRoles() as $i => $role) {
if($role != ""){
$roles[$i] = $role;
}
}
$total = count($roles);
$i=0;
$groups = "";
foreach ($roles as $role) {
if($role == "ROLE_USER") { $role = ""; }
elseif($role == "ROLE_ADMIN") { $role = $translator->trans("Beheerder"); }
elseif($role == "ROLE_SUPER_MOD") { $role = $translator->trans("Super moderator"); }
elseif($role == "ROLE_FOSSILDB_MOD") { $role = $translator->trans("Fossieldatabase moderator"); }
elseif($role == "ROLE_LOCATION_MOD") { $role = $translator->trans("Locatiedatabase moderator"); }
$groups=$groups.$role;
$i++;
if($i<$total){ $groups=$groups.","; }
}
$form = $this->createForm(UserRolesFormType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
$formdata = $form->getData();
$formdata = json_decode($formdata["groups"]);
$user_roles = array();
$user_roles[]="ROLE_USER";
if($formdata){
foreach ($formdata as $item) {
if($item->value == $translator->trans("Beheerder")) { $user_roles[]="ROLE_ADMIN"; }
elseif($item->value == $translator->trans("Super moderator")) { $user_roles[]="ROLE_SUPER_MOD"; }
elseif($item->value == $translator->trans("Fossieldatabase moderator")) { $user_roles[]="ROLE_FOSSILDB_MOD"; }
elseif($item->value == $translator->trans("Locatiedatabase moderator")) { $user_roles[]="ROLE_LOCATION_MOD"; }
}
}
$user->setRoles($user_roles);
$em->persist($user);
$em->flush();
$this->addFlash('success', "Gebruikers rechten bijgewerkt");
return $this->redirectToRoute('users_moderate_editrights',array('user' => $user->getId()));
}
$form->get('groups')->setData($groups);
return $this->render('user_moderate_roles.html.twig', [
'form' => $form->createView(),
'role' => $role,
'username' => $user->getUsername()
]);
}
/**
* @Route("/api/v1/user/getuser", methods="GET", name="api_getuser")
*/
public function api_getuser(UserRepository $userRepository, Request $request)
{
$users = $userRepository->findAllMatching($request->query->get('query'));
return $this->json($users, 200, [], ['groups' => ['main']]);
}
}