Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions routers/api/v1/repo/collaborators.go
Original file line number Diff line number Diff line change
Expand Up @@ -174,11 +174,6 @@ func AddOrUpdateCollaborator(ctx *context.APIContext) {
return
}

if !collaborator.IsActive {
ctx.APIErrorInternal(errors.New("collaborator's account is inactive"))
return
}

p := perm.AccessModeWrite
if form.Permission != nil {
p = perm.ParseAccessMode(string(*form.Permission), perm.AccessModeRead, perm.AccessModeWrite, perm.AccessModeAdmin)
Expand Down
6 changes: 0 additions & 6 deletions routers/web/repo/setting/collaboration.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,6 @@ func CollaborationPost(ctx *context.Context) {
return
}

if !u.IsActive {
ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_inactive_user"))
ctx.Redirect(setting.AppSubURL + ctx.Req.URL.EscapedPath())
return
}

// Organization is not allowed to be added as a collaborator.
if u.IsOrganization() {
ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator"))
Expand Down
2 changes: 0 additions & 2 deletions routers/web/user/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (

"gitea.dev/models/db"
user_model "gitea.dev/models/user"
"gitea.dev/modules/optional"
"gitea.dev/modules/setting"
"gitea.dev/services/context"
"gitea.dev/services/convert"
Expand All @@ -24,7 +23,6 @@ func SearchCandidates(ctx *context.Context) {
Actor: ctx.Doer,
Keyword: ctx.FormTrim("q"),
Types: searchUserTypes,
IsActive: optional.Some(true),
ListOptions: db.ListOptions{PageSize: setting.UI.MembersPagingNum},
})
if err != nil {
Expand Down
2 changes: 2 additions & 0 deletions services/org/team_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@ func TestTeam_AddMember(t *testing.T) {
team3 := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 3})
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4})
user9 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 9})

test(team1, user2)
test(team1, user4)
test(team3, user2)
test(team1, user9)
}

func TestTeam_RemoveMember(t *testing.T) {
Expand Down
1 change: 1 addition & 0 deletions services/repository/collaboration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ func TestRepository_AddCollaborator(t *testing.T) {
testSuccess(1, 4)
testSuccess(1, 4)
testSuccess(3, 4)
testSuccess(1, 9)
}

func TestRepository_DeleteCollaboration(t *testing.T) {
Expand Down
49 changes: 49 additions & 0 deletions tests/integration/inactive_user_collaboration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright 2026 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package integration

import (
"net/http"
"testing"

auth_model "gitea.dev/models/auth"
repo_model "gitea.dev/models/repo"
"gitea.dev/models/unittest"
user_model "gitea.dev/models/user"
api "gitea.dev/modules/structs"
"gitea.dev/tests"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

type userSearchResults struct {
Data []*api.User `json:"data"`
}

func TestSearchCandidatesIncludesInactiveUsers(t *testing.T) {
defer tests.PrepareTestEnv(t)()

session := loginUser(t, "user1")
req := NewRequest(t, "GET", "/user/search_candidates?q=user9")
resp := session.MakeRequest(t, req, http.StatusOK)
results := DecodeJSON(t, resp, &userSearchResults{})
require.Len(t, results.Data, 1)
assert.Equal(t, "user9", results.Data[0].UserName)
assert.False(t, results.Data[0].IsActive)
}

func TestAPIAddCollaboratorAllowsInactiveUsers(t *testing.T) {
defer tests.PrepareTestEnv(t)()

inactiveUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 9})
token := getUserToken(t, "user2", auth_model.AccessTokenScopeWriteRepository)
req := NewRequestWithJSON(t, "PUT", "/api/v1/repos/user2/repo1/collaborators/"+inactiveUser.Name, &api.AddCollaboratorOption{}).
AddTokenAuth(token)
MakeRequest(t, req, http.StatusNoContent)

isCollaborator, err := repo_model.IsCollaborator(t.Context(), 1, inactiveUser.ID)
assert.NoError(t, err)
assert.True(t, isCollaborator)
}
Loading