diff --git a/VERSIONS_HOTLINE/31595 b/VERSIONS_HOTLINE/31595 new file mode 100644 index 0000000000000000000000000000000000000000..e1e306fc3f01e790071d174a6d890dfe5060ae07 --- /dev/null +++ b/VERSIONS_HOTLINE/31595 @@ -0,0 +1 @@ + - ticket #31595 : Permissions sur les articles : correction maintien du droit de l'utilisateur après suppression de l'accès articles sur le groupe \ No newline at end of file diff --git a/library/Class/Permission.php b/library/Class/Permission.php index e23bd7d61a0f961f1bbc2547f2e037e63a2afab6..2eb4ec7e310909893d47e59a4123025a8ae2ab11 100644 --- a/library/Class/Permission.php +++ b/library/Class/Permission.php @@ -105,6 +105,12 @@ class PermissionLoader extends Storm_Model_Loader { 0, strlen(static::DYNAMIC_PREFIX))) $permission->delete(); } + + + public function denyAllCmsTo($group) { + Class_UserGroup_Permission::denyAllToGroup(Class_Permission::getCmsPermissions(), + $group); + } } diff --git a/library/Class/UserGroup.php b/library/Class/UserGroup.php index ee0c21dc52b75abcb2081ff0daaa8267b0a52780..0b2d10b48499cc6778f4e265da1b726d58fea345 100644 --- a/library/Class/UserGroup.php +++ b/library/Class/UserGroup.php @@ -492,6 +492,12 @@ class Class_UserGroup extends Storm_Model_Abstract { return true; return false; } + + + public function afterSave() { + if (!$this->hasRight(static::RIGHT_USER_ACCES_ARTICLES)) + Class_Permission::denyAllCmsTo($this); + } } ?> \ No newline at end of file diff --git a/library/Class/UserGroup/Permission.php b/library/Class/UserGroup/Permission.php index 5a9060ac531515b0291c9e417b33f420c42b2b15..a9628c4c49f495f85e0e20ff655dfcd1fe5262bf 100644 --- a/library/Class/UserGroup/Permission.php +++ b/library/Class/UserGroup/Permission.php @@ -91,6 +91,19 @@ class UserGroup_PermissionLoader extends Storm_Model_Loader { Class_UserGroup_Permission::deleteBy($params); } + + + public function denyAllToGroup($permissions, $group) { + if (!$permissions || !$group) + return; + + $ids = []; + foreach ($permissions as $permission) + $ids[] = $permission->getId(); + + Class_UserGroup_Permission::deleteBy(['id_permission' => $ids, + 'id_group' => $group->getId()]); + } } diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php index 98aa5fe49aeaf47aefe53d7f02cb45ff640e1505..d41c4be3ae52932e19d0ac81e8eb82f664163e59 100644 --- a/tests/application/modules/admin/controllers/CmsControllerTest.php +++ b/tests/application/modules/admin/controllers/CmsControllerTest.php @@ -34,16 +34,19 @@ abstract class CmsControllerTestCase extends Admin_AbstractControllerTestCase { $_cat_a_la_une, $_cat_atelier; + protected $_storm_default_to_volatile = true; + public function setUp() { parent::setUp(); $_SERVER['SCRIPT_NAME'] = ''; - Storm_Model_Loader::defaultToVolatile(); $this->setupBib(); - $this->_group_testing = $this->fixture('Class_UserGroup', ['id' => 22, - 'libelle' => 'Testing group']); + $this->_group_testing = $this->fixture('Class_UserGroup', + ['id' => 22, + 'libelle' => 'Testing group', + 'rights' => [Class_UserGroup::RIGHT_USER_ACCES_ARTICLES]]); $this->_group_admin = $this->fixture('Class_UserGroup', ['id' => 24, @@ -90,12 +93,6 @@ abstract class CmsControllerTestCase extends Admin_AbstractControllerTestCase { } - public function tearDown() { - Storm_Model_Loader::defaultToDb(); - parent::tearDown(); - } - - public function setupLieux() { $this->lieu_bonlieu = $this->fixture('Class_Lieu', ['id' => 3, 'libelle' => 'Bonlieu', @@ -1704,14 +1701,14 @@ class CmsControllerNewsAddActionPostWithWorkflowTest /** @test */ public function newArticleSavedWithStatusAValiderShouldSendDeduplicatedMails() { + $this->_group_testing->addUser($this->_laurent)->save(); + Class_Permission::validateArticle() + ->permitTo($this->_group_testing, $this->_cat_a_la_une); + $data = $this->_basePostDatas; $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; + $this->postDispatch('/admin/cms/add/id_cat/23', $data); - $this->_group_testing->addUser($this->_laurent)->save(); - Class_Permission::validateArticle()->permitTo($this->_group_testing, - $this->_cat_a_la_une); - $this->postDispatch('/admin/cms/add/id_cat/23', - $data); $this->assertEquals(['<laurent@afi-sa.fr>', '<bernard@afi-sa.fr>', '<admin@afi-sa.fr>', 'append' => true], $this->mock_transport->getSentMails()[0]->getHeaders()['To']); } diff --git a/tests/application/modules/admin/controllers/UserGroupControllerTest.php b/tests/application/modules/admin/controllers/UserGroupControllerTest.php index d7087d8a9ea70cf4b78bb8d9f200161e7fe71702..9dbfbc3b73d83d308030f58b3de4c0c99b51a49e 100644 --- a/tests/application/modules/admin/controllers/UserGroupControllerTest.php +++ b/tests/application/modules/admin/controllers/UserGroupControllerTest.php @@ -30,15 +30,10 @@ abstract class Admin_UserGroupControllerTestCase extends Admin_AbstractControlle $_group_moderateurs, $_group_subscribers; - public function tearDown() { - Storm_Model_Loader::defaultToDb(); - parent::tearDown(); - } - + protected $_storm_default_to_volatile = true; public function setUp() { parent::setUp(); - Storm_Model_Loader::defaultToVolatile(); $this->fixture('Class_AdminVar', ['id' => 'FORMATIONS', 'valeur' => '1']); @@ -148,6 +143,63 @@ abstract class Admin_UserGroupControllerTestCase extends Admin_AbstractControlle +class Admin_UserGroupControllerCmsPermissionsRevokeTest extends Admin_UserGroupControllerTestCase { + public function setUp() { + parent::setUp(); + + $this->_group_search + ->addRight(Class_UserGroup::RIGHT_USER_ACCES_ARTICLES) + ->save(); + + $this->enableCmsPermissions(); + Class_Permission::createArticleCategory() + ->permitTo($this->_group_search, $this->fixture('Class_ArticleCategorie', + ['id' => 234, + 'libelle' => 'Testing Category'])); + + $this->postDispatch('admin/usergroup/edit/id/' . $this->_group_search->getId(), + ['libelle' => 'Chercheurs', + 'rights' => []]); + } + + + /** @test */ + public function rightShouldHaveBeenRevoked() { + $this->assertFalse($this->_user_group->hasRight(Class_UserGroup::RIGHT_USER_ACCES_ARTICLES)); + } + + + /** @test */ + public function cmsPermissionShouldHaveBeenRevoked() { + $this->assertFalse($this->_group_search + ->hasPermissionOn(Class_Permission::createArticleCategory(), + Class_ArticleCategorie::find(234))); + } + + + + protected function enableCmsPermissions() { + $cnt = 1; + foreach ([['CATEGORY', 'ARTICLE', 'Sur la catégorie', 1, 'Créer des sous-catégories'], + ['ARTICLE', 'ARTICLE', 'Sur la catégorie', 2, 'Créer des articles'], + ['PENDING', 'ARTICLE', 'Nouveaux statuts autorisés', 1, 'À valider'], + ['VALIDATED', 'ARTICLE', 'Nouveaux statuts autorisés', 101, 'Validé'], + ['REFUSED', 'ARTICLE', 'Nouveaux statuts autorisés', 102, 'Refusé'], + ['ARCHIVED', 'ARTICLE', 'Nouveaux statuts autorisés', 103, 'Archivé']] as $permission) { + $this->fixture('Class_Permission', + ['id' => $cnt++, + 'code' => $permission[0], + 'module' => $permission[1], + 'type' => $permission[2], + 'sorting' => $permission[3], + 'description' => $permission[4]]); + } + + return $this; + } +} + + class Admin_UserGroupControllerListTest extends Admin_UserGroupControllerTestCase { protected $_json;