<?php
namespace App\Controller;
use App\Model\DataObject\Business;
use App\Model\DataObject\User;
use Carbon\Carbon;
use Pimcore\Controller\FrontendController;
use Pimcore\Mail;
use Pimcore\Model\DataObject;
use Pimcore\Model\DataObject\Folder;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Security as FrontSecurity;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Pimcore\Model\Element\Service;
class AuthController extends FrontendController
{
/**
* @Template
* @param Request $request
* @param AuthenticationUtils $authenticationUtils
* @return array
* @Route(
* "/{_locale}/login",
* name="login",
* methods={"GET","POST"}
* )
*/
public function loginAction(Request $request, AuthenticationUtils $authenticationUtils, FrontSecurity $security)
{
$lang = $request->getLocale();
$securityUser = $security->getUser();
if ($securityUser) {
$user = User::getByUsername($securityUser->getUserIdentifier())->load()[0];
if($user->getBusinesses()) {
return $this->redirect($this->generateUrl('dashboard'));
}else {
return $this->redirect('/'.$lang);
}
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
// dd($lastUsername);
return [
'_username' => $lastUsername,
'error' => $error,
'_target_path' => $request->get('_target_path')??null
];
}
/**
* @Route(
* "/{_locale}/afterLogin",
* name="afterLogin",
* methods={"GET"}
* )
*/
public function afterLoginAction(Request $request, FrontSecurity $security)
{
$lang = $request->getLocale();
$securityUser = $security->getUser();
if ($securityUser) {
$roles = $securityUser->getRoles();
if (in_array("ROLE_PRO",$roles)){
return $this->redirect($this->generateUrl('dashboard'));
}else if(in_array("ROLE_USER",$roles)){
return $this->redirect('/'.$lang);
}else {
return $this->redirect('/'.$lang);
}
}else {
return $this->redirect('/'.$lang);
}
}
/**
* @Template
* @param Request $request
* @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse
* @throws \Exception
* @Route(
* "/{_locale}/reset/password/{renew_token}",
* name="reset_password",
* methods={"GET","POST"}
* )
*/
public function resetPasswordAction(Request $request)
{
if ($request->isMethod('POST') && $request->get("new_password")) {
$user = User::getById($request->get('user_id'));
if (!$user) {
return ['error' => "Impossible de trouver l'utilisateur"];
}
$user->setPassword($request->get('new_password'));
$user->setRenewToken(null);
$user->setRenewExpire(null);
$user->save();
return $this->redirect($this->generateUrl("login"));
} elseif ($request->get("renew_token")) {
$user = User::getByRenewToken($request->get("renew_token"))->load()[0];
if (!$user) {
return $this->redirect($this->generateUrl('login'));
}
$expired = false;
if ($user->getRenewExpire()->lt(Carbon::now())) {
$expired = true;
}
$this->view->user = $user;
return ["user" => $user, "expired" => $expired];
} else {
return $this->redirect($this->generateUrl('login'));
}
}
/**
* @Template
* @param Request $request
* @return \Symfony\Component\HttpFoundation\JsonResponse
* @throws \Exception
* @Route(
* "/{_locale}/reset/password",
* name="ask_reset_password",
* methods={"GET","POST"}
* )
*/
public function askResetPasswordAction(Request $request, FrontSecurity $security, \Pimcore\Config\Config $websiteConfig)
{
$lang = $request->getLocale();
$securityUser = $security->getUser();
if ($securityUser) {
$user = User::getByUsername($securityUser->getUserIdentifier())->load()[0];
if($user->getBusinesses()) {
return $this->redirect('/'.$lang.'/pro');
}else {
return $this->redirect('/'.$lang);
}
}
if ($request->isMethod('POST') && $request->get('username')) {
$user = User::getByUsername($request->get('username'))->load()[0];
if (!$user) {
return ["error" => "Le compte n'existe pas"];
}
$token = md5(time() * 10000);
$user->setRenewToken($token);
$nbrDays = intval($websiteConfig->get('expirationDays')) === 0 ? 1 : intval($websiteConfig->get('expirationDays'));
$user->setRenewExpire(Carbon::now()->addDay($nbrDays));
$user->save();
$mail = new Mail();
$mail->setDocument('/'.$lang."/emails/reset-password");
$mail->to($user->getUsername());
$mail->setParam('renewLink', $this->generateUrl("reset_password", ['renew_token' => $token], UrlGeneratorInterface::ABSOLUTE_URL));
$mail->send();
return ["message" => "Vous avez reçu un lien pour modifier votre mot de passe par email."];
}
}
/**
* @Template
* @Route(
* "/{_locale}/register",
* name="register",
* methods={"GET","POST"}
* )
*/
public function registerAction(Request $request, FrontSecurity $security, \Pimcore\Config\Config $websiteConfig, ValidatorInterface $validator)
{
$lang = $request->getLocale();
$securityUser = $security->getUser();
if ($securityUser) {
$user = User::getByUsername($securityUser->getUserIdentifier())->load()[0];
if($user->getBusinesses()) {
return $this->redirect('/'.$lang.'/pro');
}else {
return $this->redirect('/'.$lang);
}
}
if ($request->isMethod('POST')) {
foreach (['gender', 'lastname', 'firstname', 'email', 'confirm-email', 'phone', 'password', 'confirm-password'] as $required_field) {
$isSet = false;
if (is_array($required_field)) {
foreach ($required_field as $field) {
if ($request->get($field)) {
$isSet = true;
}
}
} else {
$isSet = $request->get($required_field);
}
if (!$isSet) {
return ["error" => "Vous devez remplir tous les champs.", "previousValues" =>$request->request->all()];
}
}
$email = $request->get('email');
$confirmEmail = $request->get('confirm-email');
if ($email !== $confirmEmail) {
return ["error" => "Les 2 adresses email ne sont pas identiques", "previousValues" =>$request->request->all()];
}
$password = $request->get('password');
$confirmPassword = $request->get('confirm-password');
if ($password !== $confirmPassword) {
return ["error" => "Les 2 mots de passe ne sont pas identiques", "previousValues" =>$request->request->all()];
}
$emailConstraint = new Assert\Email();
$errors = $validator->validate($email, $emailConstraint);
if (count($errors) > 0) {
return ["error" => $errors[0]->getMessage(), "previousValues" =>$request->request->all()];
}
$checkUser = User::getByUsername($email, ['limit' => 1,'unpublished' => true]);
if ($checkUser) {
return ["message" => 'Le compte existe déjà, <a href="'. $this->generateUrl('login') .'">connectez-vous</a> ou <a href="'. $this->generateUrl('ask_reset_password') .'">cliquez ici</a> pour réinitialiser votre mot de passe'];
}
$gender = $request->get('gender');
$firstName = $request->get('firstname');
$lastName = $request->get('lastname');
$phone = $request->get('phone');
$user = new User();
$user->setGender($gender);
$user->setFirstname($firstName);
$user->setLastname($lastName);
$user->setPhone($phone);
$user->setUsername($email);
$user->setPassword($password);
$businesses = Business::getByEmail($email);
if(!$businesses) {
$user->setRoles(["ROLE_USER"]);
}else {
$user->setRoles(["ROLE_PRO"]);
$businesses->load();
$businessesToAdd = [];
foreach($businesses as $business) {
$businessesToAdd = [...$businessesToAdd, $business];
}
$user->setBusinesses($businessesToAdd);
}
$keyname = Service::getValidKey($email, 'object');
$user->setKey($keyname);
$user->setParent(Folder::getByPath('/users') ?? Folder::create(['o_parentId' => 1, 'o_key' => 'users']));
$user->setPublished(false);
$token = md5(uniqid('renew_token', true));
$user->setRenewToken($token);
$nbrDays = intval($websiteConfig->get('expirationDays')) === 0 ? 1 : intval($websiteConfig->get('expirationDays'));
$user->setRenewExpire(Carbon::now()->addDays($nbrDays));
$user->save();
$mail = new Mail();
$mail->setDocument('/'.$request->getLocale()."/emails/verify-email");
$mail->to($user->getUsername());
$mail->setParam('Link', $this->generateUrl('verify_email', ['renew_token' => $user->getRenewToken()], UrlGeneratorInterface::ABSOLUTE_URL));
$mail->send();
return ["message" => "Votre adresse email doit être confirmée, vous allez recevoir un email de confirmation"];
}
return ["previousValues" => ["gender"=> "", "firstname" => "", "lastname" => "", "email" => "", "confirm-email" =>"", "phone" => ""]];
}
/**
* @Template
* @Route(
* "/verify-email/{renew_token}",
* name="verify_email",
* methods={"GET"}
* )
*/
public function verifyEmailAction(Request $request, \Pimcore\Config\Config $websiteConfig)
{
if ($request->get('renew_token')) {
$user = User::getByRenewToken($request->get("renew_token"), ['limit' => 1,'unpublished' => true]);
if (!$user) {
return ["error" => "Vous devez définir un token valide", "message" => false];
}
$user->setPublished(true);
$user->setRenewToken(null);
$user->setRenewExpire(null);
$user->save();
return ["message" => "Merci d'avoir validé votre compte, vous pouvez désormais vous connecter"];
} else {
return ["error" => "Vous devez définir un token valide", "message" => false];
}
}
/**
* @Route("/logout", name="logout", methods={"GET"})
*/
public function logout()
{
// controller can be blank: it will never be executed!
throw new \Exception('Don\'t forget to activate logout in security.yaml');
}
}