diff --git a/lib/Alchemy/Phrasea/ACL/BasketACL.php b/lib/Alchemy/Phrasea/ACL/BasketACL.php new file mode 100644 index 0000000000..fa120fb989 --- /dev/null +++ b/lib/Alchemy/Phrasea/ACL/BasketACL.php @@ -0,0 +1,40 @@ +isOwner($basket, $user)) { + return true; + } + + if ($basket->getValidation()) { + foreach ($basket->getValidation()->getParticipants() as $participant) { + if ($participant->getUsrId() === $user->get_id()) { + return true; + } + } + } + + return false; + } + + public function isOwner(Basket $basket, User_Adapter $user) + { + return $basket->getUsrId() === $user->get_id(); + } +} diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index 298d1b010c..9077984241 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -77,6 +77,8 @@ use Alchemy\Phrasea\Core\Event\Subscriber\LogoutSubscriber; use Alchemy\Phrasea\Core\Event\Subscriber\PhraseaLocaleSubscriber; use Alchemy\Phrasea\Core\Event\Subscriber\MaintenanceSubscriber; use Alchemy\Phrasea\Core\Event\Subscriber\CookiesDisablerSubscriber; +use Alchemy\Phrasea\Core\Middleware\BasketMiddlewareProvider; +use Alchemy\Phrasea\Core\Provider\ACLServiceProvider; use Alchemy\Phrasea\Core\Provider\AuthenticationManagerServiceProvider; use Alchemy\Phrasea\Core\Provider\BrowserServiceProvider; use Alchemy\Phrasea\Core\Provider\BorderManagerServiceProvider; @@ -195,6 +197,9 @@ class Application extends SilexApplication ini_set('error_log', $this['root.path'] . '/logs/php_error.log'); } + $this->register(new BasketMiddlewareProvider()); + + $this->register(new ACLServiceProvider()); $this->register(new AuthenticationManagerServiceProvider()); $this->register(new BorderManagerServiceProvider()); $this->register(new BrowserServiceProvider()); diff --git a/lib/Alchemy/Phrasea/Controller/Api/V1.php b/lib/Alchemy/Phrasea/Controller/Api/V1.php index 5c3c36a1a3..3eb20acb8d 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V1.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V1.php @@ -17,6 +17,7 @@ use Alchemy\Phrasea\Authentication\Context; use Alchemy\Phrasea\Core\Event\PreAuthenticate; use Alchemy\Phrasea\Core\Event\ApiOAuth2StartEvent; use Alchemy\Phrasea\Core\Event\ApiOAuth2EndEvent; +use Alchemy\Phrasea\Model\Entities\Basket; use Silex\Application as SilexApplication; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Request; @@ -88,7 +89,7 @@ class V1 implements ControllerProviderInterface $app['dispatcher']->dispatch(PhraseaEvents::API_OAUTH2_END, new ApiOAuth2EndEvent()); return; - }, 256); + }); /** * OAuth log process @@ -604,11 +605,14 @@ class V1 implements ControllerProviderInterface * BASKET_ID : required INT * */ - $controllers->get('/baskets/{basket_id}/content/', function (SilexApplication $app, $basket_id) { - return $app['api']->get_basket($app['request'], $basket_id)->get_response(); - })->assert('basket_id', '\d+'); + $controllers->get('/baskets/{basket}/content/', function (SilexApplication $app, Basket $basket) { + return $app['api']->get_basket($app['request'], $basket)->get_response(); + }) + ->before($app['middleware.basket.converter']) + ->before($app['middleware.basket.user-access']) + ->assert('basket', '\d+'); - $controllers->get('/baskets/{wrong_basket_id}/content/', $bad_request_exception); + $controllers->get('/baskets/{wrong_basket}/content/', $bad_request_exception); /** * Route : /baskets/BASKET_ID/settitle/ @@ -619,13 +623,16 @@ class V1 implements ControllerProviderInterface * BASKET_ID : required INT * */ - $controllers->post('/baskets/{basket_id}/setname/', function (SilexApplication $app, $basket_id) { + $controllers->post('/baskets/{basket}/setname/', function (SilexApplication $app, Basket $basket) { return $app['api'] - ->set_basket_title($app['request'], $basket_id) + ->set_basket_title($app['request'], $basket) ->get_response(); - })->assert('basket_id', '\d+'); + }) + ->before($app['middleware.basket.converter']) + ->before($app['middleware.basket.user-is-owner']) + ->assert('basket', '\d+'); - $controllers->post('/baskets/{wrong_basket_id}/setname/', $bad_request_exception); + $controllers->post('/baskets/{wrong_basket}/setname/', $bad_request_exception); /** * Route : /baskets/BASKET_ID/setdescription/ @@ -636,13 +643,16 @@ class V1 implements ControllerProviderInterface * BASKET_ID : required INT * */ - $controllers->post('/baskets/{basket_id}/setdescription/', function (SilexApplication $app, $basket_id) { + $controllers->post('/baskets/{basket}/setdescription/', function (SilexApplication $app, Basket $basket) { return $app['api'] - ->set_basket_description($app['request'], $basket_id) + ->set_basket_description($app['request'], $basket) ->get_response(); - })->assert('basket_id', '\d+'); + }) + ->before($app['middleware.basket.converter']) + ->before($app['middleware.basket.user-is-owner']) + ->assert('basket', '\d+'); - $controllers->post('/baskets/{wrong_basket_id}/setdescription/', $bad_request_exception); + $controllers->post('/baskets/{wrong_basket}/setdescription/', $bad_request_exception); /** * Route : /baskets/BASKET_ID/delete/ @@ -653,11 +663,14 @@ class V1 implements ControllerProviderInterface * BASKET_ID : required INT * */ - $controllers->post('/baskets/{basket_id}/delete/', function (SilexApplication $app, $basket_id) { - return $app['api']->delete_basket($app['request'], $basket_id)->get_response(); - })->assert('basket_id', '\d+'); + $controllers->post('/baskets/{basket}/delete/', function (SilexApplication $app, Basket $basket) { + return $app['api']->delete_basket($app['request'], $basket)->get_response(); + }) + ->before($app['middleware.basket.converter']) + ->before($app['middleware.basket.user-is-owner']) + ->assert('basket', '\d+'); - $controllers->post('/baskets/{wrong_basket_id}/delete/', $bad_request_exception); + $controllers->post('/baskets/{wrong_basket}/delete/', $bad_request_exception); /** * Route : /feeds/list/ diff --git a/lib/Alchemy/Phrasea/Controller/Client/Baskets.php b/lib/Alchemy/Phrasea/Controller/Client/Baskets.php index 40a9cc72cc..5765c17388 100644 --- a/lib/Alchemy/Phrasea/Controller/Client/Baskets.php +++ b/lib/Alchemy/Phrasea/Controller/Client/Baskets.php @@ -86,9 +86,8 @@ class Baskets implements ControllerProviderInterface public function deleteBasket(Application $app, Request $request) { try { - $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - $basket = $repository->findUserBasket($app, $request->request->get('courChuId'), $app['authentication']->getUser(), true); + $basket = $app['converter.basket']->convert($request->request->get('courChuId')); + $app['acl.basket']->isOwner($basket, $app['authentication']->getUser()); $app['EM']->remove($basket); $app['EM']->flush(); @@ -137,25 +136,22 @@ class Baskets implements ControllerProviderInterface */ public function addElementToBasket(Application $app, Request $request) { - $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - $basket = $repository->findUserBasket($app, $request->request->get('courChuId'), $app['authentication']->getUser(), true); + $basket = $app['converter.basket']->convert($request->request->get('courChuId')); + $app['acl.basket']->isOwner($basket, $app['authentication']->getUser()); - if ($basket) { - try { - $record = new \record_adapter($app, $request->request->get('sbas'), $request->request->get('p0')); + try { + $record = new \record_adapter($app, $request->request->get('sbas'), $request->request->get('p0')); - $basketElement = new BasketElement(); - $basketElement->setRecord($record); - $basketElement->setBasket($basket); - $basket->addElement($basketElement); + $basketElement = new BasketElement(); + $basketElement->setRecord($record); + $basketElement->setBasket($basket); + $basket->addElement($basketElement); - $app['EM']->persist($basket); + $app['EM']->persist($basket); - $app['EM']->flush(); - } catch (\Exception $e) { + $app['EM']->flush(); + } catch (\Exception $e) { - } } return $app->redirectPath('get_client_baskets', array( @@ -181,7 +177,8 @@ class Baskets implements ControllerProviderInterface } if ('' !== $selectedBasketId) { - $selectedBasket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket')->findUserBasket($app, $selectedBasketId, $app['authentication']->getUser(), true); + $selectedBasket = $app['converter.basket']->convert($selectedBasketId); + $app['acl.basket']->isOwner($selectedBasket, $app['authentication']->getUser()); } $basketCollections = $baskets->partition(function ($key, $basket) { diff --git a/lib/Alchemy/Phrasea/Controller/Lightbox.php b/lib/Alchemy/Phrasea/Controller/Lightbox.php index 44afc04ac6..9d727b8808 100644 --- a/lib/Alchemy/Phrasea/Controller/Lightbox.php +++ b/lib/Alchemy/Phrasea/Controller/Lightbox.php @@ -57,14 +57,17 @@ class Lightbox implements ControllerProviderInterface break; case \random::TYPE_VALIDATE: case \random::TYPE_VIEW: - return $app->redirectPath('lightbox_validation', array('ssel_id' => $datas['datas'])); + return $app->redirectPath('lightbox_validation', array('basket' => $datas['datas'])); break; } }); $controllers->before(function (Request $request) use ($app) { $app['firewall']->requireAuthentication(); - }); + }) + // Silex\Route::convert is not used as this should be done prior the before middleware + ->before($app['middleware.basket.converter']) + ->before($app['middleware.basket.user-access']); $controllers->get('/', function (SilexApplication $app) { try { @@ -75,8 +78,6 @@ class Lightbox implements ControllerProviderInterface $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - $basket_collection = array_merge( $repository->findActiveByUser($app['authentication']->getUser()) , $repository->findActiveValidationByUser($app['authentication']->getUser()) @@ -117,7 +118,6 @@ class Lightbox implements ControllerProviderInterface ->assert('sselcont_id', '\d+'); $controllers->get('/ajax/LOAD_BASKET_ELEMENT/{sselcont_id}/', function (SilexApplication $app, $sselcont_id) { - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketElementRepository */ $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\BasketElement'); $BasketElement = $repository->findUserElement($sselcont_id, $app['authentication']->getUser()); @@ -201,7 +201,7 @@ class Lightbox implements ControllerProviderInterface ->assert('entry_id', '\d+') ->assert('item_id', '\d+'); - $controllers->get('/validate/{ssel_id}/', function (SilexApplication $app, $ssel_id) { + $controllers->get('/validate/{basket}/', function (SilexApplication $app, $basket) { try { \Session_Logger::updateClientInfos($app, 6); @@ -211,17 +211,10 @@ class Lightbox implements ControllerProviderInterface $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ $basket_collection = $repository->findActiveValidationAndBasketByUser( $app['authentication']->getUser() ); - $basket = $repository->findUserBasket( - $app, $ssel_id - , $app['authentication']->getUser() - , false - ); - if ($basket->getIsRead() === false) { $basket = $app['EM']->merge($basket); $basket->setIsRead(true); @@ -253,9 +246,9 @@ class Lightbox implements ControllerProviderInterface return $response; }) ->bind('lightbox_validation') - ->assert('ssel_id', '\d+'); + ->assert('basket', '\d+'); - $controllers->get('/compare/{ssel_id}/', function (SilexApplication $app, $ssel_id) { + $controllers->get('/compare/{basket}/', function (SilexApplication $app, Basket $basket) { try { \Session_Logger::updateClientInfos($app, 6); @@ -265,17 +258,10 @@ class Lightbox implements ControllerProviderInterface $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ $basket_collection = $repository->findActiveValidationAndBasketByUser( $app['authentication']->getUser() ); - $basket = $repository->findUserBasket( - $app, $ssel_id - , $app['authentication']->getUser() - , false - ); - if ($basket->getIsRead() === false) { $basket = $app['EM']->merge($basket); $basket->setIsRead(true); @@ -307,7 +293,7 @@ class Lightbox implements ControllerProviderInterface return $response; }) ->bind('lightbox_compare') - ->assert('ssel_id', '\d+'); + ->assert('basket', '\d+'); $controllers->get('/feeds/entry/{entry_id}/', function (SilexApplication $app, $entry_id) { @@ -344,26 +330,12 @@ class Lightbox implements ControllerProviderInterface ->bind('lightbox_feed_entry') ->assert('entry_id', '\d+'); - $controllers->get('/ajax/LOAD_REPORT/{ssel_id}/', function (SilexApplication $app, $ssel_id) { + $controllers->get('/ajax/LOAD_REPORT/{basket}/', function (SilexApplication $app, Basket $basket) { - $template = 'lightbox/basket_content_report.html.twig'; - - $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - $basket = $repository->findUserBasket( - $app, $ssel_id - , $app['authentication']->getUser() - , false - ); - - $response = new Response($app['twig']->render($template, array('basket' => $basket))); - $response->setCharset('UTF-8'); - - return $response; + return new Response($app['twig']->render('lightbox/basket_content_report.html.twig', array('basket' => $basket))); }) ->bind('lightbox_ajax_report') - ->assert('ssel_id', '\d+'); + ->assert('basket', '\d+'); $controllers->post('/ajax/SET_NOTE/{sselcont_id}/', function (SilexApplication $app, $sselcont_id) { $output = array('error' => true, 'datas' => _('Erreur lors de l\'enregistrement des donnees')); @@ -375,7 +347,6 @@ class Lightbox implements ControllerProviderInterface Return new Response('You must provide a note value', 400); } - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketElementRepository */ $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\BasketElement'); $basket_element = $repository->findUserElement($sselcont_id, $app['authentication']->getUser()); @@ -425,7 +396,6 @@ class Lightbox implements ControllerProviderInterface $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\BasketElement'); - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketElementRepository */ $basket_element = $repository->findUserElement( $sselcont_id , $app['authentication']->getUser() @@ -468,20 +438,11 @@ class Lightbox implements ControllerProviderInterface ->bind('lightbox_ajax_set_element_agreement') ->assert('sselcont_id', '\d+'); - $controllers->post('/ajax/SET_RELEASE/{ssel_id}/', function (SilexApplication $app, $ssel_id) { - - $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); + $controllers->post('/ajax/SET_RELEASE/{basket}/', function (SilexApplication $app, Basket $basket) { $datas = array('error' => true, 'datas' => ''); try { - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - $basket = $repository->findUserBasket( - $app, $ssel_id - , $app['authentication']->getUser() - , false - ); - if (!$basket->getValidation()) { throw new ControllerException('There is no validation session attached to this basket'); } @@ -536,7 +497,7 @@ class Lightbox implements ControllerProviderInterface return $app->json($datas); }) ->bind('lightbox_ajax_set_release') - ->assert('ssel_id', '\d+'); + ->assert('basket', '\d+'); return $controllers; } diff --git a/lib/Alchemy/Phrasea/Controller/Prod/BasketController.php b/lib/Alchemy/Phrasea/Controller/Prod/BasketController.php index 1df0fa4626..2d44f08bf8 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/BasketController.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/BasketController.php @@ -34,49 +34,62 @@ class BasketController implements ControllerProviderInterface $controllers = $app['controllers_factory']; - $controllers->before(function (Request $request) use ($app) { - $app['firewall']->requireAuthentication(); - }); + $controllers + ->before(function (Request $request, Application $app) { + $app['firewall']->requireAuthentication(); + }) + // Silex\Route::convert is not used as this should be done prior the before middleware + ->before($app['middleware.basket.converter']) + ->before($app['middleware.basket.user-access']); - $controllers->get('/{basket_id}/', 'controller.prod.basket:displayBasket') + $controllers->get('/{basket}/', 'controller.prod.basket:displayBasket') ->bind('prod_baskets_basket') - ->assert('basket_id', '\d+'); + ->assert('basket', '\d+'); $controllers->post('/', 'controller.prod.basket:createBasket') ->bind('prod_baskets'); - $controllers->post('/{basket_id}/delete/', 'controller.prod.basket:deleteBasket') - ->assert('basket_id', '\d+') - ->bind('basket_delete'); + $controllers->post('/{basket}/delete/', 'controller.prod.basket:deleteBasket') + ->assert('basket', '\d+') + ->bind('basket_delete') + ->before($app['middleware.basket.user-is-owner']); - $controllers->post('/{basket_id}/delete/{basket_element_id}/', 'controller.prod.basket:removeBasketElement') + $controllers->post('/{basket}/delete/{basket_element_id}/', 'controller.prod.basket:removeBasketElement') ->bind('prod_baskets_basket_element_remove') - ->assert('basket_id', '\d+') - ->assert('basket_element_id', '\d+'); + ->assert('basket', '\d+') + ->assert('basket_element_id', '\d+') + ->before($app['middleware.basket.user-is-owner']); - $controllers->post('/{basket_id}/update/', 'controller.prod.basket:updateBasket') + $controllers->post('/{basket}/update/', 'controller.prod.basket:updateBasket') ->bind('prod_baskets_basket_update') - ->assert('basket_id', '\d+'); + ->assert('basket', '\d+') + ->before($app['middleware.basket.user-is-owner']); - $controllers->get('/{basket_id}/update/', 'controller.prod.basket:displayUpdateForm') - ->assert('basket_id', '\d+'); + $controllers->get('/{basket}/update/', 'controller.prod.basket:displayUpdateForm') + ->assert('basket', '\d+') + ->before($app['middleware.basket.user-is-owner']); - $controllers->get('/{basket_id}/reorder/', 'controller.prod.basket:displayReorderForm') - ->assert('basket_id', '\d+') - ->bind('prod_baskets_basket_reorder'); + $controllers->get('/{basket}/reorder/', 'controller.prod.basket:displayReorderForm') + ->assert('basket', '\d+') + ->bind('prod_baskets_basket_reorder') + ->before($app['middleware.basket.user-is-owner']); - $controllers->post('/{basket_id}/reorder/', 'controller.prod.basket:reorder') - ->assert('basket_id', '\d+'); + $controllers->post('/{basket}/reorder/', 'controller.prod.basket:reorder') + ->assert('basket', '\d+') + ->before($app['middleware.basket.user-is-owner']); - $controllers->post('/{basket_id}/archive/', 'controller.prod.basket:archiveBasket') + $controllers->post('/{basket}/archive/', 'controller.prod.basket:archiveBasket') ->bind('prod_baskets_basket_archive') - ->assert('basket_id', '\d+'); + ->assert('basket', '\d+') + ->before($app['middleware.basket.user-is-owner']); - $controllers->post('/{basket_id}/addElements/', 'controller.prod.basket:addElements') - ->assert('basket_id', '\d+'); + $controllers->post('/{basket}/addElements/', 'controller.prod.basket:addElements') + ->assert('basket', '\d+') + ->before($app['middleware.basket.user-is-owner']); - $controllers->post('/{basket_id}/stealElements/', 'controller.prod.basket:stealElements') - ->assert('basket_id', '\d+'); + $controllers->post('/{basket}/stealElements/', 'controller.prod.basket:stealElements') + ->assert('basket', '\d+') + ->before($app['middleware.basket.user-is-owner']); $controllers->get('/create/', 'controller.prod.basket:displayCreateForm') ->bind('prod_baskets_create'); @@ -84,11 +97,8 @@ class BasketController implements ControllerProviderInterface return $controllers; } - public function displayBasket(Application $app, Request $request, $basket_id) + public function displayBasket(Application $app, Request $request, BasketEntity $basket) { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), false); - if ($basket->getIsRead() === false) { $basket->setIsRead(true); $app['EM']->flush(); @@ -111,9 +121,6 @@ class BasketController implements ControllerProviderInterface public function createBasket(Application $app, Request $request) { - $request = $app['request']; - /* @var $request \Symfony\Component\HttpFoundation\Request */ - $Basket = new BasketEntity(); $Basket->setName($request->request->get('name', '')); @@ -144,7 +151,7 @@ class BasketController implements ControllerProviderInterface $app['EM']->flush(); - if ($request->getRequestFormat() == 'json') { + if ($request->getRequestFormat() === 'json') { $data = array( 'success' => true , 'message' => _('Basket created') @@ -155,15 +162,12 @@ class BasketController implements ControllerProviderInterface return $app->json($data); } else { - return $app->redirectPath('prod_baskets_basket', array('basket_id' => $Basket->getId())); + return $app->redirectPath('prod_baskets_basket', array('basket' => $Basket->getId())); } } - public function deleteBasket(Application $app, Request $request, $basket_id) + public function deleteBasket(Application $app, Request $request, BasketEntity $basket) { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - $app['EM']->remove($basket); $app['EM']->flush(); @@ -172,21 +176,18 @@ class BasketController implements ControllerProviderInterface , 'message' => _('Basket has been deleted') ); - if ($request->getRequestFormat() == 'json') { + if ($request->getRequestFormat() === 'json') { return $app->json($data); } else { return $app->redirectPath('prod_workzone_show'); } } - public function removeBasketElement(Application $app, Request $request, $basket_id, $basket_element_id) + public function removeBasketElement(Application $app, Request $request, BasketEntity $basket, $basket_element_id) { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - foreach ($basket->getElements() as $basket_element) { /* @var $basket_element BasketElement */ - if ($basket_element->getId() == $basket_element_id) { + if ($basket_element->getId() === (int) $basket_element_id) { $app['EM']->remove($basket_element); } } @@ -198,21 +199,18 @@ class BasketController implements ControllerProviderInterface , 'message' => _('Record removed from basket') ); - if ($request->getRequestFormat() == 'json') { + if ($request->getRequestFormat() === 'json') { return $app->json($data); } else { return $app->redirectPath('prod_workzone_show'); } } - public function updateBasket(Application $app, Request $request, $basket_id) + public function updateBasket(Application $app, Request $request, BasketEntity $basket) { $success = false; try { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - $basket->setName($request->request->get('name', '')); $basket->setDescription($request->request->get('description')); @@ -232,41 +230,30 @@ class BasketController implements ControllerProviderInterface $data = array( 'success' => $success , 'message' => $msg - , 'basket' => array('id' => $basket_id) + , 'basket' => array('id' => $basket->getId()) ); - if ($request->getRequestFormat() == 'json') { + if ($request->getRequestFormat() === 'json') { return $app->json($data); } else { return $app->redirectPath('prod_workzone_show'); } } - public function displayUpdateForm(Application $app, $basket_id) + public function displayUpdateForm(Application $app, BasketEntity $basket) { - $basket = $app['EM'] - ->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - return $app['twig']->render('prod/Baskets/Update.html.twig', array('basket' => $basket)); } - public function displayReorderForm(Application $app, $basket_id) + public function displayReorderForm(Application $app, BasketEntity $basket) { - $basket = $app['EM'] - ->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - return $app['twig']->render('prod/Baskets/Reorder.html.twig', array('basket' => $basket)); } - public function reorder(Application $app, $basket_id) + public function reorder(Application $app, BasketEntity $basket) { $ret = array('success' => false, 'message' => _('An error occured')); try { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - $order = $app['request']->request->get('element'); /* @var $basket BasketEntity */ @@ -287,11 +274,8 @@ class BasketController implements ControllerProviderInterface return $app->json($ret); } - public function archiveBasket(Application $app, Request $request, $basket_id) + public function archiveBasket(Application $app, Request $request, BasketEntity $basket) { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - $archive_status = (Boolean) $request->query->get('archive'); $basket->setArchived($archive_status); @@ -311,18 +295,15 @@ class BasketController implements ControllerProviderInterface , 'message' => $message ); - if ($request->getRequestFormat() == 'json') { + if ($request->getRequestFormat() === 'json') { return $app->json($data); } else { return $app->redirectPath('prod_workzone_show'); } } - public function addElements(Application $app, Request $request, $basket_id) + public function addElements(Application $app, Request $request, BasketEntity $basket) { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - $n = 0; $records = RecordsRequest::fromRequest($app, $request, true); @@ -362,18 +343,15 @@ class BasketController implements ControllerProviderInterface , 'message' => sprintf(_('%d records added'), $n) ); - if ($request->getRequestFormat() == 'json') { + if ($request->getRequestFormat() === 'json') { return $app->json($data); } else { return $app->redirectPath('prod_workzone_show'); } } - public function stealElements(Application $app, Request $request, $basket_id) + public function stealElements(Application $app, Request $request, BasketEntity $basket) { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), true); - $n = 0; foreach ($request->request->get('elements') as $bask_element_id) { @@ -384,6 +362,7 @@ class BasketController implements ControllerProviderInterface continue; } + $basket_element->getBasket()->removeElement($basket_element); $basket_element->setBasket($basket); $basket->addElement($basket_element); $n++; @@ -396,7 +375,7 @@ class BasketController implements ControllerProviderInterface , 'message' => sprintf(_('%d records moved'), $n) ); - if ($request->getRequestFormat() == 'json') { + if ($request->getRequestFormat() === 'json') { return $app->json($data); } else { return $app->redirectPath('prod_workzone_show'); diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Push.php b/lib/Alchemy/Phrasea/Controller/Prod/Push.php index eb0a72b2fa..bbc3690555 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Push.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Push.php @@ -221,7 +221,7 @@ class Push implements ControllerProviderInterface $app['EM']->flush(); $url = $app->url('lightbox_compare', array( - 'ssel_id' => $Basket->getId(), + 'basket' => $Basket->getId(), 'LOG' => $app['tokens']->getUrlToken( \random::TYPE_VIEW, $user_receiver->get_id(), @@ -419,7 +419,7 @@ class Push implements ControllerProviderInterface $app['EM']->flush(); $url = $app->url('lightbox_validation', array( - 'ssel_id' => $Basket->getId(), + 'basket' => $Basket->getId(), 'LOG' => $app['tokens']->getUrlToken( \random::TYPE_VALIDATE, $participant_user->get_id(), diff --git a/lib/Alchemy/Phrasea/Controller/Prod/Tooltip.php b/lib/Alchemy/Phrasea/Controller/Prod/Tooltip.php index 91bdf13601..9023a49905 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/Tooltip.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/Tooltip.php @@ -11,6 +11,7 @@ namespace Alchemy\Phrasea\Controller\Prod; +use Alchemy\Phrasea\Model\Entities\Basket; use Alchemy\Phrasea\SearchEngine\SearchEngineOptions; use Symfony\Component\HttpFoundation\Request; use Silex\Application; @@ -33,8 +34,10 @@ class Tooltip implements ControllerProviderInterface $app['firewall']->requireAuthentication(); }); - $controllers->post('/basket/{basket_id}/', 'controller.prod.tooltip:displayBasket') - ->assert('basket_id', '\d+') + $controllers->post('/basket/{basket}/', 'controller.prod.tooltip:displayBasket') + ->assert('basket', '\d+') + ->before($app['middleware.basket.converter']) + ->before($app['middleware.basket.user-access']) ->bind('prod_tooltip_basket'); $controllers->post('/Story/{sbas_id}/{record_id}/', 'controller.prod.tooltip:displayStory') @@ -79,11 +82,8 @@ class Tooltip implements ControllerProviderInterface return $controllers; } - public function displayBasket(Application $app, $basket_id) + public function displayBasket(Application $app, Basket $basket) { - $basket = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), false); - return $app['twig']->render('prod/Tooltip/Basket.html.twig', array('basket' => $basket)); } diff --git a/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php b/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php index d5f4af6188..1a019f6d91 100644 --- a/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php +++ b/lib/Alchemy/Phrasea/Controller/Prod/WorkZone.php @@ -11,11 +11,12 @@ namespace Alchemy\Phrasea\Controller\Prod; +use Alchemy\Phrasea\Model\Entities\Basket; use Alchemy\Phrasea\Model\Entities\StoryWZ; +use Alchemy\Phrasea\Helper\WorkZone as WorkzoneHelper; use Silex\Application; use Silex\ControllerProviderInterface; use Symfony\Component\HttpFoundation\Request; -use Alchemy\Phrasea\Helper\WorkZone as WorkzoneHelper; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -35,7 +36,10 @@ class WorkZone implements ControllerProviderInterface $controllers->before(function (Request $request) use ($app) { $app['firewall']->requireAuthentication(); - }); + }) + // Silex\Route::convert is not used as this should be done prior the before middleware + ->before($app['middleware.basket.converter']) + ->before($app['middleware.basket.user-access']);; $controllers->get('/', 'controller.prod.workzone:displayWorkzone') ->bind('prod_workzone_show'); @@ -46,9 +50,9 @@ class WorkZone implements ControllerProviderInterface $controllers->get('/Browse/Search/', 'controller.prod.workzone:browserSearch') ->bind('prod_workzone_search'); - $controllers->get('/Browse/Basket/{basket_id}/', 'controller.prod.workzone:browseBasket') + $controllers->get('/Browse/Basket/{basket}/', 'controller.prod.workzone:browseBasket') ->bind('prod_workzone_basket') - ->assert('basket_id', '\d+'); + ->assert('basket', '\d+'); $controllers->post('/attachStories/', 'controller.prod.workzone:attachStories'); @@ -113,12 +117,8 @@ class WorkZone implements ControllerProviderInterface return $app['twig']->render('prod/WorkZone/Browser/Results.html.twig', $params); } - public function browseBasket(Application $app, Request $request, $basket_id) + public function browseBasket(Application $app, Request $request, Basket $basket) { - $basket = $app['EM'] - ->getRepository('Alchemy\Phrasea\Model\Entities\Basket') - ->findUserBasket($app, $basket_id, $app['authentication']->getUser(), false); - return $app['twig']->render('prod/WorkZone/Browser/Basket.html.twig', array('Basket' => $basket)); } diff --git a/lib/Alchemy/Phrasea/Controller/RecordsRequest.php b/lib/Alchemy/Phrasea/Controller/RecordsRequest.php index 6b8fa58b5f..08c8399db2 100644 --- a/lib/Alchemy/Phrasea/Controller/RecordsRequest.php +++ b/lib/Alchemy/Phrasea/Controller/RecordsRequest.php @@ -206,9 +206,8 @@ class RecordsRequest extends ArrayCollection $basket = null; if ($request->get('ssel')) { - $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - $basket = $repository->findUserBasket($app, $request->get('ssel'), $app['authentication']->getUser(), false); + $basket = $app['converter.basket']->convert($request->get('ssel')); + $app['acl.basket']->hasAccess($basket, $app['authentication']->getUser()); foreach ($basket->getElements() as $basket_element) { $received[$basket_element->getRecord($app)->get_serialize_key()] = $basket_element->getRecord($app); diff --git a/lib/Alchemy/Phrasea/Controller/Root/Login.php b/lib/Alchemy/Phrasea/Controller/Root/Login.php index a55dc2028d..28cf757e98 100644 --- a/lib/Alchemy/Phrasea/Controller/Root/Login.php +++ b/lib/Alchemy/Phrasea/Controller/Root/Login.php @@ -852,7 +852,7 @@ class Login implements ControllerProviderInterface 'ssel_id' => $basketId, 'from' => $validationSession->getInitiatorId(), 'validate_id' => $validationSession->getId(), - 'url' => $app->url('lightbox_validation', array('ssel_id' => $basketId, 'LOG' => $token)), + 'url' => $app->url('lightbox_validation', array('basket' => $basketId, 'LOG' => $token)), )); $participant->setReminded(new \DateTime('now')); diff --git a/lib/Alchemy/Phrasea/Core/Middleware/BasketMiddlewareProvider.php b/lib/Alchemy/Phrasea/Core/Middleware/BasketMiddlewareProvider.php new file mode 100644 index 0000000000..85d8796c0e --- /dev/null +++ b/lib/Alchemy/Phrasea/Core/Middleware/BasketMiddlewareProvider.php @@ -0,0 +1,47 @@ +protect(function (Request $request, Application $app) { + if ($request->attributes->has('basket')) { + $request->attributes->set('basket', $app['converter.basket']->convert($request->attributes->get('basket'))); + } + }); + + $app['middleware.basket.user-access'] = $app->protect(function (Request $request, Application $app) { + if ($request->attributes->has('basket')) { + if (!$app['acl.basket']->hasAccess($request->attributes->get('basket'), $app['authentication']->getUser())) { + throw new AccessDeniedHttpException('Current user does not have access to the basket'); + } + } + }); + + $app['middleware.basket.user-is-owner'] = $app->protect(function (Request $request, Application $app) { + if (!$app['acl.basket']->isOwner($request->attributes->get('basket'), $app['authentication']->getUser())) { + throw new AccessDeniedHttpException('Only basket owner can modify the basket'); + } + }); + } + + public function boot(Application $app) + { + } +} diff --git a/lib/Alchemy/Phrasea/Core/Provider/ACLServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/ACLServiceProvider.php new file mode 100644 index 0000000000..67a3d4d943 --- /dev/null +++ b/lib/Alchemy/Phrasea/Core/Provider/ACLServiceProvider.php @@ -0,0 +1,30 @@ +share(function ($app) { + return new BasketACL(); + }); + } + + public function boot(Application $app) + { + } +} diff --git a/lib/Alchemy/Phrasea/Core/Provider/ConvertersServiceProvider.php b/lib/Alchemy/Phrasea/Core/Provider/ConvertersServiceProvider.php index 5866cb3823..023e1c6466 100644 --- a/lib/Alchemy/Phrasea/Core/Provider/ConvertersServiceProvider.php +++ b/lib/Alchemy/Phrasea/Core/Provider/ConvertersServiceProvider.php @@ -11,6 +11,7 @@ namespace Alchemy\Phrasea\Core\Provider; +use Alchemy\Phrasea\Model\Converter\BasketConverter; use Alchemy\Phrasea\Model\Converter\TaskConverter; use Silex\Application; use Silex\ServiceProviderInterface; @@ -22,6 +23,10 @@ class ConvertersServiceProvider implements ServiceProviderInterface $app['converter.task'] = $app->share(function ($app) { return new TaskConverter($app['EM']); }); + + $app['converter.basket'] = $app->share(function ($app) { + return new BasketConverter($app['EM']); + }); } public function boot(Application $app) diff --git a/lib/Alchemy/Phrasea/Helper/Record/Helper.php b/lib/Alchemy/Phrasea/Helper/Record/Helper.php index 8385792534..d165cab385 100644 --- a/lib/Alchemy/Phrasea/Helper/Record/Helper.php +++ b/lib/Alchemy/Phrasea/Helper/Record/Helper.php @@ -113,10 +113,8 @@ class Helper extends \Alchemy\Phrasea\Helper\Helper $this->selection = new \set_selection($app); if (trim($Request->get('ssel')) !== '') { - $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - /* @var $$repository Alchemy\Phrasea\Model\\Repositories\BasketRepository */ - $Basket = $repository->findUserBasket($this->app, $Request->get('ssel'), $app['authentication']->getUser(), false); + $Basket = $app['converter.basket']->convert($Request->get('ssel')); + $app['acl.basket']->hasAccess($Basket, $app['authentication']->getUser()); $this->selection->load_basket($Basket); diff --git a/lib/Alchemy/Phrasea/Model/Converter/BasketConverter.php b/lib/Alchemy/Phrasea/Model/Converter/BasketConverter.php new file mode 100644 index 0000000000..30d55f857a --- /dev/null +++ b/lib/Alchemy/Phrasea/Model/Converter/BasketConverter.php @@ -0,0 +1,40 @@ +om = $om; + } + + /** + * {@inheritdoc} + * + * @return Basket + */ + public function convert($id) + { + if (null === $basket = $this->om->find('Alchemy\Phrasea\Model\Entities\Basket', (int) $id)) { + throw new NotFoundHttpException(sprintf('Basket %s not found.', $id)); + } + + return $basket; + } +} diff --git a/lib/Alchemy/Phrasea/Model/Repositories/BasketRepository.php b/lib/Alchemy/Phrasea/Model/Repositories/BasketRepository.php index 836360d2d9..08e0d1bcc6 100644 --- a/lib/Alchemy/Phrasea/Model/Repositories/BasketRepository.php +++ b/lib/Alchemy/Phrasea/Model/Repositories/BasketRepository.php @@ -119,51 +119,6 @@ class BasketRepository extends EntityRepository return $query->getResult(); } - /** - * Find a basket specified by his basket_id and his owner - * - * @throws NotFoundHttpException - * @throws AccessDeniedHttpException - * @param type $basket_id - * @param \User_Adapter $user - * @return Basket - */ - public function findUserBasket(Application $app, $basket_id, \User_Adapter $user, $requireOwner) - { - $dql = 'SELECT b - FROM Alchemy\Phrasea\Model\Entities\Basket b - LEFT JOIN b.elements e - WHERE b.id = :basket_id'; - - $query = $this->_em->createQuery($dql); - $query->setParameters(array('basket_id' => $basket_id)); - - $basket = $query->getOneOrNullResult(); - - /* @var $basket Basket */ - if (null === $basket) { - throw new NotFoundHttpException(_('Basket is not found')); - } - - if ($basket->getOwner($app)->get_id() != $user->get_id()) { - $participant = false; - - if ($basket->getValidation() && !$requireOwner) { - try { - $basket->getValidation()->getParticipant($user, $app); - $participant = true; - } catch (\Exception $e) { - - } - } - if (!$participant) { - throw new AccessDeniedHttpException(_('You have not access to this basket')); - } - } - - return $basket; - } - public function findContainingRecordForUser(\record_adapter $record, \User_Adapter $user) { diff --git a/lib/classes/API/V1/Interface.php b/lib/classes/API/V1/Interface.php index eacc52567c..08671ca907 100644 --- a/lib/classes/API/V1/Interface.php +++ b/lib/classes/API/V1/Interface.php @@ -9,6 +9,7 @@ * file that was distributed with this source code. */ +use Alchemy\Phrasea\Model\Entities\Basket; use Symfony\Component\HttpFoundation\Request; use Silex\Application; @@ -203,7 +204,7 @@ interface API_V1_Interface * BASKET_ID : required INT * */ - public function delete_basket(Request $request, $basket_id); + public function delete_basket(Request $request, Basket $basket); /** * Route : /baskets/BASKET_ID/content/FORMAT/ @@ -214,7 +215,7 @@ interface API_V1_Interface * BASKET_ID : required INT * */ - public function get_basket(Request $request, $basket_id); + public function get_basket(Request $request, Basket $basket); /** * Route : /baskets/BASKET_ID/title/FORMAT/ @@ -225,7 +226,7 @@ interface API_V1_Interface * BASKET_ID : required INT * */ - public function set_basket_title(Request $request, $basket_id); + public function set_basket_title(Request $request, Basket $basket); /** * Route : /baskets/BASKET_ID/description/FORMAT/ @@ -236,7 +237,7 @@ interface API_V1_Interface * BASKET_ID : required INT * */ - public function set_basket_description(Request $request, $basket_id); + public function set_basket_description(Request $request, Basket $basket); /** * Route : /publications/list/FORMAT/ diff --git a/lib/classes/API/V1/adapter.php b/lib/classes/API/V1/adapter.php index 2ab6bb9b1e..4dcc4f705a 100644 --- a/lib/classes/API/V1/adapter.php +++ b/lib/classes/API/V1/adapter.php @@ -1297,17 +1297,12 @@ class API_V1_adapter extends API_V1_Abstract * Delete a basket * * @param Request $request - * @param int $basket_id + * @param Basket $basket * @return array */ - public function delete_basket(Request $request, $basket_id) + public function delete_basket(Request $request, Basket $basket) { - $repository = $this->app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - - $Basket = $repository->findUserBasket($this->app, $basket_id, $this->app['authentication']->getUser(), true); - $this->app['EM']->remove($Basket); + $this->app['EM']->remove($basket); $this->app['EM']->flush(); return $this->search_baskets($request); @@ -1317,23 +1312,17 @@ class API_V1_adapter extends API_V1_Abstract * Retrieve a basket * * @param Request $request - * @param int $basket_id + * @param Basket $basket * @return API_V1_result */ - public function get_basket(Request $request, $basket_id) + public function get_basket(Request $request, Basket $basket) { $result = new API_V1_result($this->app, $request, $this); - $repository = $this->app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - - $Basket = $repository->findUserBasket($this->app, $basket_id, $this->app['authentication']->getUser(), false); - $result->set_datas( array( - "basket" => $this->list_basket($Basket), - "basket_elements" => $this->list_basket_content($Basket) + "basket" => $this->list_basket($basket), + "basket_elements" => $this->list_basket_content($basket) ) ); @@ -1414,26 +1403,19 @@ class API_V1_adapter extends API_V1_Abstract * Change the name of one basket * * @param Request $request - * @param int $basket_id + * @param Basket $basket * @return API_V1_result */ - public function set_basket_title(Request $request, $basket_id) + public function set_basket_title(Request $request, Basket $basket) { $result = new API_V1_result($this->app, $request, $this); - $name = $request->get('name'); + $basket->setName($request->get('name')); - $repository = $this->app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - - $Basket = $repository->findUserBasket($this->app, $basket_id, $this->app['authentication']->getUser(), true); - $Basket->setName($name); - - $this->app['EM']->merge($Basket); + $this->app['EM']->persist($basket); $this->app['EM']->flush(); - $result->set_datas(array("basket" => $this->list_basket($Basket))); + $result->set_datas(array("basket" => $this->list_basket($basket))); return $result; } @@ -1442,26 +1424,19 @@ class API_V1_adapter extends API_V1_Abstract * Change the description of one basket * * @param Request $request - * @param type $basket_id + * @param Basket $basket * @return API_V1_result */ - public function set_basket_description(Request $request, $basket_id) + public function set_basket_description(Request $request, Basket $basket) { $result = new API_V1_result($this->app, $request, $this); - $desc = $request->get('description'); + $basket->setDescription($request->get('description')); - $repository = $this->app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - - $Basket = $repository->findUserBasket($this->app, $basket_id, $this->app['authentication']->getUser(), true); - $Basket->setDescription($desc); - - $this->app['EM']->merge($Basket); + $this->app['EM']->persist($basket); $this->app['EM']->flush(); - $result->set_datas(array("basket" => $this->list_basket($Basket))); + $result->set_datas(array("basket" => $this->list_basket($basket))); return $result; } diff --git a/lib/classes/eventsmanager/notify/orderdeliver.php b/lib/classes/eventsmanager/notify/orderdeliver.php index ca41782a65..c95636e67f 100644 --- a/lib/classes/eventsmanager/notify/orderdeliver.php +++ b/lib/classes/eventsmanager/notify/orderdeliver.php @@ -114,7 +114,7 @@ class eventsmanager_notify_orderdeliver extends eventsmanager_notifyAbstract if ($readyToSend) { $url = $this->app->url('lightbox_compare', array( - 'ssel_id' => $basket->getId(), + 'basket' => $basket->getId(), 'LOG' => $this->app['tokens']->getUrlToken( \random::TYPE_VIEW, $user_to->get_id(), @@ -159,9 +159,7 @@ class eventsmanager_notify_orderdeliver extends eventsmanager_notifyAbstract $sender = User_Adapter::getInstance($from, $this->app)->get_display_name(); try { - $repository = $this->app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - $basket = $repository->findUserBasket($this->app, $ssel_id, $this->app['authentication']->getUser(), false); + $basket = $this->app['converter.basket']->convert($ssel_id); } catch (Exception $e) { return array(); } diff --git a/lib/classes/eventsmanager/notify/validate.php b/lib/classes/eventsmanager/notify/validate.php index 491836d52f..6b499a809f 100644 --- a/lib/classes/eventsmanager/notify/validate.php +++ b/lib/classes/eventsmanager/notify/validate.php @@ -146,17 +146,14 @@ class eventsmanager_notify_validate extends eventsmanager_notifyAbstract $sender = User_Adapter::getInstance($from, $this->app)->get_display_name(); try { - $repository = $this->app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - $basket = $repository->findUserBasket($this->app, $ssel_id, $this->app['authentication']->getUser(), false); - + $basket = $this->app['converter.basket']->convert($ssel_id); $basket_name = trim($basket->getName()) ? : _('Une selection'); } catch (Exception $e) { $basket_name = _('Une selection'); } $bask_link = '' . $basket_name . ''; diff --git a/lib/classes/eventsmanager/notify/validationdone.php b/lib/classes/eventsmanager/notify/validationdone.php index 921e7570a7..f3cf41b933 100644 --- a/lib/classes/eventsmanager/notify/validationdone.php +++ b/lib/classes/eventsmanager/notify/validationdone.php @@ -140,9 +140,7 @@ class eventsmanager_notify_validationdone extends eventsmanager_notifyAbstract $sender = $registered_user->get_display_name(); try { - $repository = $this->app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - $basket = $repository->findUserBasket($this->app, $ssel_id, $this->app['authentication']->getUser(), false); + $basket = $this->app['converter.basket']->convert($ssel_id); } catch (Exception $e) { return array(); } diff --git a/lib/classes/eventsmanager/notify/validationreminder.php b/lib/classes/eventsmanager/notify/validationreminder.php index b8b898134f..2925583985 100644 --- a/lib/classes/eventsmanager/notify/validationreminder.php +++ b/lib/classes/eventsmanager/notify/validationreminder.php @@ -145,10 +145,7 @@ class eventsmanager_notify_validationreminder extends eventsmanager_notifyAbstra $sender = User_Adapter::getInstance($from, $this->app)->get_display_name(); try { - $repository = $this->app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - $basket = $repository->findUserBasket($this->app, $ssel_id, $this->app['authentication']->getUser(), false); - + $basket = $this->app['converter.basket']->convert($ssel_id); $basket_name = trim($basket->getName()) ? : _('Une selection'); } catch (Exception $e) { $basket_name = _('Une selection'); diff --git a/lib/classes/record/preview.php b/lib/classes/record/preview.php index c1d1ea392d..78c6404f28 100644 --- a/lib/classes/record/preview.php +++ b/lib/classes/record/preview.php @@ -144,10 +144,8 @@ class record_preview extends record_adapter break; case "BASK": - $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); - - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - $Basket = $repository->findUserBasket($app, $contId, $app['authentication']->getUser(), false); + $Basket = $app['converter.basket']->convert($contId); + $app['acl.basket']->hasAccess($Basket, $app['authentication']->getUser()); /* @var $Basket Basket */ $this->container = $Basket; diff --git a/lib/classes/set/export.php b/lib/classes/set/export.php index 2cba27ab0e..43d4791cf6 100644 --- a/lib/classes/set/export.php +++ b/lib/classes/set/export.php @@ -58,10 +58,9 @@ class set_export extends set_abstract } if ($sstid != "") { - $repository = $app['EM']->getRepository('Alchemy\Phrasea\Model\Entities\Basket'); + $Basket = $app['converter.basket']->convert($sstid); + $app['acl.basket']->hasAccess($Basket, $app['authentication']->getUser()); - /* @var $repository Alchemy\Phrasea\Model\Repositories\BasketRepository */ - $Basket = $repository->findUserBasket($this->app, $sstid, $app['authentication']->getUser(), false); $this->exportName = str_replace(array(' ', '\\', '/'), '_', $Basket->getName()) . "_" . date("Y-n-d"); foreach ($Basket->getElements() as $basket_element) { diff --git a/templates/mobile/lightbox/basket_element.html.twig b/templates/mobile/lightbox/basket_element.html.twig index 683d9177c8..f98d193a67 100644 --- a/templates/mobile/lightbox/basket_element.html.twig +++ b/templates/mobile/lightbox/basket_element.html.twig @@ -29,7 +29,7 @@ {% set record = basket_element.getRecord(app) %}
{{ basket.getDescription() }}
{{ basket_length }} @@ -123,7 +123,7 @@ {% if basket.getElements().first() %}{{ basket.getDescription() }}
{{basket_length}} diff --git a/templates/web/prod/Baskets/Reorder.html.twig b/templates/web/prod/Baskets/Reorder.html.twig index 38755b3287..fcb8797b86 100644 --- a/templates/web/prod/Baskets/Reorder.html.twig +++ b/templates/web/prod/Baskets/Reorder.html.twig @@ -9,7 +9,7 @@ -