From 5945b3a094f3ab0c491dbfa4b56aa9f158921e2a Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Fri, 23 Oct 2020 16:21:13 +0200
Subject: [PATCH] FEAT #14214 TIME 1:20 Lock advanced privileges

---
 apps/maarch_entreprise/xml/config.json.default    |  3 ++-
 src/app/group/controllers/GroupController.php     | 14 ++++++++------
 src/app/group/controllers/PrivilegeController.php | 15 +++++++++++++++
 .../controllers/VersionUpdateController.php       |  4 ++--
 src/core/controllers/InstallerController.php      | 12 ++++++------
 5 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/apps/maarch_entreprise/xml/config.json.default b/apps/maarch_entreprise/xml/config.json.default
index fadf2e03c50..a9a3cb28953 100644
--- a/apps/maarch_entreprise/xml/config.json.default
+++ b/apps/maarch_entreprise/xml/config.json.default
@@ -6,7 +6,8 @@
         "timezone": "Europe/Paris",
         "maarchDirectory" : "/var/www/html/MaarchCourrier/",
         "customID" : "",
-        "maarchUrl" : "http://preview.maarchcourrier.com/"
+        "maarchUrl" : "http://preview.maarchcourrier.com/",
+        "lockAdvancedPrivileges" : false
     },
     "database": [
         {
diff --git a/src/app/group/controllers/GroupController.php b/src/app/group/controllers/GroupController.php
index 9f8942c18d2..c8e380c0c5a 100755
--- a/src/app/group/controllers/GroupController.php
+++ b/src/app/group/controllers/GroupController.php
@@ -11,6 +11,7 @@ use Respect\Validation\Validator;
 use Slim\Http\Request;
 use Slim\Http\Response;
 use SrcCore\controllers\PreparedClauseController;
+use SrcCore\models\CoreConfigModel;
 use SrcCore\models\ValidatorModel;
 use User\controllers\UserController;
 use User\models\UserEntityModel;
@@ -154,12 +155,13 @@ class GroupController
             return $response->withStatus(400)->withJson(['errors' => 'Group not found']);
         }
 
-        $group['security']          = GroupModel::getSecurityByGroupId(['groupId' => $group['group_id']]);
-        $group['users']             = GroupModel::getUsersById(['id' => $args['id'], 'select' => ['users.id', 'users.user_id', 'users.firstname', 'users.lastname', 'users.status']]);
-        $group['baskets']           = GroupBasketModel::getBasketsByGroupId(['select' => ['baskets.basket_id', 'baskets.basket_name', 'baskets.basket_desc'], 'groupId' => $group['group_id']]);
-        $group['canAdminUsers']     = PrivilegeController::hasPrivilege(['privilegeId' => 'admin_users', 'userId' => $GLOBALS['id']]);
-        $group['canAdminBaskets']   = PrivilegeController::hasPrivilege(['privilegeId' => 'admin_baskets', 'userId' => $GLOBALS['id']]);
-        $group['privileges']        = PrivilegeModel::getPrivilegesByGroupId(['groupId' => $args['id']]);
+        $group['security']                  = GroupModel::getSecurityByGroupId(['groupId' => $group['group_id']]);
+        $group['users']                     = GroupModel::getUsersById(['id' => $args['id'], 'select' => ['users.id', 'users.user_id', 'users.firstname', 'users.lastname', 'users.status']]);
+        $group['baskets']                   = GroupBasketModel::getBasketsByGroupId(['select' => ['baskets.basket_id', 'baskets.basket_name', 'baskets.basket_desc'], 'groupId' => $group['group_id']]);
+        $group['canAdminUsers']             = PrivilegeController::hasPrivilege(['privilegeId' => 'admin_users', 'userId' => $GLOBALS['id']]);
+        $group['canAdminBaskets']           = PrivilegeController::hasPrivilege(['privilegeId' => 'admin_baskets', 'userId' => $GLOBALS['id']]);
+        $group['privileges']                = PrivilegeModel::getPrivilegesByGroupId(['groupId' => $args['id']]);
+        $group['lockAdvancedPrivileges']    = PrivilegeController::isAdvancedPrivilegesLocked();
 
         $allowedUsers = [];
         $isRoot = UserController::isRoot(['id' => $GLOBALS['id']]);
diff --git a/src/app/group/controllers/PrivilegeController.php b/src/app/group/controllers/PrivilegeController.php
index a41fa333250..e4595b8a94e 100644
--- a/src/app/group/controllers/PrivilegeController.php
+++ b/src/app/group/controllers/PrivilegeController.php
@@ -14,6 +14,7 @@ use SignatureBook\controllers\SignatureBookController;
 use Slim\Http\Request;
 use Slim\Http\Response;
 use SrcCore\controllers\PreparedClauseController;
+use SrcCore\models\CoreConfigModel;
 use SrcCore\models\DatabaseModel;
 use SrcCore\models\ValidatorModel;
 use User\controllers\UserController;
@@ -35,6 +36,13 @@ class PrivilegeController
             return $response->withStatus(400)->withJson(['errors' => 'Route privilegeId is empty or not an integer']);
         }
 
