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.7KB

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