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.

repo_permission_test.go 9.7KB

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