Skip to content

Commit 8ae46d9

Browse files
authored
Fix some user name usages (#33689)
1. GetUserOrgsList should "order by" lower_name 2. GetIssuePostersWithSearch should search in-case-sensitive-ly 3. LoginName should not be used as username By the way, remove unnecessary "onGiteaRun"
1 parent f991807 commit 8ae46d9

File tree

5 files changed

+125
-92
lines changed

5 files changed

+125
-92
lines changed

models/organization/org_list.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ func GetUserOrgsList(ctx context.Context, user *user_model.User) ([]*MinimalOrg,
124124
if err := db.GetEngine(ctx).Select(columnsStr).
125125
Table("user").
126126
Where(builder.In("`user`.`id`", queryUserOrgIDs(user.ID, true))).
127+
OrderBy("`user`.lower_name ASC").
127128
Find(&orgs); err != nil {
128129
return nil, err
129130
}

models/repo/user_repo.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package repo
55

66
import (
77
"context"
8+
"strings"
89

910
"code.gitea.io/gitea/models/db"
1011
"code.gitea.io/gitea/models/perm"
@@ -149,9 +150,9 @@ func GetRepoAssignees(ctx context.Context, repo *Repository) (_ []*user_model.Us
149150
// If isShowFullName is set to true, also include full name prefix search
150151
func GetIssuePostersWithSearch(ctx context.Context, repo *Repository, isPull bool, search string, isShowFullName bool) ([]*user_model.User, error) {
151152
users := make([]*user_model.User, 0, 30)
152-
var prefixCond builder.Cond = builder.Like{"name", search + "%"}
153+
var prefixCond builder.Cond = builder.Like{"lower_name", strings.ToLower(search) + "%"}
153154
if isShowFullName {
154-
prefixCond = prefixCond.Or(builder.Like{"full_name", "%" + search + "%"})
155+
prefixCond = prefixCond.Or(db.BuildCaseInsensitiveLike("full_name", "%"+search+"%"))
155156
}
156157

157158
cond := builder.In("`user`.id",

models/repo/user_repo_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
user_model "code.gitea.io/gitea/models/user"
1313

1414
"github.com/stretchr/testify/assert"
15+
"github.com/stretchr/testify/require"
1516
)
1617

1718
func TestRepoAssignees(t *testing.T) {
@@ -38,3 +39,19 @@ func TestRepoAssignees(t *testing.T) {
3839
assert.NotContains(t, []int64{users[0].ID, users[1].ID, users[2].ID}, 15)
3940
}
4041
}
42+
43+
func TestGetIssuePostersWithSearch(t *testing.T) {
44+
assert.NoError(t, unittest.PrepareTestDatabase())
45+
46+
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
47+
48+
users, err := repo_model.GetIssuePostersWithSearch(db.DefaultContext, repo2, false, "USER", false /* full name */)
49+
require.NoError(t, err)
50+
require.Len(t, users, 1)
51+
assert.Equal(t, "user2", users[0].Name)
52+
53+
users, err = repo_model.GetIssuePostersWithSearch(db.DefaultContext, repo2, false, "TW%O", true /* full name */)
54+
require.NoError(t, err)
55+
require.Len(t, users, 1)
56+
assert.Equal(t, "user2", users[0].Name)
57+
}

routers/api/v1/repo/collaborators.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ package repo
77
import (
88
"errors"
99
"net/http"
10+
"strings"
1011

1112
"code.gitea.io/gitea/models/perm"
1213
access_model "code.gitea.io/gitea/models/perm/access"
@@ -274,12 +275,13 @@ func GetRepoPermissions(ctx *context.APIContext) {
274275
// "403":
275276
// "$ref": "#/responses/forbidden"
276277

277-
if !ctx.Doer.IsAdmin && ctx.Doer.LoginName != ctx.PathParam("collaborator") && !ctx.IsUserRepoAdmin() {
278+
collaboratorUsername := ctx.PathParam("collaborator")
279+
if !ctx.Doer.IsAdmin && ctx.Doer.LowerName != strings.ToLower(collaboratorUsername) && !ctx.IsUserRepoAdmin() {
278280
ctx.APIError(http.StatusForbidden, "Only admins can query all permissions, repo admins can query all repo permissions, collaborators can query only their own")
279281
return
280282
}
281283

282-
collaborator, err := user_model.GetUserByName(ctx, ctx.PathParam("collaborator"))
284+
collaborator, err := user_model.GetUserByName(ctx, collaboratorUsername)
283285
if err != nil {
284286
if user_model.IsErrUserNotExist(err) {
285287
ctx.APIError(http.StatusNotFound, err)

tests/integration/api_repo_collaborator_test.go

Lines changed: 100 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package integration
55

66
import (
77
"net/http"
8-
"net/url"
98
"testing"
109

1110
auth_model "code.gitea.io/gitea/models/auth"
@@ -14,132 +13,145 @@ import (
1413
"code.gitea.io/gitea/models/unittest"
1514
user_model "code.gitea.io/gitea/models/user"
1615
api "code.gitea.io/gitea/modules/structs"
16+
"code.gitea.io/gitea/tests"
1717

1818
"github.com/stretchr/testify/assert"
1919
)
2020

2121
func TestAPIRepoCollaboratorPermission(t *testing.T) {
22-
onGiteaRun(t, func(t *testing.T, u *url.URL) {
23-
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
24-
repo2Owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo2.OwnerID})
22+
defer tests.PrepareTestEnv(t)()
23+
repo2 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
24+
repo2Owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo2.OwnerID})
2525

26-
user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
27-
user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
28-
user10 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
29-
user11 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 11})
30-
user34 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 34})
26+
user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
27+
user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5})
28+
user10 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 10})
29+
user11 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 11})
30+
user34 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 34})
3131

