zen.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. <?php
  2. /**
  3. * The zen file of group module of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  6. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author Shujie Tian <tianshujie@easycorp.ltd>
  8. * @package group
  9. * @link https://www.zentao.net
  10. */
  11. class groupZen extends group
  12. {
  13. /**
  14. * 有些权限在resource里添加了,但没有在packagemanager里同步更新,需要追加上
  15. * Append packages in resource.
  16. *
  17. * @access public
  18. * @return void
  19. */
  20. public function appendResourcePackages()
  21. {
  22. $allPrivs = array();
  23. foreach($this->config->group->package as $packageCode => $package)
  24. {
  25. if(empty($package->privs)) continue;
  26. foreach($package->privs as $privCode => $priv)
  27. {
  28. $allPrivs[$privCode] = $privCode;
  29. }
  30. }
  31. /* Privs in resource but not in package. */
  32. foreach($this->lang->resource as $module => $methodList)
  33. {
  34. if(!$methodList) continue;
  35. foreach($methodList as $method => $methodLang)
  36. {
  37. if(isset($allPrivs[$module . '-' . $method])) continue;
  38. /* Create subset. */
  39. if(!isset($this->config->group->subset->$module))
  40. {
  41. $this->config->group->subset->$module = new stdclass();
  42. $this->config->group->subset->$module->order = 10000;
  43. $this->config->group->subset->$module->nav = $module;
  44. }
  45. /* Create subset. */
  46. $methodPackage = array('create' => 'manage', 'batchcreate' => 'manage', 'browse' => 'browse', 'view' => 'browse', 'delete' => 'delete', 'batchdelete' => 'delete', 'edit' => 'manage', 'batchedit' => 'manage');
  47. $packageName = isset($methodPackage[$method]) ? $methodPackage[$method] : 'other';
  48. $packageCode = $module . $packageName;
  49. if(!isset($this->config->group->package->$packageCode))
  50. {
  51. $this->config->group->package->$packageCode = new stdclass();
  52. $this->config->group->package->$packageCode->order = 5;
  53. $this->config->group->package->$packageCode->subset = $module;
  54. $this->config->group->package->$packageCode->privs = array();
  55. $this->lang->group->package->$packageCode = $this->lang->group->package->$packageName;
  56. }
  57. $this->appendWorkflowMenu($packageCode, $module, $method);
  58. }
  59. }
  60. }
  61. /**
  62. * 工作流列表页面的菜单也需要拆分不同的权限,比如全部、未关闭、已完成
  63. * Append priv to package of workflow browse menu.
  64. *
  65. * @param string $packageCode
  66. * @param string $module
  67. * @param string $method
  68. * @access protected
  69. * @return mixed
  70. */
  71. protected function appendWorkflowMenu($packageCode, $module, $method)
  72. {
  73. /* Browse action in workflow. */
  74. if(isset($this->lang->$module->menus) && $method == 'browse')
  75. {
  76. $this->config->group->package->$packageCode->privs["$module-$method"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 5, 'depend' => array(), 'recommend' => array());
  77. foreach($this->lang->$module->menus as $flowMethod => $flowName)
  78. {
  79. $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());
  80. }
  81. }
  82. else
  83. {
  84. $this->config->group->package->$packageCode->privs["$module-$method"] = array('edition' => 'open,biz,max,ipd', 'vision' => 'rnd,lite,or', 'order' => 5, 'depend' => array(), 'recommend' => array());
  85. }
  86. }
  87. /**
  88. * 分组权限管理。
  89. * Manage priv by package or group.
  90. *
  91. * @param int $groupID
  92. * @param string $nav
  93. * @param string $version
  94. * @access public
  95. * @return void
  96. */
  97. protected function managePrivByGroup($groupID = 0, $nav = '', $version = '')
  98. {
  99. $this->group->sortResource();
  100. $group = $this->group->getById($groupID);
  101. $groupPrivs = $this->group->getPrivs($groupID);
  102. $versionPrivs = $this->group->getPrivsAfterVersion($version);
  103. /* Subsets . */
  104. $subsets = array();
  105. foreach($this->config->group->subset as $subsetName => $subset)
  106. {
  107. $subset->code = $subsetName;
  108. $subset->allCount = 0;
  109. $subset->selectCount = 0;
  110. $subsets[$subset->code] = $subset;
  111. }
  112. $selectPrivs = $this->group->getPrivsByGroup($groupID);
  113. $allPrivList = $this->group->getPrivsByNav($nav, $version);
  114. $selectedPrivList = array();
  115. $packages = array();
  116. foreach($allPrivList as $privCode => $priv)
  117. {
  118. $subsetCode = $priv->subset;
  119. $packageCode = $priv->package;
  120. if(!isset($packages[$subsetCode])) $packages[$subsetCode] = array();
  121. if(!isset($subsets[$subsetCode]))
  122. {
  123. $subset = new stdclass();
  124. $subset->code = $subsetCode;
  125. $subset->allCount = 0;
  126. $subset->selectCount = 0;
  127. $subsets[$subsetCode] = $subset;
  128. }
  129. if(!isset($packages[$subsetCode][$packageCode]))
  130. {
  131. $package = new stdclass();
  132. $package->allCount = 0;
  133. $package->selectCount = 0;
  134. $package->subset = $subsetCode;
  135. $package->privs = array();
  136. $packages[$subsetCode][$packageCode] = $package;
  137. }
  138. $packages[$subsetCode][$packageCode]->privs[$privCode] = $priv;
  139. $packages[$subsetCode][$packageCode]->allCount ++;
  140. $subsets[$subsetCode]->allCount ++;
  141. if(isset($selectPrivs[$privCode]))
  142. {
  143. $packages[$subsetCode][$packageCode]->selectCount ++;
  144. $subsets[$subsetCode]->selectCount ++;
  145. $selectedPrivList[] = $privCode;
  146. }
  147. }
  148. $allPrivList = array_keys($allPrivList);
  149. $relatedPrivData = $this->group->getRelatedPrivs($allPrivList, $selectedPrivList);
  150. $this->view->title = $this->lang->company->common . $this->lang->hyphen . $group->name . $this->lang->hyphen . $this->lang->group->managePriv;
  151. $this->view->allPrivList = $allPrivList;
  152. $this->view->selectedPrivList = $selectedPrivList;
  153. $this->view->relatedPrivData = $relatedPrivData;
  154. $this->view->group = $group;
  155. $this->view->groupPrivs = $groupPrivs;
  156. $this->view->groupID = $groupID;
  157. $this->view->nav = $nav;
  158. $this->view->version = $version;
  159. $this->view->subsets = $subsets;
  160. $this->view->packages = $packages;
  161. }
  162. /**
  163. * 模块权限管理。
  164. * Manage priv by module.
  165. *
  166. * @access public
  167. * @return void
  168. */
  169. protected function managePrivByModule()
  170. {
  171. $this->group->loadResourceLang();
  172. $subsets = array();
  173. $packages = array();
  174. $privs = array();
  175. /* Subsets in package. */
  176. $this->app->loadLang('story');
  177. foreach($this->config->group->package as $packageCode => $packageData)
  178. {
  179. if(!isset($packageData->privs)) continue;
  180. foreach($packageData->privs as $privCode => $priv)
  181. {
  182. list($moduleName, $methodName) = explode('-', $privCode);
  183. if(strpos(',' . $priv['edition'] . ',', ',' . $this->config->edition . ',') === false) continue;
  184. if(strpos(',' . $priv['vision'] . ',', ',' . $this->config->vision . ',') === false) continue;
  185. /* Remove privs unused in the edition. */
  186. if(!isset($this->lang->resource->$moduleName) || !isset($this->lang->resource->$moduleName->$methodName)) continue;
  187. $subset = $packageData->subset;
  188. if(!isset($subsets[$subset]))
  189. {
  190. $subsets[$subset] = isset($this->lang->$subset) && isset($this->lang->$subset->common) ? $this->lang->$subset->common : $subset;
  191. $packages[$subset] = array();
  192. }
  193. $packages[$subset][$packageCode] = isset($this->lang->group->package->$packageCode) ? $this->lang->group->package->$packageCode : $packageCode;
  194. $privs[$privCode] = $privCode;
  195. }
  196. }
  197. $this->view->title = $this->lang->company->common . $this->lang->hyphen . $this->lang->group->managePriv;
  198. $this->view->groups = $this->group->getPairs();
  199. $this->view->subsets = $subsets;
  200. $this->view->packages = $packages;
  201. $this->view->privs = $this->group->getPrivsByParents(key($subsets));
  202. }
  203. /**
  204. * 构造视野维护的表单。
  205. * Build update view form.
  206. *
  207. * @access protected
  208. * @return array
  209. */
  210. protected function buildUpdateViewForm()
  211. {
  212. $formData = array();
  213. $actions = $this->post->actions;
  214. $formData['views'] = isset($actions['views']) ? array_filter($actions['views']) : array();
  215. $formData['programs'] = isset($actions['programs']) ? array_filter($actions['programs']) : array();
  216. $formData['projects'] = isset($actions['projects']) ? array_filter($actions['projects']) : array();
  217. $formData['products'] = isset($actions['products']) ? array_filter($actions['products']) : array();
  218. $formData['sprints'] = isset($actions['sprints']) ? array_filter($actions['sprints']) : array();
  219. $formData['actions'] = isset($actions['actions']) ? array_filter($actions['actions']) : array();
  220. $formData['actionallchecker'] = isset($_POST['actionallchecker']);
  221. return $formData;
  222. }
  223. /**
  224. * 构造项目管理员的表单。
  225. * Build project admin form.
  226. *
  227. * @access protected
  228. * @return array
  229. */
  230. protected function buildProjectAdminForm()
  231. {
  232. $members = $this->post->members ? $this->post->members : array();
  233. $programs = $this->post->program ? $this->post->program : array();
  234. $projects = $this->post->project ? $this->post->project : array();
  235. $products = $this->post->product ? $this->post->product : array();
  236. $executions = $this->post->execution ? $this->post->execution : array();
  237. $programAll = $this->post->programAll ? $this->post->programAll : '';
  238. $projectAll = $this->post->projectAll ? $this->post->projectAll : '';
  239. $productAll = $this->post->productAll ? $this->post->productAll : '';
  240. $executionAll = $this->post->executionAll ? $this->post->executionAll : '';
  241. $formData = array();
  242. foreach($members as $lineID => $accounts)
  243. {
  244. if(empty($accounts)) continue;
  245. $formData[$lineID] = array();
  246. $programs[$lineID] = isset($programs[$lineID]) ? $programs[$lineID] : array();
  247. $projects[$lineID] = isset($projects[$lineID]) ? $projects[$lineID] : array();
  248. $products[$lineID] = isset($products[$lineID]) ? $products[$lineID] : array();
  249. $executions[$lineID] = isset($executions[$lineID]) ? $executions[$lineID] : array();
  250. $formData[$lineID]['program'] = isset($programAll[$lineID]) ? array('all') : $programs[$lineID];
  251. $formData[$lineID]['project'] = isset($projectAll[$lineID]) ? array('all') : $projects[$lineID];
  252. $formData[$lineID]['product'] = isset($productAll[$lineID]) ? array('all') : $products[$lineID];
  253. $formData[$lineID]['execution'] = isset($executionAll[$lineID]) ? array('all') : $executions[$lineID];
  254. $formData[$lineID]['accounts'] = $accounts;
  255. }
  256. return $formData;
  257. }
  258. /**
  259. * 获取Nav分组。
  260. * Get nav group.
  261. *
  262. * @access public
  263. * @return array
  264. */
  265. public function getNavGroup()
  266. {
  267. $navGroup = array();
  268. foreach($this->lang->navGroup as $moduleName => $groupName)
  269. {
  270. if($groupName == $moduleName) continue;
  271. if($moduleName == 'testcase') $moduleName = 'case';
  272. $navGroup[$groupName][$moduleName] = $moduleName;
  273. }
  274. return $navGroup;
  275. }
  276. /**
  277. * 设置DevOps 在Compose 版本中的权限。
  278. * Set DevOps priv in compose.
  279. *
  280. * @access public
  281. * @return void
  282. */
  283. public function setDevOpsPrivInCompose()
  284. {
  285. $privList = $this->config->group->setComposeDevOpsPriv;
  286. $subsets = array_keys($privList);
  287. $allPrivs = $this->config->group->package;
  288. $servers = $this->loadModel('pipeline')->getList('');
  289. $servers = array_column($servers, 'type');
  290. foreach($allPrivs as $packageCode => $package)
  291. {
  292. $subset = $package->subset;
  293. if(!in_array($subset, $subsets)) continue;
  294. if(!empty($privList[$subset]['exclude']))
  295. {
  296. $excludeServer = explode(',', $privList[$subset]['exclude']);
  297. if(array_intersect($servers, $excludeServer)) continue;
  298. }
  299. $hidePrivs = explode(',', $privList[$subset]['priv']);
  300. foreach($hidePrivs as $priv)
  301. {
  302. if(empty($package->privs[$priv])) continue;
  303. unset($this->config->group->package->{$packageCode}->privs[$priv]);
  304. }
  305. }
  306. }
  307. }