From 0cc3ea432e24994c811e4895c5a2dee7b916c0b9 Mon Sep 17 00:00:00 2001 From: zhujinyong Date: Wed, 27 Sep 2023 16:18:07 +0800 Subject: [PATCH] * Fix bug#39017. --- module/group/model.php | 34 +++++++++++++++++++++++++++++++++ module/group/packagemanager.php | 32 +++++++++++++++---------------- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/module/group/model.php b/module/group/model.php index 8d35b8254c..0938ef62f7 100644 --- a/module/group/model.php +++ b/module/group/model.php @@ -2362,6 +2362,34 @@ class groupModel extends model } } + /** + * Process circular dependency. + * + * @param array $depends + * @param array $privs + * @access protected + * @return array + */ + protected function processDepends($depends, $privs) + { + foreach($privs as $priv) + { + if(!isset($depends[$priv])) continue; + + foreach($depends[$priv] as $dependPriv) + { + if(isset($privs[$dependPriv])) continue; + $privs[$dependPriv] = $dependPriv; + + $dependPrivs = $this->processDepends($depends, $depends[$dependPriv]); + + foreach($dependPrivs as $depend) $privs[$depend] = $depend; + } + } + + return $privs; + } + /** * Get related privs. * @@ -2375,6 +2403,8 @@ class groupModel extends model { $this->loadResourceLang(); + $depends = array(); + $privSubsets = array(); $relatedPrivs = array('depend' => array(), 'recommend' => array()); foreach($this->config->group->package as $packagePage => $package) @@ -2387,6 +2417,7 @@ class groupModel extends model { /* Show related pirvs when select. */ if($type == 'recommend' && in_array($privCode, $recommendSelect)) $relatedPrivs[$type][$privCode] = $privCode; + if($type == 'depend') $depends[$privCode] = $priv['depend']; if(!in_array($privCode, $selectedPrivList) || !isset($priv[$type])) continue; @@ -2398,6 +2429,9 @@ class groupModel extends model } } + /* Process circular dependency. */ + $relatedPrivs['depend'] = $this->processDepends($depends, $relatedPrivs['depend']); + $subsetPrivs = array('depend' => array(), 'recommend' => array()); foreach(array('depend', 'recommend') as $type) { diff --git a/module/group/packagemanager.php b/module/group/packagemanager.php index 16ab54be31..5e221542fe 100644 --- a/module/group/packagemanager.php +++ b/module/group/packagemanager.php @@ -1481,7 +1481,7 @@ $config->group->package->holiday = new stdclass(); $config->group->package->holiday->order = 10; $config->group->package->holiday->subset = 'modelconfig'; $config->group->package->holiday->privs = array(); -$config->group->package->holiday->privs['holiday-browse'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 5, 'depend' => array(), 'recommend' => array()); +$config->group->package->holiday->privs['holiday-browse'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 5, 'depend' => array('admin-index'), 'recommend' => array()); $config->group->package->holiday->privs['holiday-create'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array('holiday-browse'), 'recommend' => array('holiday-delete', 'holiday-edit')); $config->group->package->holiday->privs['holiday-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 15, 'depend' => array('holiday-browse'), 'recommend' => array('holiday-create')); $config->group->package->holiday->privs['holiday-delete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd', 'order' => 20, 'depend' => array('holiday-browse'), 'recommend' => array('holiday-create', 'holiday-edit')); @@ -2649,9 +2649,9 @@ $config->group->package->mail = new stdclass(); $config->group->package->mail->order = 10; $config->group->package->mail->subset = 'notifysetting'; $config->group->package->mail->privs = array(); -$config->group->package->mail->privs['mail-index'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 0, 'depend' => array(), 'recommend' => array()); -$config->group->package->mail->privs['mail-detect'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 5, 'depend' => array(), 'recommend' => array()); -$config->group->package->mail->privs['mail-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 1, 'depend' => array('message-index'), 'recommend' => array()); +$config->group->package->mail->privs['mail-detect'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 5, 'depend' => array('admin-index'), 'recommend' => array()); +$config->group->package->mail->privs['mail-index'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 0, 'depend' => array('mail-detect'), 'recommend' => array()); +$config->group->package->mail->privs['mail-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 1, 'depend' => array('mail-detect', 'message-index'), 'recommend' => array()); $config->group->package->mail->privs['mail-save'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 3, 'depend' => array('mail-edit'), 'recommend' => array('mail-reset')); $config->group->package->mail->privs['mail-test'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 2, 'depend' => array('mail-edit'), 'recommend' => array()); $config->group->package->mail->privs['mail-reset'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 4, 'depend' => array('mail-edit'), 'recommend' => array('mail-save')); @@ -2728,7 +2728,7 @@ $config->group->package->backup = new stdclass(); $config->group->package->backup->order = 5; $config->group->package->backup->subset = 'admin'; $config->group->package->backup->privs = array(); -$config->group->package->backup->privs['backup-index'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 0, 'depend' => array(), 'recommend' => array()); +$config->group->package->backup->privs['backup-index'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 0, 'depend' => array('admin-index'), 'recommend' => array()); $config->group->package->backup->privs['backup-backup'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 2, 'depend' => array('backup-index'), 'recommend' => array()); $config->group->package->backup->privs['backup-restore'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 3, 'depend' => array('backup-index'), 'recommend' => array()); $config->group->package->backup->privs['backup-delete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'lite,rnd,or', 'order' => 4, 'depend' => array('backup-index'), 'recommend' => array()); @@ -2740,7 +2740,7 @@ $config->group->package->trash = new stdclass(); $config->group->package->trash->order = 15; $config->group->package->trash->subset = 'systemsetting'; $config->group->package->trash->privs = array(); -$config->group->package->trash->privs['action-trash'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 0, 'depend' => array(), 'recommend' => array()); +$config->group->package->trash->privs['action-trash'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 0, 'depend' => array('admin-index'), 'recommend' => array()); $config->group->package->trash->privs['action-undelete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 1, 'depend' => array('action-trash'), 'recommend' => array()); $config->group->package->trash->privs['action-hideOne'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 2, 'depend' => array('action-trash'), 'recommend' => array()); @@ -2769,21 +2769,21 @@ $config->group->package->ldap->order = 30; $config->group->package->ldap->subset = 'systemsetting'; $config->group->package->ldap->privs = array(); $config->group->package->ldap->privs['user-importldap'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd,or', 'order' => 15, 'depend' => array('ldap-set'), 'recommend' => array()); -$config->group->package->ldap->privs['ldap-set'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array(), 'recommend' => array()); +$config->group->package->ldap->privs['ldap-set'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 10, 'depend' => array('admin-index'), 'recommend' => array()); $config->group->package->chat = new stdclass(); $config->group->package->chat->order = 35; $config->group->package->chat->subset = 'systemsetting'; $config->group->package->chat->privs = array(); -$config->group->package->chat->privs['admin-xuanxuan'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 8, 'depend' => array(), 'recommend' => array()); -$config->group->package->chat->privs['conference-admin'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 3, 'depend' => array(), 'recommend' => array()); -$config->group->package->chat->privs['setting-xuanxuan'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 0, 'depend' => array(), 'recommend' => array()); -$config->group->package->chat->privs['im-downloadXxdPackage'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 2, 'depend' => array(), 'recommend' => array()); -$config->group->package->chat->privs['im-debug'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 1, 'depend' => array(), 'recommend' => array()); -$config->group->package->chat->privs['client-browse'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 4, 'depend' => array(), 'recommend' => array()); -$config->group->package->chat->privs['client-create'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 5, 'depend' => array(), 'recommend' => array()); -$config->group->package->chat->privs['client-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 6, 'depend' => array(), 'recommend' => array()); -$config->group->package->chat->privs['client-delete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 7, 'depend' => array(), 'recommend' => array()); +$config->group->package->chat->privs['admin-xuanxuan'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 8, 'depend' => array('admin-index'), 'recommend' => array()); +$config->group->package->chat->privs['conference-admin'] = array('edition' => 'biz,max,ipd', 'vision' => 'rnd', 'order' => 3, 'depend' => array('admin-xuanxuan'), 'recommend' => array()); +$config->group->package->chat->privs['setting-xuanxuan'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 0, 'depend' => array('admin-xuanxuan'), 'recommend' => array()); +$config->group->package->chat->privs['im-downloadXxdPackage'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 2, 'depend' => array('admin-xuanxuan'), 'recommend' => array()); +$config->group->package->chat->privs['im-debug'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 1, 'depend' => array('admin-xuanxuan'), 'recommend' => array()); +$config->group->package->chat->privs['client-browse'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 4, 'depend' => array('admin-xuanxuan'), 'recommend' => array()); +$config->group->package->chat->privs['client-create'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 5, 'depend' => array('admin-xuanxuan'), 'recommend' => array()); +$config->group->package->chat->privs['client-edit'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 6, 'depend' => array('admin-xuanxuan'), 'recommend' => array()); +$config->group->package->chat->privs['client-delete'] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite', 'order' => 7, 'depend' => array('admin-xuanxuan'), 'recommend' => array()); $config->group->package->jenkins = new stdclass(); $config->group->package->jenkins->order = 25;