diff --git a/module/instance/model.php b/module/instance/model.php index ae7544de00..722cec1720 100644 --- a/module/instance/model.php +++ b/module/instance/model.php @@ -2059,7 +2059,7 @@ class InstanceModel extends model if($action == 'uninstall') return $instance->type != 'external' && $this->canDo('uninstall', $instance); if($action == 'visit') return $instance->type != 'external' ? ($instance->domain && $this->canDo('visit', $instance)) : true; if($action == 'upgrade') return !empty($instance->latestVersion); - if($action == 'bindUser') return ($instance->externalID && in_array($instance->appName, array('Gitlab', 'Gitea', 'Gogs'))) ? true : false; + if($action == 'bindUser') return ($instance->externalID && in_array($instance->appName, array('GitLab', 'Gitea', 'Gogs'))) ? true : false; if($action == 'edit') return $instance->type != 'external' ? false : true; return true; diff --git a/module/job/js/create.ui.js b/module/job/js/create.ui.js index 193cff2103..5f74a3f961 100644 --- a/module/job/js/create.ui.js +++ b/module/job/js/create.ui.js @@ -116,13 +116,6 @@ function changeRepo(event) $('#svnDirBox').append(html); }) } - - var triggerOptions = $('#triggerType').zui('picker').options.items; - for(i in triggerOptions) - { - if(triggerOptions[i].value == 'tag') triggerOptions[i].text = data.type == 'gitlab' ? buildTag : dirChange; - } - $('#triggerType').zui('picker').render({items: triggerOptions}); } }); diff --git a/module/repo/js/create.ui.js b/module/repo/js/create.ui.js index ee67cca556..74971a2b44 100644 --- a/module/repo/js/create.ui.js +++ b/module/repo/js/create.ui.js @@ -81,15 +81,16 @@ function onScmChange() } (scm == 'Git') ? $('.tips-git').removeClass('hidden') : $('.tips-git').addClass('hidden'); + if(scm == 'Git' || scm == 'Gitea' || scm == 'Gogs') { - $('.account-fields').hide(); + $('.account-fields').addClass('hidden'); $('#path').attr('placeholder', pathGitTip); $('#client').attr('placeholder', clientGitTip); } else { - $('.account-fields').show(); + $('.account-fields').removeClass('hidden'); $('#path').attr('placeholder', pathSvnTip); $('#client').attr('placeholder', clientSvnTip); } @@ -125,3 +126,23 @@ function onScmChange() }); } } + +/** + * On acl change event. + * + * @param event $event + * @access public + * @return void + */ +function onAclChange(event) +{ + const acl = $(event.target).val(); + if(acl == 'private' || acl == 'custom') + { + $('#whitelist').removeClass('hidden'); + } + else + { + $('#whitelist').addClass('hidden'); + } +} diff --git a/module/repo/js/edit.ui.js b/module/repo/js/edit.ui.js index f70ddd0c09..0b285521a6 100644 --- a/module/repo/js/edit.ui.js +++ b/module/repo/js/edit.ui.js @@ -58,7 +58,14 @@ function onProjectChange() */ function onScmChange(event) { - var scm = $('[name=SCM]').val(); + if(typeof(event) == 'object') + { + var scm = $(event.target).val(); + } + else + { + var scm = repoSCM; + } if(!scm) { for(i in scmList) @@ -71,13 +78,13 @@ function onScmChange(event) (scm == 'Git') ? $('.tips-git').removeClass('hidden') : $('.tips-git').addClass('hidden'); if(scm == 'Git' || scm == 'Gitea' || scm == 'Gogs') { - $('.account-fields').hide(); + $('.account-fields').addClass('hidden'); $('#path').attr('placeholder', pathGitTip); $('#client').attr('placeholder', clientGitTip); } else { - $('.account-fields').show(); + $('.account-fields').removeClass('hidden'); $('#path').attr('placeholder', pathSvnTip); $('#client').attr('placeholder', clientSvnTip); } @@ -116,3 +123,23 @@ function onScmChange(event) } } } + +/** + * On acl change event. + * + * @param event $event + * @access public + * @return void + */ +function onAclChange(event) +{ + const acl = $(event.target).val(); + if(acl == 'private' || acl == 'custom') + { + $('#whitelist').removeClass('hidden'); + } + else + { + $('#whitelist').addClass('hidden'); + } +} diff --git a/module/repo/lang/de.php b/module/repo/lang/de.php index 8dd4be3530..b3a1fe9b17 100644 --- a/module/repo/lang/de.php +++ b/module/repo/lang/de.php @@ -108,7 +108,7 @@ $lang->repo->file = 'File'; $lang->repo->action = 'Action'; $lang->repo->code = 'Code'; $lang->repo->review = 'Repo Review'; -$lang->repo->acl = 'Privilege'; +$lang->repo->acl = 'ACL'; $lang->repo->group = 'Group'; $lang->repo->user = 'User'; $lang->repo->info = 'Version Info'; @@ -179,6 +179,7 @@ $lang->repo->placeholder->gitlabHost = 'Input url of gitlab'; $lang->repo->notice = new stdclass(); $lang->repo->notice->syncing = 'Synchronizing. Please wait ...'; $lang->repo->notice->syncComplete = 'Synchronized. Now redirecting ...'; +$lang->repo->notice->syncFailed = 'Synchronized failed.'; $lang->repo->notice->syncedCount = 'The number of records synchronized is '; $lang->repo->notice->delete = 'Do you want to delete this repo?'; $lang->repo->notice->successDelete = 'Repository is removed.'; @@ -240,3 +241,5 @@ $lang->repo->typeList['performance'] = 'Performance'; $lang->repo->typeList['security'] = 'Security'; $lang->repo->typeList['redundancy'] = 'Redundancy'; $lang->repo->typeList['logicError'] = 'Logic Error'; + +$lang->repo->featureBar['maintain']['all'] = 'All'; diff --git a/module/repo/lang/en.php b/module/repo/lang/en.php index 23636b9ef2..3193e6e4c3 100644 --- a/module/repo/lang/en.php +++ b/module/repo/lang/en.php @@ -108,7 +108,7 @@ $lang->repo->file = 'File'; $lang->repo->action = 'Action'; $lang->repo->code = 'Code'; $lang->repo->review = 'Repo Review'; -$lang->repo->acl = 'Privilege'; +$lang->repo->acl = 'ACL'; $lang->repo->group = 'Group'; $lang->repo->user = 'User'; $lang->repo->info = 'Version Info'; @@ -179,6 +179,7 @@ $lang->repo->placeholder->gitlabHost = 'Input url of gitlab'; $lang->repo->notice = new stdclass(); $lang->repo->notice->syncing = 'Synchronizing. Please wait ...'; $lang->repo->notice->syncComplete = 'Synchronized. Now redirecting ...'; +$lang->repo->notice->syncFailed = 'Synchronized failed.'; $lang->repo->notice->syncedCount = 'The number of records synchronized is '; $lang->repo->notice->delete = 'Do you want to delete this repo?'; $lang->repo->notice->successDelete = 'Repository is removed.'; diff --git a/module/repo/lang/fr.php b/module/repo/lang/fr.php index 5d153ee25b..d259b9803b 100644 --- a/module/repo/lang/fr.php +++ b/module/repo/lang/fr.php @@ -108,7 +108,7 @@ $lang->repo->file = 'Fichier'; $lang->repo->action = 'Action'; $lang->repo->code = 'Code'; $lang->repo->review = 'Révision Ref'; -$lang->repo->acl = 'Privilège'; +$lang->repo->acl = 'ACL'; $lang->repo->group = 'Groupe'; $lang->repo->user = 'User'; $lang->repo->info = 'Info Version'; @@ -179,6 +179,7 @@ $lang->repo->placeholder->gitlabHost = 'Input url of gitlab'; $lang->repo->notice = new stdclass(); $lang->repo->notice->syncing = 'Synchronisation en cours. Veuillez patienter ...'; $lang->repo->notice->syncComplete = 'Synchronisé. Vous allez être redirigé ...'; +$lang->repo->notice->syncFailed = 'Synchronized failed.'; $lang->repo->notice->syncedCount = "Le nombre d'enregistrements synchronisés est "; $lang->repo->notice->delete = 'Etes vous certain de vouloir supprimer ce référentiel ?'; $lang->repo->notice->successDelete = 'Le référentiel est supprimé.'; @@ -240,3 +241,5 @@ $lang->repo->typeList['performance'] = 'Performance'; $lang->repo->typeList['security'] = 'Securité'; $lang->repo->typeList['redundancy'] = 'Redondance'; $lang->repo->typeList['logicError'] = 'Erreur Logique'; + +$lang->repo->featureBar['maintain']['all'] = 'All'; diff --git a/module/repo/lang/zh-cn.php b/module/repo/lang/zh-cn.php index dfcb43ed43..6d333a06d1 100644 --- a/module/repo/lang/zh-cn.php +++ b/module/repo/lang/zh-cn.php @@ -108,7 +108,7 @@ $lang->repo->file = '文件'; $lang->repo->action = '操作'; $lang->repo->code = '代码'; $lang->repo->review = '评审'; -$lang->repo->acl = '权限'; +$lang->repo->acl = '访问控制'; $lang->repo->group = '分组'; $lang->repo->user = '用户'; $lang->repo->info = '版本信息'; @@ -166,6 +166,10 @@ $lang->repo->scmList['Gitea'] = 'Gitea'; $lang->repo->scmList['Git'] = '本地 Git'; $lang->repo->scmList['Subversion'] = 'Subversion'; +$lang->repo->aclList['private'] = '私有 (所属产品和相关项目人员可访问)'; +$lang->repo->aclList['open'] = '公开 (有DevOps视图权限即可访问)'; +$lang->repo->aclList['custom'] = '自定义'; + $lang->repo->gitlabHost = 'GitLab Server'; $lang->repo->gitlabToken = 'GitLab Token'; $lang->repo->gitlabProject = 'GitLab 项目'; @@ -179,6 +183,7 @@ $lang->repo->placeholder->gitlabHost = '请填写GitLab访问地址'; $lang->repo->notice = new stdclass(); $lang->repo->notice->syncing = '正在同步中, 请稍等...'; $lang->repo->notice->syncComplete = '同步完成,正在跳转...'; +$lang->repo->notice->syncFailed = '同步失败'; $lang->repo->notice->syncedCount = '已经同步记录条数'; $lang->repo->notice->delete = '是否要删除该代码库?'; $lang->repo->notice->successDelete = '已经成功删除代码库。'; diff --git a/module/repo/model.php b/module/repo/model.php index f968d2eb3a..d517c6a48a 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -11,8 +11,23 @@ class repoModel extends model public function checkPriv($repo) { $account = $this->app->user->account; - if(strpos(",{$this->app->company->admins},", ",$account,") !== false) return true; - if(empty($repo->acl->groups) and empty($repo->acl->users)) return true; + $acl = !empty($repo->acl->acl) ? $repo->acl->acl : 'custom'; + + if(strpos(",{$this->app->company->admins},", ",$account,") !== false || $acl == 'open') return true; + if($acl == 'custom' && empty($repo->acl->groups) && empty($repo->acl->users)) return true; + + if($acl == 'private') + { + $userProjects = explode(',', $this->app->user->view->projects); + $userProducts = explode(',', $this->app->user->view->products); + $repoProjects = explode(',', $repo->projects); + $repoProducts = explode(',', $repo->product); + + $sameProjects = array_intersect($userProjects, $repoProjects); + $sameProducts = array_intersect($userProducts, $repoProducts); + if(!empty($sameProjects) || !empty($sameProducts)) return true; + } + if(!empty($repo->acl->groups)) { foreach($this->app->user->groups as $group) @@ -21,6 +36,7 @@ class repoModel extends model } } if(!empty($repo->acl->users) and in_array($account, $repo->acl->users)) return true; + return false; } @@ -589,7 +605,10 @@ class repoModel extends model if($repo->encrypt == 'base64') $repo->password = base64_decode($repo->password); $repo->codePath = $repo->path; if(in_array(strtolower($repo->SCM), $this->config->repo->gitServiceList)) $repo = $this->processGitService($repo); + $repo->acl = json_decode($repo->acl); + if(empty($repo->acl)) $repo->acl = new stdclass(); + if(empty($repo->acl->acl)) $repo->acl->acl = 'custom'; return $repo; } diff --git a/module/repo/ui/create.html.php b/module/repo/ui/create.html.php index 70f350f0f9..d13bf80426 100644 --- a/module/repo/ui/create.html.php +++ b/module/repo/ui/create.html.php @@ -81,6 +81,7 @@ formPanel ( set::width('1/2'), set::name("serviceProject"), + set::items(array()), set::label($lang->repo->serviceProject), set::control("picker"), ), @@ -162,38 +163,57 @@ formPanel ) ) ), - formGroup + formRow ( - set::label($lang->repo->acl), - inputGroup + set::id('aclList'), + formGroup ( - $lang->repo->group, - width('full'), - control(set(array - ( - 'name' => "acl[groups][]", - 'id' => "aclgroups", - 'value' => NULL, - 'type' => "picker", - 'items' => $groups, - 'multiple' => true - ))) - ), - inputGroup - ( - $lang->repo->user, - control(set(array - ( - 'name' => "acl[users][]", - 'id' => "aclusers", - 'value' => NULL, - 'type' => "picker", - 'items' => $users, - 'multiple' => true - ))), - setClass('mt-2') + set::width('1/2'), + set::name('acl[acl]'), + set::label($lang->repo->acl), + set::control('radioList'), + set::items($lang->repo->aclList), + set::value('open'), + on::change('onAclChange'), ) ), + formRow + ( + set::id('whitelist'), + setClass('hidden'), + formGroup + ( + set::label($lang->product->whitelist), + inputGroup + ( + $lang->repo->group, + width('full'), + control(set(array + ( + 'name' => "acl[groups][]", + 'id' => "aclgroups", + 'value' => NULL, + 'type' => "picker", + 'items' => $groups, + 'multiple' => true + ))) + ), + inputGroup + ( + $lang->repo->user, + control(set(array + ( + 'name' => "acl[users][]", + 'id' => "aclusers", + 'value' => NULL, + 'type' => "picker", + 'items' => $users, + 'multiple' => true + ))), + setClass('mt-2') + ) + ), + ), formGroup ( set::name("desc"), diff --git a/module/repo/ui/edit.html.php b/module/repo/ui/edit.html.php index 498d0835c3..8b5c3ed670 100644 --- a/module/repo/ui/edit.html.php +++ b/module/repo/ui/edit.html.php @@ -15,6 +15,7 @@ jsVar('pathSvnTip', $lang->repo->example->path->svn); jsVar('clientGitTip', $lang->repo->example->client->git); jsVar('clientSvnTip', $lang->repo->example->client->svn); jsVar('scmList', $lang->repo->scmList); +jsVar('repoSCM', $repo->SCM); formPanel ( @@ -168,38 +169,57 @@ formPanel ) ) ), - formGroup + formRow ( - set::label($lang->repo->acl), - inputGroup + set::id('aclList'), + formGroup ( - $lang->repo->group, - width('full'), - control(set(array - ( - 'name' => "acl[groups][]", - 'id' => "aclgroups", - 'value' => empty($repo->acl->groups) ? '' : implode(',', $repo->acl->groups), - 'type' => "picker", - 'items' => $groups, - 'multiple' => true - ))) - ), - inputGroup - ( - $lang->repo->user, - control(set(array - ( - 'name' => "acl[users][]", - 'id' => "aclusers", - 'value' => empty($repo->acl->users) ? '' : implode(',', $repo->acl->users), - 'type' => "picker", - 'items' => $users, - 'multiple' => true - ))), - setClass('mt-2') + set::width('1/2'), + set::name('acl[acl]'), + set::label($lang->repo->acl), + set::control('radioList'), + set::items($lang->repo->aclList), + set::value($repo->acl->acl), + on::change('onAclChange'), ) ), + formRow + ( + set::id('whitelist'), + $repo->acl->acl == 'open' ? setClass('hidden') : null, + formGroup + ( + set::label($lang->product->whitelist), + inputGroup + ( + $lang->repo->group, + width('full'), + control(set(array + ( + 'name' => "acl[groups][]", + 'id' => "aclgroups", + 'value' => empty($repo->acl->groups) ? '' : implode(',', $repo->acl->groups), + 'type' => "picker", + 'items' => $groups, + 'multiple' => true + ))) + ), + inputGroup + ( + $lang->repo->user, + control(set(array + ( + 'name' => "acl[users][]", + 'id' => "aclusers", + 'value' => empty($repo->acl->users) ? '' : implode(',', $repo->acl->users), + 'type' => "picker", + 'items' => $users, + 'multiple' => true + ))), + setClass('mt-2') + ) + ), + ), formGroup ( set::name("desc"), diff --git a/module/repo/zen.php b/module/repo/zen.php index 779a1dcc9d..f5f4c63a8a 100644 --- a/module/repo/zen.php +++ b/module/repo/zen.php @@ -34,13 +34,13 @@ class repoZen extends repo ->setIf($this->post->SCM == 'Git', 'account', '') ->setIf($this->post->SCM == 'Git', 'password', '') ->setIf(in_array($this->post->SCM, array('Gitea', 'Gogs')), 'path', $_POST['path']) - ->setIf($this->post->acl != '', 'acl', json_encode($this->post->acl)) ->setIf($this->post->encrypt == 'base64', 'password', base64_encode($this->post->password)) ->skipSpecial('path,client,account,password') ->setDefault('product', '')->join('product', ',') ->setDefault('projects', '')->join('projects', ',') ->get(); + if($this->post->acl != '') $repo->acl = json_encode($this->post->acl); if($repo->SCM == 'Subversion') { $scm = $this->app->loadClass('scm');