32-
testCtx := NewAPITestContext(t, repo2Owner.Name, repo2.Name, auth_model.AccessTokenScopeWriteRepository)
32+
testCtx := NewAPITestContext(t, repo2Owner.Name, repo2.Name, auth_model.AccessTokenScopeWriteRepository)
3333

34-
t.Run("RepoOwnerShouldBeOwner", func(t *testing.T) {
35-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, repo2Owner.Name).
36-
AddTokenAuth(testCtx.Token)
37-
resp := MakeRequest(t, req, http.StatusOK)
34+
t.Run("RepoOwnerShouldBeOwner", func(t *testing.T) {
35+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, repo2Owner.Name).
36+
AddTokenAuth(testCtx.Token)
37+
resp := MakeRequest(t, req, http.StatusOK)
3838

39-
var repoPermission api.RepoCollaboratorPermission
40-
DecodeJSON(t, resp, &repoPermission)
39+
var repoPermission api.RepoCollaboratorPermission
40+
DecodeJSON(t, resp, &repoPermission)
4141

42-
assert.Equal(t, "owner", repoPermission.Permission)
43-
})
42+
assert.Equal(t, "owner", repoPermission.Permission)
43+
})
4444

45-
t.Run("CollaboratorWithReadAccess", func(t *testing.T) {
46-
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeRead))
45+
t.Run("CollaboratorWithReadAccess", func(t *testing.T) {
46+
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeRead))
4747

48-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
49-
AddTokenAuth(testCtx.Token)
50-
resp := MakeRequest(t, req, http.StatusOK)
48+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
49+
AddTokenAuth(testCtx.Token)
50+
resp := MakeRequest(t, req, http.StatusOK)
5151

52-
var repoPermission api.RepoCollaboratorPermission
53-
DecodeJSON(t, resp, &repoPermission)
52+
var repoPermission api.RepoCollaboratorPermission
53+
DecodeJSON(t, resp, &repoPermission)
5454

55-
assert.Equal(t, "read", repoPermission.Permission)
56-
})
55+
assert.Equal(t, "read", repoPermission.Permission)
56+
})
5757

