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

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