![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/cartforge.co/vendor/magento/module-sales/Helper/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Sales\Helper; use Magento\Framework\App as App; use Magento\Framework\Exception\InputException; use Magento\Framework\Stdlib\Cookie\CookieSizeLimitReachedException; use Magento\Framework\Stdlib\Cookie\FailureToSendException; use \Magento\Sales\Model\Order; /** * Sales module base helper * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) */ class Guest extends \Magento\Framework\App\Helper\AbstractHelper { /** * @var \Magento\Framework\Registry */ protected $coreRegistry; /** * @var \Magento\Customer\Model\Session */ protected $customerSession; /** * @var \Magento\Framework\Stdlib\CookieManagerInterface */ protected $cookieManager; /** * @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory */ protected $cookieMetadataFactory; /** * @var \Magento\Framework\Message\ManagerInterface */ protected $messageManager; /** * @var \Magento\Sales\Model\OrderFactory */ protected $orderFactory; /** * @var \Magento\Framework\Controller\Result\RedirectFactory */ protected $resultRedirectFactory; /** * @var \Magento\Sales\Api\OrderRepositoryInterface */ private $orderRepository; /** * @var \Magento\Framework\Api\SearchCriteriaBuilder */ private $searchCriteriaBuilder; /** * Cookie key for guest view */ public const COOKIE_NAME = 'guest-view'; /** * Cookie path value */ public const COOKIE_PATH = '/'; /** * Cookie lifetime value */ public const COOKIE_LIFETIME = 600; /** * @var \Magento\Store\Model\StoreManagerInterface */ private $storeManager; /** * @var string */ private $inputExceptionMessage = 'You entered incorrect data. Please try again.'; /** * @param App\Helper\Context $context * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Framework\Registry $coreRegistry * @param \Magento\Customer\Model\Session $customerSession * @param \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager * @param \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory * @param \Magento\Framework\Message\ManagerInterface $messageManager * @param \Magento\Sales\Model\OrderFactory $orderFactory * @param \Magento\Framework\Controller\Result\RedirectFactory $resultRedirectFactory * @param \Magento\Sales\Api\OrderRepositoryInterface $orderRepository * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteria * * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( App\Helper\Context $context, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\Registry $coreRegistry, \Magento\Customer\Model\Session $customerSession, \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager, \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory, \Magento\Framework\Message\ManagerInterface $messageManager, \Magento\Sales\Model\OrderFactory $orderFactory, \Magento\Framework\Controller\Result\RedirectFactory $resultRedirectFactory, \Magento\Sales\Api\OrderRepositoryInterface $orderRepository = null, \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteria = null ) { $this->coreRegistry = $coreRegistry; $this->storeManager = $storeManager; $this->customerSession = $customerSession; $this->cookieManager = $cookieManager; $this->cookieMetadataFactory = $cookieMetadataFactory; $this->messageManager = $messageManager; $this->orderFactory = $orderFactory; $this->resultRedirectFactory = $resultRedirectFactory; $this->orderRepository = $orderRepository ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Sales\Api\OrderRepositoryInterface::class); $this->searchCriteriaBuilder = $searchCriteria?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Api\SearchCriteriaBuilder::class); parent::__construct( $context ); } /** * Try to load valid order by $_POST or $_COOKIE * * @param App\RequestInterface $request * @return \Magento\Framework\Controller\Result\Redirect|bool * @throws \RuntimeException * @throws InputException * @throws CookieSizeLimitReachedException * @throws FailureToSendException */ public function loadValidOrder(App\RequestInterface $request) { if ($this->customerSession->isLoggedIn()) { return $this->resultRedirectFactory->create()->setPath('sales/order/history'); } $post = $request->getPostValue(); $post = filter_var($post, FILTER_CALLBACK, ['options' => 'trim']); $fromCookie = $this->cookieManager->getCookie(self::COOKIE_NAME); if (empty($post) && !$fromCookie) { return $this->resultRedirectFactory->create()->setPath('sales/guest/form'); } // It is unique place in the class that process exception and only InputException. It is need because by // input data we found order and one more InputException could be throws deeper in stack trace try { $order = (!empty($post) && isset($post['oar_order_id'], $post['oar_type']) && !$this->hasPostDataEmptyFields($post)) ? $this->loadFromPost($post) : $this->loadFromCookie($fromCookie); $this->coreRegistry->register('current_order', $order); return true; } catch (InputException $e) { $this->messageManager->addErrorMessage($e->getMessage()); return $this->resultRedirectFactory->create()->setPath('sales/guest/form'); } } /** * Get Breadcrumbs for current controller action * * @param \Magento\Framework\View\Result\Page $resultPage * @return void */ public function getBreadcrumbs(\Magento\Framework\View\Result\Page $resultPage) { $breadcrumbs = $resultPage->getLayout()->getBlock('breadcrumbs'); if (!$breadcrumbs) { return; } $breadcrumbs->addCrumb( 'home', [ 'label' => __('Home'), 'title' => __('Go to Home Page'), 'link' => $this->storeManager->getStore()->getBaseUrl() ] ); $breadcrumbs->addCrumb( 'cms_page', ['label' => __('Order Information'), 'title' => __('Order Information')] ); } /** * Set guest-view cookie * * @param string $cookieValue * @return void * @throws InputException * @throws CookieSizeLimitReachedException * @throws FailureToSendException */ private function setGuestViewCookie($cookieValue) { $metadata = $this->cookieMetadataFactory->createPublicCookieMetadata() ->setPath(self::COOKIE_PATH) ->setHttpOnly(true) ->setSameSite('Lax'); $this->cookieManager->setPublicCookie(self::COOKIE_NAME, $cookieValue, $metadata); } /** * Load order from cookie * * @param string $fromCookie * @return Order * @throws InputException * @throws CookieSizeLimitReachedException * @throws FailureToSendException */ private function loadFromCookie($fromCookie) { if (!is_string($fromCookie)) { throw new InputException(__($this->inputExceptionMessage)); } // phpcs:ignore Magento2.Functions.DiscouragedFunction $cookieData = explode(':', base64_decode($fromCookie)); $protectCode = $cookieData[0] ?? null; $incrementId = $cookieData[1] ?? null; if ($protectCode && $incrementId) { $order = $this->getOrderRecord($incrementId); if (hash_equals((string)$order->getProtectCode(), $protectCode)) { $this->setGuestViewCookie($fromCookie); return $order; } } throw new InputException(__($this->inputExceptionMessage)); } /** * Load order data from post * * @param array $postData * @return Order * @throws InputException * @throws CookieSizeLimitReachedException * @throws FailureToSendException */ private function loadFromPost(array $postData) { /** @var $order \Magento\Sales\Model\Order */ $order = $this->getOrderRecord($postData['oar_order_id']); if (!$this->compareStoredBillingDataWithInput($order, $postData)) { throw new InputException(__('You entered incorrect data. Please try again.')); } $toCookie = base64_encode($order->getProtectCode() . ':' . $postData['oar_order_id']); $this->setGuestViewCookie($toCookie); return $order; } /** * Check that billing data from the order and from the input are equal * * @param Order $order * @param array $postData * @return bool */ private function compareStoredBillingDataWithInput(Order $order, array $postData) { $type = $postData['oar_type']; $email = $postData['oar_email']; $lastName = $postData['oar_billing_lastname']; $zip = $postData['oar_zip']; $billingAddress = $order->getBillingAddress(); return $this->normalizeStr($lastName) === $this->normalizeStr($billingAddress->getLastname()) && ($type === 'email' && $this->normalizeStr($email) === $this->normalizeStr($billingAddress->getEmail()) || $type === 'zip' && $this->normalizeStr($zip) === $this->normalizeStr($billingAddress->getPostcode())); } /** * Trim and convert to lower case * * @param string $str * @return string */ private function normalizeStr(string $str): string { return trim(strtolower($str)); } /** * Check post data for empty fields * * @param array $postData * @return bool */ private function hasPostDataEmptyFields(array $postData) { return empty($postData['oar_order_id']) || empty($postData['oar_billing_lastname']) || empty($postData['oar_type']) || empty($this->storeManager->getStore()->getId()) || !in_array($postData['oar_type'], ['email', 'zip'], true) || ('email' === $postData['oar_type'] && empty($postData['oar_email'])) || ('zip' === $postData['oar_type'] && empty($postData['oar_zip'])); } /** * Get order by increment_id and store_id * * @param string $incrementId * @return \Magento\Sales\Api\Data\OrderInterface * @throws InputException */ private function getOrderRecord($incrementId) { $records = $this->orderRepository->getList( $this->searchCriteriaBuilder ->addFilter('increment_id', $incrementId) ->addFilter('store_id', $this->storeManager->getStore()->getId()) ->create() ); $items = $records->getItems(); if (empty($items)) { throw new InputException(__($this->inputExceptionMessage)); } return array_shift($items); } }