Skip to content

Commit d9c36da

Browse files
authored
Merge branch 'main' into auto-merge_webUI
2 parents 6dfe7d6 + d81e31a commit d9c36da

File tree

6 files changed

+98
-127
lines changed

6 files changed

+98
-127
lines changed

models/organization/org_user.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package organization
66

77
import (
88
"context"
9+
"fmt"
910

1011
"code.gitea.io/gitea/models/db"
1112
user_model "code.gitea.io/gitea/models/user"
@@ -81,3 +82,43 @@ func CanCreateOrgRepo(orgID, uid int64) (bool, error) {
8182
And("team_user.org_id = ?", orgID).
8283
Exist(new(Team))
8384
}
85+
86+
// IsUserOrgOwner returns true if user is in the owner team of given organization.
87+
func IsUserOrgOwner(users user_model.UserList, orgID int64) map[int64]bool {
88+
results := make(map[int64]bool, len(users))
89+
for _, user := range users {
90+
results[user.ID] = false // Set default to false
91+
}
92+
ownerMaps, err := loadOrganizationOwners(db.DefaultContext, users, orgID)
93+
if err == nil {
94+
for _, owner := range ownerMaps {
95+
results[owner.UID] = true
96+
}
97+
}
98+
return results
99+
}
100+
101+
func loadOrganizationOwners(ctx context.Context, users user_model.UserList, orgID int64) (map[int64]*TeamUser, error) {
102+
if len(users) == 0 {
103+
return nil, nil
104+
}
105+
ownerTeam, err := GetOwnerTeam(ctx, orgID)
106+
if err != nil {
107+
if IsErrTeamNotExist(err) {
108+
log.Error("Organization does not have owner team: %d", orgID)
109+
return nil, nil
110+
}
111+
return nil, err
112+
}
113+
114+
userIDs := users.GetUserIDs()
115+
ownerMaps := make(map[int64]*TeamUser)
116+
err = db.GetEngine(ctx).In("uid", userIDs).
117+
And("org_id=?", orgID).
118+
And("team_id=?", ownerTeam.ID).
119+
Find(&ownerMaps)
120+
if err != nil {
121+
return nil, fmt.Errorf("find team users: %v", err)
122+
}
123+
return ownerMaps, nil
124+
}

models/organization/org_user_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,57 @@ func testIsUserOrgOwner(t *testing.T, uid, orgID int64, expected bool) {
7070
assert.NoError(t, err)
7171
assert.Equal(t, expected, is)
7272
}
73+
74+
func TestUserListIsPublicMember(t *testing.T) {
75+
assert.NoError(t, unittest.PrepareTestDatabase())
76+
tt := []struct {
77+
orgid int64
78+
expected map[int64]bool
79+
}{
80+
{3, map[int64]bool{2: true, 4: false, 28: true}},
81+
{6, map[int64]bool{5: true, 28: true}},
82+
{7, map[int64]bool{5: false}},
83+
{25, map[int64]bool{24: true}},
84+
{22, map[int64]bool{}},
85+
}
86+
for _, v := range tt {
87+
t.Run(fmt.Sprintf("IsPublicMemberOfOrdIg%d", v.orgid), func(t *testing.T) {
88+
testUserListIsPublicMember(t, v.orgid, v.expected)
89+
})
90+
}
91+
}
92+
93+
func testUserListIsPublicMember(t *testing.T, orgID int64, expected map[int64]bool) {
94+
org, err := GetOrgByID(orgID)
95+
assert.NoError(t, err)
96+
_, membersIsPublic, err := org.GetMembers()
97+
assert.NoError(t, err)
98+
assert.Equal(t, expected, membersIsPublic)
99+
}
100+
101+
func TestUserListIsUserOrgOwner(t *testing.T) {
102+
assert.NoError(t, unittest.PrepareTestDatabase())
103+
tt := []struct {
104+
orgid int64
105+
expected map[int64]bool
106+
}{
107+
{3, map[int64]bool{2: true, 4: false, 28: false}},
108+
{6, map[int64]bool{5: true, 28: false}},
109+
{7, map[int64]bool{5: true}},
110+
{25, map[int64]bool{24: false}}, // ErrTeamNotExist
111+
{22, map[int64]bool{}}, // No member
112+
}
113+
for _, v := range tt {
114+
t.Run(fmt.Sprintf("IsUserOrgOwnerOfOrdIg%d", v.orgid), func(t *testing.T) {
115+
testUserListIsUserOrgOwner(t, v.orgid, v.expected)
116+
})
117+
}
118+
}
119+
120+
func testUserListIsUserOrgOwner(t *testing.T, orgID int64, expected map[int64]bool) {
121+
org, err := GetOrgByID(orgID)
122+
assert.NoError(t, err)
123+
members, _, err := org.GetMembers()
124+
assert.NoError(t, err)
125+
assert.Equal(t, expected, IsUserOrgOwner(members, orgID))
126+
}

models/userlist.go

Lines changed: 0 additions & 55 deletions
This file was deleted.

models/userlist_test.go

Lines changed: 0 additions & 69 deletions
This file was deleted.

modules/doctor/dbconsistency.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,10 @@ func checkDBConsistency(ctx context.Context, logger log.Logger, autofix bool) er
191191
"action", "repository", "action.repo_id=repository.id"),
192192
// find OAuth2Grant without existing user
193193
genericOrphanCheck("Orphaned OAuth2Grant without existing User",
194-
"oauth2_grant", "user", "oauth2_grant.user_id=user.id"),
194+
"oauth2_grant", "user", "oauth2_grant.user_id=`user`.id"),
195195
// find OAuth2Application without existing user
196196
genericOrphanCheck("Orphaned OAuth2Application without existing User",
197-
"oauth2_application", "user", "oauth2_application.uid=user.id"),
197+
"oauth2_application", "user", "oauth2_application.uid=`user`.id"),
198198
// find OAuth2AuthorizationCode without existing OAuth2Grant
199199
genericOrphanCheck("Orphaned OAuth2AuthorizationCode without existing OAuth2Grant",
200200
"oauth2_authorization_code", "oauth2_grant", "oauth2_authorization_code.grant_id=oauth2_grant.id"),

routers/web/org/members.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func Members(ctx *context.Context) {
6363
ctx.Data["Page"] = pager
6464
ctx.Data["Members"] = members
6565
ctx.Data["MembersIsPublicMember"] = membersIsPublic
66-
ctx.Data["MembersIsUserOrgOwner"] = models.IsUserOrgOwner(members, org.ID)
66+
ctx.Data["MembersIsUserOrgOwner"] = organization.IsUserOrgOwner(members, org.ID)
6767
ctx.Data["MembersTwoFaStatus"] = members.GetTwoFaStatus()
6868

6969
ctx.HTML(http.StatusOK, tplMembers)

0 commit comments

Comments
 (0)