gitea源码

settings_test.go 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package setting
  4. import (
  5. "net/http"
  6. "testing"
  7. asymkey_model "code.gitea.io/gitea/models/asymkey"
  8. "code.gitea.io/gitea/models/organization"
  9. "code.gitea.io/gitea/models/perm"
  10. repo_model "code.gitea.io/gitea/models/repo"
  11. "code.gitea.io/gitea/models/unittest"
  12. user_model "code.gitea.io/gitea/models/user"
  13. "code.gitea.io/gitea/modules/setting"
  14. "code.gitea.io/gitea/modules/test"
  15. "code.gitea.io/gitea/modules/web"
  16. "code.gitea.io/gitea/services/context"
  17. "code.gitea.io/gitea/services/contexttest"
  18. "code.gitea.io/gitea/services/forms"
  19. repo_service "code.gitea.io/gitea/services/repository"
  20. "github.com/stretchr/testify/assert"
  21. )
  22. func TestAddReadOnlyDeployKey(t *testing.T) {
  23. defer test.MockVariableValue(&setting.SSH.RootPath, t.TempDir())()
  24. unittest.PrepareTestEnv(t)
  25. ctx, _ := contexttest.MockContext(t, "user2/repo1/settings/keys")
  26. contexttest.LoadUser(t, ctx, 2)
  27. contexttest.LoadRepo(t, ctx, 2)
  28. addKeyForm := forms.AddKeyForm{
  29. Title: "read-only",
  30. Content: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n",
  31. }
  32. web.SetForm(ctx, &addKeyForm)
  33. DeployKeysPost(ctx)
  34. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  35. unittest.AssertExistsAndLoadBean(t, &asymkey_model.DeployKey{
  36. Name: addKeyForm.Title,
  37. Content: addKeyForm.Content,
  38. Mode: perm.AccessModeRead,
  39. })
  40. }
  41. func TestAddReadWriteOnlyDeployKey(t *testing.T) {
  42. defer test.MockVariableValue(&setting.SSH.RootPath, t.TempDir())()
  43. unittest.PrepareTestEnv(t)
  44. ctx, _ := contexttest.MockContext(t, "user2/repo1/settings/keys")
  45. contexttest.LoadUser(t, ctx, 2)
  46. contexttest.LoadRepo(t, ctx, 2)
  47. addKeyForm := forms.AddKeyForm{
  48. Title: "read-write",
  49. Content: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n",
  50. IsWritable: true,
  51. }
  52. web.SetForm(ctx, &addKeyForm)
  53. DeployKeysPost(ctx)
  54. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  55. unittest.AssertExistsAndLoadBean(t, &asymkey_model.DeployKey{
  56. Name: addKeyForm.Title,
  57. Content: addKeyForm.Content,
  58. Mode: perm.AccessModeWrite,
  59. })
  60. }
  61. func TestCollaborationPost(t *testing.T) {
  62. unittest.PrepareTestEnv(t)
  63. ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
  64. contexttest.LoadUser(t, ctx, 2)
  65. contexttest.LoadUser(t, ctx, 4)
  66. contexttest.LoadRepo(t, ctx, 1)
  67. ctx.Req.Form.Set("collaborator", "user4")
  68. u := &user_model.User{
  69. LowerName: "user2",
  70. Type: user_model.UserTypeIndividual,
  71. }
  72. re := &repo_model.Repository{
  73. ID: 2,
  74. Owner: u,
  75. }
  76. repo := &context.Repository{
  77. Owner: u,
  78. Repository: re,
  79. }
  80. ctx.Repo = repo
  81. CollaborationPost(ctx)
  82. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  83. exists, err := repo_model.IsCollaborator(ctx, re.ID, 4)
  84. assert.NoError(t, err)
  85. assert.True(t, exists)
  86. }
  87. func TestCollaborationPost_InactiveUser(t *testing.T) {
  88. unittest.PrepareTestEnv(t)
  89. ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
  90. contexttest.LoadUser(t, ctx, 2)
  91. contexttest.LoadUser(t, ctx, 9)
  92. contexttest.LoadRepo(t, ctx, 1)
  93. ctx.Req.Form.Set("collaborator", "user9")
  94. repo := &context.Repository{
  95. Owner: &user_model.User{
  96. LowerName: "user2",
  97. },
  98. }
  99. ctx.Repo = repo
  100. CollaborationPost(ctx)
  101. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  102. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  103. }
  104. func TestCollaborationPost_AddCollaboratorTwice(t *testing.T) {
  105. unittest.PrepareTestEnv(t)
  106. ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
  107. contexttest.LoadUser(t, ctx, 2)
  108. contexttest.LoadUser(t, ctx, 4)
  109. contexttest.LoadRepo(t, ctx, 1)
  110. ctx.Req.Form.Set("collaborator", "user4")
  111. u := &user_model.User{
  112. LowerName: "user2",
  113. Type: user_model.UserTypeIndividual,
  114. }
  115. re := &repo_model.Repository{
  116. ID: 2,
  117. Owner: u,
  118. }
  119. repo := &context.Repository{
  120. Owner: u,
  121. Repository: re,
  122. }
  123. ctx.Repo = repo
  124. CollaborationPost(ctx)
  125. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  126. exists, err := repo_model.IsCollaborator(ctx, re.ID, 4)
  127. assert.NoError(t, err)
  128. assert.True(t, exists)
  129. // Try adding the same collaborator again
  130. CollaborationPost(ctx)
  131. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  132. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  133. }
  134. func TestCollaborationPost_NonExistentUser(t *testing.T) {
  135. unittest.PrepareTestEnv(t)
  136. ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
  137. contexttest.LoadUser(t, ctx, 2)
  138. contexttest.LoadRepo(t, ctx, 1)
  139. ctx.Req.Form.Set("collaborator", "user34")
  140. repo := &context.Repository{
  141. Owner: &user_model.User{
  142. LowerName: "user2",
  143. },
  144. }
  145. ctx.Repo = repo
  146. CollaborationPost(ctx)
  147. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  148. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  149. }
  150. func TestAddTeamPost(t *testing.T) {
  151. unittest.PrepareTestEnv(t)
  152. ctx, _ := contexttest.MockContext(t, "org26/repo43")
  153. ctx.Req.Form.Set("team", "team11")
  154. org := &user_model.User{
  155. LowerName: "org26",
  156. Type: user_model.UserTypeOrganization,
  157. }
  158. team := &organization.Team{
  159. ID: 11,
  160. OrgID: 26,
  161. }
  162. re := &repo_model.Repository{
  163. ID: 43,
  164. Owner: org,
  165. OwnerID: 26,
  166. }
  167. repo := &context.Repository{
  168. Owner: &user_model.User{
  169. ID: 26,
  170. LowerName: "org26",
  171. RepoAdminChangeTeamAccess: true,
  172. },
  173. Repository: re,
  174. }
  175. ctx.Repo = repo
  176. AddTeamPost(ctx)
  177. assert.True(t, repo_service.HasRepository(t.Context(), team, re.ID))
  178. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  179. assert.Empty(t, ctx.Flash.ErrorMsg)
  180. }
  181. func TestAddTeamPost_NotAllowed(t *testing.T) {
  182. unittest.PrepareTestEnv(t)
  183. ctx, _ := contexttest.MockContext(t, "org26/repo43")
  184. ctx.Req.Form.Set("team", "team11")
  185. org := &user_model.User{
  186. LowerName: "org26",
  187. Type: user_model.UserTypeOrganization,
  188. }
  189. team := &organization.Team{
  190. ID: 11,
  191. OrgID: 26,
  192. }
  193. re := &repo_model.Repository{
  194. ID: 43,
  195. Owner: org,
  196. OwnerID: 26,
  197. }
  198. repo := &context.Repository{
  199. Owner: &user_model.User{
  200. ID: 26,
  201. LowerName: "org26",
  202. RepoAdminChangeTeamAccess: false,
  203. },
  204. Repository: re,
  205. }
  206. ctx.Repo = repo
  207. AddTeamPost(ctx)
  208. assert.False(t, repo_service.HasRepository(t.Context(), team, re.ID))
  209. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  210. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  211. }
  212. func TestAddTeamPost_AddTeamTwice(t *testing.T) {
  213. unittest.PrepareTestEnv(t)
  214. ctx, _ := contexttest.MockContext(t, "org26/repo43")
  215. ctx.Req.Form.Set("team", "team11")
  216. org := &user_model.User{
  217. LowerName: "org26",
  218. Type: user_model.UserTypeOrganization,
  219. }
  220. team := &organization.Team{
  221. ID: 11,
  222. OrgID: 26,
  223. }
  224. re := &repo_model.Repository{
  225. ID: 43,
  226. Owner: org,
  227. OwnerID: 26,
  228. }
  229. repo := &context.Repository{
  230. Owner: &user_model.User{
  231. ID: 26,
  232. LowerName: "org26",
  233. RepoAdminChangeTeamAccess: true,
  234. },
  235. Repository: re,
  236. }
  237. ctx.Repo = repo
  238. AddTeamPost(ctx)
  239. AddTeamPost(ctx)
  240. assert.True(t, repo_service.HasRepository(t.Context(), team, re.ID))
  241. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  242. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  243. }
  244. func TestAddTeamPost_NonExistentTeam(t *testing.T) {
  245. unittest.PrepareTestEnv(t)
  246. ctx, _ := contexttest.MockContext(t, "org26/repo43")
  247. ctx.Req.Form.Set("team", "team-non-existent")
  248. org := &user_model.User{
  249. LowerName: "org26",
  250. Type: user_model.UserTypeOrganization,
  251. }
  252. re := &repo_model.Repository{
  253. ID: 43,
  254. Owner: org,
  255. OwnerID: 26,
  256. }
  257. repo := &context.Repository{
  258. Owner: &user_model.User{
  259. ID: 26,
  260. LowerName: "org26",
  261. RepoAdminChangeTeamAccess: true,
  262. },
  263. Repository: re,
  264. }
  265. ctx.Repo = repo
  266. AddTeamPost(ctx)
  267. assert.Equal(t, http.StatusSeeOther, ctx.Resp.WrittenStatus())
  268. assert.NotEmpty(t, ctx.Flash.ErrorMsg)
  269. }
  270. func TestDeleteTeam(t *testing.T) {
  271. unittest.PrepareTestEnv(t)
  272. ctx, _ := contexttest.MockContext(t, "org3/team1/repo3")
  273. ctx.Req.Form.Set("id", "2")
  274. org := &user_model.User{
  275. LowerName: "org3",
  276. Type: user_model.UserTypeOrganization,
  277. }
  278. team := &organization.Team{
  279. ID: 2,
  280. OrgID: 3,
  281. }
  282. re := &repo_model.Repository{
  283. ID: 3,
  284. Owner: org,
  285. OwnerID: 3,
  286. }
  287. repo := &context.Repository{
  288. Owner: &user_model.User{
  289. ID: 3,
  290. LowerName: "org3",
  291. RepoAdminChangeTeamAccess: true,
  292. },
  293. Repository: re,
  294. }
  295. ctx.Repo = repo
  296. DeleteTeam(ctx)
  297. assert.False(t, repo_service.HasRepository(t.Context(), team, re.ID))
  298. }