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

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