aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2024-11-17 19:06:25 -0800
committerGitHub <noreply@github.com>2024-11-18 03:06:25 +0000
commit4f879a00df029e09b40f64bf8de0572704766115 (patch)
treebb6d9b0b70fdc1d4e92e298355f244f52e831930 /tests
parentf122aaf9ff627515922a68782339725e2d7c079a (diff)
downloadgitea-4f879a00df029e09b40f64bf8de0572704766115.tar.gz
gitea-4f879a00df029e09b40f64bf8de0572704766115.zip
Refactor find forks and fix possible bugs that weak permissions check (#32528)
- Move models/GetForks to services/FindForks - Add doer as a parameter of FindForks to check permissions - Slight performance optimization for get forks API with batch loading of repository units - Add tests for forking repository to organizations --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/integration/api_fork_test.go80
-rw-r--r--tests/integration/repo_fork_test.go52
2 files changed, 132 insertions, 0 deletions
diff --git a/tests/integration/api_fork_test.go b/tests/integration/api_fork_test.go
index 7c231415a3..357dd27f86 100644
--- a/tests/integration/api_fork_test.go
+++ b/tests/integration/api_fork_test.go
@@ -7,8 +7,16 @@ import (
"net/http"
"testing"
+ "code.gitea.io/gitea/models"
+ auth_model "code.gitea.io/gitea/models/auth"
+ "code.gitea.io/gitea/models/db"
+ org_model "code.gitea.io/gitea/models/organization"
+ "code.gitea.io/gitea/models/unittest"
+ user_model "code.gitea.io/gitea/models/user"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/tests"
+
+ "github.com/stretchr/testify/assert"
)
func TestCreateForkNoLogin(t *testing.T) {
@@ -16,3 +24,75 @@ func TestCreateForkNoLogin(t *testing.T) {
req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{})
MakeRequest(t, req, http.StatusUnauthorized)
}
+
+func TestAPIForkListLimitedAndPrivateRepos(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+
+ user1Sess := loginUser(t, "user1")
+ user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"})
+
+ // fork into a limited org
+ limitedOrg := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 22})
+ assert.EqualValues(t, api.VisibleTypeLimited, limitedOrg.Visibility)
+
+ ownerTeam1, err := org_model.OrgFromUser(limitedOrg).GetOwnerTeam(db.DefaultContext)
+ assert.NoError(t, err)
+ assert.NoError(t, models.AddTeamMember(db.DefaultContext, ownerTeam1, user1))
+ user1Token := getTokenForLoggedInUser(t, user1Sess, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization)
+ req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{
+ Organization: &limitedOrg.Name,
+ }).AddTokenAuth(user1Token)
+ MakeRequest(t, req, http.StatusAccepted)
+
+ // fork into a private org
+ user4Sess := loginUser(t, "user4")
+ user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user4"})
+ privateOrg := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 23})
+ assert.EqualValues(t, api.VisibleTypePrivate, privateOrg.Visibility)
+
+ ownerTeam2, err := org_model.OrgFromUser(privateOrg).GetOwnerTeam(db.DefaultContext)
+ assert.NoError(t, err)
+ assert.NoError(t, models.AddTeamMember(db.DefaultContext, ownerTeam2, user4))
+ user4Token := getTokenForLoggedInUser(t, user4Sess, auth_model.AccessTokenScopeWriteRepository, auth_model.AccessTokenScopeWriteOrganization)
+ req = NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/forks", &api.CreateForkOption{
+ Organization: &privateOrg.Name,
+ }).AddTokenAuth(user4Token)
+ MakeRequest(t, req, http.StatusAccepted)
+
+ t.Run("Anonymous", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks")
+ resp := MakeRequest(t, req, http.StatusOK)
+
+ var forks []*api.Repository
+ DecodeJSON(t, resp, &forks)
+
+ assert.Empty(t, forks)
+ assert.EqualValues(t, "0", resp.Header().Get("X-Total-Count"))
+ })
+
+ t.Run("Logged in", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks").AddTokenAuth(user1Token)
+ resp := MakeRequest(t, req, http.StatusOK)
+
+ var forks []*api.Repository
+ DecodeJSON(t, resp, &forks)
+
+ assert.Len(t, forks, 1)
+ assert.EqualValues(t, "1", resp.Header().Get("X-Total-Count"))
+
+ assert.NoError(t, models.AddTeamMember(db.DefaultContext, ownerTeam2, user1))
+
+ req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/forks").AddTokenAuth(user1Token)
+ resp = MakeRequest(t, req, http.StatusOK)
+
+ forks = []*api.Repository{}
+ DecodeJSON(t, resp, &forks)
+
+ assert.Len(t, forks, 2)
+ assert.EqualValues(t, "2", resp.Header().Get("X-Total-Count"))
+ })
+}
diff --git a/tests/integration/repo_fork_test.go b/tests/integration/repo_fork_test.go
index feebebf062..52b55888b9 100644
--- a/tests/integration/repo_fork_test.go
+++ b/tests/integration/repo_fork_test.go
@@ -9,8 +9,12 @@ import (
"net/http/httptest"
"testing"
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/models/db"
+ org_model "code.gitea.io/gitea/models/organization"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
+ "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert"
@@ -74,3 +78,51 @@ func TestRepoForkToOrg(t *testing.T) {
_, exists := htmlDoc.doc.Find(`a.ui.button[href*="/fork"]`).Attr("href")
assert.False(t, exists, "Forking should not be allowed anymore")
}
+
+func TestForkListLimitedAndPrivateRepos(t *testing.T) {
+ defer tests.PrepareTestEnv(t)()
+ forkItemSelector := ".repo-fork-item"
+
+ user1Sess := loginUser(t, "user1")
+ user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user1"})
+
+ // fork to a limited org
+ limitedOrg := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 22})
+ assert.EqualValues(t, structs.VisibleTypeLimited, limitedOrg.Visibility)
+ ownerTeam1, err := org_model.OrgFromUser(limitedOrg).GetOwnerTeam(db.DefaultContext)
+ assert.NoError(t, err)
+ assert.NoError(t, models.AddTeamMember(db.DefaultContext, ownerTeam1, user1))
+ testRepoFork(t, user1Sess, "user2", "repo1", limitedOrg.Name, "repo1", "")
+
+ // fork to a private org
+ user4Sess := loginUser(t, "user4")
+ user4 := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: "user4"})
+ privateOrg := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 23})
+ assert.EqualValues(t, structs.VisibleTypePrivate, privateOrg.Visibility)
+ ownerTeam2, err := org_model.OrgFromUser(privateOrg).GetOwnerTeam(db.DefaultContext)
+ assert.NoError(t, err)
+ assert.NoError(t, models.AddTeamMember(db.DefaultContext, ownerTeam2, user4))
+ testRepoFork(t, user4Sess, "user2", "repo1", privateOrg.Name, "repo1", "")
+
+ t.Run("Anonymous", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+ req := NewRequest(t, "GET", "/user2/repo1/forks")
+ resp := MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ assert.EqualValues(t, 0, htmlDoc.Find(forkItemSelector).Length())
+ })
+
+ t.Run("Logged in", func(t *testing.T) {
+ defer tests.PrintCurrentTest(t)()
+
+ req := NewRequest(t, "GET", "/user2/repo1/forks")
+ resp := user1Sess.MakeRequest(t, req, http.StatusOK)
+ htmlDoc := NewHTMLParser(t, resp.Body)
+ assert.EqualValues(t, 1, htmlDoc.Find(forkItemSelector).Length())
+
+ assert.NoError(t, models.AddTeamMember(db.DefaultContext, ownerTeam2, user1))
+ resp = user1Sess.MakeRequest(t, req, http.StatusOK)
+ htmlDoc = NewHTMLParser(t, resp.Body)
+ assert.EqualValues(t, 2, htmlDoc.Find(forkItemSelector).Length())
+ })
+}