You've already forked woodpecker
mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-11-23 21:44:44 +02:00
Consider gitlab inherited permissions (#3308)
The gitlab projects endpoint does not include information about permissions granted by namespace memberships. To get this information a separate query to https://docs.gitlab.com/ee/api/members.html#get-a-member-of-a-group-or-project-including-inherited-and-invited-members is necessary.
This commit is contained in:
@@ -246,6 +246,20 @@ func (g *GitLab) getProject(ctx context.Context, client *gitlab.Client, forgeRem
|
||||
return repo, err
|
||||
}
|
||||
|
||||
func (g *GitLab) getInheritedProjectMember(ctx context.Context, client *gitlab.Client, forgeRemoteID model.ForgeRemoteID, owner, name string, userID int) (*gitlab.ProjectMember, error) {
|
||||
if forgeRemoteID.IsValid() {
|
||||
intID, err := strconv.Atoi(string(forgeRemoteID))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
projectMember, _, err := client.ProjectMembers.GetInheritedProjectMember(intID, userID, gitlab.WithContext(ctx))
|
||||
return projectMember, err
|
||||
}
|
||||
|
||||
projectMember, _, err := client.ProjectMembers.GetInheritedProjectMember(fmt.Sprintf("%s/%s", owner, name), userID, gitlab.WithContext(ctx))
|
||||
return projectMember, err
|
||||
}
|
||||
|
||||
// Repo fetches the repository from the forge.
|
||||
func (g *GitLab) Repo(ctx context.Context, user *model.User, remoteID model.ForgeRemoteID, owner, name string) (*model.Repo, error) {
|
||||
client, err := newClient(g.url, user.Token, g.SkipVerify)
|
||||
@@ -258,7 +272,17 @@ func (g *GitLab) Repo(ctx context.Context, user *model.User, remoteID model.Forg
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return g.convertGitLabRepo(_repo)
|
||||
intUserID, err := strconv.Atoi(string(user.ForgeRemoteID))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
projectMember, err := g.getInheritedProjectMember(ctx, client, remoteID, owner, name, intUserID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return g.convertGitLabRepo(_repo, projectMember)
|
||||
}
|
||||
|
||||
// Repos fetches a list of repos from the forge.
|
||||
@@ -276,6 +300,10 @@ func (g *GitLab) Repos(ctx context.Context, user *model.User) ([]*model.Repo, er
|
||||
if g.HideArchives {
|
||||
opts.Archived = gitlab.Ptr(false)
|
||||
}
|
||||
intUserID, err := strconv.Atoi(string(user.ForgeRemoteID))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for i := 1; true; i++ {
|
||||
opts.Page = i
|
||||
@@ -285,7 +313,12 @@ func (g *GitLab) Repos(ctx context.Context, user *model.User) ([]*model.Repo, er
|
||||
}
|
||||
|
||||
for i := range batch {
|
||||
repo, err := g.convertGitLabRepo(batch[i])
|
||||
projectMember, _, err := client.ProjectMembers.GetInheritedProjectMember(batch[i].ID, intUserID, gitlab.WithContext(ctx))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
repo, err := g.convertGitLabRepo(batch[i], projectMember)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user