github.com/mad-app/mattermost-server@v5.11.1+incompatible/api4/team_test.go (about) 1 // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package api4 5 6 import ( 7 "encoding/binary" 8 "fmt" 9 "net/http" 10 "strconv" 11 "strings" 12 "testing" 13 14 "encoding/base64" 15 16 "github.com/mattermost/mattermost-server/app" 17 "github.com/mattermost/mattermost-server/model" 18 "github.com/mattermost/mattermost-server/services/mailservice" 19 "github.com/mattermost/mattermost-server/utils" 20 "github.com/mattermost/mattermost-server/utils/testutils" 21 "github.com/stretchr/testify/assert" 22 "github.com/stretchr/testify/require" 23 ) 24 25 func TestCreateTeam(t *testing.T) { 26 th := Setup().InitBasic() 27 defer th.TearDown() 28 Client := th.Client 29 30 team := &model.Team{Name: GenerateTestUsername(), DisplayName: "Some Team", Type: model.TEAM_OPEN} 31 rteam, resp := Client.CreateTeam(team) 32 CheckNoError(t, resp) 33 CheckCreatedStatus(t, resp) 34 35 if rteam.Name != team.Name { 36 t.Fatal("names did not match") 37 } 38 39 if rteam.DisplayName != team.DisplayName { 40 t.Fatal("display names did not match") 41 } 42 43 if rteam.Type != team.Type { 44 t.Fatal("types did not match") 45 } 46 47 _, resp = Client.CreateTeam(rteam) 48 CheckBadRequestStatus(t, resp) 49 50 rteam.Id = "" 51 _, resp = Client.CreateTeam(rteam) 52 CheckErrorMessage(t, resp, "store.sql_team.save.domain_exists.app_error") 53 CheckBadRequestStatus(t, resp) 54 55 rteam.Name = "" 56 _, resp = Client.CreateTeam(rteam) 57 CheckErrorMessage(t, resp, "model.team.is_valid.characters.app_error") 58 CheckBadRequestStatus(t, resp) 59 60 if r, err := Client.DoApiPost("/teams", "garbage"); err == nil { 61 t.Fatal("should have errored") 62 } else { 63 if r.StatusCode != http.StatusBadRequest { 64 t.Log("actual: " + strconv.Itoa(r.StatusCode)) 65 t.Log("expected: " + strconv.Itoa(http.StatusBadRequest)) 66 t.Fatal("wrong status code") 67 } 68 } 69 70 Client.Logout() 71 72 _, resp = Client.CreateTeam(rteam) 73 CheckUnauthorizedStatus(t, resp) 74 75 // Check the appropriate permissions are enforced. 76 defaultRolePermissions := th.SaveDefaultRolePermissions() 77 defer func() { 78 th.RestoreDefaultRolePermissions(defaultRolePermissions) 79 }() 80 81 th.RemovePermissionFromRole(model.PERMISSION_CREATE_TEAM.Id, model.SYSTEM_USER_ROLE_ID) 82 th.AddPermissionToRole(model.PERMISSION_CREATE_TEAM.Id, model.SYSTEM_ADMIN_ROLE_ID) 83 84 th.LoginBasic() 85 _, resp = Client.CreateTeam(team) 86 CheckForbiddenStatus(t, resp) 87 } 88 89 func TestCreateTeamSanitization(t *testing.T) { 90 th := Setup().InitBasic() 91 defer th.TearDown() 92 93 // Non-admin users can create a team, but they become a team admin by doing so 94 95 t.Run("team admin", func(t *testing.T) { 96 team := &model.Team{ 97 DisplayName: t.Name() + "_1", 98 Name: GenerateTestTeamName(), 99 Email: th.GenerateTestEmail(), 100 Type: model.TEAM_OPEN, 101 AllowedDomains: "simulator.amazonses.com,dockerhost", 102 } 103 104 rteam, resp := th.Client.CreateTeam(team) 105 CheckNoError(t, resp) 106 if rteam.Email == "" { 107 t.Fatal("should not have sanitized email") 108 } 109 }) 110 111 t.Run("system admin", func(t *testing.T) { 112 team := &model.Team{ 113 DisplayName: t.Name() + "_2", 114 Name: GenerateTestTeamName(), 115 Email: th.GenerateTestEmail(), 116 Type: model.TEAM_OPEN, 117 AllowedDomains: "simulator.amazonses.com,dockerhost", 118 } 119 120 rteam, resp := th.SystemAdminClient.CreateTeam(team) 121 CheckNoError(t, resp) 122 if rteam.Email == "" { 123 t.Fatal("should not have sanitized email") 124 } 125 }) 126 } 127 128 func TestGetTeam(t *testing.T) { 129 th := Setup().InitBasic() 130 defer th.TearDown() 131 Client := th.Client 132 team := th.BasicTeam 133 134 rteam, resp := Client.GetTeam(team.Id, "") 135 CheckNoError(t, resp) 136 137 if rteam.Id != team.Id { 138 t.Fatal("wrong team") 139 } 140 141 _, resp = Client.GetTeam("junk", "") 142 CheckBadRequestStatus(t, resp) 143 144 _, resp = Client.GetTeam("", "") 145 CheckNotFoundStatus(t, resp) 146 147 _, resp = Client.GetTeam(model.NewId(), "") 148 CheckNotFoundStatus(t, resp) 149 150 th.LoginTeamAdmin() 151 152 team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: false} 153 rteam2, _ := Client.CreateTeam(team2) 154 155 team3 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_INVITE, AllowOpenInvite: true} 156 rteam3, _ := Client.CreateTeam(team3) 157 158 th.LoginBasic() 159 // AllowInviteOpen is false and team is open, and user is not on team 160 _, resp = Client.GetTeam(rteam2.Id, "") 161 CheckForbiddenStatus(t, resp) 162 163 // AllowInviteOpen is true and team is invite, and user is not on team 164 _, resp = Client.GetTeam(rteam3.Id, "") 165 CheckForbiddenStatus(t, resp) 166 167 Client.Logout() 168 _, resp = Client.GetTeam(team.Id, "") 169 CheckUnauthorizedStatus(t, resp) 170 171 _, resp = th.SystemAdminClient.GetTeam(rteam2.Id, "") 172 CheckNoError(t, resp) 173 } 174 175 func TestGetTeamSanitization(t *testing.T) { 176 th := Setup().InitBasic() 177 defer th.TearDown() 178 179 team, resp := th.Client.CreateTeam(&model.Team{ 180 DisplayName: t.Name() + "_1", 181 Name: GenerateTestTeamName(), 182 Email: th.GenerateTestEmail(), 183 Type: model.TEAM_OPEN, 184 AllowedDomains: "simulator.amazonses.com,dockerhost", 185 }) 186 CheckNoError(t, resp) 187 188 t.Run("team user", func(t *testing.T) { 189 th.LinkUserToTeam(th.BasicUser2, team) 190 191 client := th.CreateClient() 192 th.LoginBasic2WithClient(client) 193 194 rteam, resp := client.GetTeam(team.Id, "") 195 CheckNoError(t, resp) 196 if rteam.Email != "" { 197 t.Fatal("should've sanitized email") 198 } 199 }) 200 201 t.Run("team admin", func(t *testing.T) { 202 rteam, resp := th.Client.GetTeam(team.Id, "") 203 CheckNoError(t, resp) 204 if rteam.Email == "" { 205 t.Fatal("should not have sanitized email") 206 } 207 }) 208 209 t.Run("system admin", func(t *testing.T) { 210 rteam, resp := th.SystemAdminClient.GetTeam(team.Id, "") 211 CheckNoError(t, resp) 212 if rteam.Email == "" { 213 t.Fatal("should not have sanitized email") 214 } 215 }) 216 } 217 218 func TestGetTeamUnread(t *testing.T) { 219 th := Setup().InitBasic() 220 defer th.TearDown() 221 Client := th.Client 222 223 teamUnread, resp := Client.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) 224 CheckNoError(t, resp) 225 if teamUnread.TeamId != th.BasicTeam.Id { 226 t.Fatal("wrong team id returned for regular user call") 227 } 228 229 _, resp = Client.GetTeamUnread("junk", th.BasicUser.Id) 230 CheckBadRequestStatus(t, resp) 231 232 _, resp = Client.GetTeamUnread(th.BasicTeam.Id, "junk") 233 CheckBadRequestStatus(t, resp) 234 235 _, resp = Client.GetTeamUnread(model.NewId(), th.BasicUser.Id) 236 CheckForbiddenStatus(t, resp) 237 238 _, resp = Client.GetTeamUnread(th.BasicTeam.Id, model.NewId()) 239 CheckForbiddenStatus(t, resp) 240 241 Client.Logout() 242 _, resp = Client.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) 243 CheckUnauthorizedStatus(t, resp) 244 245 teamUnread, resp = th.SystemAdminClient.GetTeamUnread(th.BasicTeam.Id, th.BasicUser.Id) 246 CheckNoError(t, resp) 247 if teamUnread.TeamId != th.BasicTeam.Id { 248 t.Fatal("wrong team id returned") 249 } 250 } 251 252 func TestUpdateTeam(t *testing.T) { 253 th := Setup().InitBasic() 254 defer th.TearDown() 255 Client := th.Client 256 257 team := &model.Team{DisplayName: "Name", Description: "Some description", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewId() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TEAM_OPEN} 258 team, _ = Client.CreateTeam(team) 259 260 team.Description = "updated description" 261 uteam, resp := Client.UpdateTeam(team) 262 CheckNoError(t, resp) 263 264 if uteam.Description != "updated description" { 265 t.Fatal("Update failed") 266 } 267 268 team.DisplayName = "Updated Name" 269 uteam, resp = Client.UpdateTeam(team) 270 CheckNoError(t, resp) 271 272 if uteam.DisplayName != "Updated Name" { 273 t.Fatal("Update failed") 274 } 275 276 team.AllowOpenInvite = true 277 uteam, resp = Client.UpdateTeam(team) 278 CheckNoError(t, resp) 279 280 if !uteam.AllowOpenInvite { 281 t.Fatal("Update failed") 282 } 283 284 team.InviteId = "inviteid1" 285 uteam, resp = Client.UpdateTeam(team) 286 CheckNoError(t, resp) 287 288 if uteam.InviteId == "inviteid1" { 289 t.Fatal("InviteID should not be updated") 290 } 291 292 team.AllowedDomains = "domain" 293 uteam, resp = Client.UpdateTeam(team) 294 CheckNoError(t, resp) 295 296 if uteam.AllowedDomains != "domain" { 297 t.Fatal("Update failed") 298 } 299 300 team.Name = "Updated name" 301 uteam, resp = Client.UpdateTeam(team) 302 CheckNoError(t, resp) 303 304 if uteam.Name == "Updated name" { 305 t.Fatal("Should not update name") 306 } 307 308 team.Email = "test@domain.com" 309 uteam, resp = Client.UpdateTeam(team) 310 CheckNoError(t, resp) 311 312 if uteam.Email == "test@domain.com" { 313 t.Fatal("Should not update email") 314 } 315 316 team.Type = model.TEAM_INVITE 317 uteam, resp = Client.UpdateTeam(team) 318 CheckNoError(t, resp) 319 320 if uteam.Type == model.TEAM_INVITE { 321 t.Fatal("Should not update type") 322 } 323 324 originalTeamId := team.Id 325 team.Id = model.NewId() 326 327 r, _ := Client.DoApiPut(Client.GetTeamRoute(originalTeamId), team.ToJson()) 328 assert.Equal(t, http.StatusBadRequest, r.StatusCode) 329 330 if uteam.Id != originalTeamId { 331 t.Fatal("wrong team id") 332 } 333 334 team.Id = "fake" 335 _, resp = Client.UpdateTeam(team) 336 CheckBadRequestStatus(t, resp) 337 338 Client.Logout() 339 _, resp = Client.UpdateTeam(team) 340 CheckUnauthorizedStatus(t, resp) 341 342 team.Id = originalTeamId 343 _, resp = th.SystemAdminClient.UpdateTeam(team) 344 CheckNoError(t, resp) 345 } 346 347 func TestUpdateTeamSanitization(t *testing.T) { 348 th := Setup().InitBasic() 349 defer th.TearDown() 350 351 team, resp := th.Client.CreateTeam(&model.Team{ 352 DisplayName: t.Name() + "_1", 353 Name: GenerateTestTeamName(), 354 Email: th.GenerateTestEmail(), 355 Type: model.TEAM_OPEN, 356 AllowedDomains: "simulator.amazonses.com,dockerhost", 357 }) 358 CheckNoError(t, resp) 359 360 // Non-admin users cannot update the team 361 362 t.Run("team admin", func(t *testing.T) { 363 rteam, resp := th.Client.UpdateTeam(team) 364 CheckNoError(t, resp) 365 if rteam.Email == "" { 366 t.Fatal("should not have sanitized email for admin") 367 } 368 }) 369 370 t.Run("system admin", func(t *testing.T) { 371 rteam, resp := th.SystemAdminClient.UpdateTeam(team) 372 CheckNoError(t, resp) 373 if rteam.Email == "" { 374 t.Fatal("should not have sanitized email for admin") 375 } 376 }) 377 } 378 379 func TestPatchTeam(t *testing.T) { 380 th := Setup().InitBasic() 381 defer th.TearDown() 382 Client := th.Client 383 384 team := &model.Team{DisplayName: "Name", Description: "Some description", CompanyName: "Some company name", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewId() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TEAM_OPEN} 385 team, _ = Client.CreateTeam(team) 386 387 patch := &model.TeamPatch{} 388 389 patch.DisplayName = model.NewString("Other name") 390 patch.Description = model.NewString("Other description") 391 patch.CompanyName = model.NewString("Other company name") 392 patch.AllowOpenInvite = model.NewBool(true) 393 394 rteam, resp := Client.PatchTeam(team.Id, patch) 395 CheckNoError(t, resp) 396 397 if rteam.DisplayName != "Other name" { 398 t.Fatal("DisplayName did not update properly") 399 } 400 if rteam.Description != "Other description" { 401 t.Fatal("Description did not update properly") 402 } 403 if rteam.CompanyName != "Other company name" { 404 t.Fatal("CompanyName did not update properly") 405 } 406 if rteam.InviteId == "inviteid1" { 407 t.Fatal("InviteId should not update") 408 } 409 if !rteam.AllowOpenInvite { 410 t.Fatal("AllowOpenInvite did not update properly") 411 } 412 413 _, resp = Client.PatchTeam("junk", patch) 414 CheckBadRequestStatus(t, resp) 415 416 _, resp = Client.PatchTeam(GenerateTestId(), patch) 417 CheckForbiddenStatus(t, resp) 418 419 if r, err := Client.DoApiPut("/teams/"+team.Id+"/patch", "garbage"); err == nil { 420 t.Fatal("should have errored") 421 } else { 422 if r.StatusCode != http.StatusBadRequest { 423 t.Log("actual: " + strconv.Itoa(r.StatusCode)) 424 t.Log("expected: " + strconv.Itoa(http.StatusBadRequest)) 425 t.Fatal("wrong status code") 426 } 427 } 428 429 Client.Logout() 430 _, resp = Client.PatchTeam(team.Id, patch) 431 CheckUnauthorizedStatus(t, resp) 432 433 th.LoginBasic2() 434 _, resp = Client.PatchTeam(team.Id, patch) 435 CheckForbiddenStatus(t, resp) 436 437 _, resp = th.SystemAdminClient.PatchTeam(team.Id, patch) 438 CheckNoError(t, resp) 439 } 440 441 func TestPatchTeamSanitization(t *testing.T) { 442 th := Setup().InitBasic() 443 defer th.TearDown() 444 445 team, resp := th.Client.CreateTeam(&model.Team{ 446 DisplayName: t.Name() + "_1", 447 Name: GenerateTestTeamName(), 448 Email: th.GenerateTestEmail(), 449 Type: model.TEAM_OPEN, 450 AllowedDomains: "simulator.amazonses.com,dockerhost", 451 }) 452 CheckNoError(t, resp) 453 454 // Non-admin users cannot update the team 455 456 t.Run("team admin", func(t *testing.T) { 457 rteam, resp := th.Client.PatchTeam(team.Id, &model.TeamPatch{}) 458 CheckNoError(t, resp) 459 if rteam.Email == "" { 460 t.Fatal("should not have sanitized email for admin") 461 } 462 }) 463 464 t.Run("system admin", func(t *testing.T) { 465 rteam, resp := th.SystemAdminClient.PatchTeam(team.Id, &model.TeamPatch{}) 466 CheckNoError(t, resp) 467 if rteam.Email == "" { 468 t.Fatal("should not have sanitized email for admin") 469 } 470 }) 471 } 472 473 func TestRegenerateTeamInviteId(t *testing.T) { 474 th := Setup().InitBasic() 475 defer th.TearDown() 476 Client := th.Client 477 478 team := &model.Team{DisplayName: "Name", Description: "Some description", CompanyName: "Some company name", AllowOpenInvite: false, InviteId: "inviteid0", Name: "z-z-" + model.NewId() + "a", Email: "success+" + model.NewId() + "@simulator.amazonses.com", Type: model.TEAM_OPEN} 479 team, _ = Client.CreateTeam(team) 480 481 assert.NotEqual(t, team.InviteId, "") 482 assert.NotEqual(t, team.InviteId, "inviteid0") 483 484 rteam, resp := Client.RegenerateTeamInviteId(team.Id) 485 CheckNoError(t, resp) 486 487 assert.NotEqual(t, team.InviteId, rteam.InviteId) 488 assert.NotEqual(t, team.InviteId, "") 489 } 490 491 func TestSoftDeleteTeam(t *testing.T) { 492 th := Setup().InitBasic() 493 defer th.TearDown() 494 Client := th.Client 495 496 team := &model.Team{DisplayName: "DisplayName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN} 497 team, _ = Client.CreateTeam(team) 498 499 ok, resp := Client.SoftDeleteTeam(team.Id) 500 CheckNoError(t, resp) 501 502 if !ok { 503 t.Fatal("should have returned true") 504 } 505 506 rteam, err := th.App.GetTeam(team.Id) 507 if err != nil { 508 t.Fatal("should have returned archived team") 509 } 510 if rteam.DeleteAt == 0 { 511 t.Fatal("should have not set to zero") 512 } 513 514 ok, resp = Client.SoftDeleteTeam("junk") 515 CheckBadRequestStatus(t, resp) 516 517 if ok { 518 t.Fatal("should have returned false") 519 } 520 521 otherTeam := th.BasicTeam 522 _, resp = Client.SoftDeleteTeam(otherTeam.Id) 523 CheckForbiddenStatus(t, resp) 524 525 Client.Logout() 526 _, resp = Client.SoftDeleteTeam(otherTeam.Id) 527 CheckUnauthorizedStatus(t, resp) 528 529 _, resp = th.SystemAdminClient.SoftDeleteTeam(otherTeam.Id) 530 CheckNoError(t, resp) 531 } 532 533 func TestPermanentDeleteTeam(t *testing.T) { 534 th := Setup().InitBasic() 535 defer th.TearDown() 536 Client := th.Client 537 538 team := &model.Team{DisplayName: "DisplayName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN} 539 team, _ = Client.CreateTeam(team) 540 541 enableAPITeamDeletion := *th.App.Config().ServiceSettings.EnableAPITeamDeletion 542 defer func() { 543 th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnableAPITeamDeletion = &enableAPITeamDeletion }) 544 }() 545 546 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPITeamDeletion = false }) 547 548 // Does not error when deletion is disabled, just soft deletes 549 ok, resp := Client.PermanentDeleteTeam(team.Id) 550 CheckNoError(t, resp) 551 assert.True(t, ok) 552 553 rteam, err := th.App.GetTeam(team.Id) 554 assert.Nil(t, err) 555 assert.True(t, rteam.DeleteAt > 0) 556 557 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPITeamDeletion = true }) 558 559 ok, resp = Client.PermanentDeleteTeam(team.Id) 560 CheckNoError(t, resp) 561 assert.True(t, ok) 562 563 _, err = th.App.GetTeam(team.Id) 564 assert.NotNil(t, err) 565 566 ok, resp = Client.PermanentDeleteTeam("junk") 567 CheckBadRequestStatus(t, resp) 568 569 if ok { 570 t.Fatal("should have returned false") 571 } 572 } 573 574 func TestGetAllTeams(t *testing.T) { 575 th := Setup().InitBasic() 576 defer th.TearDown() 577 Client := th.Client 578 579 team1 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: true} 580 team1, resp := Client.CreateTeam(team1) 581 CheckNoError(t, resp) 582 583 team2 := &model.Team{DisplayName: "Name2", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: true} 584 team2, resp = Client.CreateTeam(team2) 585 CheckNoError(t, resp) 586 587 team3 := &model.Team{DisplayName: "Name3", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: false} 588 team3, resp = Client.CreateTeam(team3) 589 CheckNoError(t, resp) 590 591 testCases := []struct { 592 Name string 593 Page int 594 PerPage int 595 Permissions []string 596 ExpectedTeams []string 597 }{ 598 { 599 Name: "Get 1 team per page", 600 Page: 0, 601 PerPage: 1, 602 Permissions: []string{model.PERMISSION_LIST_PUBLIC_TEAMS.Id}, 603 ExpectedTeams: []string{team1.Id}, 604 }, 605 { 606 Name: "Get second page with 1 team per page", 607 Page: 1, 608 PerPage: 1, 609 Permissions: []string{model.PERMISSION_LIST_PUBLIC_TEAMS.Id}, 610 ExpectedTeams: []string{team2.Id}, 611 }, 612 { 613 Name: "Get no items per page", 614 Page: 1, 615 PerPage: 0, 616 Permissions: []string{model.PERMISSION_LIST_PUBLIC_TEAMS.Id}, 617 ExpectedTeams: []string{}, 618 }, 619 { 620 Name: "Get all open teams", 621 Page: 0, 622 PerPage: 10, 623 Permissions: []string{model.PERMISSION_LIST_PUBLIC_TEAMS.Id}, 624 ExpectedTeams: []string{team1.Id, team2.Id}, 625 }, 626 { 627 Name: "Get all private teams", 628 Page: 0, 629 PerPage: 10, 630 Permissions: []string{model.PERMISSION_LIST_PRIVATE_TEAMS.Id}, 631 ExpectedTeams: []string{th.BasicTeam.Id, team3.Id}, 632 }, 633 { 634 Name: "Get all teams", 635 Page: 0, 636 PerPage: 10, 637 Permissions: []string{model.PERMISSION_LIST_PUBLIC_TEAMS.Id, model.PERMISSION_LIST_PRIVATE_TEAMS.Id}, 638 ExpectedTeams: []string{th.BasicTeam.Id, team1.Id, team2.Id, team3.Id}, 639 }, 640 { 641 Name: "Get no teams because permissions", 642 Page: 0, 643 PerPage: 10, 644 Permissions: []string{}, 645 ExpectedTeams: []string{}, 646 }, 647 } 648 649 for _, tc := range testCases { 650 t.Run(tc.Name, func(t *testing.T) { 651 defaultRolePermissions := th.SaveDefaultRolePermissions() 652 defer func() { 653 th.RestoreDefaultRolePermissions(defaultRolePermissions) 654 }() 655 th.RemovePermissionFromRole(model.PERMISSION_LIST_PUBLIC_TEAMS.Id, model.SYSTEM_USER_ROLE_ID) 656 th.RemovePermissionFromRole(model.PERMISSION_JOIN_PUBLIC_TEAMS.Id, model.SYSTEM_USER_ROLE_ID) 657 th.RemovePermissionFromRole(model.PERMISSION_LIST_PRIVATE_TEAMS.Id, model.SYSTEM_USER_ROLE_ID) 658 th.RemovePermissionFromRole(model.PERMISSION_JOIN_PRIVATE_TEAMS.Id, model.SYSTEM_USER_ROLE_ID) 659 for _, permission := range tc.Permissions { 660 th.AddPermissionToRole(permission, model.SYSTEM_USER_ROLE_ID) 661 } 662 663 var teams []*model.Team 664 teams, resp = Client.GetAllTeams("", tc.Page, tc.PerPage) 665 CheckNoError(t, resp) 666 require.Equal(t, len(tc.ExpectedTeams), len(teams)) 667 for idx, team := range teams { 668 assert.Equal(t, tc.ExpectedTeams[idx], team.Id) 669 } 670 }) 671 } 672 673 t.Run("Unauthorized", func(t *testing.T) { 674 Client.Logout() 675 _, resp = Client.GetAllTeams("", 1, 10) 676 CheckUnauthorizedStatus(t, resp) 677 }) 678 } 679 680 func TestGetAllTeamsSanitization(t *testing.T) { 681 th := Setup().InitBasic() 682 defer th.TearDown() 683 684 team, resp := th.Client.CreateTeam(&model.Team{ 685 DisplayName: t.Name() + "_1", 686 Name: GenerateTestTeamName(), 687 Email: th.GenerateTestEmail(), 688 Type: model.TEAM_OPEN, 689 AllowedDomains: "simulator.amazonses.com,dockerhost", 690 AllowOpenInvite: true, 691 }) 692 CheckNoError(t, resp) 693 team2, resp := th.SystemAdminClient.CreateTeam(&model.Team{ 694 DisplayName: t.Name() + "_2", 695 Name: GenerateTestTeamName(), 696 Email: th.GenerateTestEmail(), 697 Type: model.TEAM_OPEN, 698 AllowedDomains: "simulator.amazonses.com,dockerhost", 699 AllowOpenInvite: true, 700 }) 701 CheckNoError(t, resp) 702 703 // This may not work if the server has over 1000 open teams on it 704 705 t.Run("team admin/non-admin", func(t *testing.T) { 706 teamFound := false 707 team2Found := false 708 709 rteams, resp := th.Client.GetAllTeams("", 0, 1000) 710 CheckNoError(t, resp) 711 for _, rteam := range rteams { 712 if rteam.Id == team.Id { 713 teamFound = true 714 if rteam.Email == "" { 715 t.Fatal("should not have sanitized email for team admin") 716 } 717 } else if rteam.Id == team2.Id { 718 team2Found = true 719 if rteam.Email != "" { 720 t.Fatal("should've sanitized email for non-admin") 721 } 722 } 723 } 724 725 if !teamFound || !team2Found { 726 t.Fatal("wasn't returned the expected teams so the test wasn't run correctly") 727 } 728 }) 729 730 t.Run("system admin", func(t *testing.T) { 731 rteams, resp := th.SystemAdminClient.GetAllTeams("", 0, 1000) 732 CheckNoError(t, resp) 733 for _, rteam := range rteams { 734 if rteam.Id != team.Id && rteam.Id != team2.Id { 735 continue 736 } 737 738 if rteam.Email == "" { 739 t.Fatal("should not have sanitized email") 740 } 741 } 742 }) 743 } 744 745 func TestGetTeamByName(t *testing.T) { 746 th := Setup().InitBasic() 747 defer th.TearDown() 748 Client := th.Client 749 team := th.BasicTeam 750 751 rteam, resp := Client.GetTeamByName(team.Name, "") 752 CheckNoError(t, resp) 753 754 if rteam.Name != team.Name { 755 t.Fatal("wrong team") 756 } 757 758 _, resp = Client.GetTeamByName("junk", "") 759 CheckNotFoundStatus(t, resp) 760 761 _, resp = Client.GetTeamByName("", "") 762 CheckNotFoundStatus(t, resp) 763 764 _, resp = th.SystemAdminClient.GetTeamByName(strings.ToUpper(team.Name), "") 765 CheckNoError(t, resp) 766 767 Client.Logout() 768 _, resp = Client.GetTeamByName(team.Name, "") 769 CheckUnauthorizedStatus(t, resp) 770 771 _, resp = th.SystemAdminClient.GetTeamByName(team.Name, "") 772 CheckNoError(t, resp) 773 774 th.LoginTeamAdmin() 775 776 team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: false} 777 rteam2, _ := Client.CreateTeam(team2) 778 779 team3 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_INVITE, AllowOpenInvite: true} 780 rteam3, _ := Client.CreateTeam(team3) 781 782 th.LoginBasic() 783 // AllowInviteOpen is false and team is open, and user is not on team 784 _, resp = Client.GetTeamByName(rteam2.Name, "") 785 CheckForbiddenStatus(t, resp) 786 787 // AllowInviteOpen is true and team is invite only, and user is not on team 788 _, resp = Client.GetTeamByName(rteam3.Name, "") 789 CheckForbiddenStatus(t, resp) 790 } 791 792 func TestGetTeamByNameSanitization(t *testing.T) { 793 th := Setup().InitBasic() 794 defer th.TearDown() 795 796 team, resp := th.Client.CreateTeam(&model.Team{ 797 DisplayName: t.Name() + "_1", 798 Name: GenerateTestTeamName(), 799 Email: th.GenerateTestEmail(), 800 Type: model.TEAM_OPEN, 801 AllowedDomains: "simulator.amazonses.com,dockerhost", 802 }) 803 CheckNoError(t, resp) 804 805 t.Run("team user", func(t *testing.T) { 806 th.LinkUserToTeam(th.BasicUser2, team) 807 808 client := th.CreateClient() 809 th.LoginBasic2WithClient(client) 810 811 rteam, resp := client.GetTeamByName(team.Name, "") 812 CheckNoError(t, resp) 813 if rteam.Email != "" { 814 t.Fatal("should've sanitized email") 815 } 816 }) 817 818 t.Run("team admin/non-admin", func(t *testing.T) { 819 rteam, resp := th.Client.GetTeamByName(team.Name, "") 820 CheckNoError(t, resp) 821 if rteam.Email == "" { 822 t.Fatal("should not have sanitized email") 823 } 824 }) 825 826 t.Run("system admin", func(t *testing.T) { 827 rteam, resp := th.SystemAdminClient.GetTeamByName(team.Name, "") 828 CheckNoError(t, resp) 829 if rteam.Email == "" { 830 t.Fatal("should not have sanitized email") 831 } 832 }) 833 } 834 835 func TestSearchAllTeams(t *testing.T) { 836 th := Setup().InitBasic() 837 defer th.TearDown() 838 Client := th.Client 839 oTeam := th.BasicTeam 840 oTeam.AllowOpenInvite = true 841 842 if updatedTeam, err := th.App.UpdateTeam(oTeam); err != nil { 843 t.Fatal(err) 844 } else { 845 oTeam.UpdateAt = updatedTeam.UpdateAt 846 } 847 848 pTeam := &model.Team{DisplayName: "PName", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_INVITE} 849 Client.CreateTeam(pTeam) 850 851 rteams, resp := Client.SearchTeams(&model.TeamSearch{Term: oTeam.Name}) 852 CheckNoError(t, resp) 853 854 if len(rteams) != 1 { 855 t.Fatal("should have returned 1 team") 856 } 857 858 if oTeam.Id != rteams[0].Id { 859 t.Fatal("invalid team") 860 } 861 862 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: oTeam.DisplayName}) 863 CheckNoError(t, resp) 864 865 if len(rteams) != 1 { 866 t.Fatal("should have returned 1 team") 867 } 868 869 if rteams[0].Id != oTeam.Id { 870 t.Fatal("invalid team") 871 } 872 873 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: pTeam.Name}) 874 CheckNoError(t, resp) 875 876 if len(rteams) != 0 { 877 t.Fatal("should have not returned team") 878 } 879 880 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) 881 CheckNoError(t, resp) 882 883 if len(rteams) != 0 { 884 t.Fatal("should have not returned team") 885 } 886 887 rteams, resp = th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: oTeam.Name}) 888 CheckNoError(t, resp) 889 890 if len(rteams) != 1 { 891 t.Fatal("should have returned 1 team") 892 } 893 894 rteams, resp = th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) 895 CheckNoError(t, resp) 896 897 if len(rteams) != 1 { 898 t.Fatal("should have returned 1 team") 899 } 900 901 rteams, resp = Client.SearchTeams(&model.TeamSearch{Term: "junk"}) 902 CheckNoError(t, resp) 903 904 if len(rteams) != 0 { 905 t.Fatal("should have not returned team") 906 } 907 908 Client.Logout() 909 910 _, resp = Client.SearchTeams(&model.TeamSearch{Term: pTeam.Name}) 911 CheckUnauthorizedStatus(t, resp) 912 913 _, resp = Client.SearchTeams(&model.TeamSearch{Term: pTeam.DisplayName}) 914 CheckUnauthorizedStatus(t, resp) 915 } 916 917 func TestSearchAllTeamsSanitization(t *testing.T) { 918 th := Setup().InitBasic() 919 defer th.TearDown() 920 921 team, resp := th.Client.CreateTeam(&model.Team{ 922 DisplayName: t.Name() + "_1", 923 Name: GenerateTestTeamName(), 924 Email: th.GenerateTestEmail(), 925 Type: model.TEAM_OPEN, 926 AllowedDomains: "simulator.amazonses.com,dockerhost", 927 }) 928 CheckNoError(t, resp) 929 team2, resp := th.Client.CreateTeam(&model.Team{ 930 DisplayName: t.Name() + "_2", 931 Name: GenerateTestTeamName(), 932 Email: th.GenerateTestEmail(), 933 Type: model.TEAM_OPEN, 934 AllowedDomains: "simulator.amazonses.com,dockerhost", 935 }) 936 CheckNoError(t, resp) 937 938 t.Run("non-team user", func(t *testing.T) { 939 client := th.CreateClient() 940 th.LoginBasic2WithClient(client) 941 942 rteams, resp := client.SearchTeams(&model.TeamSearch{Term: t.Name()}) 943 CheckNoError(t, resp) 944 for _, rteam := range rteams { 945 if rteam.Email != "" { 946 t.Fatal("should've sanitized email") 947 } else if rteam.AllowedDomains != "" { 948 t.Fatal("should've sanitized allowed domains") 949 } 950 } 951 }) 952 953 t.Run("team user", func(t *testing.T) { 954 th.LinkUserToTeam(th.BasicUser2, team) 955 956 client := th.CreateClient() 957 th.LoginBasic2WithClient(client) 958 959 rteams, resp := client.SearchTeams(&model.TeamSearch{Term: t.Name()}) 960 CheckNoError(t, resp) 961 for _, rteam := range rteams { 962 if rteam.Email != "" { 963 t.Fatal("should've sanitized email") 964 } else if rteam.AllowedDomains != "" { 965 t.Fatal("should've sanitized allowed domains") 966 } 967 } 968 }) 969 970 t.Run("team admin", func(t *testing.T) { 971 rteams, resp := th.Client.SearchTeams(&model.TeamSearch{Term: t.Name()}) 972 CheckNoError(t, resp) 973 for _, rteam := range rteams { 974 if rteam.Id == team.Id || rteam.Id == team2.Id || rteam.Id == th.BasicTeam.Id { 975 if rteam.Email == "" { 976 t.Fatal("should not have sanitized email") 977 } 978 } 979 } 980 }) 981 982 t.Run("system admin", func(t *testing.T) { 983 rteams, resp := th.SystemAdminClient.SearchTeams(&model.TeamSearch{Term: t.Name()}) 984 CheckNoError(t, resp) 985 for _, rteam := range rteams { 986 if rteam.Email == "" { 987 t.Fatal("should not have sanitized email") 988 } 989 } 990 }) 991 } 992 993 func TestGetTeamsForUser(t *testing.T) { 994 th := Setup().InitBasic() 995 defer th.TearDown() 996 Client := th.Client 997 998 team2 := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: th.GenerateTestEmail(), Type: model.TEAM_INVITE} 999 rteam2, _ := Client.CreateTeam(team2) 1000 1001 teams, resp := Client.GetTeamsForUser(th.BasicUser.Id, "") 1002 CheckNoError(t, resp) 1003 1004 if len(teams) != 2 { 1005 t.Fatal("wrong number of teams") 1006 } 1007 1008 found1 := false 1009 found2 := false 1010 for _, t := range teams { 1011 if t.Id == th.BasicTeam.Id { 1012 found1 = true 1013 } else if t.Id == rteam2.Id { 1014 found2 = true 1015 } 1016 } 1017 1018 if !found1 || !found2 { 1019 t.Fatal("missing team") 1020 } 1021 1022 _, resp = Client.GetTeamsForUser("junk", "") 1023 CheckBadRequestStatus(t, resp) 1024 1025 _, resp = Client.GetTeamsForUser(model.NewId(), "") 1026 CheckForbiddenStatus(t, resp) 1027 1028 _, resp = Client.GetTeamsForUser(th.BasicUser2.Id, "") 1029 CheckForbiddenStatus(t, resp) 1030 1031 _, resp = th.SystemAdminClient.GetTeamsForUser(th.BasicUser2.Id, "") 1032 CheckNoError(t, resp) 1033 } 1034 1035 func TestGetTeamsForUserSanitization(t *testing.T) { 1036 th := Setup().InitBasic() 1037 defer th.TearDown() 1038 1039 team, resp := th.Client.CreateTeam(&model.Team{ 1040 DisplayName: t.Name() + "_1", 1041 Name: GenerateTestTeamName(), 1042 Email: th.GenerateTestEmail(), 1043 Type: model.TEAM_OPEN, 1044 AllowedDomains: "simulator.amazonses.com,dockerhost", 1045 }) 1046 CheckNoError(t, resp) 1047 team2, resp := th.Client.CreateTeam(&model.Team{ 1048 DisplayName: t.Name() + "_2", 1049 Name: GenerateTestTeamName(), 1050 Email: th.GenerateTestEmail(), 1051 Type: model.TEAM_OPEN, 1052 AllowedDomains: "simulator.amazonses.com,dockerhost", 1053 }) 1054 CheckNoError(t, resp) 1055 1056 t.Run("team user", func(t *testing.T) { 1057 th.LinkUserToTeam(th.BasicUser2, team) 1058 th.LinkUserToTeam(th.BasicUser2, team2) 1059 1060 client := th.CreateClient() 1061 th.LoginBasic2WithClient(client) 1062 1063 rteams, resp := client.GetTeamsForUser(th.BasicUser2.Id, "") 1064 CheckNoError(t, resp) 1065 for _, rteam := range rteams { 1066 if rteam.Id != team.Id && rteam.Id != team2.Id { 1067 continue 1068 } 1069 1070 if rteam.Email != "" { 1071 t.Fatal("should've sanitized email") 1072 } 1073 } 1074 }) 1075 1076 t.Run("team admin", func(t *testing.T) { 1077 rteams, resp := th.Client.GetTeamsForUser(th.BasicUser.Id, "") 1078 CheckNoError(t, resp) 1079 for _, rteam := range rteams { 1080 if rteam.Id != team.Id && rteam.Id != team2.Id { 1081 continue 1082 } 1083 1084 if rteam.Email == "" { 1085 t.Fatal("should not have sanitized email") 1086 } 1087 } 1088 }) 1089 1090 t.Run("system admin", func(t *testing.T) { 1091 rteams, resp := th.SystemAdminClient.GetTeamsForUser(th.BasicUser.Id, "") 1092 CheckNoError(t, resp) 1093 for _, rteam := range rteams { 1094 if rteam.Id != team.Id && rteam.Id != team2.Id { 1095 continue 1096 } 1097 1098 if rteam.Email == "" { 1099 t.Fatal("should not have sanitized email") 1100 } 1101 } 1102 }) 1103 } 1104 1105 func TestGetTeamMember(t *testing.T) { 1106 th := Setup().InitBasic() 1107 defer th.TearDown() 1108 Client := th.Client 1109 team := th.BasicTeam 1110 user := th.BasicUser 1111 1112 rmember, resp := Client.GetTeamMember(team.Id, user.Id, "") 1113 CheckNoError(t, resp) 1114 1115 if rmember.TeamId != team.Id { 1116 t.Fatal("wrong team id") 1117 } 1118 1119 if rmember.UserId != user.Id { 1120 t.Fatal("wrong team id") 1121 } 1122 1123 _, resp = Client.GetTeamMember("junk", user.Id, "") 1124 CheckBadRequestStatus(t, resp) 1125 1126 _, resp = Client.GetTeamMember(team.Id, "junk", "") 1127 CheckBadRequestStatus(t, resp) 1128 1129 _, resp = Client.GetTeamMember("junk", "junk", "") 1130 CheckBadRequestStatus(t, resp) 1131 1132 _, resp = Client.GetTeamMember(team.Id, model.NewId(), "") 1133 CheckNotFoundStatus(t, resp) 1134 1135 _, resp = Client.GetTeamMember(model.NewId(), user.Id, "") 1136 CheckForbiddenStatus(t, resp) 1137 1138 _, resp = th.SystemAdminClient.GetTeamMember(team.Id, user.Id, "") 1139 CheckNoError(t, resp) 1140 } 1141 1142 func TestGetTeamMembers(t *testing.T) { 1143 th := Setup().InitBasic() 1144 defer th.TearDown() 1145 Client := th.Client 1146 team := th.BasicTeam 1147 userNotMember := th.CreateUser() 1148 1149 rmembers, resp := Client.GetTeamMembers(team.Id, 0, 100, "") 1150 CheckNoError(t, resp) 1151 1152 t.Logf("rmembers count %v\n", len(rmembers)) 1153 1154 if len(rmembers) == 0 { 1155 t.Fatal("should have results") 1156 } 1157 1158 for _, rmember := range rmembers { 1159 if rmember.TeamId != team.Id || rmember.UserId == userNotMember.Id { 1160 t.Fatal("user should be a member of team") 1161 } 1162 } 1163 1164 rmembers, resp = Client.GetTeamMembers(team.Id, 0, 1, "") 1165 CheckNoError(t, resp) 1166 if len(rmembers) != 1 { 1167 t.Fatal("should be 1 per page") 1168 } 1169 1170 rmembers, resp = Client.GetTeamMembers(team.Id, 1, 1, "") 1171 CheckNoError(t, resp) 1172 if len(rmembers) != 1 { 1173 t.Fatal("should be 1 per page") 1174 } 1175 1176 rmembers, resp = Client.GetTeamMembers(team.Id, 10000, 100, "") 1177 CheckNoError(t, resp) 1178 if len(rmembers) != 0 { 1179 t.Fatal("should be no member") 1180 } 1181 1182 rmembers, resp = Client.GetTeamMembers(team.Id, 0, 2, "") 1183 CheckNoError(t, resp) 1184 rmembers2, resp := Client.GetTeamMembers(team.Id, 1, 2, "") 1185 CheckNoError(t, resp) 1186 1187 for _, tm1 := range rmembers { 1188 for _, tm2 := range rmembers2 { 1189 assert.NotEqual(t, tm1.UserId+tm1.TeamId, tm2.UserId+tm2.TeamId, "different pages should not have the same members") 1190 } 1191 } 1192 1193 _, resp = Client.GetTeamMembers("junk", 0, 100, "") 1194 CheckBadRequestStatus(t, resp) 1195 1196 _, resp = Client.GetTeamMembers(model.NewId(), 0, 100, "") 1197 CheckForbiddenStatus(t, resp) 1198 1199 Client.Logout() 1200 _, resp = Client.GetTeamMembers(team.Id, 0, 1, "") 1201 CheckUnauthorizedStatus(t, resp) 1202 1203 _, resp = th.SystemAdminClient.GetTeamMembers(team.Id, 0, 100, "") 1204 CheckNoError(t, resp) 1205 } 1206 1207 func TestGetTeamMembersForUser(t *testing.T) { 1208 th := Setup().InitBasic() 1209 defer th.TearDown() 1210 Client := th.Client 1211 1212 members, resp := Client.GetTeamMembersForUser(th.BasicUser.Id, "") 1213 CheckNoError(t, resp) 1214 1215 found := false 1216 for _, m := range members { 1217 if m.TeamId == th.BasicTeam.Id { 1218 found = true 1219 } 1220 } 1221 1222 if !found { 1223 t.Fatal("missing team member") 1224 } 1225 1226 _, resp = Client.GetTeamMembersForUser("junk", "") 1227 CheckBadRequestStatus(t, resp) 1228 1229 _, resp = Client.GetTeamMembersForUser(model.NewId(), "") 1230 CheckForbiddenStatus(t, resp) 1231 1232 Client.Logout() 1233 _, resp = Client.GetTeamMembersForUser(th.BasicUser.Id, "") 1234 CheckUnauthorizedStatus(t, resp) 1235 1236 user := th.CreateUser() 1237 Client.Login(user.Email, user.Password) 1238 _, resp = Client.GetTeamMembersForUser(th.BasicUser.Id, "") 1239 CheckForbiddenStatus(t, resp) 1240 1241 _, resp = th.SystemAdminClient.GetTeamMembersForUser(th.BasicUser.Id, "") 1242 CheckNoError(t, resp) 1243 } 1244 1245 func TestGetTeamMembersByIds(t *testing.T) { 1246 th := Setup().InitBasic() 1247 defer th.TearDown() 1248 Client := th.Client 1249 1250 tm, resp := Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{th.BasicUser.Id}) 1251 CheckNoError(t, resp) 1252 1253 if tm[0].UserId != th.BasicUser.Id { 1254 t.Fatal("returned wrong user") 1255 } 1256 1257 _, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{}) 1258 CheckBadRequestStatus(t, resp) 1259 1260 tm1, resp := Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{"junk"}) 1261 CheckNoError(t, resp) 1262 if len(tm1) > 0 { 1263 t.Fatal("no users should be returned") 1264 } 1265 1266 tm1, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{"junk", th.BasicUser.Id}) 1267 CheckNoError(t, resp) 1268 if len(tm1) != 1 { 1269 t.Fatal("1 user should be returned") 1270 } 1271 1272 _, resp = Client.GetTeamMembersByIds("junk", []string{th.BasicUser.Id}) 1273 CheckBadRequestStatus(t, resp) 1274 1275 _, resp = Client.GetTeamMembersByIds(model.NewId(), []string{th.BasicUser.Id}) 1276 CheckForbiddenStatus(t, resp) 1277 1278 Client.Logout() 1279 _, resp = Client.GetTeamMembersByIds(th.BasicTeam.Id, []string{th.BasicUser.Id}) 1280 CheckUnauthorizedStatus(t, resp) 1281 } 1282 1283 func TestAddTeamMember(t *testing.T) { 1284 th := Setup().InitBasic() 1285 defer th.TearDown() 1286 Client := th.Client 1287 team := th.BasicTeam 1288 otherUser := th.CreateUser() 1289 1290 if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id, ""); err != nil { 1291 t.Fatalf(err.Error()) 1292 } 1293 1294 // Regular user can't add a member to a team they don't belong to. 1295 th.LoginBasic2() 1296 _, resp := Client.AddTeamMember(team.Id, otherUser.Id) 1297 CheckForbiddenStatus(t, resp) 1298 if resp.Error == nil { 1299 t.Fatalf("Error is nil") 1300 } 1301 Client.Logout() 1302 1303 // Regular user can add a member to a team they belong to. 1304 th.LoginBasic() 1305 tm, resp := Client.AddTeamMember(team.Id, otherUser.Id) 1306 CheckNoError(t, resp) 1307 CheckCreatedStatus(t, resp) 1308 1309 // Check all the returned data. 1310 if tm == nil { 1311 t.Fatal("should have returned team member") 1312 } 1313 1314 if tm.UserId != otherUser.Id { 1315 t.Fatal("user ids should have matched") 1316 } 1317 1318 if tm.TeamId != team.Id { 1319 t.Fatal("team ids should have matched") 1320 } 1321 1322 // Check with various invalid requests. 1323 tm, resp = Client.AddTeamMember(team.Id, "junk") 1324 CheckBadRequestStatus(t, resp) 1325 1326 if tm != nil { 1327 t.Fatal("should have not returned team member") 1328 } 1329 1330 _, resp = Client.AddTeamMember("junk", otherUser.Id) 1331 CheckBadRequestStatus(t, resp) 1332 1333 _, resp = Client.AddTeamMember(GenerateTestId(), otherUser.Id) 1334 CheckForbiddenStatus(t, resp) 1335 1336 _, resp = Client.AddTeamMember(team.Id, GenerateTestId()) 1337 CheckNotFoundStatus(t, resp) 1338 1339 Client.Logout() 1340 1341 // Check the appropriate permissions are enforced. 1342 defaultRolePermissions := th.SaveDefaultRolePermissions() 1343 defer func() { 1344 th.RestoreDefaultRolePermissions(defaultRolePermissions) 1345 }() 1346 1347 // Set the config so that only team admins can add a user to a team. 1348 th.AddPermissionToRole(model.PERMISSION_INVITE_USER.Id, model.TEAM_ADMIN_ROLE_ID) 1349 th.AddPermissionToRole(model.PERMISSION_ADD_USER_TO_TEAM.Id, model.TEAM_ADMIN_ROLE_ID) 1350 th.RemovePermissionFromRole(model.PERMISSION_INVITE_USER.Id, model.TEAM_USER_ROLE_ID) 1351 th.RemovePermissionFromRole(model.PERMISSION_ADD_USER_TO_TEAM.Id, model.TEAM_USER_ROLE_ID) 1352 1353 th.LoginBasic() 1354 1355 // Check that a regular user can't add someone to the team. 1356 _, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1357 CheckForbiddenStatus(t, resp) 1358 1359 // Update user to team admin 1360 th.UpdateUserToTeamAdmin(th.BasicUser, th.BasicTeam) 1361 th.App.InvalidateAllCaches() 1362 th.LoginBasic() 1363 1364 // Should work as a team admin. 1365 _, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1366 CheckNoError(t, resp) 1367 1368 // Change permission level to team user 1369 th.AddPermissionToRole(model.PERMISSION_INVITE_USER.Id, model.TEAM_USER_ROLE_ID) 1370 th.AddPermissionToRole(model.PERMISSION_ADD_USER_TO_TEAM.Id, model.TEAM_USER_ROLE_ID) 1371 th.RemovePermissionFromRole(model.PERMISSION_INVITE_USER.Id, model.TEAM_ADMIN_ROLE_ID) 1372 th.RemovePermissionFromRole(model.PERMISSION_ADD_USER_TO_TEAM.Id, model.TEAM_ADMIN_ROLE_ID) 1373 1374 th.UpdateUserToNonTeamAdmin(th.BasicUser, th.BasicTeam) 1375 th.App.InvalidateAllCaches() 1376 th.LoginBasic() 1377 1378 // Should work as a regular user. 1379 _, resp = Client.AddTeamMember(team.Id, otherUser.Id) 1380 CheckNoError(t, resp) 1381 1382 // by token 1383 Client.Login(otherUser.Email, otherUser.Password) 1384 1385 token := model.NewToken( 1386 app.TOKEN_TYPE_TEAM_INVITATION, 1387 model.MapToJson(map[string]string{"teamId": team.Id}), 1388 ) 1389 <-th.App.Srv.Store.Token().Save(token) 1390 1391 tm, resp = Client.AddTeamMemberFromInvite(token.Token, "") 1392 CheckNoError(t, resp) 1393 1394 if tm == nil { 1395 t.Fatal("should have returned team member") 1396 } 1397 1398 if tm.UserId != otherUser.Id { 1399 t.Fatal("user ids should have matched") 1400 } 1401 1402 if tm.TeamId != team.Id { 1403 t.Fatal("team ids should have matched") 1404 } 1405 1406 if result := <-th.App.Srv.Store.Token().GetByToken(token.Token); result.Err == nil { 1407 t.Fatal("The token must be deleted after be used") 1408 } 1409 1410 tm, resp = Client.AddTeamMemberFromInvite("junk", "") 1411 CheckBadRequestStatus(t, resp) 1412 1413 if tm != nil { 1414 t.Fatal("should have not returned team member") 1415 } 1416 1417 // expired token of more than 50 hours 1418 token = model.NewToken(app.TOKEN_TYPE_TEAM_INVITATION, "") 1419 token.CreateAt = model.GetMillis() - 1000*60*60*50 1420 <-th.App.Srv.Store.Token().Save(token) 1421 1422 _, resp = Client.AddTeamMemberFromInvite(token.Token, "") 1423 CheckBadRequestStatus(t, resp) 1424 th.App.DeleteToken(token) 1425 1426 // invalid team id 1427 testId := GenerateTestId() 1428 token = model.NewToken( 1429 app.TOKEN_TYPE_TEAM_INVITATION, 1430 model.MapToJson(map[string]string{"teamId": testId}), 1431 ) 1432 <-th.App.Srv.Store.Token().Save(token) 1433 1434 _, resp = Client.AddTeamMemberFromInvite(token.Token, "") 1435 CheckNotFoundStatus(t, resp) 1436 th.App.DeleteToken(token) 1437 1438 // by invite_id 1439 Client.Login(otherUser.Email, otherUser.Password) 1440 1441 tm, resp = Client.AddTeamMemberFromInvite("", team.InviteId) 1442 CheckNoError(t, resp) 1443 1444 if tm == nil { 1445 t.Fatal("should have returned team member") 1446 } 1447 1448 if tm.UserId != otherUser.Id { 1449 t.Fatal("user ids should have matched") 1450 } 1451 1452 if tm.TeamId != team.Id { 1453 t.Fatal("team ids should have matched") 1454 } 1455 1456 tm, resp = Client.AddTeamMemberFromInvite("", "junk") 1457 CheckNotFoundStatus(t, resp) 1458 1459 if tm != nil { 1460 t.Fatal("should have not returned team member") 1461 } 1462 } 1463 1464 func TestAddTeamMemberMyself(t *testing.T) { 1465 th := Setup().InitBasic() 1466 defer th.TearDown() 1467 Client := th.Client 1468 1469 // Check the appropriate permissions are enforced. 1470 defaultRolePermissions := th.SaveDefaultRolePermissions() 1471 defer func() { 1472 th.RestoreDefaultRolePermissions(defaultRolePermissions) 1473 }() 1474 1475 th.LoginBasic() 1476 1477 testCases := []struct { 1478 Name string 1479 Public bool 1480 PublicPermission bool 1481 PrivatePermission bool 1482 ExpectedSuccess bool 1483 }{ 1484 { 1485 Name: "Try to join an open team without the permissions", 1486 Public: true, 1487 PublicPermission: false, 1488 PrivatePermission: false, 1489 ExpectedSuccess: false, 1490 }, 1491 { 1492 Name: "Try to join a private team without the permissions", 1493 Public: false, 1494 PublicPermission: false, 1495 PrivatePermission: false, 1496 ExpectedSuccess: false, 1497 }, 1498 { 1499 Name: "Try to join an open team without public permission but with private permissions", 1500 Public: true, 1501 PublicPermission: false, 1502 PrivatePermission: true, 1503 ExpectedSuccess: false, 1504 }, 1505 { 1506 Name: "Try to join a private team without private permission but with public permission", 1507 Public: false, 1508 PublicPermission: true, 1509 PrivatePermission: false, 1510 ExpectedSuccess: false, 1511 }, 1512 { 1513 Name: "Join an open team with the permissions", 1514 Public: true, 1515 PublicPermission: true, 1516 PrivatePermission: false, 1517 ExpectedSuccess: true, 1518 }, 1519 { 1520 Name: "Join a private team with the permissions", 1521 Public: false, 1522 PublicPermission: false, 1523 PrivatePermission: true, 1524 ExpectedSuccess: true, 1525 }, 1526 } 1527 1528 for _, tc := range testCases { 1529 t.Run(tc.Name, func(t *testing.T) { 1530 team := th.CreateTeam() 1531 team.AllowOpenInvite = tc.Public 1532 th.App.UpdateTeam(team) 1533 if tc.PublicPermission { 1534 th.AddPermissionToRole(model.PERMISSION_JOIN_PUBLIC_TEAMS.Id, model.SYSTEM_USER_ROLE_ID) 1535 } else { 1536 th.RemovePermissionFromRole(model.PERMISSION_JOIN_PUBLIC_TEAMS.Id, model.SYSTEM_USER_ROLE_ID) 1537 } 1538 if tc.PrivatePermission { 1539 th.AddPermissionToRole(model.PERMISSION_JOIN_PRIVATE_TEAMS.Id, model.SYSTEM_USER_ROLE_ID) 1540 } else { 1541 th.RemovePermissionFromRole(model.PERMISSION_JOIN_PRIVATE_TEAMS.Id, model.SYSTEM_USER_ROLE_ID) 1542 } 1543 _, resp := Client.AddTeamMember(team.Id, th.BasicUser.Id) 1544 if tc.ExpectedSuccess { 1545 CheckNoError(t, resp) 1546 } else { 1547 CheckForbiddenStatus(t, resp) 1548 } 1549 }) 1550 } 1551 1552 } 1553 1554 func TestAddTeamMembers(t *testing.T) { 1555 th := Setup().InitBasic() 1556 defer th.TearDown() 1557 Client := th.Client 1558 team := th.BasicTeam 1559 otherUser := th.CreateUser() 1560 userList := []string{ 1561 otherUser.Id, 1562 } 1563 1564 if err := th.App.RemoveUserFromTeam(th.BasicTeam.Id, th.BasicUser2.Id, ""); err != nil { 1565 t.Fatalf(err.Error()) 1566 } 1567 1568 // Regular user can't add a member to a team they don't belong to. 1569 th.LoginBasic2() 1570 _, resp := Client.AddTeamMembers(team.Id, userList) 1571 CheckForbiddenStatus(t, resp) 1572 Client.Logout() 1573 1574 // Regular user can add a member to a team they belong to. 1575 th.LoginBasic() 1576 tm, resp := Client.AddTeamMembers(team.Id, userList) 1577 CheckNoError(t, resp) 1578 CheckCreatedStatus(t, resp) 1579 1580 // Check all the returned data. 1581 if tm[0] == nil { 1582 t.Fatal("should have returned team member") 1583 } 1584 1585 if tm[0].UserId != otherUser.Id { 1586 t.Fatal("user ids should have matched") 1587 } 1588 1589 if tm[0].TeamId != team.Id { 1590 t.Fatal("team ids should have matched") 1591 } 1592 1593 // Check with various invalid requests. 1594 _, resp = Client.AddTeamMembers("junk", userList) 1595 CheckBadRequestStatus(t, resp) 1596 1597 _, resp = Client.AddTeamMembers(GenerateTestId(), userList) 1598 CheckForbiddenStatus(t, resp) 1599 1600 testUserList := append(userList, GenerateTestId()) 1601 _, resp = Client.AddTeamMembers(team.Id, testUserList) 1602 CheckNotFoundStatus(t, resp) 1603 1604 // Test with many users. 1605 for i := 0; i < 25; i++ { 1606 testUserList = append(testUserList, GenerateTestId()) 1607 } 1608 _, resp = Client.AddTeamMembers(team.Id, testUserList) 1609 CheckBadRequestStatus(t, resp) 1610 1611 Client.Logout() 1612 1613 // Check the appropriate permissions are enforced. 1614 defaultRolePermissions := th.SaveDefaultRolePermissions() 1615 defer func() { 1616 th.RestoreDefaultRolePermissions(defaultRolePermissions) 1617 }() 1618 1619 // Set the config so that only team admins can add a user to a team. 1620 th.AddPermissionToRole(model.PERMISSION_INVITE_USER.Id, model.TEAM_ADMIN_ROLE_ID) 1621 th.AddPermissionToRole(model.PERMISSION_ADD_USER_TO_TEAM.Id, model.TEAM_ADMIN_ROLE_ID) 1622 th.RemovePermissionFromRole(model.PERMISSION_INVITE_USER.Id, model.TEAM_USER_ROLE_ID) 1623 th.RemovePermissionFromRole(model.PERMISSION_ADD_USER_TO_TEAM.Id, model.TEAM_USER_ROLE_ID) 1624 1625 th.LoginBasic() 1626 1627 // Check that a regular user can't add someone to the team. 1628 _, resp = Client.AddTeamMembers(team.Id, userList) 1629 CheckForbiddenStatus(t, resp) 1630 1631 // Update user to team admin 1632 th.UpdateUserToTeamAdmin(th.BasicUser, th.BasicTeam) 1633 th.App.InvalidateAllCaches() 1634 th.LoginBasic() 1635 1636 // Should work as a team admin. 1637 _, resp = Client.AddTeamMembers(team.Id, userList) 1638 CheckNoError(t, resp) 1639 1640 // Change permission level to team user 1641 th.AddPermissionToRole(model.PERMISSION_INVITE_USER.Id, model.TEAM_USER_ROLE_ID) 1642 th.AddPermissionToRole(model.PERMISSION_ADD_USER_TO_TEAM.Id, model.TEAM_USER_ROLE_ID) 1643 th.RemovePermissionFromRole(model.PERMISSION_INVITE_USER.Id, model.TEAM_ADMIN_ROLE_ID) 1644 th.RemovePermissionFromRole(model.PERMISSION_ADD_USER_TO_TEAM.Id, model.TEAM_ADMIN_ROLE_ID) 1645 1646 th.UpdateUserToNonTeamAdmin(th.BasicUser, th.BasicTeam) 1647 th.App.InvalidateAllCaches() 1648 th.LoginBasic() 1649 1650 // Should work as a regular user. 1651 _, resp = Client.AddTeamMembers(team.Id, userList) 1652 CheckNoError(t, resp) 1653 } 1654 1655 func TestRemoveTeamMember(t *testing.T) { 1656 th := Setup().InitBasic() 1657 defer th.TearDown() 1658 Client := th.Client 1659 1660 pass, resp := Client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id) 1661 CheckNoError(t, resp) 1662 1663 if !pass { 1664 t.Fatal("should have passed") 1665 } 1666 1667 _, resp = th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, th.BasicUser.Id) 1668 CheckNoError(t, resp) 1669 1670 _, resp = Client.RemoveTeamMember(th.BasicTeam.Id, "junk") 1671 CheckBadRequestStatus(t, resp) 1672 1673 _, resp = Client.RemoveTeamMember("junk", th.BasicUser2.Id) 1674 CheckBadRequestStatus(t, resp) 1675 1676 _, resp = Client.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser2.Id) 1677 CheckForbiddenStatus(t, resp) 1678 1679 _, resp = Client.RemoveTeamMember(model.NewId(), th.BasicUser.Id) 1680 CheckNotFoundStatus(t, resp) 1681 1682 _, resp = th.SystemAdminClient.RemoveTeamMember(th.BasicTeam.Id, th.BasicUser.Id) 1683 CheckNoError(t, resp) 1684 } 1685 1686 func TestGetTeamStats(t *testing.T) { 1687 th := Setup().InitBasic() 1688 defer th.TearDown() 1689 Client := th.Client 1690 team := th.BasicTeam 1691 1692 rstats, resp := Client.GetTeamStats(team.Id, "") 1693 CheckNoError(t, resp) 1694 1695 if rstats.TeamId != team.Id { 1696 t.Fatal("wrong team id") 1697 } 1698 1699 if rstats.TotalMemberCount != 3 { 1700 t.Fatal("wrong count") 1701 } 1702 1703 if rstats.ActiveMemberCount != 3 { 1704 t.Fatal("wrong count") 1705 } 1706 1707 _, resp = Client.GetTeamStats("junk", "") 1708 CheckBadRequestStatus(t, resp) 1709 1710 _, resp = Client.GetTeamStats(model.NewId(), "") 1711 CheckForbiddenStatus(t, resp) 1712 1713 _, resp = th.SystemAdminClient.GetTeamStats(team.Id, "") 1714 CheckNoError(t, resp) 1715 1716 // deactivate BasicUser2 1717 th.UpdateActiveUser(th.BasicUser2, false) 1718 1719 rstats, resp = th.SystemAdminClient.GetTeamStats(team.Id, "") 1720 CheckNoError(t, resp) 1721 1722 if rstats.TotalMemberCount != 3 { 1723 t.Fatal("wrong count") 1724 } 1725 1726 if rstats.ActiveMemberCount != 2 { 1727 t.Fatal("wrong count") 1728 } 1729 1730 // login with different user and test if forbidden 1731 user := th.CreateUser() 1732 Client.Login(user.Email, user.Password) 1733 _, resp = Client.GetTeamStats(th.BasicTeam.Id, "") 1734 CheckForbiddenStatus(t, resp) 1735 1736 Client.Logout() 1737 _, resp = Client.GetTeamStats(th.BasicTeam.Id, "") 1738 CheckUnauthorizedStatus(t, resp) 1739 } 1740 1741 func TestUpdateTeamMemberRoles(t *testing.T) { 1742 th := Setup().InitBasic() 1743 defer th.TearDown() 1744 Client := th.Client 1745 SystemAdminClient := th.SystemAdminClient 1746 1747 const TEAM_MEMBER = "team_user" 1748 const TEAM_ADMIN = "team_user team_admin" 1749 1750 // user 1 tries to promote user 2 1751 ok, resp := Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN) 1752 CheckForbiddenStatus(t, resp) 1753 if ok { 1754 t.Fatal("should have returned false") 1755 } 1756 1757 // user 1 tries to promote himself 1758 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_ADMIN) 1759 CheckForbiddenStatus(t, resp) 1760 1761 // user 1 tries to demote someone 1762 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER) 1763 CheckForbiddenStatus(t, resp) 1764 1765 // system admin promotes user 1 1766 ok, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_ADMIN) 1767 CheckNoError(t, resp) 1768 if !ok { 1769 t.Fatal("should have returned true") 1770 } 1771 1772 // user 1 (team admin) promotes user 2 1773 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN) 1774 CheckNoError(t, resp) 1775 1776 // user 1 (team admin) demotes user 2 (team admin) 1777 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_MEMBER) 1778 CheckNoError(t, resp) 1779 1780 // user 1 (team admin) tries to demote system admin (not member of a team) 1781 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER) 1782 CheckNotFoundStatus(t, resp) 1783 1784 // user 1 (team admin) demotes system admin (member of a team) 1785 th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam) 1786 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, TEAM_MEMBER) 1787 CheckNoError(t, resp) 1788 // Note from API v3 1789 // Note to anyone who thinks this (above) test is wrong: 1790 // This operation will not affect the system admin's permissions because they have global access to all teams. 1791 // Their team level permissions are irrelevant. A team admin should be able to manage team level permissions. 1792 1793 // System admins should be able to manipulate permission no matter what their team level permissions are. 1794 // system admin promotes user 2 1795 _, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_ADMIN) 1796 CheckNoError(t, resp) 1797 1798 // system admin demotes user 2 (team admin) 1799 _, resp = SystemAdminClient.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser2.Id, TEAM_MEMBER) 1800 CheckNoError(t, resp) 1801 1802 // user 1 (team admin) tries to promote himself to a random team 1803 _, resp = Client.UpdateTeamMemberRoles(model.NewId(), th.BasicUser.Id, TEAM_ADMIN) 1804 CheckForbiddenStatus(t, resp) 1805 1806 // user 1 (team admin) tries to promote a random user 1807 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, model.NewId(), TEAM_ADMIN) 1808 CheckNotFoundStatus(t, resp) 1809 1810 // user 1 (team admin) tries to promote invalid team permission 1811 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, "junk") 1812 CheckBadRequestStatus(t, resp) 1813 1814 // user 1 (team admin) demotes himself 1815 _, resp = Client.UpdateTeamMemberRoles(th.BasicTeam.Id, th.BasicUser.Id, TEAM_MEMBER) 1816 CheckNoError(t, resp) 1817 } 1818 1819 func TestUpdateTeamMemberSchemeRoles(t *testing.T) { 1820 th := Setup().InitBasic() 1821 defer th.TearDown() 1822 SystemAdminClient := th.SystemAdminClient 1823 th.LoginBasic() 1824 1825 s1 := &model.SchemeRoles{ 1826 SchemeAdmin: false, 1827 SchemeUser: false, 1828 } 1829 _, r1 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s1) 1830 CheckNoError(t, r1) 1831 1832 tm1, rtm1 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") 1833 CheckNoError(t, rtm1) 1834 assert.Equal(t, false, tm1.SchemeUser) 1835 assert.Equal(t, false, tm1.SchemeAdmin) 1836 1837 s2 := &model.SchemeRoles{ 1838 SchemeAdmin: false, 1839 SchemeUser: true, 1840 } 1841 _, r2 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s2) 1842 CheckNoError(t, r2) 1843 1844 tm2, rtm2 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") 1845 CheckNoError(t, rtm2) 1846 assert.Equal(t, true, tm2.SchemeUser) 1847 assert.Equal(t, false, tm2.SchemeAdmin) 1848 1849 s3 := &model.SchemeRoles{ 1850 SchemeAdmin: true, 1851 SchemeUser: false, 1852 } 1853 _, r3 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s3) 1854 CheckNoError(t, r3) 1855 1856 tm3, rtm3 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") 1857 CheckNoError(t, rtm3) 1858 assert.Equal(t, false, tm3.SchemeUser) 1859 assert.Equal(t, true, tm3.SchemeAdmin) 1860 1861 s4 := &model.SchemeRoles{ 1862 SchemeAdmin: true, 1863 SchemeUser: true, 1864 } 1865 _, r4 := SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s4) 1866 CheckNoError(t, r4) 1867 1868 tm4, rtm4 := SystemAdminClient.GetTeamMember(th.BasicTeam.Id, th.BasicUser.Id, "") 1869 CheckNoError(t, rtm4) 1870 assert.Equal(t, true, tm4.SchemeUser) 1871 assert.Equal(t, true, tm4.SchemeAdmin) 1872 1873 _, resp := SystemAdminClient.UpdateTeamMemberSchemeRoles(model.NewId(), th.BasicUser.Id, s4) 1874 CheckNotFoundStatus(t, resp) 1875 1876 _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, model.NewId(), s4) 1877 CheckNotFoundStatus(t, resp) 1878 1879 _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles("ASDF", th.BasicUser.Id, s4) 1880 CheckBadRequestStatus(t, resp) 1881 1882 _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, "ASDF", s4) 1883 CheckBadRequestStatus(t, resp) 1884 1885 th.LoginBasic2() 1886 _, resp = th.Client.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.BasicUser.Id, s4) 1887 CheckForbiddenStatus(t, resp) 1888 1889 SystemAdminClient.Logout() 1890 _, resp = SystemAdminClient.UpdateTeamMemberSchemeRoles(th.BasicTeam.Id, th.SystemAdminUser.Id, s4) 1891 CheckUnauthorizedStatus(t, resp) 1892 } 1893 1894 func TestGetMyTeamsUnread(t *testing.T) { 1895 th := Setup().InitBasic() 1896 defer th.TearDown() 1897 Client := th.Client 1898 1899 user := th.BasicUser 1900 Client.Login(user.Email, user.Password) 1901 1902 teams, resp := Client.GetTeamsUnreadForUser(user.Id, "") 1903 CheckNoError(t, resp) 1904 if len(teams) == 0 { 1905 t.Fatal("should have results") 1906 } 1907 1908 teams, resp = Client.GetTeamsUnreadForUser(user.Id, th.BasicTeam.Id) 1909 CheckNoError(t, resp) 1910 if len(teams) != 0 { 1911 t.Fatal("should not have results") 1912 } 1913 1914 _, resp = Client.GetTeamsUnreadForUser("fail", "") 1915 CheckBadRequestStatus(t, resp) 1916 1917 _, resp = Client.GetTeamsUnreadForUser(model.NewId(), "") 1918 CheckForbiddenStatus(t, resp) 1919 1920 Client.Logout() 1921 _, resp = Client.GetTeamsUnreadForUser(user.Id, "") 1922 CheckUnauthorizedStatus(t, resp) 1923 } 1924 1925 func TestTeamExists(t *testing.T) { 1926 th := Setup().InitBasic() 1927 defer th.TearDown() 1928 Client := th.Client 1929 team := th.BasicTeam 1930 1931 th.LoginBasic() 1932 1933 exists, resp := Client.TeamExists(team.Name, "") 1934 CheckNoError(t, resp) 1935 if !exists { 1936 t.Fatal("team should exist") 1937 } 1938 1939 exists, resp = Client.TeamExists("testingteam", "") 1940 CheckNoError(t, resp) 1941 if exists { 1942 t.Fatal("team should not exist") 1943 } 1944 1945 Client.Logout() 1946 _, resp = Client.TeamExists(team.Name, "") 1947 CheckUnauthorizedStatus(t, resp) 1948 } 1949 1950 func TestImportTeam(t *testing.T) { 1951 th := Setup().InitBasic() 1952 defer th.TearDown() 1953 1954 t.Run("ImportTeam", func(t *testing.T) { 1955 var data []byte 1956 var err error 1957 data, err = testutils.ReadTestFile("Fake_Team_Import.zip") 1958 if err != nil && len(data) == 0 { 1959 t.Fatal("Error while reading the test file.") 1960 } 1961 1962 // Import the channels/users/posts 1963 fileResp, resp := th.SystemAdminClient.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) 1964 CheckNoError(t, resp) 1965 1966 fileData, err := base64.StdEncoding.DecodeString(fileResp["results"]) 1967 if err != nil { 1968 t.Fatal("failed to decode base64 results data") 1969 } 1970 1971 fileReturned := fmt.Sprintf("%s", fileData) 1972 if !strings.Contains(fileReturned, "darth.vader@stardeath.com") { 1973 t.Log(fileReturned) 1974 t.Fatal("failed to report the user was imported") 1975 } 1976 1977 // Checking the imported users 1978 importedUser, resp := th.SystemAdminClient.GetUserByUsername("bot_test", "") 1979 CheckNoError(t, resp) 1980 if importedUser.Username != "bot_test" { 1981 t.Fatal("username should match with the imported user") 1982 } 1983 1984 importedUser, resp = th.SystemAdminClient.GetUserByUsername("lordvader", "") 1985 CheckNoError(t, resp) 1986 if importedUser.Username != "lordvader" { 1987 t.Fatal("username should match with the imported user") 1988 } 1989 1990 // Checking the imported Channels 1991 importedChannel, resp := th.SystemAdminClient.GetChannelByName("testchannel", th.BasicTeam.Id, "") 1992 CheckNoError(t, resp) 1993 if importedChannel.Name != "testchannel" { 1994 t.Fatal("names did not match expected: testchannel") 1995 } 1996 1997 importedChannel, resp = th.SystemAdminClient.GetChannelByName("general", th.BasicTeam.Id, "") 1998 CheckNoError(t, resp) 1999 if importedChannel.Name != "general" { 2000 t.Fatal("names did not match expected: general") 2001 } 2002 2003 posts, resp := th.SystemAdminClient.GetPostsForChannel(importedChannel.Id, 0, 60, "") 2004 CheckNoError(t, resp) 2005 if posts.Posts[posts.Order[3]].Message != "This is a test post to test the import process" { 2006 t.Fatal("missing posts in the import process") 2007 } 2008 }) 2009 2010 t.Run("MissingFile", func(t *testing.T) { 2011 _, resp := th.SystemAdminClient.ImportTeam(nil, 4343, "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) 2012 CheckBadRequestStatus(t, resp) 2013 }) 2014 2015 t.Run("WrongPermission", func(t *testing.T) { 2016 var data []byte 2017 var err error 2018 data, err = testutils.ReadTestFile("Fake_Team_Import.zip") 2019 if err != nil && len(data) == 0 { 2020 t.Fatal("Error while reading the test file.") 2021 } 2022 2023 // Import the channels/users/posts 2024 _, resp := th.Client.ImportTeam(data, binary.Size(data), "slack", "Fake_Team_Import.zip", th.BasicTeam.Id) 2025 CheckForbiddenStatus(t, resp) 2026 }) 2027 } 2028 2029 func TestInviteUsersToTeam(t *testing.T) { 2030 th := Setup().InitBasic() 2031 defer th.TearDown() 2032 2033 user1 := th.GenerateTestEmail() 2034 user2 := th.GenerateTestEmail() 2035 2036 emailList := []string{user1, user2} 2037 2038 //Delete all the messages before check the sample email 2039 mailservice.DeleteMailBox(user1) 2040 mailservice.DeleteMailBox(user2) 2041 2042 enableEmailInvitations := *th.App.Config().ServiceSettings.EnableEmailInvitations 2043 restrictCreationToDomains := th.App.Config().TeamSettings.RestrictCreationToDomains 2044 defer func() { 2045 th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnableEmailInvitations = &enableEmailInvitations }) 2046 th.App.UpdateConfig(func(cfg *model.Config) { cfg.TeamSettings.RestrictCreationToDomains = restrictCreationToDomains }) 2047 }() 2048 2049 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableEmailInvitations = false }) 2050 _, resp := th.SystemAdminClient.InviteUsersToTeam(th.BasicTeam.Id, emailList) 2051 if resp.Error == nil { 2052 t.Fatal("Should be disabled") 2053 } 2054 2055 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableEmailInvitations = true }) 2056 okMsg, resp := th.SystemAdminClient.InviteUsersToTeam(th.BasicTeam.Id, emailList) 2057 CheckNoError(t, resp) 2058 if !okMsg { 2059 t.Fatal("should return true") 2060 } 2061 2062 nameFormat := *th.App.Config().TeamSettings.TeammateNameDisplay 2063 expectedSubject := utils.T("api.templates.invite_subject", 2064 map[string]interface{}{"SenderName": th.SystemAdminUser.GetDisplayName(nameFormat), 2065 "TeamDisplayName": th.BasicTeam.DisplayName, 2066 "SiteName": th.App.ClientConfig()["SiteName"]}) 2067 2068 //Check if the email was send to the rigth email address 2069 for _, email := range emailList { 2070 var resultsMailbox mailservice.JSONMessageHeaderInbucket 2071 err := mailservice.RetryInbucket(5, func() error { 2072 var err error 2073 resultsMailbox, err = mailservice.GetMailBox(email) 2074 return err 2075 }) 2076 if err != nil { 2077 t.Log(err) 2078 t.Log("No email was received, maybe due load on the server. Disabling this verification") 2079 } 2080 if err == nil && len(resultsMailbox) > 0 { 2081 if !strings.ContainsAny(resultsMailbox[len(resultsMailbox)-1].To[0], email) { 2082 t.Fatal("Wrong To recipient") 2083 } else { 2084 if resultsEmail, err := mailservice.GetMessageFromMailbox(email, resultsMailbox[len(resultsMailbox)-1].ID); err == nil { 2085 if resultsEmail.Subject != expectedSubject { 2086 t.Log(resultsEmail.Subject) 2087 t.Log(expectedSubject) 2088 t.Fatal("Wrong Subject") 2089 } 2090 } 2091 } 2092 } 2093 } 2094 2095 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.TeamSettings.RestrictCreationToDomains = "@global.com,@common.com" }) 2096 2097 t.Run("restricted domains", func(t *testing.T) { 2098 err := th.App.InviteNewUsersToTeam(emailList, th.BasicTeam.Id, th.BasicUser.Id) 2099 2100 if err == nil { 2101 t.Fatal("Adding users with non-restricted domains was allowed") 2102 } 2103 if err.Where != "InviteNewUsersToTeam" || err.Id != "api.team.invite_members.invalid_email.app_error" { 2104 t.Log(err) 2105 t.Fatal("Got wrong error message!") 2106 } 2107 }) 2108 2109 t.Run("override restricted domains", func(t *testing.T) { 2110 th.BasicTeam.AllowedDomains = "invalid.com,common.com" 2111 if _, err := th.App.UpdateTeam(th.BasicTeam); err == nil { 2112 t.Fatal("Should not update the team") 2113 } 2114 2115 th.BasicTeam.AllowedDomains = "common.com" 2116 if _, err := th.App.UpdateTeam(th.BasicTeam); err != nil { 2117 t.Log(err) 2118 t.Fatal("Should update the team") 2119 } 2120 2121 if err := th.App.InviteNewUsersToTeam([]string{"test@global.com"}, th.BasicTeam.Id, th.BasicUser.Id); err == nil || err.Where != "InviteNewUsersToTeam" { 2122 t.Log(err) 2123 t.Fatal("Per team restriction should take precedence over the global restriction") 2124 } 2125 2126 if err := th.App.InviteNewUsersToTeam([]string{"test@common.com"}, th.BasicTeam.Id, th.BasicUser.Id); err != nil { 2127 t.Log(err) 2128 t.Fatal("Failed to invite user which was common between team and global domain restriction") 2129 } 2130 2131 if err := th.App.InviteNewUsersToTeam([]string{"test@invalid.com"}, th.BasicTeam.Id, th.BasicUser.Id); err == nil { 2132 t.Log(err) 2133 t.Fatal("Should not invite user") 2134 } 2135 2136 }) 2137 } 2138 2139 func TestGetTeamInviteInfo(t *testing.T) { 2140 th := Setup().InitBasic() 2141 defer th.TearDown() 2142 Client := th.Client 2143 team := th.BasicTeam 2144 2145 team, resp := Client.GetTeamInviteInfo(team.InviteId) 2146 CheckNoError(t, resp) 2147 2148 if team.DisplayName == "" { 2149 t.Fatal("should not be empty") 2150 } 2151 2152 if team.Email != "" { 2153 t.Fatal("should be empty") 2154 } 2155 2156 team.InviteId = "12345678901234567890123456789012" 2157 team, resp = th.SystemAdminClient.UpdateTeam(team) 2158 CheckNoError(t, resp) 2159 2160 _, resp = Client.GetTeamInviteInfo(team.InviteId) 2161 CheckNoError(t, resp) 2162 2163 _, resp = Client.GetTeamInviteInfo("junk") 2164 CheckNotFoundStatus(t, resp) 2165 } 2166 2167 func TestSetTeamIcon(t *testing.T) { 2168 th := Setup().InitBasic() 2169 defer th.TearDown() 2170 Client := th.Client 2171 team := th.BasicTeam 2172 2173 data, err := testutils.ReadTestFile("test.png") 2174 if err != nil { 2175 t.Fatal(err) 2176 } 2177 2178 th.LoginTeamAdmin() 2179 2180 ok, resp := Client.SetTeamIcon(team.Id, data) 2181 if !ok { 2182 t.Fatal(resp.Error) 2183 } 2184 CheckNoError(t, resp) 2185 2186 ok, resp = Client.SetTeamIcon(model.NewId(), data) 2187 if ok { 2188 t.Fatal("Should return false, set team icon not allowed") 2189 } 2190 CheckForbiddenStatus(t, resp) 2191 2192 th.LoginBasic() 2193 2194 _, resp = Client.SetTeamIcon(team.Id, data) 2195 if resp.StatusCode == http.StatusForbidden { 2196 CheckForbiddenStatus(t, resp) 2197 } else if resp.StatusCode == http.StatusUnauthorized { 2198 CheckUnauthorizedStatus(t, resp) 2199 } else { 2200 t.Fatal("Should have failed either forbidden or unauthorized") 2201 } 2202 2203 Client.Logout() 2204 2205 _, resp = Client.SetTeamIcon(team.Id, data) 2206 if resp.StatusCode == http.StatusForbidden { 2207 CheckForbiddenStatus(t, resp) 2208 } else if resp.StatusCode == http.StatusUnauthorized { 2209 CheckUnauthorizedStatus(t, resp) 2210 } else { 2211 t.Fatal("Should have failed either forbidden or unauthorized") 2212 } 2213 2214 teamBefore, err := th.App.GetTeam(team.Id) 2215 require.Nil(t, err) 2216 2217 _, resp = th.SystemAdminClient.SetTeamIcon(team.Id, data) 2218 CheckNoError(t, resp) 2219 2220 teamAfter, err := th.App.GetTeam(team.Id) 2221 require.Nil(t, err) 2222 assert.True(t, teamBefore.LastTeamIconUpdate < teamAfter.LastTeamIconUpdate, "LastTeamIconUpdate should have been updated for team") 2223 2224 info := &model.FileInfo{Path: "teams/" + team.Id + "/teamIcon.png"} 2225 if err := th.cleanupTestFile(info); err != nil { 2226 t.Fatal(err) 2227 } 2228 } 2229 2230 func TestGetTeamIcon(t *testing.T) { 2231 th := Setup().InitBasic() 2232 defer th.TearDown() 2233 Client := th.Client 2234 team := th.BasicTeam 2235 2236 // should always fail because no initial image and no auto creation 2237 _, resp := Client.GetTeamIcon(team.Id, "") 2238 CheckNotFoundStatus(t, resp) 2239 2240 Client.Logout() 2241 2242 _, resp = Client.GetTeamIcon(team.Id, "") 2243 CheckUnauthorizedStatus(t, resp) 2244 } 2245 2246 func TestRemoveTeamIcon(t *testing.T) { 2247 th := Setup().InitBasic() 2248 defer th.TearDown() 2249 Client := th.Client 2250 team := th.BasicTeam 2251 2252 th.LoginTeamAdmin() 2253 data, _ := testutils.ReadTestFile("test.png") 2254 Client.SetTeamIcon(team.Id, data) 2255 2256 _, resp := Client.RemoveTeamIcon(team.Id) 2257 CheckNoError(t, resp) 2258 teamAfter, _ := th.App.GetTeam(team.Id) 2259 if teamAfter.LastTeamIconUpdate != 0 { 2260 t.Fatal("should update LastTeamIconUpdate to 0") 2261 } 2262 2263 Client.SetTeamIcon(team.Id, data) 2264 2265 _, resp = th.SystemAdminClient.RemoveTeamIcon(team.Id) 2266 CheckNoError(t, resp) 2267 teamAfter, _ = th.App.GetTeam(team.Id) 2268 if teamAfter.LastTeamIconUpdate != 0 { 2269 t.Fatal("should update LastTeamIconUpdate to 0") 2270 } 2271 2272 Client.SetTeamIcon(team.Id, data) 2273 Client.Logout() 2274 2275 _, resp = Client.RemoveTeamIcon(team.Id) 2276 CheckUnauthorizedStatus(t, resp) 2277 2278 th.LoginBasic() 2279 _, resp = Client.RemoveTeamIcon(team.Id) 2280 CheckForbiddenStatus(t, resp) 2281 } 2282 2283 func TestUpdateTeamScheme(t *testing.T) { 2284 th := Setup().InitBasic() 2285 defer th.TearDown() 2286 2287 th.App.SetLicense(model.NewTestLicense("")) 2288 2289 th.App.SetPhase2PermissionsMigrationStatus(true) 2290 2291 team := &model.Team{ 2292 DisplayName: "Name", 2293 Description: "Some description", 2294 CompanyName: "Some company name", 2295 AllowOpenInvite: false, 2296 InviteId: "inviteid0", 2297 Name: "z-z-" + model.NewId() + "a", 2298 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 2299 Type: model.TEAM_OPEN, 2300 } 2301 team, _ = th.SystemAdminClient.CreateTeam(team) 2302 2303 teamScheme := &model.Scheme{ 2304 DisplayName: "DisplayName", 2305 Name: model.NewId(), 2306 Description: "Some description", 2307 Scope: model.SCHEME_SCOPE_TEAM, 2308 } 2309 teamScheme, _ = th.SystemAdminClient.CreateScheme(teamScheme) 2310 channelScheme := &model.Scheme{ 2311 DisplayName: "DisplayName", 2312 Name: model.NewId(), 2313 Description: "Some description", 2314 Scope: model.SCHEME_SCOPE_CHANNEL, 2315 } 2316 channelScheme, _ = th.SystemAdminClient.CreateScheme(channelScheme) 2317 2318 // Test the setup/base case. 2319 _, resp := th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) 2320 CheckNoError(t, resp) 2321 2322 // Test the return to default scheme 2323 _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, "") 2324 CheckNoError(t, resp) 2325 2326 // Test various invalid team and scheme id combinations. 2327 _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, "x") 2328 CheckBadRequestStatus(t, resp) 2329 _, resp = th.SystemAdminClient.UpdateTeamScheme("x", teamScheme.Id) 2330 CheckBadRequestStatus(t, resp) 2331 _, resp = th.SystemAdminClient.UpdateTeamScheme("x", "x") 2332 CheckBadRequestStatus(t, resp) 2333 2334 // Test that permissions are required. 2335 _, resp = th.Client.UpdateTeamScheme(team.Id, teamScheme.Id) 2336 CheckForbiddenStatus(t, resp) 2337 2338 // Test that a license is requried. 2339 th.App.SetLicense(nil) 2340 _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) 2341 CheckNotImplementedStatus(t, resp) 2342 th.App.SetLicense(model.NewTestLicense("")) 2343 2344 // Test an invalid scheme scope. 2345 _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, channelScheme.Id) 2346 CheckBadRequestStatus(t, resp) 2347 2348 // Test that an unauthenticated user gets rejected. 2349 th.SystemAdminClient.Logout() 2350 _, resp = th.SystemAdminClient.UpdateTeamScheme(team.Id, teamScheme.Id) 2351 CheckUnauthorizedStatus(t, resp) 2352 }