58-
t.Run("CollaboratorWithWriteAccess", func(t *testing.T) {
59-
t.Run("AddUserAsCollaboratorWithWriteAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeWrite))
58+
t.Run("CollaboratorWithWriteAccess", func(t *testing.T) {
59+
t.Run("AddUserAsCollaboratorWithWriteAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeWrite))
6060

61-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
62-
AddTokenAuth(testCtx.Token)
63-
resp := MakeRequest(t, req, http.StatusOK)
61+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
62+
AddTokenAuth(testCtx.Token)
63+
resp := MakeRequest(t, req, http.StatusOK)
6464

65-
var repoPermission api.RepoCollaboratorPermission
66-
DecodeJSON(t, resp, &repoPermission)
65+
var repoPermission api.RepoCollaboratorPermission
66+
DecodeJSON(t, resp, &repoPermission)
6767

68-
assert.Equal(t, "write", repoPermission.Permission)
69-
})
68+
assert.Equal(t, "write", repoPermission.Permission)
69+
})
7070

71-
t.Run("CollaboratorWithAdminAccess", func(t *testing.T) {
72-
t.Run("AddUserAsCollaboratorWithAdminAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeAdmin))
71+
t.Run("CollaboratorWithAdminAccess", func(t *testing.T) {
72+
t.Run("AddUserAsCollaboratorWithAdminAccess", doAPIAddCollaborator(testCtx, user4.Name, perm.AccessModeAdmin))
7373

74-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
75-
AddTokenAuth(testCtx.Token)
76-
resp := MakeRequest(t, req, http.StatusOK)
74+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user4.Name).
75+
AddTokenAuth(testCtx.Token)
76+
resp := MakeRequest(t, req, http.StatusOK)
7777

78-
var repoPermission api.RepoCollaboratorPermission
79-
DecodeJSON(t, resp, &repoPermission)
78+
var repoPermission api.RepoCollaboratorPermission
79+
DecodeJSON(t, resp, &repoPermission)
8080

81-
assert.Equal(t, "admin", repoPermission.Permission)
82-
})
81+
assert.Equal(t, "admin", repoPermission.Permission)
82+
})
8383

84-
t.Run("CollaboratorNotFound", func(t *testing.T) {
85-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, "non-existent-user").
86-
AddTokenAuth(testCtx.Token)
87-
MakeRequest(t, req, http.StatusNotFound)
88-
})
84+
t.Run("CollaboratorNotFound", func(t *testing.T) {
85+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, "non-existent-user").
86+
AddTokenAuth(testCtx.Token)
87+
MakeRequest(t, req, http.StatusNotFound)
88+
})
8989

90-
t.Run("CollaboratorBlocked", func(t *testing.T) {
91-
ctx := NewAPITestContext(t, repo2Owner.Name, repo2.Name, auth_model.AccessTokenScopeWriteRepository)
92-
ctx.ExpectedCode = http.StatusForbidden
93-
doAPIAddCollaborator(ctx, user34.Name, perm.AccessModeAdmin)(t)
94-
})
90+
t.Run("CollaboratorBlocked", func(t *testing.T) {
91+
ctx := NewAPITestContext(t, repo2Owner.Name, repo2.Name, auth_model.AccessTokenScopeWriteRepository)
92+
ctx.ExpectedCode = http.StatusForbidden
93+
doAPIAddCollaborator(ctx, user34.Name, perm.AccessModeAdmin)(t)
94+
})
95+
96+
t.Run("CollaboratorCanQueryItsPermissions", func(t *testing.T) {
97+
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user5.Name, perm.AccessModeRead))
98+
99+
_session := loginUser(t, user5.Name)
100+
_testCtx := NewAPITestContext(t, user5.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
101+
102+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user5.Name).
103+
AddTokenAuth(_testCtx.Token)
104+
resp := _session.MakeRequest(t, req, http.StatusOK)
95105

96-
t.Run("CollaboratorCanQueryItsPermissions", func(t *testing.T) {
97-
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user5.Name, perm.AccessModeRead))
106+
var repoPermission api.RepoCollaboratorPermission
107+
DecodeJSON(t, resp, &repoPermission)
98108

