* an inactive user shouldn't be able to be a collaborator * use translated error message * add active user check when adding a new collaborator via the api * fix translation text * added collaborator test * improvee testcasestags/v1.21.12.1
| @@ -1025,7 +1025,8 @@ settings.transfer_succeed = The repository has been transferred. | |||||
| settings.confirm_delete = Delete Repository | settings.confirm_delete = Delete Repository | ||||
| settings.add_collaborator = Add Collaborator | settings.add_collaborator = Add Collaborator | ||||
| settings.add_collaborator_success = The collaborator has been added. | settings.add_collaborator_success = The collaborator has been added. | ||||
| settings.add_collaborator_duplicate =The collaborator is already added to this repository. | |||||
| settings.add_collaborator_inactive_user = Can not add an inactive user as a collaborator. | |||||
| settings.add_collaborator_duplicate = The collaborator is already added to this repository. | |||||
| settings.delete_collaborator = Remove | settings.delete_collaborator = Remove | ||||
| settings.collaborator_deletion = Remove Collaborator | settings.collaborator_deletion = Remove Collaborator | ||||
| settings.collaborator_deletion_desc = Removing a collaborator will revoke their access to this repository. Continue? | settings.collaborator_deletion_desc = Removing a collaborator will revoke their access to this repository. Continue? | ||||
| @@ -5,6 +5,8 @@ | |||||
| package repo | package repo | ||||
| import ( | import ( | ||||
| "errors" | |||||
| "code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
| "code.gitea.io/gitea/modules/context" | "code.gitea.io/gitea/modules/context" | ||||
| @@ -145,6 +147,11 @@ func AddCollaborator(ctx *context.APIContext, form api.AddCollaboratorOption) { | |||||
| return | return | ||||
| } | } | ||||
| if !collaborator.IsActive { | |||||
| ctx.Error(500, "InactiveCollaborator", errors.New("collaborator's account is inactive")) | |||||
| return | |||||
| } | |||||
| if err := ctx.Repo.Repository.AddCollaborator(collaborator); err != nil { | if err := ctx.Repo.Repository.AddCollaborator(collaborator); err != nil { | ||||
| ctx.Error(500, "AddCollaborator", err) | ctx.Error(500, "AddCollaborator", err) | ||||
| return | return | ||||
| @@ -381,6 +381,12 @@ func CollaborationPost(ctx *context.Context) { | |||||
| return | return | ||||
| } | } | ||||
| if !u.IsActive { | |||||
| ctx.Flash.Error(ctx.Tr("repo.settings.add_collaborator_inactive_user")) | |||||
| ctx.Redirect(setting.AppSubURL + ctx.Req.URL.Path) | |||||
| return | |||||
| } | |||||
| // Organization is not allowed to be added as a collaborator. | // Organization is not allowed to be added as a collaborator. | ||||
| if u.IsOrganization() { | if u.IsOrganization() { | ||||
| ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator")) | ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator")) | ||||
| @@ -97,6 +97,30 @@ func TestCollaborationPost(t *testing.T) { | |||||
| assert.True(t, exists) | assert.True(t, exists) | ||||
| } | } | ||||
| func TestCollaborationPost_InactiveUser(t *testing.T) { | |||||
| models.PrepareTestEnv(t) | |||||
| ctx := test.MockContext(t, "user2/repo1/issues/labels") | |||||
| test.LoadUser(t, ctx, 2) | |||||
| test.LoadUser(t, ctx, 9) | |||||
| test.LoadRepo(t, ctx, 1) | |||||
| ctx.Req.Form.Set("collaborator", "user9") | |||||
| repo := &context.Repository{ | |||||
| Owner: &models.User{ | |||||
| LowerName: "user2", | |||||
| }, | |||||
| } | |||||
| ctx.Repo = repo | |||||
| CollaborationPost(ctx) | |||||
| assert.EqualValues(t, http.StatusFound, ctx.Resp.Status()) | |||||
| assert.NotEmpty(t, ctx.Flash.ErrorMsg) | |||||
| } | |||||
| func TestCollaborationPost_AddCollaboratorTwice(t *testing.T) { | func TestCollaborationPost_AddCollaboratorTwice(t *testing.T) { | ||||
| models.PrepareTestEnv(t) | models.PrepareTestEnv(t) | ||||