znt/module/group/zen.php

356 lines
14 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
/**
* The zen file of group module of ZenTaoPMS.
*
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Shujie Tian <tianshujie@easycorp.ltd>
* @package group
* @link https://www.zentao.net
*/
class groupZen extends group
{
/**
* 有些权限在resource里添加了但没有在packagemanager里同步更新需要追加上
* Append packages in resource.
*
* @access public
* @return void
*/
public function appendResourcePackages()
{
$allPrivs = array();
foreach($this->config->group->package as $packageCode => $package)
{
if(empty($package->privs)) continue;
foreach($package->privs as $privCode => $priv)
{
$allPrivs[$privCode] = $privCode;
}
}
/* Privs in resource but not in package. */
foreach($this->lang->resource as $module => $methodList)
{
if(!$methodList) continue;
foreach($methodList as $method => $methodLang)
{
if(isset($allPrivs[$module . '-' . $method])) continue;
/* Create subset. */
if(!isset($this->config->group->subset->$module))
{
$this->config->group->subset->$module = new stdclass();
$this->config->group->subset->$module->order = 10000;
$this->config->group->subset->$module->nav = $module;
}
/* Create subset. */
$methodPackage = array('create' => 'manage', 'batchcreate' => 'manage', 'browse' => 'browse', 'view' => 'browse', 'delete' => 'delete', 'batchdelete' => 'delete', 'edit' => 'manage', 'batchedit' => 'manage');
$packageName = isset($methodPackage[$method]) ? $methodPackage[$method] : 'other';
$packageCode = $module . $packageName;
if(!isset($this->config->group->package->$packageCode))
{
$this->config->group->package->$packageCode = new stdclass();
$this->config->group->package->$packageCode->order = 5;
$this->config->group->package->$packageCode->subset = $module;
$this->config->group->package->$packageCode->privs = array();
$this->lang->group->package->$packageCode = $this->lang->group->package->$packageName;
}
$this->appendWorkflowMenu($packageCode, $module, $method);
}
}
}
/**
* 工作流列表页面的菜单也需要拆分不同的权限,比如全部、未关闭、已完成
* Append priv to package of workflow browse menu.
*
* @param string $packageCode
* @param string $module
* @param string $method
* @access protected
* @return mixed
*/
protected function appendWorkflowMenu(string $packageCode, string $module, string $method)
{
/* Browse action in workflow. */
if(isset($this->lang->$module->menus) && $method == 'browse')
{
$this->config->group->package->$packageCode->privs["$module-$method"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 5, 'depend' => array(), 'recommend' => array());
foreach($this->lang->$module->menus as $flowMethod => $flowName)
{
$this->config->group->package->$packageCode->privs["$module-$flowMethod"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 5, 'depend' => array("$module-$method"), 'recommend' => array());
}
}
else
{
$this->config->group->package->$packageCode->privs["$module-$method"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 5, 'depend' => array(), 'recommend' => array());
}
}
/**
* 分组权限管理。
* Manage priv by package or group.
*
* @param int $groupID
* @param string $nav
* @param string $version
* @access public
* @return void
*/
protected function managePrivByGroup(int $groupID = 0, string $nav = '', string $version = ''): void
{
$this->group->sortResource();
$group = $this->group->getById($groupID);
$groupPrivs = $this->group->getPrivs($groupID);
$versionPrivs = $this->group->getPrivsAfterVersion($version);
/* Subsets . */
$subsets = array();
foreach($this->config->group->subset as $subsetName => $subset)
{
$subset->code = $subsetName;
$subset->allCount = 0;
$subset->selectCount = 0;
$subsets[$subset->code] = $subset;
}
$selectPrivs = $this->group->getPrivsByGroup($groupID);
$allPrivList = $this->group->getPrivsByNav($nav, $version);
$selectedPrivList = array();
$packages = array();
foreach($allPrivList as $privCode => $priv)
{
$subsetCode = $priv->subset;
$packageCode = $priv->package;
if(!isset($packages[$subsetCode])) $packages[$subsetCode] = array();
if(!isset($subsets[$subsetCode]))
{
$subset = new stdclass();
$subset->code = $subsetCode;
$subset->allCount = 0;
$subset->selectCount = 0;
$subsets[$subsetCode] = $subset;
}
if(!isset($packages[$subsetCode][$packageCode]))
{
$package = new stdclass();
$package->allCount = 0;
$package->selectCount = 0;
$package->subset = $subsetCode;
$package->privs = array();
$packages[$subsetCode][$packageCode] = $package;
}
$packages[$subsetCode][$packageCode]->privs[$privCode] = $priv;
$packages[$subsetCode][$packageCode]->allCount ++;
$subsets[$subsetCode]->allCount ++;
if(isset($selectPrivs[$privCode]))
{
$packages[$subsetCode][$packageCode]->selectCount ++;
$subsets[$subsetCode]->selectCount ++;
$selectedPrivList[] = $privCode;
}
}
$allPrivList = array_keys($allPrivList);
$relatedPrivData = $this->group->getRelatedPrivs($allPrivList, $selectedPrivList);
$this->view->title = $this->lang->company->common . $this->lang->hyphen . $group->name . $this->lang->hyphen . $this->lang->group->managePriv;
$this->view->allPrivList = $allPrivList;
$this->view->selectedPrivList = $selectedPrivList;
$this->view->relatedPrivData = $relatedPrivData;
$this->view->group = $group;
$this->view->groupPrivs = $groupPrivs;
$this->view->groupID = $groupID;
$this->view->nav = $nav;
$this->view->version = $version;
$this->view->subsets = $subsets;
$this->view->packages = $packages;
}
/**
* 模块权限管理。
* Manage priv by module.
*
* @access public
* @return void
*/
protected function managePrivByModule()
{
$this->group->loadResourceLang();
$subsets = array();
$packages = array();
$privs = array();
/* Subsets in package. */
$this->app->loadLang('story');
foreach($this->config->group->package as $packageCode => $packageData)
{
if(!isset($packageData->privs)) continue;
foreach($packageData->privs as $privCode => $priv)
{
list($moduleName, $methodName) = explode('-', $privCode);
if(strpos(',' . $priv['edition'] . ',', ',' . $this->config->edition . ',') === false) continue;
if(strpos(',' . $priv['vision'] . ',', ',' . $this->config->vision . ',') === false) continue;
/* Remove privs unused in the edition. */
if(!isset($this->lang->resource->$moduleName) || !isset($this->lang->resource->$moduleName->$methodName)) continue;
$subset = $packageData->subset;
if(!isset($subsets[$subset]))
{
$subsets[$subset] = isset($this->lang->$subset) && isset($this->lang->$subset->common) ? $this->lang->$subset->common : $subset;
$packages[$subset] = array();
}
$packages[$subset][$packageCode] = isset($this->lang->group->package->$packageCode) ? $this->lang->group->package->$packageCode : $packageCode;
$privs[$privCode] = $privCode;
}
}
$this->view->title = $this->lang->company->common . $this->lang->hyphen . $this->lang->group->managePriv;
$this->view->groups = $this->group->getPairs();
$this->view->subsets = $subsets;
$this->view->packages = $packages;
$this->view->privs = $this->group->getPrivsByParents(key($subsets));
}
/**
* 构造视野维护的表单。
* Build update view form.
*
* @access protected
* @return array
*/
protected function buildUpdateViewForm()
{
$formData = array();
$actions = $this->post->actions;
$formData['views'] = isset($actions['views']) ? array_filter($actions['views']) : array();
$formData['programs'] = isset($actions['programs']) ? array_filter($actions['programs']) : array();
$formData['projects'] = isset($actions['projects']) ? array_filter($actions['projects']) : array();
$formData['products'] = isset($actions['products']) ? array_filter($actions['products']) : array();
$formData['sprints'] = isset($actions['sprints']) ? array_filter($actions['sprints']) : array();
$formData['actions'] = isset($actions['actions']) ? array_filter($actions['actions']) : array();
$formData['actionallchecker'] = isset($_POST['actionallchecker']);
return $formData;
}
/**
* 构造项目管理员的表单。
* Build project admin form.
*
* @access protected
* @return array
*/
protected function buildProjectAdminForm()
{
$members = $this->post->members ? $this->post->members : array();
$programs = $this->post->program ? $this->post->program : array();
$projects = $this->post->project ? $this->post->project : array();
$products = $this->post->product ? $this->post->product : array();
$executions = $this->post->execution ? $this->post->execution : array();
$programAll = $this->post->programAll ? $this->post->programAll : '';
$projectAll = $this->post->projectAll ? $this->post->projectAll : '';
$productAll = $this->post->productAll ? $this->post->productAll : '';
$executionAll = $this->post->executionAll ? $this->post->executionAll : '';
$formData = array();
foreach($members as $lineID => $accounts)
{
if(empty($accounts)) continue;
$formData[$lineID] = array();
$programs[$lineID] = isset($programs[$lineID]) ? $programs[$lineID] : array();
$projects[$lineID] = isset($projects[$lineID]) ? $projects[$lineID] : array();
$products[$lineID] = isset($products[$lineID]) ? $products[$lineID] : array();
$executions[$lineID] = isset($executions[$lineID]) ? $executions[$lineID] : array();
$formData[$lineID]['program'] = isset($programAll[$lineID]) ? array('all') : $programs[$lineID];
$formData[$lineID]['project'] = isset($projectAll[$lineID]) ? array('all') : $projects[$lineID];
$formData[$lineID]['product'] = isset($productAll[$lineID]) ? array('all') : $products[$lineID];
$formData[$lineID]['execution'] = isset($executionAll[$lineID]) ? array('all') : $executions[$lineID];
$formData[$lineID]['accounts'] = $accounts;
}
return $formData;
}
/**
* 获取Nav分组。
* Get nav group.
*
* @access public
* @return array
*/
public function getNavGroup()
{
$navGroup = array();
foreach($this->lang->navGroup as $moduleName => $groupName)
{
if($groupName == $moduleName) continue;
if($moduleName == 'testcase') $moduleName = 'case';
$navGroup[$groupName][$moduleName] = $moduleName;
}
return $navGroup;
}
/**
* 设置DevOps 在Compose 版本中的权限。
* Set DevOps priv in compose.
*
* @access public
* @return void
*/
public function setDevOpsPrivInCompose()
{
$privList = $this->config->group->setComposeDevOpsPriv;
$subsets = array_keys($privList);
$allPrivs = $this->config->group->package;
$servers = $this->loadModel('pipeline')->getList('');
$servers = array_column($servers, 'type');
foreach($allPrivs as $packageCode => $package)
{
$subset = $package->subset;
if(!in_array($subset, $subsets)) continue;
if(!empty($privList[$subset]['exclude']))
{
$excludeServer = explode(',', $privList[$subset]['exclude']);
if(array_intersect($servers, $excludeServer)) continue;
}
$hidePrivs = explode(',', $privList[$subset]['priv']);
foreach($hidePrivs as $priv)
{
if(empty($package->privs[$priv])) continue;
unset($this->config->group->package->{$packageCode}->privs[$priv]);
}
}
}
}