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