diff --git a/module/gitlab/config/form.php b/module/gitlab/config/form.php index 5129b21400..95485a13d3 100644 --- a/module/gitlab/config/form.php +++ b/module/gitlab/config/form.php @@ -7,3 +7,34 @@ $config->gitlab->form->create = common::formConfig('gitlab', 'create'); $config->gitlab->form->create['name'] = array('type' => 'string', 'required' => true, 'default' => ''); $config->gitlab->form->create['url'] = array('type' => 'string', 'required' => true, 'default' => ''); $config->gitlab->form->create['token'] = array('type' => 'string', 'required' => true, 'default' => ''); + +$config->gitlab->form->edit = common::formConfig('gitlab', 'edit'); + +$config->gitlab->form->edit['name'] = array('type' => 'string', 'required' => true, 'default' => ''); +$config->gitlab->form->edit['url'] = array('type' => 'string', 'required' => true, 'default' => ''); +$config->gitlab->form->edit['token'] = array('type' => 'string', 'required' => true, 'default' => ''); + +$config->gitlab->form->user = new stdclass(); + +$config->gitlab->form->user->create = common::formConfig('gitlab', 'createUser'); +$config->gitlab->form->user->create['account'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->create['name'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->create['username'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->create['email'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->create['password'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->create['password_repeat'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->create['projects_limit'] = array('type' => 'int', 'required' => false, 'default' => '100000'); +$config->gitlab->form->user->create['can_create_group'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->create['external'] = array('type' => 'string', 'required' => false, 'default' => ''); + +$config->gitlab->form->user->edit = common::formConfig('gitlab', 'editUser'); +$config->gitlab->form->user->edit['id'] = array('type' => 'int', 'required' => true); +$config->gitlab->form->user->edit['account'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->edit['name'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->edit['username'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->edit['email'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->edit['password'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->edit['password_repeat'] = array('type' => 'string', 'required' => false, 'default' => ''); +$config->gitlab->form->user->edit['projects_limit'] = array('type' => 'int', 'required' => false, 'default' => '100000'); +$config->gitlab->form->user->edit['can_create_group'] = array('type' => 'string', 'required' => false, 'default' => '0'); +$config->gitlab->form->user->edit['external'] = array('type' => 'string', 'required' => false, 'default' => '0'); diff --git a/module/gitlab/control.php b/module/gitlab/control.php index 6c356aa06b..624abda9ec 100644 --- a/module/gitlab/control.php +++ b/module/gitlab/control.php @@ -76,7 +76,7 @@ class gitlab extends control { $gitlab = form::data($this->config->gitlab->form->create) ->add('type', 'gitlab') - ->add('private',md5(rand(10,113450))) + ->add('private',md5((string)rand(10,113450))) ->add('createdBy', $this->app->user->account) ->add('createdDate', helper::now()) ->trim('url,token') @@ -130,14 +130,14 @@ class gitlab extends control if($_POST) { - $gitlab = fixer::input('post')->trim('url,token')->get(); + $gitlab = form::data($this->config->gitlab->form->edit)->trim('url,token')->get(); $this->checkToken($gitlab, $gitlabID); $this->gitlab->update($gitlabID); $gitLab = $this->gitlab->getByID($gitlabID); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); $this->loadModel('action'); - $actionID = $this->action->create('gitlab', $id, 'edited'); + $actionID = $this->action->create('gitlab', $gitlabID, 'edited'); $changes = common::createChanges($oldGitLab, $gitLab); $this->action->logHistory($actionID, $changes); return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'load' => true, 'closeModal' => true)); @@ -171,45 +171,11 @@ class gitlab extends control { $users = $this->post->zentaoUsers; $gitlabNames = $this->post->gitlabUserNames; - $accountList = array(); - $repeatUsers = array(); - foreach($users as $openID => $user) - { - if(empty($user)) continue; - if(isset($accountList[$user])) $repeatUsers[] = zget($userPairs, $user); - $accountList[$user] = $openID; - } - if(count($repeatUsers)) return $this->send(array('result' => 'fail', 'message' => sprintf($this->lang->gitlab->bindUserError, join(',', array_unique($repeatUsers))))); + $result = $this->gitlabZen->checkUserRepeat($users); + if($result['result'] != 'success') return $this->send($result); - $user = new stdclass; - $user->providerID = $gitlabID; - $user->providerType = 'gitlab'; - - $oldUsers = $this->dao->select('*')->from(TABLE_OAUTH)->where('providerType')->eq($user->providerType)->andWhere('providerID')->eq($user->providerID)->fetchAll('openID'); - foreach($users as $openID => $account) - { - $existAccount = isset($oldUsers[$openID]) ? $oldUsers[$openID] : ''; - - if($existAccount and $existAccount->account != $account) - { - $this->dao->delete() - ->from(TABLE_OAUTH) - ->where('openID')->eq($openID) - ->andWhere('providerType')->eq($user->providerType) - ->andWhere('providerID')->eq($user->providerID) - ->exec(); - $this->loadModel('action')->create('gitlabuser', $openID, 'unbind', '', sprintf($this->lang->gitlab->bindDynamic, $gitlabNames[$openID], $zentaoUsers[$existAccount->account]->realname)); - } - if(!$existAccount or $existAccount->account != $account) - { - if(!$account) continue; - $user->account = $account; - $user->openID = $openID; - $this->dao->insert(TABLE_OAUTH)->data($user)->exec(); - $this->loadModel('action')->create('gitlabuser', $openID, 'bind', '', sprintf($this->lang->gitlab->bindDynamic, $gitlabNames[$openID], $zentaoUsers[$account]->realname)); - } - } + $this->gitlabZen->bindUsers($gitlabID, $users, $gitlabNames, $zentaoUsers); if(dao::isError()) return $this->sendError(dao::getError()); return $this->sendSuccess(array('message' => $this->lang->saveSuccess, 'load' => helper::createLink('space', 'browse'))); @@ -286,6 +252,7 @@ class gitlab extends control } /** + * 检查post的token是否有管理员权限。 * Check post token has admin permissions. * * @param object $gitlab @@ -328,17 +295,7 @@ class gitlab extends control $requestBody = json_decode($input); $result = $this->gitlab->webhookParseBody($requestBody, $gitlab); - $logFile = $this->app->getLogRoot() . 'webhook.'. date('Ymd') . '.log.php'; - if(!file_exists($logFile)) file_put_contents($logFile, ''); - - $fh = @fopen($logFile, 'a'); - if($fh) - { - fwrite($fh, date('Ymd H:i:s') . ": " . $this->app->getURI() . "\n"); - fwrite($fh, "JSON: \n " . $input . "\n"); - fwrite($fh, "Parsed object: {$result->issue->objectType} :\n " . print_r($result->object, true) . "\n"); - fclose($fh); - } + $this->gitlabZen->recordWebhookLogs($input, $result); if($result->action == 'updateissue' and isset($result->changes->assignees)) $this->gitlab->webhookAssignIssue($result); @@ -355,6 +312,7 @@ class gitlab extends control } /** + * Gitlab群组列表。 * Browse gitlab group. * * @param int $gitlabID @@ -389,6 +347,7 @@ class gitlab extends control } /** + * 创建一个gitlab群组。 * Creat a gitlab group. * * @param int $gitlabID @@ -420,6 +379,7 @@ class gitlab extends control } /** + * 编辑一个gitlab群组。 * Edit a gitlab group. * * @param int $gitlabID @@ -457,6 +417,7 @@ class gitlab extends control } /** + * 删除一个gitlab群组。 * Delete a gitlab group. * * @param int $gitlabID @@ -485,6 +446,7 @@ class gitlab extends control } /** + * 管理gitlba群组成员。 * Manage a gitlab group members. * * @param int $gitlabID @@ -511,48 +473,7 @@ class gitlab extends control $currentMembers = $this->gitlab->apiGetGroupMembers($gitlabID, $groupID); - /* Get the updated,deleted data. */ - $addedMembers = $deletedMembers = $updatedMembers = array(); - foreach($currentMembers as $currentMember) - { - $memberID = $currentMember->id; - if(empty($newMembers[$memberID])) - { - $deletedMembers[] = $memberID; - } - else - { - if($newMembers[$memberID]->access_level != $currentMember->access_level or $newMembers[$memberID]->expires_at != $currentMember->expires_at) - { - $updatedData = new stdClass(); - $updatedData->user_id = $memberID; - $updatedData->access_level = $newMembers[$memberID]->access_level; - $updatedData->expires_at = $newMembers[$memberID]->expires_at; - $updatedMembers[] = $updatedData; - } - } - } - /* Get the added data. */ - foreach($newMembers as $id => $newMember) - { - $exist = false; - foreach($currentMembers as $currentMember) - { - if($currentMember->id == $id) - { - $exist = true; - break; - } - } - if($exist == false) - { - $addedData = new stdClass(); - $addedData->user_id = $id; - $addedData->access_level = $newMembers[$id]->access_level; - $addedData->expires_at = $newMembers[$id]->expires_at; - $addedMembers[] = $addedData; - } - } + list($addedMembers, $deletedMembers, $updatedMembers) = $this->gitlabZen->getGroupMemberData($currentMembers, $newMembers); foreach($addedMembers as $addedMember) { @@ -591,6 +512,7 @@ class gitlab extends control } /** + * Gitlab用户列表。 * Browse gitlab user. * * @param int $gitlabID @@ -639,7 +561,10 @@ class gitlab extends control { if($_POST) { - $this->gitlab->createUser($gitlabID); + $gitlabUser = form::data($this->config->gitlab->form->user->create)->get(); + if(!empty($_FILES['avatar'])) $gitlabUser->avatar = curl_file_create($_FILES['avatar']['tmp_name'], $_FILES['avatar']['type'], $_FILES['avatar']['name']); + + $this->gitlab->createUser($gitlabID, $gitlabUser); if(dao::isError()) { @@ -683,10 +608,15 @@ class gitlab extends control { if($_POST) { - $this->gitlab->editUser($gitlabID); + $gitlabUser = form::data($this->config->gitlab->form->user->edit) + ->removeIF(!$this->post->password, 'password,password_repeat') + ->get(); + if(!empty($_FILES['avatar']['name'])) $gitlabUser->avatar = curl_file_create($_FILES['avatar']['tmp_name'], $_FILES['avatar']['type'], $_FILES['avatar']['name']); + + $this->gitlab->editUser($gitlabID, $gitlabUser); if(dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError())); - return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'locate' => inlink('browseUser', "gitlabID=$gitlabID"))); + return $this->send(array('result' => 'success', 'message' => $this->lang->saveSuccess, 'reload' => inlink('browseUser', "gitlabID=$gitlabID"))); } $gitlabUser = $this->gitlab->apiGetSingleUser($gitlabID, $userID); @@ -1188,11 +1118,7 @@ class gitlab extends control $repo = $this->loadModel('repo')->getByID($repoID); $users = $this->loadModel('user')->getPairs('noletter|noempty|nodeleted'); - $bindedUsers = $this->dao->select('account,openID') - ->from(TABLE_OAUTH) - ->where('providerType')->eq('gitlab') - ->andWhere('providerID')->eq($repo->gitService) - ->fetchPairs(); + $bindedUsers = $this->gitlab->getUserAccountIdPairs($repo->gitService); if(empty($repo->acl)) { @@ -1213,74 +1139,21 @@ class gitlab extends control $gitlabCurrentMembers = $this->gitlab->apiGetProjectMembers($repo->gitService, $repo->project); - $addedMembers = $updatedMembers = $deletedMembers = array(); - /* Get the updated data. */ - foreach($gitlabCurrentMembers as $gitlabCurrentMember) - { - $memberID = isset($gitlabCurrentMember->id) ? $gitlabCurrentMember->id : 0; - if(!isset($newGitlabMembers[$memberID])) continue; - if($newGitlabMembers[$memberID]->access_level != $gitlabCurrentMember->access_level or $newGitlabMembers[$memberID]->expires_at != $gitlabCurrentMember->expires_at) - { - $updatedData = new stdClass(); - $updatedData->user_id = $memberID; - $updatedData->access_level = $newGitlabMembers[$memberID]->access_level; - $updatedData->expires_at = $newGitlabMembers[$memberID]->expires_at; - $updatedMembers[] = $updatedData; - } - } - /* Get the added data. */ - foreach($newGitlabMembers as $id => $newMember) - { - $exist = false; - foreach($gitlabCurrentMembers as $gitlabCurrentMember) - { - if($gitlabCurrentMember->id == $id) - { - $exist = true; - break; - } - } - if($exist == false) - { - $addedData = new stdClass(); - $addedData->user_id = $id; - $addedData->access_level = $newGitlabMembers[$id]->access_level; - $addedData->expires_at = $newGitlabMembers[$id]->expires_at; - $addedMembers[] = $addedData; - } - } - /* Get the deleted data. */ - $originalUsers = $repo->acl->users; - foreach($originalUsers as $user) - { - if(!in_array($user, $accounts) and isset($bindedUsers[$user])) - { - $exist = false; - foreach($gitlabCurrentMembers as $gitlabCurrentMember) - { - if($gitlabCurrentMember->id == $bindedUsers[$user]) - { - $exist = true; - $deletedMembers[] = $gitlabCurrentMember->id; - break; - } - } - } - } + list($addedMembers, $deletedMembers, $updatedMembers) = $this->gitlabZen->getProjectMemberData($gitlabCurrentMembers, $newGitlabMembers, $bindedUsers, $accounts, !empty($repo->acl->users) ? $repo->acl->users : array()); foreach($addedMembers as $addedMember) { - $this->gitlab->apiCreateProjectMember((int)$repo->gitService, (int)$repo->project, $addedMember); + $this->gitlab->apiCreateProjectMember($repo->gitService, $repo->project, $addedMember); } foreach($updatedMembers as $updatedMember) { - $this->gitlab->apiUpdateProjectMember((int)$repo->gitService, (int)$repo->project, $updatedMember); + $this->gitlab->apiUpdateProjectMember($repo->gitService, $repo->project, $updatedMember); } foreach($deletedMembers as $deletedMemberID) { - $this->gitlab->apiDeleteProjectMember((int)$repo->gitService, (int)$repo->project, (int)$deletedMemberID); + $this->gitlab->apiDeleteProjectMember($repo->gitService, $repo->project, (int)$deletedMemberID); } $repo->acl->users = array_values($accounts); @@ -1295,11 +1168,7 @@ class gitlab extends control /* Get users accesslevel. */ $userAccessData = array(); - $bindedUsers = $this->dao->select('openID,account') - ->from(TABLE_OAUTH) - ->where('providerType')->eq('gitlab') - ->andWhere('providerID')->eq($repo->gitService) - ->fetchPairs(); + $bindedUsers = $this->gitlab->getUserIdAccountPairs($repo->gitService); foreach($projectMembers as $projectMember) { diff --git a/module/gitlab/model.php b/module/gitlab/model.php index ac4fd5a528..5c8f06566b 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -216,11 +216,7 @@ class gitlabModel extends model } } - $bindedUsers = $this->dao->select('openID,account') - ->from(TABLE_OAUTH) - ->where('providerType')->eq('gitlab') - ->andWhere('providerID')->eq($gitlabID) - ->fetchPairs(); + $bindedUsers = $this->getUserIdAccountPairs($gitlabID); $matchedUsers = array(); foreach($gitlabUsers as $gitlabUser) @@ -2454,29 +2450,27 @@ class gitlabModel extends model * Create a gitlab user. * * @param int $gitlabID + * @param object $gitlabUser * @access public * @return bool */ - public function createUser(int $gitlabID): bool + public function createUser(int $gitlabID, object $gitlabUser): bool { - $user = fixer::input('post')->remove('avatar')->get(); - if(!empty($_FILES['avatar'])) $user->avatar = curl_file_create($_FILES['avatar']['tmp_name'], $_FILES['avatar']['type'], $_FILES['avatar']['name']); - - if(empty($user->account)) dao::$errors['account'][] = $this->lang->gitlab->user->bind . $this->lang->gitlab->user->emptyError; - if(empty($user->name)) dao::$errors['name'][] = $this->lang->gitlab->user->name . $this->lang->gitlab->user->emptyError; - if(empty($user->username)) dao::$errors['username'][] = $this->lang->gitlab->user->username . $this->lang->gitlab->user->emptyError; - if(empty($user->email)) dao::$errors['email'][] = $this->lang->gitlab->user->email . $this->lang->gitlab->user->emptyError; - if(empty($user->password)) dao::$errors['password'][] = $this->lang->gitlab->user->password . $this->lang->gitlab->user->emptyError; + if(empty($gitlabUser->account)) dao::$errors['account'][] = $this->lang->gitlab->user->bind . $this->lang->gitlab->user->emptyError; + if(empty($gitlabUser->name)) dao::$errors['name'][] = $this->lang->gitlab->user->name . $this->lang->gitlab->user->emptyError; + if(empty($gitlabUser->username)) dao::$errors['username'][] = $this->lang->gitlab->user->username . $this->lang->gitlab->user->emptyError; + if(empty($gitlabUser->email)) dao::$errors['email'][] = $this->lang->gitlab->user->email . $this->lang->gitlab->user->emptyError; + if(empty($gitlabUser->password)) dao::$errors['password'][] = $this->lang->gitlab->user->password . $this->lang->gitlab->user->emptyError; if(dao::isError()) return false; - if($user->password != $user->password_repeat) + if($gitlabUser->password != $gitlabUser->password_repeat) { dao::$errors[] = $this->lang->gitlab->user->passwordError; return false; } /* Check whether the user has been bind. */ - if($user->account) + if($gitlabUser->account) { - $zentaoBindUser = $this->dao->select('account')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('account')->eq($user->account)->fetch(); + $zentaoBindUser = $this->dao->select('account')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('account')->eq($gitlabUser->account)->fetch(); if($zentaoBindUser) { dao::$errors['account'][] = $this->lang->gitlab->user->bindError; @@ -2484,21 +2478,21 @@ class gitlabModel extends model } } - $response = $this->apiCreateUser($gitlabID, $user); + $response = $this->apiCreateUser($gitlabID, $gitlabUser); if(!empty($response->id)) { $this->loadModel('action')->create('gitlabuser', $response->id, 'created', '', $response->name); /* Bind user. */ - if($user->account) + if($gitlabUser->account) { - $userBind = new stdclass; - $userBind->providerID = $gitlabID; - $userBind->providerType = 'gitlab'; - $userBind->account = $user->account; - $userBind->openID = $response->id; - $this->dao->insert(TABLE_OAUTH)->data($userBind)->exec(); + $gitlabUserBind = new stdclass; + $gitlabUserBind->providerID = $gitlabID; + $gitlabUserBind->providerType = 'gitlab'; + $gitlabUserBind->account = $gitlabUser->account; + $gitlabUserBind->openID = $response->id; + $this->dao->insert(TABLE_OAUTH)->data($gitlabUserBind)->exec(); } return true; } @@ -2514,30 +2508,22 @@ class gitlabModel extends model * @access public * @return bool */ - public function editUser(int $gitlabID): bool + public function editUser(int $gitlabID, object $gitlabUser): bool { - $user = fixer::input('post') - ->setDefault('can_create_group', 0) - ->setDefault('external', 0) - ->remove('username,avatar') - ->removeIF(!$this->post->password, 'password,password_repeat') - ->get(); - if(!empty($_FILES['avatar']['name'])) $user->avatar = curl_file_create($_FILES['avatar']['tmp_name'], $_FILES['avatar']['type'], $_FILES['avatar']['name']); - - if(empty($user->account)) dao::$errors['account'][] = $this->lang->gitlab->user->bind . $this->lang->gitlab->user->emptyError; - if(empty($user->name)) dao::$errors['name'][] = $this->lang->gitlab->user->name . $this->lang->gitlab->user->emptyError; - if(empty($user->email)) dao::$errors['email'][] = $this->lang->gitlab->user->email . $this->lang->gitlab->user->emptyError; + if(empty($gitlabUser->account)) dao::$errors['account'][] = $this->lang->gitlab->user->bind . $this->lang->gitlab->user->emptyError; + if(empty($gitlabUser->name)) dao::$errors['name'][] = $this->lang->gitlab->user->name . $this->lang->gitlab->user->emptyError; + if(empty($gitlabUser->email)) dao::$errors['email'][] = $this->lang->gitlab->user->email . $this->lang->gitlab->user->emptyError; if(dao::isError()) return false; - if(!empty($user->password) and $user->password != $user->password_repeat) + if(!empty($gitlabUser->password) and $gitlabUser->password != $gitlabUser->password_repeat) { dao::$errors[] = $this->lang->gitlab->user->passwordError; return false; } /* Check whether the user has been bind. */ - if($user->account) + if($gitlabUser->account) { - $zentaoBindUser = $this->dao->select('account,openID')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('account')->eq($user->account)->fetch(); - $changeBind = (!$zentaoBindUser or $zentaoBindUser->openID != $user->id) ? true : false; + $zentaoBindUser = $this->dao->select('account,openID')->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('account')->eq($gitlabUser->account)->fetch(); + $changeBind = (!$zentaoBindUser or $zentaoBindUser->openID != $gitlabUser->id) ? true : false; if($zentaoBindUser && $changeBind) { dao::$errors['bind'][] = $this->lang->gitlab->user->bindError; @@ -2545,23 +2531,23 @@ class gitlabModel extends model } } - $response = $this->apiUpdateUser($gitlabID, $user); + $response = $this->apiUpdateUser($gitlabID, $gitlabUser); if(!empty($response->id)) { $this->loadModel('action')->create('gitlabuser', $response->id, 'edited', '', $response->name); /* Delete old bind. */ - $this->dao->delete()->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('openID')->eq($response->id)->andWhere('account')->ne($user->account)->exec(); + $this->dao->delete()->from(TABLE_OAUTH)->where('providerType')->eq('gitlab')->andWhere('providerID')->eq($gitlabID)->andWhere('openID')->eq($response->id)->andWhere('account')->ne($gitlabUser->account)->exec(); /* Bind user. */ - if($user->account && $changeBind) + if($gitlabUser->account && $changeBind) { - $userBind = new stdclass; - $userBind->providerID = $gitlabID; - $userBind->providerType = 'gitlab'; - $userBind->account = $user->account; - $userBind->openID = $response->id; - $this->dao->replace(TABLE_OAUTH)->data($userBind)->exec(); + $gitlabUserBind = new stdclass; + $gitlabUserBind->providerID = $gitlabID; + $gitlabUserBind->providerType = 'gitlab'; + $gitlabUserBind->account = $gitlabUser->account; + $gitlabUserBind->openID = $response->id; + $this->dao->replace(TABLE_OAUTH)->data($gitlabUserBind)->exec(); } return true; } @@ -3054,46 +3040,6 @@ class gitlabModel extends model return $this->apiGet($apiRoot, '/user'); } - /** - * 获取gitlab菜单。 - * Get gitlab menu. - * - * @param int $gitlabID - * @param string $type - * @access public - * @return string - */ - public function getGitlabMenu(int $gitlabID = 0, string $type = 'project'): string - { - $html = '
'; - return $html; - } - /** * 通过api获取流水线。 * Get pipeline with api. diff --git a/module/gitlab/zen.php b/module/gitlab/zen.php new file mode 100644 index 0000000000..8ad16afe13 --- /dev/null +++ b/module/gitlab/zen.php @@ -0,0 +1,231 @@ + + * @package gitlab + * @link https://www.zentao.net + */ +class gitlabZen extends gitlab +{ + /** + * 检查绑定用户是否重复。 + * Check bind user repeat. + * + * @param array $zentaoUsers + * @access protected + * @return array + */ + protected function checkUserRepeat(array $zentaoUsers): array + { + $accountList = array(); + $repeatUsers = array(); + foreach($zentaoUsers as $openID => $user) + { + if(empty($user)) continue; + if(isset($accountList[$user])) $repeatUsers[] = zget($userPairs, $user); + $accountList[$user] = $openID; + } + + if(count($repeatUsers)) return array('result' => 'fail', 'message' => sprintf($this->lang->gitlab->bindUserError, join(',', array_unique($repeatUsers)))); + return array('result' => 'success'); + } + + /** + * 绑定用户。 + * Bind user. + * + * @param int $gitlabID + * @param array $users + * @param array $gitlabNames + * @param array $zentaoUsers + * @access protected + * @return void + */ + protected function bindUsers(int $gitlabID, array $users, array $gitlabNames, array $zentaoUsers): void + { + $user = new stdclass; + $user->providerID = $gitlabID; + $user->providerType = 'gitlab'; + + $oldUsers = $this->dao->select('*')->from(TABLE_OAUTH)->where('providerType')->eq($user->providerType)->andWhere('providerID')->eq($user->providerID)->fetchAll('openID'); + foreach($users as $openID => $account) + { + $existAccount = isset($oldUsers[$openID]) ? $oldUsers[$openID] : ''; + + if($existAccount and $existAccount->account != $account) + { + $this->dao->delete() + ->from(TABLE_OAUTH) + ->where('openID')->eq($openID) + ->andWhere('providerType')->eq($user->providerType) + ->andWhere('providerID')->eq($user->providerID) + ->exec(); + $this->loadModel('action')->create('gitlabuser', $openID, 'unbind', '', sprintf($this->lang->gitlab->bindDynamic, $gitlabNames[$openID], $zentaoUsers[$existAccount->account]->realname)); + } + if(!$existAccount or $existAccount->account != $account) + { + if(!$account) continue; + $user->account = $account; + $user->openID = $openID; + $this->dao->insert(TABLE_OAUTH)->data($user)->exec(); + $this->loadModel('action')->create('gitlabuser', $openID, 'bind', '', sprintf($this->lang->gitlab->bindDynamic, $gitlabNames[$openID], $zentaoUsers[$account]->realname)); + } + } + } + + /** + * 记录webhook日志。 + * Record webhook logs. + * + * @param string $input + * @param object $result + * @access protected + * @return void + */ + protected function recordWebhookLogs(string $input, object $result): void + { + $logFile = $this->app->getLogRoot() . 'webhook.'. date('Ymd') . '.log.php'; + if(!file_exists($logFile)) file_put_contents($logFile, ''); + + $fh = @fopen($logFile, 'a'); + if($fh) + { + fwrite($fh, date('Ymd H:i:s') . ": " . $this->app->getURI() . "\n"); + fwrite($fh, "JSON: \n " . $input . "\n"); + fwrite($fh, "Parsed object: {$result->issue->objectType} :\n " . print_r($result->object, true) . "\n"); + fclose($fh); + } + } + + /** + * 获取gitlab组新增、删除、更新成员数据。 + * Get group added、deleted、updated member data. + * + * @param array $currentMembers + * @param array $newMembers + * @access protected + * @return array + */ + protected function getGroupMemberData(array $currentMembers, array $newMembers): array + { + /* Get the updated,deleted data. */ + $addedMembers = $deletedMembers = $updatedMembers = array(); + foreach($currentMembers as $currentMember) + { + $memberID = $currentMember->id; + if(empty($newMembers[$memberID])) + { + $deletedMembers[] = $memberID; + } + else + { + if($newMembers[$memberID]->access_level != $currentMember->access_level or $newMembers[$memberID]->expires_at != $currentMember->expires_at) + { + $updatedData = new stdClass(); + $updatedData->user_id = $memberID; + $updatedData->access_level = $newMembers[$memberID]->access_level; + $updatedData->expires_at = $newMembers[$memberID]->expires_at; + $updatedMembers[] = $updatedData; + } + } + } + /* Get the added data. */ + foreach($newMembers as $id => $newMember) + { + $exist = false; + foreach($currentMembers as $currentMember) + { + if($currentMember->id == $id) + { + $exist = true; + break; + } + } + if($exist == false) + { + $addedData = new stdClass(); + $addedData->user_id = $id; + $addedData->access_level = $newMembers[$id]->access_level; + $addedData->expires_at = $newMembers[$id]->expires_at; + $addedMembers[] = $addedData; + } + } + + return array($addedMembers, $deletedMembers, $updatedMembers); + } + + /** + * 获取项目成员数据。 + * Get project member data. + * + * @param array $gitlabCurrentMembers + * @param array $newGitlabMembers + * @param array $bindedUsers + * @param array $accounts + * @param array $originalUsers + * @access protected + * @return array + */ + protected function getProjectMemberData(array $gitlabCurrentMembers, array $newGitlabMembers, array $bindedUsers, array $accounts, array $originalUsers): array + { + $addedMembers = $updatedMembers = $deletedMembers = array(); + /* Get the updated data. */ + foreach($gitlabCurrentMembers as $gitlabCurrentMember) + { + $memberID = isset($gitlabCurrentMember->id) ? $gitlabCurrentMember->id : 0; + if(!isset($newGitlabMembers[$memberID])) continue; + if($newGitlabMembers[$memberID]->access_level != $gitlabCurrentMember->access_level or $newGitlabMembers[$memberID]->expires_at != $gitlabCurrentMember->expires_at) + { + $updatedData = new stdClass(); + $updatedData->user_id = $memberID; + $updatedData->access_level = $newGitlabMembers[$memberID]->access_level; + $updatedData->expires_at = $newGitlabMembers[$memberID]->expires_at; + $updatedMembers[] = $updatedData; + } + } + /* Get the added data. */ + foreach($newGitlabMembers as $id => $newMember) + { + $exist = false; + foreach($gitlabCurrentMembers as $gitlabCurrentMember) + { + if($gitlabCurrentMember->id == $id) + { + $exist = true; + break; + } + } + if($exist == false) + { + $addedData = new stdClass(); + $addedData->user_id = $id; + $addedData->access_level = $newGitlabMembers[$id]->access_level; + $addedData->expires_at = $newGitlabMembers[$id]->expires_at; + $addedMembers[] = $addedData; + } + } + /* Get the deleted data. */ + foreach($originalUsers as $user) + { + if(!in_array($user, $accounts) and isset($bindedUsers[$user])) + { + $exist = false; + foreach($gitlabCurrentMembers as $gitlabCurrentMember) + { + if($gitlabCurrentMember->id == $bindedUsers[$user]) + { + $exist = true; + $deletedMembers[] = $gitlabCurrentMember->id; + break; + } + } + } + } + + return array($addedMembers, $deletedMembers, $updatedMembers); + } +} diff --git a/module/repo/model.php b/module/repo/model.php index 6a78c29bc3..7ae971a709 100644 --- a/module/repo/model.php +++ b/module/repo/model.php @@ -1834,8 +1834,8 @@ class repoModel extends model { $repo->codePath = $service ? "{$service->url}/{$repo->serviceProject}" : $repo->path; } - $repo->gitService = $repo->serviceHost; - $repo->project = $repo->serviceProject; + $repo->gitService = (int)$repo->serviceHost; + $repo->project = (int)$repo->serviceProject; return $repo; } @@ -2295,7 +2295,7 @@ class repoModel extends model $showAll = ($filter == 'ALL' and common::hasPriv('repo', 'create')) ? true : false; if($this->app->user->admin or $showAll) { - $projects = $this->loadModel('gitlab')->apiGetProjects($gitlabID, true, 0, 0, false); + $projects = $this->loadModel('gitlab')->apiGetProjects($gitlabID, 'true', 0, 0, false); } else {