Skip to content

Commit

Permalink
Refactor remote OrgMembership method
Browse files Browse the repository at this point in the history
  • Loading branch information
lafriks committed Jul 24, 2022
1 parent 5931df5 commit fc62a6d
Show file tree
Hide file tree
Showing 10 changed files with 39 additions and 45 deletions.
3 changes: 1 addition & 2 deletions server/cache/membership.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,10 @@ func (c *membershipCache) Get(ctx context.Context, u *model.User, name string) (
return item.Value(), nil
}

member, admin, err := c.Remote.OrgMembership(ctx, u, name)
perm, err := c.Remote.OrgMembership(ctx, u, name)
if err != nil {
return nil, err
}
perm := &model.OrgPerm{Member: member, Admin: admin}
c.Cache.Set(key, perm, c.TTL)
return perm, nil
}
6 changes: 3 additions & 3 deletions server/remote/bitbucket/bitbucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,12 +303,12 @@ func (c *config) Hook(ctx context.Context, req *http.Request) (*model.Repo, *mod

// OrgMembership returns if user is member of organization and if user
// is admin/owner in this organization.
func (c *config) OrgMembership(ctx context.Context, u *model.User, owner string) (bool, bool, error) {
func (c *config) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) {
perm, err := c.newClient(ctx, u).GetUserWorkspaceMembership(owner, u.Login)
if err != nil {
return false, false, err
return nil, err
}
return perm != "", perm == "owner", nil
return &model.OrgPerm{Member: perm != "", Admin: perm == "owner"}, nil
}

// helper function to return the bitbucket oauth2 client
Expand Down
4 changes: 2 additions & 2 deletions server/remote/bitbucketserver/bitbucketserver.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,9 +247,9 @@ func (c *Config) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model

// OrgMembership returns if user is member of organization and if user
// is admin/owner in this organization.
func (c *Config) OrgMembership(ctx context.Context, u *model.User, owner string) (bool, bool, error) {
func (c *Config) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) {
// TODO: Not implemented currently
return false, false, nil
return nil, nil
}

func CreateConsumer(URL, ConsumerKey string, PrivateKey *rsa.PrivateKey) *oauth.Consumer {
Expand Down
4 changes: 2 additions & 2 deletions server/remote/coding/coding.go
Original file line number Diff line number Diff line change
Expand Up @@ -303,9 +303,9 @@ func (c *Coding) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model

// OrgMembership returns if user is member of organization and if user
// is admin/owner in this organization.
func (c *Coding) OrgMembership(ctx context.Context, u *model.User, owner string) (bool, bool, error) {
func (c *Coding) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) {
// TODO: Not supported in Coding OAuth API
return false, false, nil
return nil, nil
}

// helper function to return the Coding oauth2 context using an HTTPClient that
Expand Down
12 changes: 6 additions & 6 deletions server/remote/gitea/gitea.go
Original file line number Diff line number Diff line change
Expand Up @@ -460,27 +460,27 @@ func (c *Gitea) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model.

// OrgMembership returns if user is member of organization and if user
// is admin/owner in this organization.
func (c *Gitea) OrgMembership(ctx context.Context, u *model.User, owner string) (bool, bool, error) {
func (c *Gitea) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) {
client, err := c.newClientToken(ctx, u.Token)
if err != nil {
return false, false, err
return nil, err
}

member, _, err := client.CheckOrgMembership(owner, u.Login)
if err != nil {
return false, false, err
return nil, err
}

if !member {
return false, false, nil
return &model.OrgPerm{}, nil
}

perm, _, err := client.GetOrgPermissions(owner, u.Login)
if err != nil {
return member, false, err
return &model.OrgPerm{Member: member}, err
}

return member, perm.IsAdmin || perm.IsOwner, nil
return &model.OrgPerm{Member: member, Admin: perm.IsAdmin || perm.IsOwner}, nil
}

// helper function to return the Gitea client with Token
Expand Down
6 changes: 3 additions & 3 deletions server/remote/github/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -307,14 +307,14 @@ func (c *client) Deactivate(ctx context.Context, u *model.User, r *model.Repo, l

// OrgMembership returns if user is member of organization and if user
// is admin/owner in this organization.
func (c *client) OrgMembership(ctx context.Context, u *model.User, owner string) (bool, bool, error) {
func (c *client) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) {
client := c.newClientToken(ctx, u.Token)
org, _, err := client.Organizations.GetOrgMembership(ctx, u.Login, owner)
if err != nil {
return false, false, err
return nil, err
}

return org.GetState() == "active", org.GetRole() == "admin", nil
return &model.OrgPerm{Member: org.GetState() == "active", Admin: org.GetRole() == "admin"}, nil
}

// helper function to return the GitHub oauth2 context using an HTTPClient that
Expand Down
14 changes: 7 additions & 7 deletions server/remote/gitlab/gitlab.go
Original file line number Diff line number Diff line change
Expand Up @@ -556,10 +556,10 @@ func (g *Gitlab) Hook(ctx context.Context, req *http.Request) (*model.Repo, *mod

// OrgMembership returns if user is member of organization and if user
// is admin/owner in this organization.
func (g *Gitlab) OrgMembership(ctx context.Context, u *model.User, owner string) (bool, bool, error) {
func (g *Gitlab) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) {
client, err := newClient(g.URL, u.Token, g.SkipVerify)
if err != nil {
return false, false, err
return nil, err
}

groups, _, err := client.Groups.ListGroups(&gitlab.ListGroupsOptions{
Expand All @@ -570,7 +570,7 @@ func (g *Gitlab) OrgMembership(ctx context.Context, u *model.User, owner string)
Search: gitlab.String(owner),
}, gitlab.WithContext(ctx))
if err != nil {
return false, false, err
return nil, err
}
var gid int
for _, group := range groups {
Expand All @@ -580,7 +580,7 @@ func (g *Gitlab) OrgMembership(ctx context.Context, u *model.User, owner string)
}
}
if gid == 0 {
return false, false, nil
return &model.OrgPerm{}, nil
}

opts := &gitlab.ListGroupMembersOptions{
Expand All @@ -594,11 +594,11 @@ func (g *Gitlab) OrgMembership(ctx context.Context, u *model.User, owner string)
opts.Page = i
members, _, err := client.Groups.ListAllGroupMembers(gid, opts, gitlab.WithContext(ctx))
if err != nil {
return false, false, err
return nil, err
}
for _, member := range members {
if member.Username == u.Login {
return true, member.AccessLevel >= gitlab.OwnerPermissions, nil
return &model.OrgPerm{Member: true, Admin: member.AccessLevel >= gitlab.OwnerPermissions}, nil
}
}

Expand All @@ -607,7 +607,7 @@ func (g *Gitlab) OrgMembership(ctx context.Context, u *model.User, owner string)
}
}

return false, false, nil
return &model.OrgPerm{}, nil
}

func (g *Gitlab) loadChangedFilesFromMergeRequest(ctx context.Context, tmpRepo *model.Repo, build *model.Build, mergeIID int) (*model.Build, error) {
Expand Down
8 changes: 4 additions & 4 deletions server/remote/gogs/gogs.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,21 +292,21 @@ func (c *client) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model

// OrgMembership returns if user is member of organization and if user
// is admin/owner in this organization.
func (c *client) OrgMembership(ctx context.Context, u *model.User, owner string) (bool, bool, error) {
func (c *client) OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error) {
client := c.newClientToken(u.Token)

orgs, err := client.ListMyOrgs()
if err != nil {
return false, false, err
return nil, err
}

for _, org := range orgs {
if org.UserName == owner {
// TODO: API does not support checking if user is admin/owner of org
return true, false, nil
return &model.OrgPerm{Member: true}, nil
}
}
return false, false, nil
return &model.OrgPerm{}, nil
}

// helper function to return the Gogs client
Expand Down
25 changes: 10 additions & 15 deletions server/remote/mocks/remote.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion server/remote/remote.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ type Remote interface {

// OrgMembership returns if user is member of organization and if user
// is admin/owner in that organization.
OrgMembership(ctx context.Context, u *model.User, owner string) (member, admin bool, err error)
OrgMembership(ctx context.Context, u *model.User, owner string) (*model.OrgPerm, error)
}

// FileMeta represents a file in version control
Expand Down

0 comments on commit fc62a6d

Please sign in to comment.