Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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
9 changes: 9 additions & 0 deletions routers/api/v1/repo/fork.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,15 @@ func CreateFork(ctx *context.APIContext) {
ctx.APIError(http.StatusForbidden, fmt.Sprintf("User is no Member of Organisation '%s'", org.Name))
return
}

canCreate, err := org.CanCreateOrgRepo(ctx, ctx.Doer.ID)
Comment thread
wxiaoguang marked this conversation as resolved.
Outdated
if err != nil {
ctx.APIErrorInternal(err)
return
} else if !canCreate {
ctx.APIError(http.StatusForbidden, "User is not allowed to create repositories in this organization.")
return
}
}
forker = org.AsUser()
}
Expand Down
17 changes: 17 additions & 0 deletions tests/integration/api_fork_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,23 @@ func TestCreateForkNoLogin(t *testing.T) {
MakeRequest(t, req, http.StatusUnauthorized)
}

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

user4Sess := loginUser(t, "user4")
org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3})

canCreate, err := org_model.OrgFromUser(org).CanCreateOrgRepo(t.Context(), 4)
assert.NoError(t, err)
assert.False(t, canCreate)

user4Token := getTokenForLoggedInUser(t, user4Sess, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization)
req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{
Organization: &org.Name,
}).AddTokenAuth(user4Token)
MakeRequest(t, req, http.StatusForbidden)
}

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

Expand Down