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

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