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.

settings_test.go 9.4KB

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