99-
_session := loginUser(t, user5.Name)
100-
_testCtx := NewAPITestContext(t, user5.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
109+
assert.Equal(t, "read", repoPermission.Permission)
101110

102-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user5.Name).
103-
AddTokenAuth(_testCtx.Token)
104-
resp := _session.MakeRequest(t, req, http.StatusOK)
111+
t.Run("CollaboratorCanReadOwnPermission", func(t *testing.T) {
112+
session := loginUser(t, user5.Name)
113+
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository)
105114

106-
var repoPermission api.RepoCollaboratorPermission
107-
DecodeJSON(t, resp, &repoPermission)
115+
req = NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user5.Name).AddTokenAuth(token)
116+
resp = MakeRequest(t, req, http.StatusOK)
108117

109-
assert.Equal(t, "read", repoPermission.Permission)
118+
repoCollPerm := api.RepoCollaboratorPermission{}
119+
DecodeJSON(t, resp, &repoCollPerm)
120+
121+
assert.Equal(t, "read", repoCollPerm.Permission)
110122
})
123+
})
111124

112-
t.Run("CollaboratorCanQueryItsPermissions", func(t *testing.T) {
113-
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user5.Name, perm.AccessModeRead))
125+
t.Run("CollaboratorCanQueryItsPermissions", func(t *testing.T) {
126+
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user5.Name, perm.AccessModeRead))
114127

115-
_session := loginUser(t, user5.Name)
116-
_testCtx := NewAPITestContext(t, user5.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
128+
_session := loginUser(t, user5.Name)
129+
_testCtx := NewAPITestContext(t, user5.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
117130

118-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user5.Name).
119-
AddTokenAuth(_testCtx.Token)
120-
resp := _session.MakeRequest(t, req, http.StatusOK)
131+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user5.Name).
132+
AddTokenAuth(_testCtx.Token)
133+
resp := _session.MakeRequest(t, req, http.StatusOK)
121134

122-
var repoPermission api.RepoCollaboratorPermission
123-
DecodeJSON(t, resp, &repoPermission)
135+
var repoPermission api.RepoCollaboratorPermission
136+
DecodeJSON(t, resp, &repoPermission)
124137

125-
assert.Equal(t, "read", repoPermission.Permission)
126-
})
138+
assert.Equal(t, "read", repoPermission.Permission)
139+
})
127140

128-
t.Run("RepoAdminCanQueryACollaboratorsPermissions", func(t *testing.T) {
129-
t.Run("AddUserAsCollaboratorWithAdminAccess", doAPIAddCollaborator(testCtx, user10.Name, perm.AccessModeAdmin))
130-
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user11.Name, perm.AccessModeRead))
141+
t.Run("RepoAdminCanQueryACollaboratorsPermissions", func(t *testing.T) {
142+
t.Run("AddUserAsCollaboratorWithAdminAccess", doAPIAddCollaborator(testCtx, user10.Name, perm.AccessModeAdmin))
143+
t.Run("AddUserAsCollaboratorWithReadAccess", doAPIAddCollaborator(testCtx, user11.Name, perm.AccessModeRead))
131144

132-
_session := loginUser(t, user10.Name)
133-
_testCtx := NewAPITestContext(t, user10.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
145+
_session := loginUser(t, user10.Name)
146+
_testCtx := NewAPITestContext(t, user10.Name, repo2.Name, auth_model.AccessTokenScopeReadRepository)
134147

135-
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user11.Name).
136-
AddTokenAuth(_testCtx.Token)
137-
resp := _session.MakeRequest(t, req, http.StatusOK)
148+
req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/collaborators/%s/permission", repo2Owner.Name, repo2.Name, user11.Name).
149+
AddTokenAuth(_testCtx.Token)
150+
resp := _session.MakeRequest(t, req, http.StatusOK)
138151

139-
var repoPermission api.RepoCollaboratorPermission
140-
DecodeJSON(t, resp, &repoPermission)
152+
var repoPermission api.RepoCollaboratorPermission
153+
DecodeJSON(t, resp, &repoPermission)
141154

142-
assert.Equal(t, "read", repoPermission.Permission)
143-
})
155+
assert.Equal(t, "read", repoPermission.Permission)
144156
})
145157
}

0 commit comments

Comments
 (0)