+        if (in_array($args['privilegeId'], ['create_custom', 'admin_update_control'])) {
+            $config = CoreConfigModel::getJsonLoaded(['path' => 'apps/maarch_entreprise/xml/config.json']);
+            if (!empty($config['config']['lockAdvancedPrivileges'])) {
+                return $response->withStatus(403)->withJson(['errors' => 'Privilege forbidden']);
+            }
+        }
+
         $group = GroupModel::getById(['id' => $args['id']]);
         if (empty($group)) {
             return $response->withStatus(400)->withJson(['errors' => 'Group not found']);
@@ -344,4 +352,11 @@ class PrivilegeController
 
         return true;
     }
+
+    public static function isAdvancedPrivilegesLocked()
+    {
+        $file = CoreConfigModel::getJsonLoaded(['path' => 'apps/maarch_entreprise/xml/config.json']);
+
+        return !empty($file['config']['lockAdvancedPrivileges']);
+    }
 }
diff --git a/src/app/versionUpdate/controllers/VersionUpdateController.php b/src/app/versionUpdate/controllers/VersionUpdateController.php
index 33b0b46f4a4..7122844d351 100755
--- a/src/app/versionUpdate/controllers/VersionUpdateController.php
+++ b/src/app/versionUpdate/controllers/VersionUpdateController.php
@@ -29,7 +29,7 @@ class VersionUpdateController
 {
     public function get(Request $request, Response $response)
     {
-        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_update_control', 'userId' => $GLOBALS['id']])) {
+        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_update_control', 'userId' => $GLOBALS['id']]) || PrivilegeController::isAdvancedPrivilegesLocked()) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
 
@@ -110,7 +110,7 @@ class VersionUpdateController
     */
     public function update(Request $request, Response $response)
     {
-        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_update_control', 'userId' => $GLOBALS['id']])) {
+        if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_update_control', 'userId' => $GLOBALS['id']]) || PrivilegeController::isAdvancedPrivilegesLocked()) {
             return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
         }
 
diff --git a/src/core/controllers/InstallerController.php b/src/core/controllers/InstallerController.php
index d2dc17ee9f1..55fd30af044 100644
--- a/src/core/controllers/InstallerController.php
+++ b/src/core/controllers/InstallerController.php
@@ -272,7 +272,7 @@ class InstallerController
 
     public function createCustom(Request $request, Response $response)
     {
-        if (!empty($GLOBALS['id']) && !PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']])) {
+        if (!empty($GLOBALS['id']) && (!PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']]) || PrivilegeController::isAdvancedPrivilegesLocked())) {
             return $response->withStatus(403)->withJson(['errors' => 'Route forbidden']);
         }
 
@@ -332,7 +332,7 @@ class InstallerController
 
     public function createDatabase(Request $request, Response $response)
     {
-        if (!empty($GLOBALS['id']) && !PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']])) {
+        if (!empty($GLOBALS['id']) && (!PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']]) || PrivilegeController::isAdvancedPrivilegesLocked())) {
             return $response->withStatus(403)->withJson(['errors' => 'Route forbidden']);
         }
 
@@ -433,7 +433,7 @@ class InstallerController
 
     public function createDocservers(Request $request, Response $response)
     {
-        if (!empty($GLOBALS['id']) && !PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']])) {
+        if (!empty($GLOBALS['id']) && (!PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']]) || PrivilegeController::isAdvancedPrivilegesLocked())) {
             return $response->withStatus(403)->withJson(['errors' => 'Route forbidden']);
         }
 
@@ -518,7 +518,7 @@ class InstallerController
 
     public function createCustomization(Request $request, Response $response)
     {
-        if (!empty($GLOBALS['id']) && !PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']])) {
+        if (!empty($GLOBALS['id']) && (!PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']]) || PrivilegeController::isAdvancedPrivilegesLocked())) {
             return $response->withStatus(403)->withJson(['errors' => 'Route forbidden']);
         }
 
@@ -595,7 +595,7 @@ class InstallerController
 
     public function updateAdministrator(Request $request, Response $response)
     {
-        if (!empty($GLOBALS['id']) && !PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']])) {
+        if (!empty($GLOBALS['id']) && (!PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']]) || PrivilegeController::isAdvancedPrivilegesLocked())) {
             return $response->withStatus(403)->withJson(['errors' => 'Route forbidden']);
         }
 
@@ -662,7 +662,7 @@ class InstallerController
 
     public function terminateInstaller(Request $request, Response $response)
     {
-        if (!empty($GLOBALS['id']) && !PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']])) {
+        if (!empty($GLOBALS['id']) && (!PrivilegeController::hasPrivilege(['privilegeId' => 'create_custom', 'userId' => $GLOBALS['id']]) || PrivilegeController::isAdvancedPrivilegesLocked())) {
             return $response->withStatus(403)->withJson(['errors' => 'Route forbidden']);
         }
 
-- 
GitLab