<?php
namespace AccountBundle\Controller;
use AccountBundle\Form\ActivateFormType;
use AccountBundle\Form\EditAccountFormType;
use AccountBundle\Form\LoginFormType;
use AccountBundle\Form\LostPasswordFormType;
use AccountBundle\Form\SignupFormType;
use App\Services\CheckwebsitesettingService;
use AccountBundle\Services\AccountSendMailService;
use App\Services\ReCaptchaService;
use MultilingualBundle\Service\DocumentLookupService;
use Pimcore\Model\DataObject;
use Pimcore\Model\User;
use Pimcore\Translation\Translator;
use Pimcore\Twig\Extension\Templating\PimcoreUrl;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
class AccountController extends \App\Controller\BaseController
{
protected $recaptcha;
protected $recaptchaVersion;
protected $recaptchaPublicKey;
protected $checkwebsitesettingService;
protected $inotherlang;
protected $translator;
protected $session;
protected $sendmailAccount;
protected $secretKey;
protected $currentLanguage;
/**
* @var PimcoreUrl
*/
protected $pimcoreUrl;
/**
*
* @param PimcoreUrl $pimcoreUrl
*/
public function __construct(CheckwebsitesettingService $checkwebsitesettingService, DocumentLookupService $inotherlang, Translator $translator, ReCaptchaService $recaptcha, AccountSendMailService $sendmailAccount, ParameterBagInterface $params, PimcoreUrl $pimcoreUrl, SessionInterface $session){
$this->checkwebsitesettingService = $checkwebsitesettingService;
$this->inotherlang = $inotherlang;
$this->translator = $translator;
$this->pimcoreUrl = $pimcoreUrl;
$this->session = $session;
$this->recaptcha = $recaptcha;
$this->recaptchaVersion = $recaptcha->getVersion();
$this->recaptchaPublicKey = $recaptcha->getPublicKey();
$this->sendmailAccount = $sendmailAccount;
$this->secretKey = $params->get('account.secretkey');
}
/**
* Parent Account page
*
* @param Request $request
* @return Response
*/
public function parentDocAction(Request $request, \Pimcore\Config\Config $websiteConfig){
$session = $request->getSession();
if($session->get('userLogged')) {
$userObj = $session->get('userLogged');
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'account-page',
true
));
}else{
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'login-page',
true
));
}
}
/**
* Login / Logout view page
*
* @param Request $request
* @return Response
*/
public function loginLogoutAction(Request $request)
{
$userLoggedIn = false;
$session = $request->getSession();
if($session->get('userLogged')) {
$userLoggedIn = true;
}
return $this->render('@Account/account/login-logout.html.twig', [
'userLoggedIn' => $userLoggedIn,
]);
}
/**
* Login page
*
* @Route("{_locale}/account/login", name="login-page")
*
* @param Request $request
* @return Response
*/
public function loginAction(Request $request, \Pimcore\Config\Config $websiteConfig)
{
$signupsuccess = false;
$formName = LoginFormType::class;
$session = $request->getSession();
// Check if user is already logged in
if($session->get('userLogged')) {
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'account-page',
true
));
}
if($formName){
$form = $this->createForm($formName);
$form->handleRequest($request);
}
// Check if account exist
if ($form->isSubmitted()) {
if ($form->isValid()) {
$params = $request->request->all();
$data = $form->getData();
if($this->recaptchaVersion){
if($this->recaptcha->captchaverify($params)){
$redirect = $this->loginToAccount($data, $request, $session);
}else{
$message = $this->translator->trans("Captcha code is niet correct!");
$this->addFlash("warning", $message);
}
}else{
$redirect = $this->loginToAccount($data, $request, $session);
}
return $this->redirect($redirect);
}
}
return $this->render('@Account/account/login.html.twig', [
'form' => $form->createView(),
'signupsuccess' => $signupsuccess,
'recaptcha' => $this->recaptchaVersion,
'recaptchaPublic' => $this->recaptchaPublicKey
]);
}
protected function loginToAccount($data, $request, $session)
{
$email = $data['email'];
$password = $data['password'];
if (!empty($password) && !empty($email)) {
$userObject = DataObject\UserPortal::getByEmail($email, array('limit' => 1));
/** @var \Pimcore\Model\DataObject\UserPortal $userObject */
if ($userObject) {
if (password_verify("$password", $userObject->getPassword())) {
$session->set('userLogged', $userObject);
$redirectUri = $request->get("r"); // If return uri is given
if ($redirectUri) {
$redirectUri = base64_decode($redirectUri);
return $redirectUri;
} else {
$message = $this->translator->trans("Successfully logged in");
$this->addFlash("info", $message);
return $this->pimcoreUrl->__invoke(
[],
'cart-page',
true
);
}
} else {
$message = $this->translator->trans("Password incorrect!");
$this->addFlash("warning", $message);
return $this->pimcoreUrl->__invoke(
[],
'login-page',
true
);
}
} else {
$message = $this->translator->trans("User doesn't exist!");
$this->addFlash("warning", $message);
return $this->pimcoreUrl->__invoke(
[],
'login-page',
true
);
}
} else {
$message = $this->translator->trans("User or password incorrect!");
$this->addFlash("warning", $message);
return $this->pimcoreUrl->__invoke(
[],
'login-page',
true
);
}
}
/**
* Logout page
*
* @Route("{_locale}/account/logout", name="logout-page")
*
* @param Request $request
* @return Response
*/
public function logoutAction(Request $request, \Pimcore\Config\Config $websiteConfig)
{
$session = $request->getSession();
$session->set('userLogged', false);
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'login-page',
true
));
}
/**
* Signup page
*
* @Route("{_locale}/account/signup", name="signup-page")
*
* @param Request $request
* @return Response
*/
public function signupAction(Request $request, \Pimcore\Config\Config $websiteConfig)
{
$signupsuccess = false;
$formName = SignupFormType::class;
$emailTemplate = 'email_account_signup'; // Email template contact
$emailTemplateConfirm = 'email_account_signup_customer'; // Email template contact confirm
$confirmAccountOnRegister = $websiteConfig->get('confirmAccountOnRegister');
if ($formName) {
$form = $this->createForm($formName);
$form->handleRequest($request);
}
if ($this->checkwebsitesettingService->check("loginportal_userPath", "object")) {
$folderUsersPath = $websiteConfig->get('loginportal_userPath');
if($folderUsersPath){
$folderUsersFullPath = $folderUsersPath->getFullpath();
$folderUsersObject = DataObject\Folder::getByPath($folderUsersFullPath);
}
if(!empty($folderUsersObject)) {
$folderUsersId = $folderUsersObject->getId();
if ($form->isSubmitted()) {
if ($form->isValid()) {
$params = $request->request->all();
if($confirmAccountOnRegister){
$message = $this->translator->trans("Er werd een activatie mail verstuurd!");
}else{
$message = $this->translator->trans("Uw account wordt gereviewed voor activatie.");
}
if($this->recaptchaVersion){
if($this->recaptcha->captchaverify($params)){
$data = $form->getData();
$this->sendmailAccount->_sendMailDefaultForm($websiteConfig, $data, "$emailTemplate", "$emailTemplateConfirm", "$message", "");
$signupsuccess = true;
}else{
$message = $this->translator->trans("Captcha code is niet correct!");
$this->addFlash("warning", $message);
}
}else{
$data = $form->getData();
$this->sendmailAccount->_sendMailDefaultForm($websiteConfig, $data, "$emailTemplate", "$emailTemplateConfirm", "$message", "");
$signupsuccess = true;
}
}
}
}
}
return $this->render('@Account/account/signup.html.twig', [
'form' => $form->createView(),
'signupsuccess' => $signupsuccess,
'recaptcha' => $this->recaptchaVersion,
'recaptchaPublic' => $this->recaptchaPublicKey
]);
}
/**
* Activate account page
*
* @Route("{_locale}/account/activate", name="activate-page")
*
* @param Request $request
* @return Response
*/
public function activateAction(Request $request)
{
$currentLanguage = $request->attributes->get('_locale');
$hash = str_replace($this->secretKey,"",base64_decode($request->get("c")));
$id = $request->get("id");
$email = $request->get("e");
$sendsuccessfull = false;
if(!empty($hash) && (!empty($id) || !empty($email))) {
if($email){
$findKlant = new DataObject\UserPortal\Listing();
$findKlant->setCondition("email = :email", ["email" => $email]);
$findKlant->setLimit(1);
$findKlant->setUnpublished(true);
foreach ($findKlant as $klant){
$id = $klant->getId();
}
}
$lidObject = DataObject\UserPortal::getById($id);
if(!empty($lidObject)) {
if($hash === $lidObject->getPassword()){
$formName = ActivateFormType::class;
if ($formName) {
$form = $this->createForm($formName);
$form->handleRequest($request);
}
if ($form->isSubmitted()) {
if ($form->isValid()) {
$data = $form->getData();
if ($data['password'] != $data['confirmpassword']) {
$message = $this->translator->trans("The passwords specified must be identical!");
$this->addFlash("success", $message);
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'activate-page',
true
) . '?id=' . $id . '&code=' . $request->get("c"));
}
$lidObject->setPassword($data["password"]);
try {
$lidObject->save();
// message to confirm that new password was save
$message = $this->translator->trans("Your new password is set! You can now login.");
$this->addFlash("success", $message);
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'login-page',
true
));
} catch (\Exception $e) {
$message = date("d-m-Y H:i:s") . ' ' . $e->getMessage() . "\n";
error_log($message, 3, PIMCORE_LOG_DIRECTORY . "/system.log");
}
}
}
}elseif(base64_decode($hash) === $lidObject->getEmail()){
$lidObject->setPublished(true);
try {
$lidObject->save();
// message to confirm that new password was save
$message = $this->translator->trans("Your account has been activated. You can now login.");
$this->addFlash("success", $message);
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'login-page',
true
));
} catch (\Exception $e) {
$message = date("d-m-Y H:i:s") . ' ' . $e->getMessage() . "\n";
error_log($message, 3, PIMCORE_LOG_DIRECTORY . "/system.log");
}
}
}
}
return $this->render('@Account/account/activate.html.twig', [
'form' => $form->createView(),
'sendsuccessfull' => $sendsuccessfull,
'recaptcha' => $this->recaptchaVersion,
'recaptchaPublic' => $this->recaptchaPublicKey
]);
}
/**
* Lost password page
*
* @Route("{_locale}/account/lostpassword", name="lostpassword-page")
*
* @param Request $request
* @return Response
*/
public function lostpasswordAction(Request $request, \Pimcore\Config\Config $websiteConfig)
{
$sendsuccessfull = false;
$formName = LostPasswordFormType::class;
$emailTemplate = 'login_portal_email_lostpassword';
if ($formName) {
$form = $this->createForm($formName);
$form->handleRequest($request);
}
if ($form->isSubmitted()) {
if ($form->isValid()) {
$params = $request->request->all();
$activatePath = $this->pimcoreUrl->__invoke(
[],
'activate-page',
true
);
if($this->recaptchaVersion){
if($this->recaptcha->captchaverify($params)){
$data = $form->getData();
$this->sendmailAccount->_sendMailForgotPasswordForm($websiteConfig, $data, $emailTemplate, "", "", "$activatePath");
$sendsuccessfull = true;
}else{
$message = $this->translator->trans("Captcha code is niet correct!");
$this->addFlash("warning", $message);
}
}else{
$data = $form->getData();
$this->sendmailAccount->_sendMailForgotPasswordForm($websiteConfig, $data, $emailTemplate, "", "", "$activatePath");
$sendsuccessfull = true;
}
return $this->redirectToRoute('account-page');
}
}
return $this->render('@Account/account/lostpassword.html.twig', [
'form' => $form->createView(),
'sendsuccessfull' => $sendsuccessfull,
'recaptcha' => $this->recaptchaVersion,
'recaptchaPublic' => $this->recaptchaPublicKey
]);
}
/**
* View account page
*
* @Route("{_locale}/account/view", name="account-page")
*
* @param Request $request
* @return Response
*/
public function accountAction(Request $request)
{
$session = $request->getSession();
// Check if user is already logged in
if($session->get('userLogged')) {
$userObj = $session->get('userLogged');
if ($userObj->getGeboorte_datum()){
$date = $userObj->getGeboorte_datum()->format("d/m/Y");
}else{
$date = null;
}
return $this->render('@Account/account/account.html.twig',[
'user' => $userObj,
'date' => $date
]);
}else{
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'login-page',
true
));
}
}
/**
* Edit account page
*
* @Route("{_locale}/account/edit", name="editaccount-page")
*
* @param Request $request
* @return Response
*/
public function editaccountAction(Request $request)
{
$session = $request->getSession();
// Check if user is already logged in
if($session->get('userLogged')) {
$sendsuccessfull = false;
$formName = EditAccountFormType::class;
if ($formName) {
$form = $this->createForm($formName);
$form->handleRequest($request);
}
$userObj = $session->get('userLogged');
if (!empty($userObj)) {
$userId = $userObj->getId();
$userObject = DataObject\UserPortal::getById($userId);
}
if ($form->isSubmitted()) {
if ($form->isValid()) {
$params = $request->request->all();
if($this->recaptchaVersion){
if($this->recaptcha->captchaverify($params)){
$data = $form->getData();
$this->saveUserData($data, $userObject);
$session->set('userLogged', $userObject);
$sendsuccessfull = true;
}else{
$message = $this->translator->trans("Captcha code is niet correct!");
$this->addFlash("warning", $message);
}
}else{
$data = $form->getData();
$this->saveUserData($data, $userObject);
$session->set('userLogged', $userObject);
$sendsuccessfull = true;
}
return $this->redirectToRoute('account-page');
}
}
return $this->render('@Account/account/editaccount.html.twig', [
'form' => $form->createView(),
'userObject' => $userObject,
'sendsuccessfull' => $sendsuccessfull,
'recaptcha' => $this->recaptchaVersion,
'recaptchaPublic' => $this->recaptchaPublicKey
]);
}else{
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'login-page',
true
));
}
}
protected function saveUserData($data, $userObject){
/** @var \Pimcore\Model\DataObject\UserPortal $userObject */
$userObject->setNaam($data['lastname']);
$userObject->setVoornaam($data['firstname']);
$userObject->setTel($data['phone']);
$userObject->setMobile($data['mobile']);
$userObject->setAdres_straat($data['address']);
$userObject->setAdres_nr($data['number']);
$userObject->setAdres_postcode($data['postcode']);
$userObject->setAdres_stad($data['city']);
/*$userObject->setNewsletter($data['newsletter']);*/
$userObject->setGeboorte_datum($data['birthday']);
$userObject->setAdres_box($data['box']);
$userObject->setAdres_land($data['country']);
try {
if($userObject->save()) {
$message = $this->translator->trans("De gegevens werden bewaard!");
$message = $this->translator->trans($message);
$this->session->getFlashBag()->add('success', $message);
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'editaccount-page',
true
));
}
} catch (\Exception $e) {
$message = date("d-m-Y H:i:s") . ' ' . $e->getMessage() . "\n";
error_log($message, 3, PIMCORE_LOG_DIRECTORY . "/system.log");
}
}
/**
* Default protected page
*/
public function defaultprotectedAction(Request $request)
{
$session = $request->getSession();
if(empty($session->get('userLogged')) || !$this->editmode) {
return $this->redirect($this->pimcoreUrl->__invoke(
[],
'login-page',
true
)."?r=".base64_encode($this->document->getFullPath()));
}
}
private function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
$pieces = [];
$max = mb_strlen($keyspace, '8bit') - 1;
for ($i = 0; $i < $length; ++$i) {
$pieces []= $keyspace[random_int(0, $max)];
}
return implode('', $pieces);
}
}