Merge branch 'zenops_41' into 'liyuchun_62870'

# Conflicts:
#   module/gogs/model.php
#   module/repo/config.php
This commit is contained in:
李玉春
2022-08-02 05:38:32 +00:00
38 changed files with 938 additions and 236 deletions
+32 -130
View File
@@ -12,14 +12,6 @@
class gogsModel extends model
{
const HOOK_PUSH_EVENT = 'Push Hook';
/* Gitlab access level. */
public $noAccess = 0;
public $developerAccess = 30;
public $maintainerAccess = 40;
/**
* Get a gogs by id.
*
@@ -62,23 +54,15 @@ class gogsModel extends model
* Get gogs api base url by gogs id.
*
* @param int $gogsID
* @param bool $sudo
* @access public
* @return string
*/
public function getApiRoot($gogsID, $sudo = true)
public function getApiRoot($gogsID)
{
$gogs = $this->getByID($gogsID);
if(!$gogs) return '';
$sudoParam = '';
if($sudo == true and !$this->app->user->admin)
{
$openID = $this->getUserIDByZentaoAccount($gogsID, $this->app->user->account);
if($openID) $sudoParam = "&sudo={$openID}";
}
return rtrim($gogs->url, '/') . '/api/v1%s' . "?token={$gogs->token}" . $sudoParam;
return rtrim($gogs->url, '/') . '/api/v1%s' . "?token={$gogs->token}";
}
/**
@@ -207,45 +191,6 @@ class gogsModel extends model
return false;
}
/**
* Check user access.
*
* @param int $gogsID
* @param int $projectID
* @param object $project
* @param string $maxRole
* @access public
* @return bool
*/
public function checkUserAccess($gogsID, $projectID = 0, $project = null, $groupIDList = array(), $maxRole = 'maintainer')
{
if($this->app->user->admin) return true;
if($project == null) $project = $this->apiGetSingleProject($gogsID, $projectID);
if(!isset($project->id)) return false;
$accessLevel = $this->config->gogs->accessLevel[$maxRole];
if(isset($project->permissions->project_access->access_level) and $project->permissions->project_access->access_level >= $accessLevel) return true;
if(isset($project->permissions->group_access->access_level) and $project->permissions->group_access->access_level >= $accessLevel) return true;
if(!empty($project->shared_with_groups))
{
if(empty($groupIDList))
{
$groups = $this->apiGetGroups($gogsID, 'name_asc', $maxRole);
foreach($groups as $group) $groupIDList[] = $group->id;
}
foreach($project->shared_with_groups as $group)
{
if($group->group_access_level < $accessLevel) continue;
if(in_array($group->group_id, $groupIDList)) return true;
}
}
return false;
}
/**
* Check token access.
*
@@ -408,28 +353,48 @@ class gogsModel extends model
* Get projects by api.
*
* @param int $gogsID
* @param bool $sudo
* @access public
* @return array
*/
public function apiGetProjects($gogsID, $sudo = true)
public function apiGetProjects($gogsID)
{
$apiRoot = $this->getApiRoot($gogsID, $sudo);
$apiRoot = $this->getApiRoot($gogsID);
if(!$apiRoot) return array();
$url = sprintf($apiRoot, "/repos/search");
$user = $this->apiGetAdminer($gogsID);
if(!$user) return array();
$url = sprintf($apiRoot, "/users/{$user->username}/repos");
$allResults = array();
for($page = 1; true; $page++)
{
$results = json_decode(commonModel::http($url . "&page={$page}&limit=50"));
if(!is_array($results->data)) break;
if(!empty($results->data)) $allResults = array_merge($allResults, $results->data);
if(count($results->data) < 50) break;
if(!is_array($results)) break;
if(!empty($results)) $allResults = array_merge($allResults, $results);
if(count($results) < 50) break;
}
return $allResults;
}
/**
* Api get adminer.
*
* @param int $gogsID
* @access public
* @return void
*/
public function apiGetAdminer($gogsID)
{
$apiRoot = $this->getApiRoot($gogsID);
if(!$apiRoot) return array();
$url = sprintf($apiRoot, "/user");
$user = json_decode(commonModel::http($url));
return isset($user->username) ? $user : null;
}
/**
* Get gogs user list.
*
@@ -502,31 +467,17 @@ class gogsModel extends model
return $allResults;
}
/**
* Get Forks of a project by API.
*
* @param int $gogsID
* @param string $projectID
* @access public
* @return object
*/
public function apiGetForks($gogsID, $projectID)
{
$url = sprintf($this->getApiRoot($gogsID), "/repos/$projectID/forks");
return json_decode(commonModel::http($url));
}
/**
* Get upstream project by API.
*
* @param int $gogsID
* @param string $projectID
* @param string $project
* @access public
* @return void
*/
public function apiGetUpstream($gogsID, $projectID)
public function apiGetUpstream($gogsID, $project)
{
$currentProject = $this->apiGetSingleProject($gogsID, $projectID);
$currentProject = $this->apiGetSingleProject($gogsID, $project);
if(isset($currentProject->parent->full_name)) return $currentProject->parent->full_name;
return array();
}
@@ -566,53 +517,4 @@ class gogsModel extends model
->andWhere('providerID')->eq($gogsID)
->fetchPairs();
}
/**
* Get single branch by API.
*
* @param int $gogsID
* @param string $project
* @param string $branchName
* @access public
* @return object
*/
public function apiGetSingleBranch($gogsID, $project, $branchName)
{
$url = sprintf($this->getApiRoot($gogsID), "/repos/$project/branches/$branchName");
$branch = json_decode(commonModel::http($url));
if($branch)
{
$gogs = $this->getByID($gogsID);
$branch->web_url = "{$gogs->url}/$project/src/branch/$branchName";
}
return $branch;
}
/**
* Get protect branches of one project.
*
* @param int $gogsID
* @param string $project
* @param string $keyword
* @access public
* @return array
*/
public function apiGetBranchPrivs($gogsID, $project, $keyword = '')
{
$keyword = urlencode($keyword);
$url = sprintf($this->getApiRoot($gogsID), "/repos/$project/branch_protections");
$branches = json_decode(commonModel::http($url));
if(!is_array($branches)) return $branches;
$newBranches = array();
foreach($branches as $branch)
{
$branch->name = $branch->branch_name;
if(empty($keyword) || stristr($branch->name, $keyword)) $newBranches[] = $branch;
}
return $newBranches;
}
}