Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

repo_permission_test.go 9.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. // Copyright 2018 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 models
  5. import (
  6. "testing"
  7. "code.gitea.io/gitea/models/db"
  8. "code.gitea.io/gitea/models/organization"
  9. perm_model "code.gitea.io/gitea/models/perm"
  10. repo_model "code.gitea.io/gitea/models/repo"
  11. "code.gitea.io/gitea/models/unit"
  12. "code.gitea.io/gitea/models/unittest"
  13. user_model "code.gitea.io/gitea/models/user"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func TestRepoPermissionPublicNonOrgRepo(t *testing.T) {
  17. assert.NoError(t, unittest.PrepareTestDatabase())
  18. // public non-organization repo
  19. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 4}).(*repo_model.Repository)
  20. assert.NoError(t, repo.LoadUnits(db.DefaultContext))
  21. // plain user
  22. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  23. perm, err := GetUserRepoPermission(db.DefaultContext, repo, user)
  24. assert.NoError(t, err)
  25. for _, unit := range repo.Units {
  26. assert.True(t, perm.CanRead(unit.Type))
  27. assert.False(t, perm.CanWrite(unit.Type))
  28. }
  29. // change to collaborator
  30. assert.NoError(t, AddCollaborator(repo, user))
  31. perm, err = GetUserRepoPermission(db.DefaultContext, repo, user)
  32. assert.NoError(t, err)
  33. for _, unit := range repo.Units {
  34. assert.True(t, perm.CanRead(unit.Type))
  35. assert.True(t, perm.CanWrite(unit.Type))
  36. }
  37. // collaborator
  38. collaborator := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}).(*user_model.User)
  39. perm, err = GetUserRepoPermission(db.DefaultContext, repo, collaborator)
  40. assert.NoError(t, err)
  41. for _, unit := range repo.Units {
  42. assert.True(t, perm.CanRead(unit.Type))
  43. assert.True(t, perm.CanWrite(unit.Type))
  44. }
  45. // owner
  46. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User)
  47. perm, err = GetUserRepoPermission(db.DefaultContext, repo, owner)
  48. assert.NoError(t, err)
  49. for _, unit := range repo.Units {
  50. assert.True(t, perm.CanRead(unit.Type))
  51. assert.True(t, perm.CanWrite(unit.Type))
  52. }
  53. // admin
  54. admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
  55. perm, err = GetUserRepoPermission(db.DefaultContext, repo, admin)
  56. assert.NoError(t, err)
  57. for _, unit := range repo.Units {
  58. assert.True(t, perm.CanRead(unit.Type))
  59. assert.True(t, perm.CanWrite(unit.Type))
  60. }
  61. }
  62. func TestRepoPermissionPrivateNonOrgRepo(t *testing.T) {
  63. assert.NoError(t, unittest.PrepareTestDatabase())
  64. // private non-organization repo
  65. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}).(*repo_model.Repository)
  66. assert.NoError(t, repo.LoadUnits(db.DefaultContext))
  67. // plain user
  68. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 4}).(*user_model.User)
  69. perm, err := GetUserRepoPermission(db.DefaultContext, repo, user)
  70. assert.NoError(t, err)
  71. for _, unit := range repo.Units {
  72. assert.False(t, perm.CanRead(unit.Type))
  73. assert.False(t, perm.CanWrite(unit.Type))
  74. }
  75. // change to collaborator to default write access
  76. assert.NoError(t, AddCollaborator(repo, user))
  77. perm, err = GetUserRepoPermission(db.DefaultContext, repo, user)
  78. assert.NoError(t, err)
  79. for _, unit := range repo.Units {
  80. assert.True(t, perm.CanRead(unit.Type))
  81. assert.True(t, perm.CanWrite(unit.Type))
  82. }
  83. assert.NoError(t, ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead))
  84. perm, err = GetUserRepoPermission(db.DefaultContext, repo, user)
  85. assert.NoError(t, err)
  86. for _, unit := range repo.Units {
  87. assert.True(t, perm.CanRead(unit.Type))
  88. assert.False(t, perm.CanWrite(unit.Type))
  89. }
  90. // owner
  91. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  92. perm, err = GetUserRepoPermission(db.DefaultContext, repo, owner)
  93. assert.NoError(t, err)
  94. for _, unit := range repo.Units {
  95. assert.True(t, perm.CanRead(unit.Type))
  96. assert.True(t, perm.CanWrite(unit.Type))
  97. }
  98. // admin
  99. admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
  100. perm, err = GetUserRepoPermission(db.DefaultContext, repo, admin)
  101. assert.NoError(t, err)
  102. for _, unit := range repo.Units {
  103. assert.True(t, perm.CanRead(unit.Type))
  104. assert.True(t, perm.CanWrite(unit.Type))
  105. }
  106. }
  107. func TestRepoPermissionPublicOrgRepo(t *testing.T) {
  108. assert.NoError(t, unittest.PrepareTestDatabase())
  109. // public organization repo
  110. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 32}).(*repo_model.Repository)
  111. assert.NoError(t, repo.LoadUnits(db.DefaultContext))
  112. // plain user
  113. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User)
  114. perm, err := GetUserRepoPermission(db.DefaultContext, repo, user)
  115. assert.NoError(t, err)
  116. for _, unit := range repo.Units {
  117. assert.True(t, perm.CanRead(unit.Type))
  118. assert.False(t, perm.CanWrite(unit.Type))
  119. }
  120. // change to collaborator to default write access
  121. assert.NoError(t, AddCollaborator(repo, user))
  122. perm, err = GetUserRepoPermission(db.DefaultContext, repo, user)
  123. assert.NoError(t, err)
  124. for _, unit := range repo.Units {
  125. assert.True(t, perm.CanRead(unit.Type))
  126. assert.True(t, perm.CanWrite(unit.Type))
  127. }
  128. assert.NoError(t, ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead))
  129. perm, err = GetUserRepoPermission(db.DefaultContext, repo, user)
  130. assert.NoError(t, err)
  131. for _, unit := range repo.Units {
  132. assert.True(t, perm.CanRead(unit.Type))
  133. assert.False(t, perm.CanWrite(unit.Type))
  134. }
  135. // org member team owner
  136. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  137. perm, err = GetUserRepoPermission(db.DefaultContext, repo, owner)
  138. assert.NoError(t, err)
  139. for _, unit := range repo.Units {
  140. assert.True(t, perm.CanRead(unit.Type))
  141. assert.True(t, perm.CanWrite(unit.Type))
  142. }
  143. // org member team tester
  144. member := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15}).(*user_model.User)
  145. perm, err = GetUserRepoPermission(db.DefaultContext, repo, member)
  146. assert.NoError(t, err)
  147. for _, unit := range repo.Units {
  148. assert.True(t, perm.CanRead(unit.Type))
  149. }
  150. assert.True(t, perm.CanWrite(unit.TypeIssues))
  151. assert.False(t, perm.CanWrite(unit.TypeCode))
  152. // admin
  153. admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
  154. perm, err = GetUserRepoPermission(db.DefaultContext, repo, admin)
  155. assert.NoError(t, err)
  156. for _, unit := range repo.Units {
  157. assert.True(t, perm.CanRead(unit.Type))
  158. assert.True(t, perm.CanWrite(unit.Type))
  159. }
  160. }
  161. func TestRepoPermissionPrivateOrgRepo(t *testing.T) {
  162. assert.NoError(t, unittest.PrepareTestDatabase())
  163. // private organization repo
  164. repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 24}).(*repo_model.Repository)
  165. assert.NoError(t, repo.LoadUnits(db.DefaultContext))
  166. // plain user
  167. user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}).(*user_model.User)
  168. perm, err := GetUserRepoPermission(db.DefaultContext, repo, user)
  169. assert.NoError(t, err)
  170. for _, unit := range repo.Units {
  171. assert.False(t, perm.CanRead(unit.Type))
  172. assert.False(t, perm.CanWrite(unit.Type))
  173. }
  174. // change to collaborator to default write access
  175. assert.NoError(t, AddCollaborator(repo, user))
  176. perm, err = GetUserRepoPermission(db.DefaultContext, repo, user)
  177. assert.NoError(t, err)
  178. for _, unit := range repo.Units {
  179. assert.True(t, perm.CanRead(unit.Type))
  180. assert.True(t, perm.CanWrite(unit.Type))
  181. }
  182. assert.NoError(t, ChangeCollaborationAccessMode(repo, user.ID, perm_model.AccessModeRead))
  183. perm, err = GetUserRepoPermission(db.DefaultContext, repo, user)
  184. assert.NoError(t, err)
  185. for _, unit := range repo.Units {
  186. assert.True(t, perm.CanRead(unit.Type))
  187. assert.False(t, perm.CanWrite(unit.Type))
  188. }
  189. // org member team owner
  190. owner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 15}).(*user_model.User)
  191. perm, err = GetUserRepoPermission(db.DefaultContext, repo, owner)
  192. assert.NoError(t, err)
  193. for _, unit := range repo.Units {
  194. assert.True(t, perm.CanRead(unit.Type))
  195. assert.True(t, perm.CanWrite(unit.Type))
  196. }
  197. // update team information and then check permission
  198. team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: 5}).(*organization.Team)
  199. err = organization.UpdateTeamUnits(team, nil)
  200. assert.NoError(t, err)
  201. perm, err = GetUserRepoPermission(db.DefaultContext, repo, owner)
  202. assert.NoError(t, err)
  203. for _, unit := range repo.Units {
  204. assert.True(t, perm.CanRead(unit.Type))
  205. assert.True(t, perm.CanWrite(unit.Type))
  206. }
  207. // org member team tester
  208. tester := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}).(*user_model.User)
  209. perm, err = GetUserRepoPermission(db.DefaultContext, repo, tester)
  210. assert.NoError(t, err)
  211. assert.True(t, perm.CanWrite(unit.TypeIssues))
  212. assert.False(t, perm.CanWrite(unit.TypeCode))
  213. assert.False(t, perm.CanRead(unit.TypeCode))
  214. // org member team reviewer
  215. reviewer := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 20}).(*user_model.User)
  216. perm, err = GetUserRepoPermission(db.DefaultContext, repo, reviewer)
  217. assert.NoError(t, err)
  218. assert.False(t, perm.CanRead(unit.TypeIssues))
  219. assert.False(t, perm.CanWrite(unit.TypeCode))
  220. assert.True(t, perm.CanRead(unit.TypeCode))
  221. // admin
  222. admin := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}).(*user_model.User)
  223. perm, err = GetUserRepoPermission(db.DefaultContext, repo, admin)
  224. assert.NoError(t, err)
  225. for _, unit := range repo.Units {
  226. assert.True(t, perm.CanRead(unit.Type))
  227. assert.True(t, perm.CanWrite(unit.Type))
  228. }
  229. }