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

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