src/Controller/AccountController.php line 165

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Pimcore\Controller\FrontendController;
  4. use Pimcore\Mail;
  5. use \Pimcore\Model\DataObject;
  6. use Pimcore\Model\DataObject\CustomerAccount;
  7. use Pimcore\Model\DataObject\AvailabilityCountry;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Pimcore\Model\Document;
  10. use Carbon\Carbon;
  11. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  12. use Symfony\Component\Intl\Intl;
  13. use Symfony\Component\Intl\Countries;
  14. use Pimcore\Model\Asset;
  15. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\HttpFoundation\Session\Session;
  19. // lass AccountController extends \Website\Controller\CartAware
  20. //class AccountController extends FrontendControllerWebsite\Controller\CartAware
  21. class AccountController extends Action
  22. {
  23.   public $translator;
  24.   public function __construct(TranslatorInterface $translator)
  25.   {
  26.     $this->translator $translator;
  27.   }
  28.   //public function init() {
  29.   public function onKernelController(FilterControllerEvent $event)
  30.   {
  31.     parent::onKernelController($event);
  32.     $params $event->getRequest()->request->all();
  33.     //$this->view->preview = $event->getRequest()->get('pimcore_preview');
  34.   }
  35.   /**
  36.    * show Sign In
  37.    */
  38.   public function historyAction(Request $request)
  39.   {
  40.     $data = [];
  41.     $data['locale'] = $request->getLocale();
  42.     $data['downloaddir'] = realpath("downloads");
  43.     // Set Us as default country
  44.     $defaultCountry DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
  45.     if (isset($this->country)) {
  46.       $availableCountry $this->country;
  47.     } else {
  48.       $availableCountry $defaultCountry;
  49.       $data['country'] = $defaultCountry;
  50.     }
  51.     //$this->layout()->setLayout('account');
  52.     $session $request->getSession();
  53.     $authNamespace $session->getBag('espirit');
  54.     if ($authNamespace && $authNamespace->has('customeraccount')) {
  55.       $data['email'] = $authNamespace->get('customeraccount')->getEmail();
  56.       $company $authNamespace->get('customeraccount')->getCompany();
  57.       if ($company) {
  58.         $company $company[0]->getObject();
  59.         $data['companyname'] = $company->getCompanyName();
  60.       }
  61.       $data['accountname'] = $authNamespace->get('customeraccount')->getFirstName() . " " $authNamespace->get('customeraccount')->getLastName();
  62.       $orders = new DataObject\OnlineShopOrder\Listing();
  63.       $orders->setCondition(" customer__id = '" $authNamespace->get('customeraccount')->getId() . "'");
  64.       $orders->setOrderKey("orderdate"false);
  65.       $orders->setOrder("desc");
  66.       $orders->load();
  67.       $data['orders'] = $orders;
  68.     }
  69.     return $this->render('Account/history.html.twig'$data);
  70.   }
  71.   /**
  72.    * show Sign Out
  73.    */
  74.   public function signOutAction(Request $request)
  75.   {
  76.     //$authNamespace = new Zend_Session_Namespace('Zend_Auth');    
  77.     $session $request->getSession();
  78.     $authNamespace $session->getBag('espirit');
  79.     if ($authNamespace) {
  80.       $authNamespace->remove('customeraccount');
  81.       $authNamespace->remove('lastlogindate');
  82.     }
  83.     //$urlHelper = $this->container->get('pimcore.templating.view_helper.pimcore_url');
  84.     $urlHelper $this->generateUrl('sign-in', array('prefix' => strtolower($request->getLocale())));
  85.     return $this->redirect($urlHelper);
  86.   }
  87.   public function signInAction(Request $request)
  88.   {
  89.     //**$this->layout()->setLayout('signin');
  90.     $this->view->loggedin false;
  91.     //Set the next step if available
  92.     $this->view->nextstep $request->get("ns");
  93.     //navigation and breadcrumbs
  94.     $this->view->hideNav true;
  95.     $session $request->getSession();
  96.     $authNamespace $session->getBag('espirit');
  97.     if ($authNamespace->has('customeraccount')) {
  98.       $this->view->loggedin true;
  99.       //echo "Welcome " . $authNamespace->customeraccount->getFirstName() . " " . $authNamespace->customeraccount->getLastName();
  100.       //return $this->redirect("/" . $request->getLocale() . "/");
  101.     }
  102. p_r($_POST);exit;
  103.     if (!empty($_POST)) {
  104.       $email filter_var($request->get("email"), FILTER_VALIDATE_EMAIL);
  105.       $password htmlspecialchars($request->get("password"), ENT_QUOTES'UTF-8');
  106.       $customeraccounts = new DataObject\CustomerAccount\Listing();
  107.       $customeraccounts->setCondition(" email = ? AND password = ? AND o_published = 1", array($emailmd5($password)));
  108.       $customeraccounts->load();
  109.       foreach ($customeraccounts as $customeraccount) {
  110.         break;
  111.       }
  112.       if ($customeraccount) {
  113.         $authNamespace->get('lastlogindate'$customeraccount->getLastLoginDate());
  114.         $date Carbon::now();
  115.         $customeraccount->setLastLoginDate($date);
  116.         $customeraccount->save();
  117.         $authNamespace->set('customeraccount'$customeraccount);
  118.         //get country availability.  If not assigned, default to united-states
  119.         $defaultUserCountry $customeraccount->geteSpiritsCountryAvailabilityList();
  120.         if ($defaultUserCountry) {
  121.           $defaultUserCountry $defaultUserCountry[0]->getObject();
  122.         } else {
  123.           $defaultUserCountry DataObject\AvailabilityCountry::getByPath("/availability-countries/us");
  124.           $this->view->country $defaultUserCountry;
  125.         }
  126.         $defaulteSpirits strtolower($defaultUserCountry->geteSpiritsLanguageSiteList()[0]);
  127.         $authNamespace->defaultUserCountry $defaultUserCountry;
  128.         $authNamespace->defaulteSpirits $defaulteSpirits;
  129.         if ($request->get("ns") && $request->get("ns") == "confirm") {
  130.           return $this->redirect($this->view->url(array("prefix" => $defaulteSpirits'action' => 'confirm'), 'checkout'true));
  131.         } else {
  132.           return $this->redirect($defaulteSpirits "/");
  133.         }
  134.       } else {
  135.         $this->view->errormessage $this->get('translator')->trans("espirits.login.incorrect-password");
  136.       }
  137.     }
  138.     return $this->renderTemplate('Account/signIn.html');
  139.   }
  140.   /**
  141.    * forgot password
  142.    */
  143.   public function forgotPasswordAction(Request $request)
  144.   {
  145.     $data['locale'] = $request->getLocale();
  146.     $data['errormessage'] = '';
  147.     $data['editpassword'] = 0;
  148.     //$authNamespace = new Zend_Session_Namespace('Zend_Auth');
  149.     $session $request->getSession();
  150.     $authNamespace $session->getBag('espirit');
  151.     if (($authNamespace->has('forgotpasswordedit')) && $authNamespace->get('forgotpasswordedit') == 1) {
  152.       $data['editpassword'] = 1;
  153.     }
  154.     //Check if the email exists
  155.     if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  156.       $email filter_var($request->get("email"), FILTER_VALIDATE_EMAIL);
  157.       $password htmlspecialchars($request->get("password"), ENT_QUOTES'UTF-8');
  158.       $passwordverify htmlspecialchars($request->get("passwordverify"), ENT_QUOTES'UTF-8');
  159.       if ($email && !empty($email)) {
  160.         $customeraccount DataObject\CustomerAccount::getByEmail($email1);
  161.         if ($customeraccount) {
  162.           //Send the email to reset password
  163.           $code substr(md5($email rand(620) . $email), 06);
  164.           $authNamespace->set('forgotpasswordauthenticationcode'$code);
  165.           $authNamespace->set('email'$email);
  166.           $authNamespace->set('customername'htmlentities($customeraccount->getFirstName(), ENT_QUOTES'UTF-8') . " " htmlentities($customeraccount->getLastName(), ENT_QUOTES'UTF-8'));
  167.           $data['locale'] = $request->getLocale() == 'en' 'en_us' $request->getLocale();
  168.           $this->SendTempCode($data['locale'], $email"/espirits/" $data['locale'] . "/emails/password-reset");
  169.           $url $this->generateUrl('authentication-code', array('prefix' => strtolower($data['locale'])));
  170.           return $this->redirect($url);
  171.         } else {
  172.           $errorMessage $this->translator->trans("espirits.login.no-email");
  173.           $errorMessage str_replace("register"'<a href="/' $request->getLocale() . '/account/register">register</a>'$errorMessage);
  174.           $data['errormessage'] = $errorMessage;
  175.         }
  176.       } else if ($password && !empty($password)) {
  177.         if ($password != $passwordverify) {
  178.           $data['errormessage'] = $this->translator->trans("espirits.login.password-match");
  179.       return $this->redirect("/en_us/account/forgot-password");
  180.         } else {
  181.           $customeraccount DataObject\CustomerAccount::getByEmail($authNamespace->get('email'), 1);
  182.           if ($customeraccount) {
  183.             $customeraccount->setPassword($password);
  184.             $customeraccount->save();
  185.             $authNamespace->remove('forgotpasswordedit');
  186.             $authNamespace->set('authenticated'1);
  187.             $authNamespace->set('customeraccountid'$customeraccount->getO_id());
  188.             $authNamespace->set('customeraccountname'htmlentities($customeraccount->getFirstName(), ENT_QUOTES'UTF-8') . " " htmlentities($customeraccount->getLastName(), ENT_QUOTES'UTF-8'));
  189.             //Send them to account page
  190.             $data['locale'] = $request->getLocale() == 'en' 'en_us' $request->getLocale();
  191.             $url $this->generateUrl('product-landing', array('prefix' => strtolower($data['locale'])));
  192.             return $this->redirect($url);
  193.             //return $this->redirect( $this->view->url(["prefix" => $request->getLocale()], "product-landing", true) );
  194.           }
  195.         }
  196.       }
  197.     }
  198.     return $this->render('Account/forgotPassword.html.twig'$data);
  199.   }
  200.   public function authenticationCodeAction(Request $request)
  201.   {
  202.     //**$this->layout()->setLayout('signin');
  203.     $data['locale'] = $request->getLocale();
  204.     $data['errormessage'] = '';
  205.     $data['loggedin'] = '';
  206.     $data['nextstep'] = '';
  207.     $session $request->getSession();
  208.     $authNamespace $session->getBag('espirit');
  209.     if (!empty($_POST)) {
  210.       if (($authNamespace->has('forgotpasswordauthenticationcode'))) {
  211.         $authenticationcode $request->get("authenticationcode");
  212.         if ($authNamespace->get('forgotpasswordauthenticationcode') == $authenticationcode) {
  213.           $authNamespace->set('forgotpasswordedit'1);
  214.           $authNamespace->remove('forgotpasswordauthenticationcode');
  215.           $data['locale'] = $request->getLocale() == 'en' 'en_us' $request->getLocale();
  216.           $url $this->generateUrl('forgot-password', array('prefix' => $data['locale']));
  217.           return $this->redirect($url);
  218.         } else {
  219.           $data['errormessage'] = $this->translator->trans("espirits.login.authentication-invalid");
  220.         }
  221.       } else {
  222.         $data['errormessage'] = $this->translator->trans("espirits.login.authentication-expired");
  223.       }
  224.     }
  225.     return $this->render('Account/authenticationCode.html.twig'$data);
  226.   }
  227.   protected function SendTempCode($locale$email)
  228.   {
  229.     $mail = new Mail();
  230.     $mail->setIgnoreDebugMode(true);
  231.     $mail->addTo($email);
  232.     $mail->subject($this->translator->trans("espirits.login.reset-email.subject"));
  233.     //$mail->setDefaultFrom("contact@beamsuntory.com","Forgot Password");
  234.     $locale == 'en' $locale 'en_us' $locale;
  235.     $emailDocument Document::getByPath("/espirits/" $locale "/emails/authentication-code");
  236.     $mail->setDocument($emailDocument);
  237.     $mail->send();
  238.   }
  239.   public function emailAuthenticationCodeAction(Request $request)
  240.   {
  241.     $session $request->getSession();
  242.     $authNamespace $session->getBag('espirit');    
  243.     $params['authenticationcode'] = $authNamespace->get('forgotpasswordauthenticationcode');
  244.     $params['customername'] = $authNamespace->get('customername');
  245.     return $this->render('Account/emailAuthenticationCode.html.twig'$params);
  246.   }
  247.   public function emailPasswordResetAction(Request $request)
  248.   {
  249.     $session $request->getSession();
  250.     $authNamespace $session->getBag('espirit');
  251.     $data['authenticationcode'] = $authNamespace->get('forgotpasswordauthenticationcode');
  252.     $data['customername'] = $authNamespace->get('customername');
  253.     return $this->render('Account/emailPasswordReset.html.twig'$data);
  254.   }
  255.   /**
  256.    * forgot password
  257.    */
  258.   public function resetPasswordAction(Request $request)
  259.   {
  260.     $data = [];
  261.     $data['locale'] = $request->getLocale();
  262.     $data['errormessage'] = '';
  263.     $data['country'] = $this->country;    
  264.     // Set Us as default country
  265.     $defaultCountry DataObject\AvailabilityCountry::getByPath('/availability-countries/us');
  266.     if (isset($this->country)) {
  267.       $availableCountry $this->country;
  268.     } else {
  269.       $availableCountry $defaultCountry;
  270.       $data['country'] = $defaultCountry;
  271.     }
  272.     //$this->layout()->setLayout('account');
  273.     //$this->enableLayout();
  274.     $session $request->getSession();
  275.     $authNamespace $session->getBag('espirit');
  276.     if ($authNamespace && $authNamespace->has('customeraccount')) {
  277.        $data['loggedin'] = true;
  278.       //Check if the email exists
  279.       if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  280.         $email $authNamespace->get('customeraccount')->getEmail();
  281.         $currentpassword htmlspecialchars($request->get("currentpassword"), ENT_QUOTES'UTF-8');
  282.         $password htmlspecialchars($request->get("password"), ENT_QUOTES'UTF-8');
  283.         $passwordverify htmlspecialchars($request->get("passwordverify"), ENT_QUOTES'UTF-8');
  284.         
  285.         $customeraccounts = new DataObject\CustomerAccount\Listing();
  286.         $customeraccounts->setCondition(" email = ? AND password = ? AND o_published = 1", array($emailmd5($currentpassword)));
  287.         $customeraccounts->load();
  288.         foreach ($customeraccounts as $customeraccount) {
  289.           break;
  290.         }
  291.         if (!$customeraccount) {
  292.           $data['errormessage'] = $this->translator->trans("espirits.login.password-incorrect");
  293.         } else {
  294.           if ($password && !empty($password)) {
  295.             if ($password != $passwordverify) {
  296.               $data['errormessage'] = $this->translator->trans("espirits.login.password-match");
  297.             } else {
  298.               if ($customeraccount) {
  299.                 $customeraccount->setPassword($password);
  300.                 $customeraccount->save();
  301.                 //Send them to account page
  302.                 return $this->redirect("/" strtolower($request->getLocale()) . "/account/history");
  303.               }
  304.             }
  305.           } else {
  306.             $data['errormessage'] = $this->translator->trans("espirits.login.password-empty");
  307.           }
  308.         }
  309.       }
  310.       return $this->render('Account/resetPassword.html.twig'$data);
  311.     }
  312.   }
  313.   /**
  314.    * show Sign Up 
  315.    */
  316.   public function signUpAction(Request $request)
  317.   {
  318.     //Set the layout
  319.     #$this->layout()->setLayout('signin');
  320.     #$this->enableLayout();
  321.     $this->view->loggedin false;
  322.     $this->view->signup true;
  323.     //Set the next step if available
  324.     $this->view->nextstep $request->get("ns");
  325.     //navigation and breadcrumbs
  326.     $this->view->hideNav true;
  327.     //Set the auth namespace
  328.     $session $this->get('session');
  329.     $authNamespace $session->getBag('espirit');
  330.     if ($authNamespace->get('customeraccount')) {
  331.       $this->view->loggedin true;
  332.       return $this->redirect("/" $request->getLocale() . "/");
  333.       return;
  334.     }
  335.     //If the post is not empty set up the account
  336.     if (!empty($_POST)) {
  337.       $firstName htmlentities($request->get("firstName"), ENT_QUOTES'UTF-8');
  338.       $lastName htmlentities($request->get("lastName"), ENT_QUOTES'UTF-8');
  339.       $email htmlentities($request->get("email"), ENT_QUOTES'UTF-8');
  340.       $companyName htmlentities($request->get("companyName"), ENT_QUOTES'UTF-8');
  341.       $country htmlentities($request->get("country"), ENT_QUOTES'UTF-8');
  342.       $password htmlspecialchars($request->get("password"), ENT_QUOTES'UTF-8');
  343.       $customeraccounts = new DataObject\CustomerAccount\Listing();
  344.       $customeraccounts->setCondition(" email = ? AND o_published = 1 ", array($email));
  345.       $customeraccounts->load();
  346.       if (count($customeraccounts) > 0) {
  347.         $this->view->errormessage = $$this->translator->trans("espirits.register.email-already-exists");
  348.         return;
  349.       } else {
  350.         //Now create the account under the country
  351.         //Set up the new customer account
  352.         $customeraccount = new DataObject\CustomerAccount();
  353.         $key \Pimcore\File::getValidFilename(strtolower($email));
  354.         $customeraccount->setKey($key);
  355.         //get the sso folder to save accounts          
  356.         $ssofolder Databject\Folder::getByPath("/customer-accounts/" strtolower($country));
  357.         $customeraccount->setParentId($ssofolder->getId());
  358.         $customeraccount->setCreationDate(time());
  359.         //Set the company as file metadata
  360.         $customeraccount->setCompanyName($companyName);
  361.         $customeraccount->setfirstName($firstName);
  362.         $customeraccount->setlastName($lastName);
  363.         $customeraccount->setemail($email);
  364.         $customeraccount->setpassword($password);
  365.         //Set the Country
  366.         //Set the country 
  367.         $countries = new DataObject\AvailabilityCountry\Listing();
  368.         if ($countries) {
  369.           foreach ($countries as $eachcountry) {
  370.             if ($eachcountry->getCountry() == $country) {
  371.               //Set the country as file metadata
  372.               $countryArray = [];
  373.               $countryMetadata = new DataObject\Data\ObjectMetadata('AvailabilityCountry', [],  $eachcountry);
  374.               $countryArray[] = $countryMetadata;
  375.               $customeraccount->seteSpiritsCountryAvailabilityList($countryArray);
  376.             }
  377.           }
  378.         }
  379.         $customeraccount->save();
  380.         //Sign up done, show the msg
  381.         $this->view->signup false;
  382.       }
  383.     }
  384.     $esCountry = [];
  385.     $countries = new DataObject\AvailabilityCountry\Listing();
  386.     $countries->setCondition(" eSpiritsEnable = 1 AND o_published = 1 ");
  387.     $countries->load();
  388.     foreach ($countries as $country) {
  389.       $esCountry[] = ["value" => $country->getCountry(), "name" => $country->getAltName()];
  390.     }
  391.     $this->view->esCountries $esCountry;
  392.   }
  393.   /**
  394.    * @Route("/saml2/auth")    
  395.    */
  396.   public function azSignInAction(Request $request)
  397.   {
  398.     $adminSessions = new Session();    
  399.     //Check for saml response
  400.     if ($_POST["SAMLResponse"]) {
  401.       $samlXml base64_decode($_POST["SAMLResponse"]);
  402.       $samlObj simplexml_load_string($samlXml);
  403.       try {
  404.         $xmlDoc = new \DOMDocument();
  405.         $xmlDoc->loadXML($samlXml);
  406.         $xpath = new \DOMXPath($xmlDoc);
  407.         $xpath->registerNamespace('secdsig''http://www.w3.org/2000/09/xmldsig#');
  408.         // fetch Signature node from XML
  409.         $query ".//secdsig:Signature";
  410.         $nodeset $xpath->query($query$xmlDoc);
  411.         $signatureNode $nodeset->item(0);
  412.         // fetch SignedInfo node from XML
  413.         $query "./secdsig:SignedInfo";
  414.         $nodeset $xpath->query($query$signatureNode);
  415.         $signedInfoNode $nodeset->item(0);
  416.         // canonicalize SignedInfo using the method descried in
  417.         // ./secdsig:SignedInfo/secdsig:CanonicalizationMethod/@Algorithm
  418.         $signedInfoNodeCanonicalized $signedInfoNode->C14N(truefalse);
  419.         // fetch the x509 certificate from XML
  420.         $query 'string(./secdsig:KeyInfo/secdsig:X509Data/secdsig:X509Certificate)';
  421.         $x509cert $xpath->evaluate($query$signatureNode);
  422.         // we have to re-wrap the certificate from XML to respect the PEM standard
  423.         $localcert file_get_contents(__DIR__ '/secrets/PimCore.cer');
  424.         // fetch public key from x509 certificate
  425.         $publicKey openssl_get_publickey($localcert);
  426.         // fetch the signature from XML
  427.         $query 'string(./secdsig:SignatureValue)';
  428.         $signature base64_decode($xpath->evaluate($query$signatureNode));
  429.         // verify the signature
  430.         $ok openssl_verify($signedInfoNodeCanonicalized$signature$publicKey"sha256");
  431.       } catch (Exception $e) {
  432.       }
  433.       //Get the name and email address        
  434.       if ($ok && $samlObj->Assertion->AttributeStatement) {
  435.         foreach ($samlObj->Assertion->AttributeStatement->Attribute as $attr) {
  436.           switch ($attr["Name"]) {
  437.             case "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname":
  438.               $firstname = (string)$attr->AttributeValue;
  439.               break;
  440.             case "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname":
  441.               $lastname = (string)$attr->AttributeValue;
  442.               break;
  443.             case "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress":
  444.               $email = (string)$attr->AttributeValue;
  445.               break;
  446.             case "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/country":
  447.               $country = (string)$attr->AttributeValue;
  448.               break;
  449.           }
  450.         }
  451.         $new 0;
  452.         $country "us";
  453.         //Set the customer account now, if we cannot find by email
  454.         $customeraccount DataObject\CustomerAccount::getByEmail($email1);
  455.         if (!$customeraccount) {
  456.           //Set up the new customer account
  457.           $customeraccount = new DataObject\CustomerAccount();
  458.           $key \Pimcore\File::getValidFilename(strtolower($email));
  459.           $customeraccount->setKey($key);
  460.           //get the sso folder to save accounts
  461.           $ssofolder DataObject\CustomerCompany::getByPath("/customer-accounts/sso");
  462.           $customeraccount->setParentId($ssofolder->getId());
  463.           $customeraccount->setCreationDate(time());
  464.           //Set the company as file metadata
  465.           $companyArray = [];
  466.           $companyMetadata = new DataObject\Data\ObjectMetadata('company', [],  $ssofolder);
  467.           $companyArray[] = $companyMetadata;
  468.           $customeraccount->setCompany($companyArray);
  469.           $new 1;
  470.         } else {
  471.           $customeraccount->seteSpiritsCountryAvailabilityList([]);
  472.         }
  473.         //Set the country 
  474.         $countries = new DataObject\AvailabilityCountry\Listing();
  475.         if ($countries) {
  476.           foreach ($countries as $eachcountry) {
  477.             if ($eachcountry->getName() == $this->getShortCountryName($country)) {
  478.               //Set the country as file metadata
  479.               $countryArray = [];
  480.               $countryMetadata = new DataObject\Data\ObjectMetadata('AvailabilityCountry', [],  $eachcountry);
  481.               $countryArray[] = $countryMetadata;
  482.               $customeraccount->seteSpiritsCountryAvailabilityList($countryArray);
  483.             }
  484.           }
  485.         }
  486.         //Set the values and publish
  487.         $customeraccount->setPublished(true);
  488.         $customeraccount->setFirstName($firstname);
  489.         $customeraccount->setLastName($lastname);
  490.         $customeraccount->setCountry($this->getShortCountryName($country));
  491.         $customeraccount->setEmail($email);
  492.         $date Carbon::now();
  493.         $customeraccount->setLastLoginDate($date);
  494.         $customeraccount->save();
  495.         if ($new == 1) {
  496.           // Disable email sending
  497.           //$this->approveAccountAction($customeraccount->getId());
  498.         }
  499.        // p_r($customeraccount);exit;
  500.         //Set up the zend auth for session details
  501.         $session $request->getSession();
  502.         $authNamespace $session->getBag('espirit');
  503.         if ($customeraccount) {
  504.           $authNamespace->get('lastlogindate'$customeraccount->getLastLoginDate());
  505.           $date Carbon::now();
  506.           $customeraccount->setLastLoginDate($date);
  507.           $customeraccount->save();
  508.           $authNamespace->set('customeraccount'$customeraccount);            
  509.   
  510.           //get country availability.  If not assigned, default to united-states
  511.           $defaultUserCountry $customeraccount->geteSpiritsCountryAvailabilityList();
  512.   
  513.           if ($defaultUserCountry) {
  514.             $defaultUserCountry $defaultUserCountry[0]->getObject();
  515.           } else {
  516.             $defaultUserCountry DataObject\AvailabilityCountry::getByPath("/availability-countries/us");
  517.             //$this->view->country = $defaultUserCountry;
  518.           }
  519.   
  520.           $defaulteSpirits strtolower($defaultUserCountry->geteSpiritsLanguageSiteList()[0]);
  521.           $authNamespace->defaultUserCountry $defaultUserCountry;
  522.           $authNamespace->defaulteSpirits $defaulteSpirits;
  523.           setcookie('customeraccount'$customeraccounttime() + 5"/");
  524.           setcookie('defaultUserCountry'$defaultUserCountrytime() + 5"/");
  525.           setcookie('defaulteSpirits'$defaulteSpiritstime() + 5"/");      
  526.   
  527.           if ($request->get("ns") && $request->get("ns") == "confirm") {
  528.             return $this->redirect($this->view->url(array("prefix" => $defaulteSpirits'action' => 'confirm'), 'checkout'true));
  529.           } else {
  530.             return $this->redirect($defaulteSpirits);
  531.           }
  532.         }        
  533.       }
  534.     }
  535.     return $this->redirect("/");
  536.   }
  537.   private function getShortCountryName($country)
  538.   {
  539.     switch ($country) {
  540.       case "United States":
  541.         return "US";
  542.       case "Germany":
  543.         return "DE";
  544.       case "France":
  545.         return "FR";
  546.     }
  547.   }
  548.   /**
  549.    * sign-in-sso
  550.    */
  551.   public function signInSsoAction(Request $request)
  552.   {
  553.     $session $request->getSession();
  554.     $data['locale'] = strtolower($request->getLocale());
  555.     $data['errormessage'] = '';
  556.     #$this->layout()->setLayout('signin');
  557.     #$this->enableLayout();
  558.     $data['loggedin'] = false;
  559.     //$this->view->loggedin = false;
  560.     //Set the next step if available
  561.     //$this->view->nextstep = $request->get("ns");
  562.     $data['nextstep'] = $request->get("ns");
  563.     //navigation and breadcrumbs
  564.     //$this->view->hideNav = true;
  565.     $data['hideNav'] = true;
  566.     //$authNamespace = new Zend_Session_Namespace('Zend_Auth'); 
  567.     $authNamespace $session->getBag('espirit');
  568.     if ($authNamespace->has('customeraccount')) {
  569.       $data['loggedin'] = true;
  570.       return $this->redirect("/" strtolower($request->getLocale()) . "/");
  571.     }
  572.     if (!empty($_POST)) {
  573.       $email filter_var($request->get("email"), FILTER_VALIDATE_EMAIL);
  574.       $password htmlspecialchars($request->get("password"), ENT_QUOTES'UTF-8');
  575.       $customeraccounts = new DataObject\CustomerAccount\Listing();
  576.       $customeraccounts->setCondition(" email = ? AND password = ? AND o_published = 1", array($emailmd5($password)));
  577.       $customeraccounts->load();
  578.       $customerData $customeraccounts->getData();
  579.       $customeraccount = (!empty($customerData)) ? $customerData[0] : null;
  580.       if ($customeraccount) {
  581.         $authNamespace->set('lastlogindate'$customeraccount->getLastLoginDate());
  582.         $date Carbon::now();
  583.         $customeraccount->setLastLoginDate($date);
  584.         $customeraccount->save();
  585.         $authNamespace->set('customeraccount'$customeraccount);
  586.         //get country availability.  If not assigned, default to united-states
  587.         $defaultUserCountry $customeraccount->geteSpiritsCountryAvailabilityList();
  588.         if ($defaultUserCountry) {
  589.           $defaultUserCountry $defaultUserCountry[0]->getObject();
  590.         } else {
  591.           $defaultUserCountry DataObject\AvailabilityCountry::getByPath("/availability-countries/us");
  592.         }
  593.         $defaulteSpirits $defaultUserCountry->geteSpiritsLanguageSiteList()[0];      
  594.         $authNamespace->set('defaultUserCountry'$defaultUserCountry);
  595.         $authNamespace->set('defaulteSpirits'$defaulteSpirits);        
  596.         if ($request->get("ns") && $request->get("ns") == "confirm") {
  597.           $urlHelper \Pimcore::getContainer()->get('pimcore.templating.view_helper.pimcore_url');
  598.           return $this->redirect($urlHelper(array("prefix" => $defaulteSpirits'action' => 'confirm'), 'checkout'true));
  599.         } else {
  600.           return $this->redirect($defaulteSpirits "/");
  601.         }
  602.       } else {
  603.         $data['errormessage'] = $this->translator->trans("espirits.login.incorrect-password");
  604.     return $this->redirect("/en_us/account/sign-in");
  605.       }
  606.     }
  607.     return $this->render('Account/signInSso.html.twig'$data);
  608.   }
  609.   /**
  610.    * register
  611.    */
  612.   public function registerAction(Request $request)
  613.   {
  614.     $data['locale'] = strtolower($request->getLocale());
  615.     $data['loggedin'] = false;
  616.     $data['errormessage'] = '';
  617.     $data['errorfield'] = '';
  618.     $data['firstname'] = '';
  619.     $data['lastname'] = '';
  620.     $data['email'] = '';
  621.     $data['company'] = '';
  622.     $data['country'] = '';
  623.     //get available countries
  624.     $countriesView = [];
  625.     $x 0;
  626.     $countries = new DataObject\AvailabilityCountry\Listing();
  627.     $countries->setCondition(" eSpiritsEnable = 1 "); // probably need a new flag for registerEnable on the object
  628.     $countries->load();
  629.     foreach ($countries as $enabledCountry) {
  630.       if ($enabledCountry->getAltCode()) {
  631.         $countriesView[$x]["Value"] = $enabledCountry->getAltCode();
  632.         $countriesView[$x]["Name"] = $enabledCountry->getAltName();
  633.       } else {
  634.         $countriesView[$x]["Value"] = $enabledCountry->getCountry();
  635.         $countriesView[$x]["Name"] = Countries::getName($enabledCountry->getName());
  636.       }
  637.       if ($request->getLocale() == $enabledCountry->getKey()) {
  638.         $countriesView[$x]["Selected"] = "Selected";
  639.       }
  640.       $countriesView[$x]["Icon"] = $enabledCountry->getFlagIconImage();
  641.       $x++;
  642.     }
  643.     $data['countries'] = $countriesView;
  644.     //If the post is not empty set up the account
  645.     if (!empty($_POST)) {
  646.       //Set the view properties and local variables
  647.       $firstName $data['firstname'] =
  648.         htmlentities(
  649.           $request->get("firstname"),
  650.           ENT_QUOTES,
  651.           'UTF-8'
  652.         );
  653.       $lastName $data['lastname'] =
  654.         htmlentities(
  655.           $request->get("lastname"),
  656.           ENT_QUOTES,
  657.           'UTF-8'
  658.         );
  659.       $email $data['email'] = filter_var($request->get("email"), FILTER_VALIDATE_EMAIL);
  660.       $companyName $data['company'] =
  661.         htmlentities(
  662.           $request->get("company"),
  663.           ENT_QUOTES,
  664.           'UTF-8'
  665.         );
  666.       $country =  $data['country'] =
  667.         htmlentities(
  668.           $request->get("country"),
  669.           ENT_QUOTES,
  670.           'UTF-8'
  671.         );
  672.       $password htmlspecialchars($request->get("createpassword"), ENT_QUOTES'UTF-8');
  673.       $verifypassword htmlspecialchars($request->get("verifypassword"), ENT_QUOTES'UTF-8');
  674.       //Check email validation
  675.       if (!filter_var($emailFILTER_VALIDATE_EMAIL)) {
  676.         $data['errorfield'] = "email";
  677.         $data['errormessage'] = $this->translator->trans("espirits.register.email-invalid");
  678.         return;
  679.       }
  680.       //Check for password similarity check
  681.       if ($password != $verifypassword) {
  682.         $data['errorfield'] = "password";
  683.         $data['errormessage'] = $this->translator->trans("espirits.register.passwords-dont-match");
  684.         return;
  685.       }
  686.       //Password requirement checks
  687.       $passwordRegEx "/^(?=.*[A-Z])(?=.*\d)[a-zA-Z\d\W]{8,}$/";
  688.       if (!preg_match($passwordRegEx$password)) {
  689.         $data['errorfield'] = "password";
  690.         $data['errormessage'] = $this->translator->trans("espirits.register.password-requirement-error");
  691.         return;
  692.       }
  693.       //Check company name
  694.       if (strlen($companyName) < 3) {
  695.         $data['errorfield'] = "companyName";
  696.         $data['errormessage'] = $this->translator->trans("espirits.register.company-requirement-error");
  697.         return;
  698.       }
  699.       //Start creating the customer account and make sure NOT TO PUBLISH
  700.       $customeraccounts = new DataObject\CustomerAccount\Listing();
  701.       $customeraccounts->setUnpublished(true);
  702.       $customeraccounts->setCondition(" email = ? AND o_published = 1 ", array($email));
  703.       $customeraccounts->load();
  704.       if (count($customeraccounts) > 0) {
  705.         //Email address already exists.
  706.         $errorMessage $this->translator->trans("espirits.register.email-already-exists");
  707.         $errorMessage str_replace("login"'<a href="/' $request->getLocale() . '/account/sign-in">login</a>'$errorMessage);
  708.         $errorMessage str_replace("reset"'<a href="/' $request->getLocale() . '/account/forgot-password">reset</a>'$errorMessage);
  709.         $data['errormessage'] = $errorMessage;
  710.         $data['errorfield'] = "email";
  711.         return;
  712.       } else {
  713.         //Now create the account under the country
  714.         //Set up the new customer account
  715.         $customeraccount = new DataObject\CustomerAccount();
  716.         $key \Pimcore\File::getValidFilename(strtolower($email));
  717.         $customeraccount->setKey($key);
  718.         //get the sso folder to save accounts          
  719.         $ssofolder DataObject\Folder::getByPath("/customer-accounts/" strtolower($country));
  720.         $customeraccount->setParentId($ssofolder->getId());
  721.         $customeraccount->setCreationDate(time());
  722.         //Set the company as file metadata
  723.         $customeraccount->setCompanyName($companyName);
  724.         $customeraccount->setfirstName($firstName);
  725.         $customeraccount->setlastName($lastName);
  726.         $customeraccount->setemail($email);
  727.         $customeraccount->setpassword($password);
  728.         //Set the Country
  729.         //Set the country 
  730.         $countries = new DataObject\AvailabilityCountry\Listing();
  731.         if ($countries) {
  732.           foreach ($countries as $eachcountry) {
  733.             if ($eachcountry->getCountry() == $country) {
  734.               //Set the country as file metadata
  735.               $countryArray = [];
  736.               $countryMetadata = new DataObject\Data\ObjectMetadata('AvailabilityCountry', [],  $eachcountry);
  737.               $countryArray[] = $countryMetadata;
  738.               $customeraccount->seteSpiritsCountryAvailabilityList($countryArray);
  739.             }
  740.           }
  741.         }
  742.         $customeraccount->setPublished(false);
  743.         $customeraccount->save();
  744.         //Send the admin Email, Disable for now
  745.         //$this->approveAccountAction($customeraccount->getId());
  746.         /*
  747.         //if (strrpos($customeraccount->getPath(),"/de/") > 0) {
  748.           //Send the confirmation email
  749.           
  750.         } else {
  751.           $this->sendPendingAccountEmail($customeraccount);
  752.         }
  753.         */
  754.         //Sign up done, show the msg
  755.         return $this->redirect("/" strtolower($request->getLocale()) . "/account/register-confirm");
  756.       }
  757.     }
  758.     return $this->render('Account/register.html.twig'$data);
  759.     //$this->renderTemplate("Account/register.html.php");
  760.   }
  761.   /**
  762.    * register-confirm
  763.    */
  764.   public function registerConfirmAction(Request $request)
  765.   {
  766.     //Set the layout and enable it
  767.     //$this->layout()->setLayout('signin');
  768.     //$this->enableLayout();
  769.     $data['locale'] = strtolower($request->getLocale());
  770.     $data['loggedin'] = false;
  771.     $data['errormessage'] = false;
  772.     $data['nextstep'] = false;
  773.     return $this->render('Account/signIn.html.twig'$data);
  774.   }
  775.   /**
  776.    * email-approve-account
  777.    */
  778.   public function emailApproveAccountAction(Request $request)
  779.   {
  780.   }
  781.   /**
  782.    * approve-account
  783.    */
  784.   public function approveAccountAction(/*Request $request,*/$id null)
  785.   {
  786.     //if ($request->get("id")) {
  787.     // $id = $request->get("id");
  788.     //}
  789.     $customerAccount DataObject\CustomerAccount::getById($id1);
  790.     if ($customerAccount) {
  791.       $mail = new Mail();
  792.       $mail->setIgnoreDebugMode(true);
  793.       $mail->addTo($customerAccount->getEmail());
  794.       $mail->subject($this->translator->trans("espirits.login.approve-account.subject"));
  795.       //$mail->setDefaultFrom("contact@beamsuntory.com","Forgot Password");
  796.       if ($customerAccount->geteSpiritsCountryAvailabilityList()[0] == '/availability-countries/us' || !$customerAccount->geteSpiritsCountryAvailabilityList()[0]) {
  797.         $emailPath "/espirits/en_us/emails/approve-account";
  798.         $downloadInstructions Asset::getByPath("/espirits/how-to/en_us/download-instructions.pdf");
  799.         if ($downloadInstructions) {
  800.           $mail->attach($downloadInstructions->getData(), $downloadInstructions->getType(), "eSpirits Download Instructions.pdf");
  801.         }
  802.         $espiritsPortal Asset::getByPath("/espirits/how-to/en_us/espirits-portal.pdf");
  803.         if ($espiritsPortal) {
  804.           $mail->attach($espiritsPortal->getData(), $espiritsPortal->getType(), "eSpirits Portal.pdf");
  805.         }
  806.       } else if ($customerAccount->geteSpiritsCountryAvailabilityList()[0] == '/availability-countries/de') {
  807.         $emailPath "/espirits/de/emails/approve-account";
  808.       }
  809.       //$docPath = substr($_SERVER["REQUEST_URI"],0, strrpos($_SERVER["REQUEST_URI"],"?"));
  810.       //$docPath = str_replace("/account","/emails",$docPath);
  811.       $emailDocument Document::getByPath($emailPath);
  812.       $mail->setDocument($emailDocument);
  813.       $mail->send();
  814.     }
  815.     return;
  816.   }
  817.   /**
  818.    * email-approve-account
  819.    */
  820.   public function sendPendingAccountEmail($customeraccount)
  821.   {
  822.     //set the email doc path
  823.     $emailPath "/espirits/en_us/emails/pending-account";
  824.     if (strrpos($customeraccount->getPath(), "/de/") > 0) {
  825.       $emailPath "/espirits/de/emails/pending-account";
  826.     }
  827.     //Set the params
  828.     $params = array(
  829.       'firstName' => $customeraccount->getFirstname(),
  830.       'lastName' => $customeraccount->getLastname(),
  831.       'email' => $customeraccount->getEmail(),
  832.       'link' => 'https://' $_SERVER["HTTP_HOST"] . '/admin/login/deeplink?object_' $customeraccount->getId() . '_object'
  833.     );
  834.     //Send the email now
  835.     $mail = new Mail();
  836.     $mail->setIgnoreDebugMode(true);
  837.     $emailDocument Document::getByPath($emailPath);
  838.     $mail->setDocument($emailDocument);
  839.     $mail->setParams($params);
  840.     $mail->send();
  841.   }
  842. }