securityContext = $securityContext; $this->requestStack = $requestStack; $this->dispatcher = $dispatcher; } /** * Process security check function * * @param array $params * @param \Smarty $smarty * @return string no text is returned. * @throws \Thelia\Core\Security\Exception\AuthenticationException * @throws AuthenticationException * @throws AuthorizationException */ public function checkAuthFunction($params, &$smarty) { $roles = $this->explode($this->getParam($params, 'role')); $resources = $this->explode($this->getParam($params, 'resource')); $modules = $this->explode($this->getParam($params, 'module')); $accesses = $this->explode($this->getParam($params, 'access')); if (! $this->securityContext->isGranted($roles, $resources, $modules, $accesses)) { if (null === $this->securityContext->checkRole($roles)) { // The current user is not logged-in. $ex = new AuthenticationException( sprintf( "User not granted for roles '%s', to access resources '%s' with %s.", implode(',', $roles), implode(',', $resources), implode(',', $accesses) ) ); $loginTpl = $this->getParam($params, 'login_tpl'); if (null != $loginTpl) { $ex->setLoginTemplate($loginTpl); } } else { // We have a logged-in user, who do not have the proper permission. Issue an AuthorizationException. $ex = new AuthorizationException( sprintf( "User not granted for roles '%s', to access resources '%s' with %s.", implode(',', $roles), implode(',', $resources), implode(',', $accesses) ) ); } throw $ex; } return ''; } public function checkCartNotEmptyFunction($params, &$smarty) { $cart = $this->getSession()->getSessionCart($this->dispatcher); if ($cart===null || $cart->countCartItems() == 0) { throw new OrderException('Cart must not be empty', OrderException::CART_EMPTY, array('empty' => 1)); } return ""; } public function checkValidDeliveryFunction($params, &$smarty) { $order = $this->getSession()->getOrder(); /* Does address and module still exists ? We assume address owner can't change neither module type */ if ($order !== null) { $checkAddress = AddressQuery::create()->findPk($order->getChoosenDeliveryAddress()); $checkModule = ModuleQuery::create()->findPk($order->getDeliveryModuleId()); } else { $checkAddress = $checkModule = null; } if (null === $order || null == $checkAddress || null === $checkModule) { throw new OrderException('Delivery must be defined', OrderException::UNDEFINED_DELIVERY, array('missing' => 1)); } return ""; } /** * Define the various smarty plugins handled by this class * * @return array an array of smarty plugin descriptors */ public function getPluginDescriptors() { return array( new SmartyPluginDescriptor('function', 'check_auth', $this, 'checkAuthFunction'), new SmartyPluginDescriptor('function', 'check_cart_not_empty', $this, 'checkCartNotEmptyFunction'), new SmartyPluginDescriptor('function', 'check_valid_delivery', $this, 'checkValidDeliveryFunction'), ); } /** * @return Session */ protected function getSession() { return $this->requestStack->getCurrentRequest()->getSession(); } }