You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

org_test.go 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package integrations
  5. import (
  6. "fmt"
  7. "net/http"
  8. "strings"
  9. "testing"
  10. "code.gitea.io/gitea/models/unittest"
  11. user_model "code.gitea.io/gitea/models/user"
  12. api "code.gitea.io/gitea/modules/structs"
  13. "github.com/stretchr/testify/assert"
  14. )
  15. func TestOrgRepos(t *testing.T) {
  16. defer prepareTestEnv(t)()
  17. var (
  18. users = []string{"user1", "user2"}
  19. cases = map[string][]string{
  20. "alphabetically": {"repo21", "repo3", "repo5"},
  21. "reversealphabetically": {"repo5", "repo3", "repo21"},
  22. }
  23. )
  24. for _, user := range users {
  25. t.Run(user, func(t *testing.T) {
  26. session := loginUser(t, user)
  27. for sortBy, repos := range cases {
  28. req := NewRequest(t, "GET", "/user3?sort="+sortBy)
  29. resp := session.MakeRequest(t, req, http.StatusOK)
  30. htmlDoc := NewHTMLParser(t, resp.Body)
  31. sel := htmlDoc.doc.Find("a.name")
  32. assert.Len(t, repos, len(sel.Nodes))
  33. for i := 0; i < len(repos); i++ {
  34. assert.EqualValues(t, repos[i], strings.TrimSpace(sel.Eq(i).Text()))
  35. }
  36. }
  37. })
  38. }
  39. }
  40. func TestLimitedOrg(t *testing.T) {
  41. defer prepareTestEnv(t)()
  42. // not logged in user
  43. req := NewRequest(t, "GET", "/limited_org")
  44. MakeRequest(t, req, http.StatusNotFound)
  45. req = NewRequest(t, "GET", "/limited_org/public_repo_on_limited_org")
  46. MakeRequest(t, req, http.StatusNotFound)
  47. req = NewRequest(t, "GET", "/limited_org/private_repo_on_limited_org")
  48. MakeRequest(t, req, http.StatusNotFound)
  49. // login non-org member user
  50. session := loginUser(t, "user2")
  51. req = NewRequest(t, "GET", "/limited_org")
  52. session.MakeRequest(t, req, http.StatusOK)
  53. req = NewRequest(t, "GET", "/limited_org/public_repo_on_limited_org")
  54. session.MakeRequest(t, req, http.StatusOK)
  55. req = NewRequest(t, "GET", "/limited_org/private_repo_on_limited_org")
  56. session.MakeRequest(t, req, http.StatusNotFound)
  57. // site admin
  58. session = loginUser(t, "user1")
  59. req = NewRequest(t, "GET", "/limited_org")
  60. session.MakeRequest(t, req, http.StatusOK)
  61. req = NewRequest(t, "GET", "/limited_org/public_repo_on_limited_org")
  62. session.MakeRequest(t, req, http.StatusOK)
  63. req = NewRequest(t, "GET", "/limited_org/private_repo_on_limited_org")
  64. session.MakeRequest(t, req, http.StatusOK)
  65. }
  66. func TestPrivateOrg(t *testing.T) {
  67. defer prepareTestEnv(t)()
  68. // not logged in user
  69. req := NewRequest(t, "GET", "/privated_org")
  70. MakeRequest(t, req, http.StatusNotFound)
  71. req = NewRequest(t, "GET", "/privated_org/public_repo_on_private_org")
  72. MakeRequest(t, req, http.StatusNotFound)
  73. req = NewRequest(t, "GET", "/privated_org/private_repo_on_private_org")
  74. MakeRequest(t, req, http.StatusNotFound)
  75. // login non-org member user
  76. session := loginUser(t, "user2")
  77. req = NewRequest(t, "GET", "/privated_org")
  78. session.MakeRequest(t, req, http.StatusNotFound)
  79. req = NewRequest(t, "GET", "/privated_org/public_repo_on_private_org")
  80. session.MakeRequest(t, req, http.StatusNotFound)
  81. req = NewRequest(t, "GET", "/privated_org/private_repo_on_private_org")
  82. session.MakeRequest(t, req, http.StatusNotFound)
  83. // non-org member who is collaborator on repo in private org
  84. session = loginUser(t, "user4")
  85. req = NewRequest(t, "GET", "/privated_org")
  86. session.MakeRequest(t, req, http.StatusNotFound)
  87. req = NewRequest(t, "GET", "/privated_org/public_repo_on_private_org") // colab of this repo
  88. session.MakeRequest(t, req, http.StatusOK)
  89. req = NewRequest(t, "GET", "/privated_org/private_repo_on_private_org")
  90. session.MakeRequest(t, req, http.StatusNotFound)
  91. // site admin
  92. session = loginUser(t, "user1")
  93. req = NewRequest(t, "GET", "/privated_org")
  94. session.MakeRequest(t, req, http.StatusOK)
  95. req = NewRequest(t, "GET", "/privated_org/public_repo_on_private_org")
  96. session.MakeRequest(t, req, http.StatusOK)
  97. req = NewRequest(t, "GET", "/privated_org/private_repo_on_private_org")
  98. session.MakeRequest(t, req, http.StatusOK)
  99. }
  100. func TestOrgRestrictedUser(t *testing.T) {
  101. defer prepareTestEnv(t)()
  102. // privated_org is a private org who has id 23
  103. orgName := "privated_org"
  104. // public_repo_on_private_org is a public repo on privated_org
  105. repoName := "public_repo_on_private_org"
  106. // user29 is a restricted user who is not a member of the organization
  107. restrictedUser := "user29"
  108. // #17003 reports a bug whereby adding a restricted user to a read-only team doesn't work
  109. // assert restrictedUser cannot see the org or the public repo
  110. restrictedSession := loginUser(t, restrictedUser)
  111. req := NewRequest(t, "GET", fmt.Sprintf("/%s", orgName))
  112. restrictedSession.MakeRequest(t, req, http.StatusNotFound)
  113. req = NewRequest(t, "GET", fmt.Sprintf("/%s/%s", orgName, repoName))
  114. restrictedSession.MakeRequest(t, req, http.StatusNotFound)
  115. // Therefore create a read-only team
  116. adminSession := loginUser(t, "user1")
  117. token := getTokenForLoggedInUser(t, adminSession)
  118. teamToCreate := &api.CreateTeamOption{
  119. Name: "codereader",
  120. Description: "Code Reader",
  121. IncludesAllRepositories: true,
  122. Permission: "read",
  123. Units: []string{"repo.code"},
  124. }
  125. req = NewRequestWithJSON(t, "POST",
  126. fmt.Sprintf("/api/v1/orgs/%s/teams?token=%s", orgName, token), teamToCreate)
  127. var apiTeam api.Team
  128. resp := adminSession.MakeRequest(t, req, http.StatusCreated)
  129. DecodeJSON(t, resp, &apiTeam)
  130. checkTeamResponse(t, "CreateTeam_codereader", &apiTeam, teamToCreate.Name, teamToCreate.Description, teamToCreate.IncludesAllRepositories,
  131. teamToCreate.Permission, teamToCreate.Units, nil)
  132. checkTeamBean(t, apiTeam.ID, teamToCreate.Name, teamToCreate.Description, teamToCreate.IncludesAllRepositories,
  133. teamToCreate.Permission, teamToCreate.Units, nil)
  134. // teamID := apiTeam.ID
  135. // Now we need to add the restricted user to the team
  136. req = NewRequest(t, "PUT",
  137. fmt.Sprintf("/api/v1/teams/%d/members/%s?token=%s", apiTeam.ID, restrictedUser, token))
  138. _ = adminSession.MakeRequest(t, req, http.StatusNoContent)
  139. // Now we need to check if the restrictedUser can access the repo
  140. req = NewRequest(t, "GET", fmt.Sprintf("/%s", orgName))
  141. restrictedSession.MakeRequest(t, req, http.StatusOK)
  142. req = NewRequest(t, "GET", fmt.Sprintf("/%s/%s", orgName, repoName))
  143. restrictedSession.MakeRequest(t, req, http.StatusOK)
  144. }
  145. func TestTeamSearch(t *testing.T) {
  146. defer prepareTestEnv(t)()
  147. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  148. org := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}).(*user_model.User)
  149. var results TeamSearchResults
  150. session := loginUser(t, user.Name)
  151. csrf := GetCSRF(t, session, "/"+org.Name)
  152. req := NewRequestf(t, "GET", "/org/%s/teams/-/search?q=%s", org.Name, "_team")
  153. req.Header.Add("X-Csrf-Token", csrf)
  154. resp := session.MakeRequest(t, req, http.StatusOK)
  155. DecodeJSON(t, resp, &results)
  156. assert.NotEmpty(t, results.Data)
  157. assert.Len(t, results.Data, 1)
  158. assert.Equal(t, "test_team", results.Data[0].Name)
  159. // no access if not organization member
  160. user5 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User)
  161. session = loginUser(t, user5.Name)
  162. csrf = GetCSRF(t, session, "/"+org.Name)
  163. req = NewRequestf(t, "GET", "/org/%s/teams/-/search?q=%s", org.Name, "team")
  164. req.Header.Add("X-Csrf-Token", csrf)
  165. session.MakeRequest(t, req, http.StatusNotFound)
  166. }