github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/api4/channel_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package api4 5 6 import ( 7 "context" 8 "fmt" 9 "net/http" 10 "os" 11 "sort" 12 "strings" 13 "sync" 14 "testing" 15 "time" 16 17 "github.com/stretchr/testify/assert" 18 "github.com/stretchr/testify/require" 19 20 "github.com/masterhung0112/hk_server/v5/app" 21 "github.com/masterhung0112/hk_server/v5/model" 22 "github.com/masterhung0112/hk_server/v5/plugin/plugintest/mock" 23 "github.com/masterhung0112/hk_server/v5/store/storetest/mocks" 24 "github.com/masterhung0112/hk_server/v5/utils" 25 ) 26 27 func TestCreateChannel(t *testing.T) { 28 th := Setup(t).InitBasic() 29 defer th.TearDown() 30 Client := th.Client 31 team := th.BasicTeam 32 33 channel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id} 34 private := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_PRIVATE, TeamId: team.Id} 35 36 rchannel, resp := Client.CreateChannel(channel) 37 CheckNoError(t, resp) 38 CheckCreatedStatus(t, resp) 39 40 require.Equal(t, channel.Name, rchannel.Name, "names did not match") 41 require.Equal(t, channel.DisplayName, rchannel.DisplayName, "display names did not match") 42 require.Equal(t, channel.TeamId, rchannel.TeamId, "team ids did not match") 43 44 rprivate, resp := Client.CreateChannel(private) 45 CheckNoError(t, resp) 46 47 require.Equal(t, private.Name, rprivate.Name, "names did not match") 48 require.Equal(t, model.CHANNEL_PRIVATE, rprivate.Type, "wrong channel type") 49 require.Equal(t, th.BasicUser.Id, rprivate.CreatorId, "wrong creator id") 50 51 _, resp = Client.CreateChannel(channel) 52 CheckErrorMessage(t, resp, "store.sql_channel.save_channel.exists.app_error") 53 CheckBadRequestStatus(t, resp) 54 55 direct := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_DIRECT, TeamId: team.Id} 56 _, resp = Client.CreateChannel(direct) 57 CheckErrorMessage(t, resp, "api.channel.create_channel.direct_channel.app_error") 58 CheckBadRequestStatus(t, resp) 59 60 Client.Logout() 61 _, resp = Client.CreateChannel(channel) 62 CheckUnauthorizedStatus(t, resp) 63 64 userNotOnTeam := th.CreateUser() 65 Client.Login(userNotOnTeam.Email, userNotOnTeam.Password) 66 67 _, resp = Client.CreateChannel(channel) 68 CheckForbiddenStatus(t, resp) 69 70 _, resp = Client.CreateChannel(private) 71 CheckForbiddenStatus(t, resp) 72 73 // Check the appropriate permissions are enforced. 74 defaultRolePermissions := th.SaveDefaultRolePermissions() 75 defer func() { 76 th.RestoreDefaultRolePermissions(defaultRolePermissions) 77 }() 78 79 th.AddPermissionToRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_USER_ROLE_ID) 80 th.AddPermissionToRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_USER_ROLE_ID) 81 82 th.LoginBasic() 83 84 channel.Name = GenerateTestChannelName() 85 _, resp = Client.CreateChannel(channel) 86 CheckNoError(t, resp) 87 88 private.Name = GenerateTestChannelName() 89 _, resp = Client.CreateChannel(private) 90 CheckNoError(t, resp) 91 92 th.AddPermissionToRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_ADMIN_ROLE_ID) 93 th.AddPermissionToRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_ADMIN_ROLE_ID) 94 th.RemovePermissionFromRole(model.PERMISSION_CREATE_PUBLIC_CHANNEL.Id, model.TEAM_USER_ROLE_ID) 95 th.RemovePermissionFromRole(model.PERMISSION_CREATE_PRIVATE_CHANNEL.Id, model.TEAM_USER_ROLE_ID) 96 97 _, resp = Client.CreateChannel(channel) 98 CheckForbiddenStatus(t, resp) 99 100 _, resp = Client.CreateChannel(private) 101 CheckForbiddenStatus(t, resp) 102 103 th.LoginTeamAdmin() 104 105 channel.Name = GenerateTestChannelName() 106 _, resp = Client.CreateChannel(channel) 107 CheckNoError(t, resp) 108 109 private.Name = GenerateTestChannelName() 110 _, resp = Client.CreateChannel(private) 111 CheckNoError(t, resp) 112 113 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 114 channel.Name = GenerateTestChannelName() 115 _, resp = client.CreateChannel(channel) 116 CheckNoError(t, resp) 117 118 private.Name = GenerateTestChannelName() 119 _, resp = client.CreateChannel(private) 120 CheckNoError(t, resp) 121 }) 122 123 // Test posting Garbage 124 r, err := Client.DoApiPost("/channels", "garbage") 125 require.NotNil(t, err, "expected error") 126 require.Equal(t, http.StatusBadRequest, r.StatusCode, "Expected 400 Bad Request") 127 128 // Test GroupConstrained flag 129 groupConstrainedChannel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id, GroupConstrained: model.NewBool(true)} 130 rchannel, resp = Client.CreateChannel(groupConstrainedChannel) 131 CheckNoError(t, resp) 132 133 require.Equal(t, *groupConstrainedChannel.GroupConstrained, *rchannel.GroupConstrained, "GroupConstrained flags do not match") 134 } 135 136 func TestUpdateChannel(t *testing.T) { 137 th := Setup(t).InitBasic() 138 defer th.TearDown() 139 Client := th.Client 140 team := th.BasicTeam 141 142 channel := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id} 143 private := &model.Channel{DisplayName: "Test API Name", Name: GenerateTestChannelName(), Type: model.CHANNEL_PRIVATE, TeamId: team.Id} 144 145 channel, _ = Client.CreateChannel(channel) 146 private, _ = Client.CreateChannel(private) 147 148 //Update a open channel 149 channel.DisplayName = "My new display name" 150 channel.Header = "My fancy header" 151 channel.Purpose = "Mattermost ftw!" 152 153 newChannel, resp := Client.UpdateChannel(channel) 154 CheckNoError(t, resp) 155 156 require.Equal(t, channel.DisplayName, newChannel.DisplayName, "Update failed for DisplayName") 157 require.Equal(t, channel.Header, newChannel.Header, "Update failed for Header") 158 require.Equal(t, channel.Purpose, newChannel.Purpose, "Update failed for Purpose") 159 160 // Test GroupConstrained flag 161 channel.GroupConstrained = model.NewBool(true) 162 rchannel, resp := Client.UpdateChannel(channel) 163 CheckNoError(t, resp) 164 CheckOKStatus(t, resp) 165 166 require.Equal(t, *channel.GroupConstrained, *rchannel.GroupConstrained, "GroupConstrained flags do not match") 167 168 //Update a private channel 169 private.DisplayName = "My new display name for private channel" 170 private.Header = "My fancy private header" 171 private.Purpose = "Mattermost ftw! in private mode" 172 173 newPrivateChannel, resp := Client.UpdateChannel(private) 174 CheckNoError(t, resp) 175 176 require.Equal(t, private.DisplayName, newPrivateChannel.DisplayName, "Update failed for DisplayName in private channel") 177 require.Equal(t, private.Header, newPrivateChannel.Header, "Update failed for Header in private channel") 178 require.Equal(t, private.Purpose, newPrivateChannel.Purpose, "Update failed for Purpose in private channel") 179 180 // Test that changing the type fails and returns error 181 182 private.Type = model.CHANNEL_OPEN 183 newPrivateChannel, resp = Client.UpdateChannel(private) 184 CheckBadRequestStatus(t, resp) 185 186 // Test that keeping the same type succeeds 187 188 private.Type = model.CHANNEL_PRIVATE 189 newPrivateChannel, resp = Client.UpdateChannel(private) 190 CheckNoError(t, resp) 191 192 //Non existing channel 193 channel1 := &model.Channel{DisplayName: "Test API Name for apiv4", Name: GenerateTestChannelName(), Type: model.CHANNEL_OPEN, TeamId: team.Id} 194 _, resp = Client.UpdateChannel(channel1) 195 CheckNotFoundStatus(t, resp) 196 197 //Try to update with not logged user 198 Client.Logout() 199 _, resp = Client.UpdateChannel(channel) 200 CheckUnauthorizedStatus(t, resp) 201 202 //Try to update using another user 203 user := th.CreateUser() 204 Client.Login(user.Email, user.Password) 205 206 channel.DisplayName = "Should not update" 207 _, resp = Client.UpdateChannel(channel) 208 CheckForbiddenStatus(t, resp) 209 210 // Test updating the header of someone else's GM channel. 211 user1 := th.CreateUser() 212 user2 := th.CreateUser() 213 user3 := th.CreateUser() 214 215 groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id}) 216 CheckNoError(t, resp) 217 218 groupChannel.Header = "lolololol" 219 Client.Logout() 220 Client.Login(user3.Email, user3.Password) 221 _, resp = Client.UpdateChannel(groupChannel) 222 CheckForbiddenStatus(t, resp) 223 224 // Test updating the header of someone else's GM channel. 225 Client.Logout() 226 Client.Login(user.Email, user.Password) 227 228 directChannel, resp := Client.CreateDirectChannel(user.Id, user1.Id) 229 CheckNoError(t, resp) 230 231 directChannel.Header = "lolololol" 232 Client.Logout() 233 Client.Login(user3.Email, user3.Password) 234 _, resp = Client.UpdateChannel(directChannel) 235 CheckForbiddenStatus(t, resp) 236 } 237 238 func TestPatchChannel(t *testing.T) { 239 th := Setup(t).InitBasic() 240 defer th.TearDown() 241 Client := th.Client 242 243 patch := &model.ChannelPatch{ 244 Name: new(string), 245 DisplayName: new(string), 246 Header: new(string), 247 Purpose: new(string), 248 } 249 *patch.Name = model.NewId() 250 *patch.DisplayName = model.NewId() 251 *patch.Header = model.NewId() 252 *patch.Purpose = model.NewId() 253 254 channel, resp := Client.PatchChannel(th.BasicChannel.Id, patch) 255 CheckNoError(t, resp) 256 257 require.Equal(t, *patch.Name, channel.Name, "do not match") 258 require.Equal(t, *patch.DisplayName, channel.DisplayName, "do not match") 259 require.Equal(t, *patch.Header, channel.Header, "do not match") 260 require.Equal(t, *patch.Purpose, channel.Purpose, "do not match") 261 262 patch.Name = nil 263 oldName := channel.Name 264 channel, resp = Client.PatchChannel(th.BasicChannel.Id, patch) 265 CheckNoError(t, resp) 266 267 require.Equal(t, oldName, channel.Name, "should not have updated") 268 269 // Test GroupConstrained flag 270 patch.GroupConstrained = model.NewBool(true) 271 rchannel, resp := Client.PatchChannel(th.BasicChannel.Id, patch) 272 CheckNoError(t, resp) 273 CheckOKStatus(t, resp) 274 275 require.Equal(t, *rchannel.GroupConstrained, *patch.GroupConstrained, "GroupConstrained flags do not match") 276 patch.GroupConstrained = nil 277 278 _, resp = Client.PatchChannel("junk", patch) 279 CheckBadRequestStatus(t, resp) 280 281 _, resp = Client.PatchChannel(model.NewId(), patch) 282 CheckNotFoundStatus(t, resp) 283 284 user := th.CreateUser() 285 Client.Login(user.Email, user.Password) 286 _, resp = Client.PatchChannel(th.BasicChannel.Id, patch) 287 CheckForbiddenStatus(t, resp) 288 289 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 290 _, resp = client.PatchChannel(th.BasicChannel.Id, patch) 291 CheckNoError(t, resp) 292 293 _, resp = client.PatchChannel(th.BasicPrivateChannel.Id, patch) 294 CheckNoError(t, resp) 295 }) 296 297 // Test updating the header of someone else's GM channel. 298 user1 := th.CreateUser() 299 user2 := th.CreateUser() 300 user3 := th.CreateUser() 301 302 groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id}) 303 CheckNoError(t, resp) 304 305 Client.Logout() 306 Client.Login(user3.Email, user3.Password) 307 308 channelPatch := &model.ChannelPatch{} 309 channelPatch.Header = new(string) 310 *channelPatch.Header = "lolololol" 311 312 _, resp = Client.PatchChannel(groupChannel.Id, channelPatch) 313 CheckForbiddenStatus(t, resp) 314 315 // Test updating the header of someone else's GM channel. 316 Client.Logout() 317 Client.Login(user.Email, user.Password) 318 319 directChannel, resp := Client.CreateDirectChannel(user.Id, user1.Id) 320 CheckNoError(t, resp) 321 322 Client.Logout() 323 Client.Login(user3.Email, user3.Password) 324 _, resp = Client.PatchChannel(directChannel.Id, channelPatch) 325 CheckForbiddenStatus(t, resp) 326 } 327 328 func TestChannelUnicodeNames(t *testing.T) { 329 th := Setup(t).InitBasic() 330 defer th.TearDown() 331 Client := th.Client 332 team := th.BasicTeam 333 334 t.Run("create channel unicode", func(t *testing.T) { 335 channel := &model.Channel{ 336 Name: "\u206cenglish\u206dchannel", 337 DisplayName: "The \u206cEnglish\u206d Channel", 338 Type: model.CHANNEL_OPEN, 339 TeamId: team.Id} 340 341 rchannel, resp := Client.CreateChannel(channel) 342 CheckNoError(t, resp) 343 CheckCreatedStatus(t, resp) 344 345 require.Equal(t, "englishchannel", rchannel.Name, "bad unicode should be filtered from name") 346 require.Equal(t, "The English Channel", rchannel.DisplayName, "bad unicode should be filtered from display name") 347 }) 348 349 t.Run("update channel unicode", func(t *testing.T) { 350 channel := &model.Channel{ 351 DisplayName: "Test API Name", 352 Name: GenerateTestChannelName(), 353 Type: model.CHANNEL_OPEN, 354 TeamId: team.Id, 355 } 356 channel, _ = Client.CreateChannel(channel) 357 358 channel.Name = "\u206ahistorychannel" 359 channel.DisplayName = "UFO's and \ufff9stuff\ufffb." 360 361 newChannel, resp := Client.UpdateChannel(channel) 362 CheckNoError(t, resp) 363 364 require.Equal(t, "historychannel", newChannel.Name, "bad unicode should be filtered from name") 365 require.Equal(t, "UFO's and stuff.", newChannel.DisplayName, "bad unicode should be filtered from display name") 366 }) 367 368 t.Run("patch channel unicode", func(t *testing.T) { 369 patch := &model.ChannelPatch{ 370 Name: new(string), 371 DisplayName: new(string), 372 Header: new(string), 373 Purpose: new(string), 374 } 375 *patch.Name = "\u206ecommunitychannel\u206f" 376 *patch.DisplayName = "Natalie Tran's \ufffcAwesome Channel" 377 378 channel, resp := Client.PatchChannel(th.BasicChannel.Id, patch) 379 CheckNoError(t, resp) 380 381 require.Equal(t, "communitychannel", channel.Name, "bad unicode should be filtered from name") 382 require.Equal(t, "Natalie Tran's Awesome Channel", channel.DisplayName, "bad unicode should be filtered from display name") 383 }) 384 } 385 386 func TestCreateDirectChannel(t *testing.T) { 387 th := Setup(t).InitBasic() 388 defer th.TearDown() 389 Client := th.Client 390 user1 := th.BasicUser 391 user2 := th.BasicUser2 392 user3 := th.CreateUser() 393 394 dm, resp := Client.CreateDirectChannel(user1.Id, user2.Id) 395 CheckNoError(t, resp) 396 397 channelName := "" 398 if user2.Id > user1.Id { 399 channelName = user1.Id + "__" + user2.Id 400 } else { 401 channelName = user2.Id + "__" + user1.Id 402 } 403 404 require.Equal(t, channelName, dm.Name, "dm name didn't match") 405 406 _, resp = Client.CreateDirectChannel("junk", user2.Id) 407 CheckBadRequestStatus(t, resp) 408 409 _, resp = Client.CreateDirectChannel(user1.Id, model.NewId()) 410 CheckBadRequestStatus(t, resp) 411 412 _, resp = Client.CreateDirectChannel(model.NewId(), user1.Id) 413 CheckBadRequestStatus(t, resp) 414 415 _, resp = Client.CreateDirectChannel(model.NewId(), user2.Id) 416 CheckForbiddenStatus(t, resp) 417 418 r, err := Client.DoApiPost("/channels/direct", "garbage") 419 require.NotNil(t, err) 420 require.Equal(t, http.StatusBadRequest, r.StatusCode) 421 422 _, resp = th.SystemAdminClient.CreateDirectChannel(user3.Id, user2.Id) 423 CheckNoError(t, resp) 424 425 // Normal client should not be allowed to create a direct channel if users are 426 // restricted to messaging members of their own team 427 th.App.UpdateConfig(func(cfg *model.Config) { 428 *cfg.TeamSettings.RestrictDirectMessage = model.DIRECT_MESSAGE_TEAM 429 }) 430 user4 := th.CreateUser() 431 _, resp = th.Client.CreateDirectChannel(user1.Id, user4.Id) 432 CheckForbiddenStatus(t, resp) 433 th.LinkUserToTeam(user4, th.BasicTeam) 434 _, resp = th.Client.CreateDirectChannel(user1.Id, user4.Id) 435 CheckNoError(t, resp) 436 437 Client.Logout() 438 _, resp = Client.CreateDirectChannel(model.NewId(), user2.Id) 439 CheckUnauthorizedStatus(t, resp) 440 } 441 442 func TestCreateDirectChannelAsGuest(t *testing.T) { 443 th := Setup(t).InitBasic() 444 defer th.TearDown() 445 Client := th.Client 446 user1 := th.BasicUser 447 448 enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable 449 defer func() { 450 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts }) 451 th.App.Srv().RemoveLicense() 452 }() 453 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) 454 th.App.Srv().SetLicense(model.NewTestLicense()) 455 456 id := model.NewId() 457 guest := &model.User{ 458 Email: "success+" + id + "@simulator.amazonses.com", 459 Username: "un_" + id, 460 Nickname: "nn_" + id, 461 Password: "Password1", 462 EmailVerified: true, 463 } 464 guest, err := th.App.CreateGuest(th.Context, guest) 465 require.Nil(t, err) 466 467 _, resp := Client.Login(guest.Username, "Password1") 468 CheckNoError(t, resp) 469 470 t.Run("Try to created DM with not visible user", func(t *testing.T) { 471 _, resp := Client.CreateDirectChannel(guest.Id, user1.Id) 472 CheckForbiddenStatus(t, resp) 473 474 _, resp = Client.CreateDirectChannel(user1.Id, guest.Id) 475 CheckForbiddenStatus(t, resp) 476 }) 477 478 t.Run("Creating DM with visible user", func(t *testing.T) { 479 th.LinkUserToTeam(guest, th.BasicTeam) 480 th.AddUserToChannel(guest, th.BasicChannel) 481 482 _, resp := Client.CreateDirectChannel(guest.Id, user1.Id) 483 CheckNoError(t, resp) 484 }) 485 } 486 487 func TestDeleteDirectChannel(t *testing.T) { 488 th := Setup(t).InitBasic() 489 defer th.TearDown() 490 Client := th.Client 491 user := th.BasicUser 492 user2 := th.BasicUser2 493 494 rgc, resp := Client.CreateDirectChannel(user.Id, user2.Id) 495 CheckNoError(t, resp) 496 CheckCreatedStatus(t, resp) 497 require.NotNil(t, rgc, "should have created a direct channel") 498 499 deleted, resp := Client.DeleteChannel(rgc.Id) 500 CheckErrorMessage(t, resp, "api.channel.delete_channel.type.invalid") 501 require.False(t, deleted, "should not have been able to delete direct channel.") 502 } 503 504 func TestCreateGroupChannel(t *testing.T) { 505 th := Setup(t).InitBasic() 506 defer th.TearDown() 507 Client := th.Client 508 user := th.BasicUser 509 user2 := th.BasicUser2 510 user3 := th.CreateUser() 511 512 userIds := []string{user.Id, user2.Id, user3.Id} 513 514 rgc, resp := Client.CreateGroupChannel(userIds) 515 CheckNoError(t, resp) 516 CheckCreatedStatus(t, resp) 517 518 require.NotNil(t, rgc, "should have created a group channel") 519 require.Equal(t, model.CHANNEL_GROUP, rgc.Type, "should have created a channel of group type") 520 521 m, _ := th.App.GetChannelMembersPage(rgc.Id, 0, 10) 522 require.Len(t, *m, 3, "should have 3 channel members") 523 524 // saving duplicate group channel 525 rgc2, resp := Client.CreateGroupChannel([]string{user3.Id, user2.Id}) 526 CheckNoError(t, resp) 527 require.Equal(t, rgc.Id, rgc2.Id, "should have returned existing channel") 528 529 m2, _ := th.App.GetChannelMembersPage(rgc2.Id, 0, 10) 530 require.Equal(t, m, m2) 531 532 _, resp = Client.CreateGroupChannel([]string{user2.Id}) 533 CheckBadRequestStatus(t, resp) 534 535 user4 := th.CreateUser() 536 user5 := th.CreateUser() 537 user6 := th.CreateUser() 538 user7 := th.CreateUser() 539 user8 := th.CreateUser() 540 user9 := th.CreateUser() 541 542 rgc, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, user4.Id, user5.Id, user6.Id, user7.Id, user8.Id, user9.Id}) 543 CheckBadRequestStatus(t, resp) 544 require.Nil(t, rgc) 545 546 _, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, GenerateTestId()}) 547 CheckBadRequestStatus(t, resp) 548 549 _, resp = Client.CreateGroupChannel([]string{user.Id, user2.Id, user3.Id, "junk"}) 550 CheckBadRequestStatus(t, resp) 551 552 Client.Logout() 553 554 _, resp = Client.CreateGroupChannel(userIds) 555 CheckUnauthorizedStatus(t, resp) 556 557 _, resp = th.SystemAdminClient.CreateGroupChannel(userIds) 558 CheckNoError(t, resp) 559 } 560 561 func TestCreateGroupChannelAsGuest(t *testing.T) { 562 th := Setup(t).InitBasic() 563 defer th.TearDown() 564 Client := th.Client 565 user1 := th.BasicUser 566 user2 := th.BasicUser2 567 user3 := th.CreateUser() 568 user4 := th.CreateUser() 569 user5 := th.CreateUser() 570 th.LinkUserToTeam(user2, th.BasicTeam) 571 th.AddUserToChannel(user2, th.BasicChannel) 572 th.LinkUserToTeam(user3, th.BasicTeam) 573 th.AddUserToChannel(user3, th.BasicChannel) 574 575 enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable 576 defer func() { 577 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts }) 578 th.App.Srv().RemoveLicense() 579 }() 580 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) 581 th.App.Srv().SetLicense(model.NewTestLicense()) 582 583 id := model.NewId() 584 guest := &model.User{ 585 Email: "success+" + id + "@simulator.amazonses.com", 586 Username: "un_" + id, 587 Nickname: "nn_" + id, 588 Password: "Password1", 589 EmailVerified: true, 590 } 591 guest, err := th.App.CreateGuest(th.Context, guest) 592 require.Nil(t, err) 593 594 _, resp := Client.Login(guest.Username, "Password1") 595 CheckNoError(t, resp) 596 597 t.Run("Try to created GM with not visible users", func(t *testing.T) { 598 _, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user2.Id, user3.Id}) 599 CheckForbiddenStatus(t, resp) 600 601 _, resp = Client.CreateGroupChannel([]string{user1.Id, user2.Id, guest.Id, user3.Id}) 602 CheckForbiddenStatus(t, resp) 603 }) 604 605 t.Run("Try to created GM with visible and not visible users", func(t *testing.T) { 606 th.LinkUserToTeam(guest, th.BasicTeam) 607 th.AddUserToChannel(guest, th.BasicChannel) 608 609 _, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user3.Id, user4.Id, user5.Id}) 610 CheckForbiddenStatus(t, resp) 611 612 _, resp = Client.CreateGroupChannel([]string{user1.Id, user2.Id, guest.Id, user4.Id, user5.Id}) 613 CheckForbiddenStatus(t, resp) 614 }) 615 616 t.Run("Creating GM with visible users", func(t *testing.T) { 617 _, resp := Client.CreateGroupChannel([]string{guest.Id, user1.Id, user2.Id, user3.Id}) 618 CheckNoError(t, resp) 619 }) 620 } 621 622 func TestDeleteGroupChannel(t *testing.T) { 623 th := Setup(t).InitBasic() 624 defer th.TearDown() 625 user := th.BasicUser 626 user2 := th.BasicUser2 627 user3 := th.CreateUser() 628 629 userIds := []string{user.Id, user2.Id, user3.Id} 630 631 th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { 632 rgc, resp := th.Client.CreateGroupChannel(userIds) 633 CheckNoError(t, resp) 634 CheckCreatedStatus(t, resp) 635 require.NotNil(t, rgc, "should have created a group channel") 636 deleted, resp := client.DeleteChannel(rgc.Id) 637 CheckErrorMessage(t, resp, "api.channel.delete_channel.type.invalid") 638 require.False(t, deleted, "should not have been able to delete group channel.") 639 }) 640 641 } 642 643 func TestGetChannel(t *testing.T) { 644 th := Setup(t).InitBasic() 645 defer th.TearDown() 646 Client := th.Client 647 648 channel, resp := Client.GetChannel(th.BasicChannel.Id, "") 649 CheckNoError(t, resp) 650 require.Equal(t, th.BasicChannel.Id, channel.Id, "ids did not match") 651 652 Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) 653 _, resp = Client.GetChannel(th.BasicChannel.Id, "") 654 CheckNoError(t, resp) 655 656 channel, resp = Client.GetChannel(th.BasicPrivateChannel.Id, "") 657 CheckNoError(t, resp) 658 require.Equal(t, th.BasicPrivateChannel.Id, channel.Id, "ids did not match") 659 660 Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) 661 _, resp = Client.GetChannel(th.BasicPrivateChannel.Id, "") 662 CheckForbiddenStatus(t, resp) 663 664 _, resp = Client.GetChannel(model.NewId(), "") 665 CheckNotFoundStatus(t, resp) 666 667 Client.Logout() 668 _, resp = Client.GetChannel(th.BasicChannel.Id, "") 669 CheckUnauthorizedStatus(t, resp) 670 671 user := th.CreateUser() 672 Client.Login(user.Email, user.Password) 673 _, resp = Client.GetChannel(th.BasicChannel.Id, "") 674 CheckForbiddenStatus(t, resp) 675 676 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 677 _, resp = client.GetChannel(th.BasicChannel.Id, "") 678 CheckNoError(t, resp) 679 680 _, resp = client.GetChannel(th.BasicPrivateChannel.Id, "") 681 CheckNoError(t, resp) 682 683 _, resp = client.GetChannel(th.BasicUser.Id, "") 684 CheckNotFoundStatus(t, resp) 685 }) 686 } 687 688 func TestGetDeletedChannelsForTeam(t *testing.T) { 689 th := Setup(t).InitBasic() 690 defer th.TearDown() 691 692 Client := th.Client 693 team := th.BasicTeam 694 695 th.LoginTeamAdmin() 696 697 channels, resp := Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") 698 CheckNoError(t, resp) 699 numInitialChannelsForTeam := len(channels) 700 701 // create and delete public channel 702 publicChannel1 := th.CreatePublicChannel() 703 Client.DeleteChannel(publicChannel1.Id) 704 705 th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { 706 channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") 707 CheckNoError(t, resp) 708 require.Len(t, channels, numInitialChannelsForTeam+1, "should be 1 deleted channel") 709 }) 710 711 publicChannel2 := th.CreatePublicChannel() 712 Client.DeleteChannel(publicChannel2.Id) 713 714 th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { 715 channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") 716 CheckNoError(t, resp) 717 require.Len(t, channels, numInitialChannelsForTeam+2, "should be 2 deleted channels") 718 }) 719 720 th.LoginBasic() 721 722 privateChannel1 := th.CreatePrivateChannel() 723 Client.DeleteChannel(privateChannel1.Id) 724 725 channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") 726 CheckNoError(t, resp) 727 require.Len(t, channels, numInitialChannelsForTeam+3) 728 729 // Login as different user and create private channel 730 th.LoginBasic2() 731 privateChannel2 := th.CreatePrivateChannel() 732 Client.DeleteChannel(privateChannel2.Id) 733 734 // Log back in as first user 735 th.LoginBasic() 736 737 channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") 738 CheckNoError(t, resp) 739 require.Len(t, channels, numInitialChannelsForTeam+3) 740 741 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 742 channels, resp = client.GetDeletedChannelsForTeam(team.Id, 0, 100, "") 743 CheckNoError(t, resp) 744 require.Len(t, channels, numInitialChannelsForTeam+2) 745 }) 746 747 channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 0, 1, "") 748 CheckNoError(t, resp) 749 require.Len(t, channels, 1, "should be one channel per page") 750 751 channels, resp = Client.GetDeletedChannelsForTeam(team.Id, 1, 1, "") 752 CheckNoError(t, resp) 753 require.Len(t, channels, 1, "should be one channel per page") 754 } 755 756 func TestGetPrivateChannelsForTeam(t *testing.T) { 757 th := Setup(t).InitBasic() 758 defer th.TearDown() 759 team := th.BasicTeam 760 761 // normal user 762 _, resp := th.Client.GetPrivateChannelsForTeam(team.Id, 0, 100, "") 763 CheckForbiddenStatus(t, resp) 764 765 th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { 766 channels, resp := c.GetPrivateChannelsForTeam(team.Id, 0, 100, "") 767 CheckNoError(t, resp) 768 // th.BasicPrivateChannel and th.BasicPrivateChannel2 769 require.Len(t, channels, 2, "wrong number of private channels") 770 for _, c := range channels { 771 // check all channels included are private 772 require.Equal(t, model.CHANNEL_PRIVATE, c.Type, "should include private channels only") 773 } 774 775 channels, resp = c.GetPrivateChannelsForTeam(team.Id, 0, 1, "") 776 CheckNoError(t, resp) 777 require.Len(t, channels, 1, "should be one channel per page") 778 779 channels, resp = c.GetPrivateChannelsForTeam(team.Id, 1, 1, "") 780 CheckNoError(t, resp) 781 require.Len(t, channels, 1, "should be one channel per page") 782 783 channels, resp = c.GetPrivateChannelsForTeam(team.Id, 10000, 100, "") 784 CheckNoError(t, resp) 785 require.Empty(t, channels, "should be no channel") 786 787 _, resp = c.GetPrivateChannelsForTeam("junk", 0, 100, "") 788 CheckBadRequestStatus(t, resp) 789 }) 790 } 791 792 func TestGetPublicChannelsForTeam(t *testing.T) { 793 th := Setup(t).InitBasic() 794 defer th.TearDown() 795 Client := th.Client 796 team := th.BasicTeam 797 publicChannel1 := th.BasicChannel 798 publicChannel2 := th.BasicChannel2 799 800 channels, resp := Client.GetPublicChannelsForTeam(team.Id, 0, 100, "") 801 CheckNoError(t, resp) 802 require.Len(t, channels, 4, "wrong path") 803 804 for i, c := range channels { 805 // check all channels included are open 806 require.Equal(t, model.CHANNEL_OPEN, c.Type, "should include open channel only") 807 808 // only check the created 2 public channels 809 require.False(t, i < 2 && !(c.DisplayName == publicChannel1.DisplayName || c.DisplayName == publicChannel2.DisplayName), "should match public channel display name") 810 } 811 812 privateChannel := th.CreatePrivateChannel() 813 channels, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "") 814 CheckNoError(t, resp) 815 require.Len(t, channels, 4, "incorrect length of team public channels") 816 817 for _, c := range channels { 818 require.Equal(t, model.CHANNEL_OPEN, c.Type, "should not include private channel") 819 require.NotEqual(t, privateChannel.DisplayName, c.DisplayName, "should not match private channel display name") 820 } 821 822 channels, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 1, "") 823 CheckNoError(t, resp) 824 require.Len(t, channels, 1, "should be one channel per page") 825 826 channels, resp = Client.GetPublicChannelsForTeam(team.Id, 1, 1, "") 827 CheckNoError(t, resp) 828 require.Len(t, channels, 1, "should be one channel per page") 829 830 channels, resp = Client.GetPublicChannelsForTeam(team.Id, 10000, 100, "") 831 CheckNoError(t, resp) 832 require.Empty(t, channels, "should be no channel") 833 834 _, resp = Client.GetPublicChannelsForTeam("junk", 0, 100, "") 835 CheckBadRequestStatus(t, resp) 836 837 _, resp = Client.GetPublicChannelsForTeam(model.NewId(), 0, 100, "") 838 CheckForbiddenStatus(t, resp) 839 840 Client.Logout() 841 _, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "") 842 CheckUnauthorizedStatus(t, resp) 843 844 user := th.CreateUser() 845 Client.Login(user.Email, user.Password) 846 _, resp = Client.GetPublicChannelsForTeam(team.Id, 0, 100, "") 847 CheckForbiddenStatus(t, resp) 848 849 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 850 _, resp = client.GetPublicChannelsForTeam(team.Id, 0, 100, "") 851 CheckNoError(t, resp) 852 }) 853 } 854 855 func TestGetPublicChannelsByIdsForTeam(t *testing.T) { 856 th := Setup(t).InitBasic() 857 defer th.TearDown() 858 Client := th.Client 859 teamId := th.BasicTeam.Id 860 input := []string{th.BasicChannel.Id} 861 output := []string{th.BasicChannel.DisplayName} 862 863 channels, resp := Client.GetPublicChannelsByIdsForTeam(teamId, input) 864 CheckNoError(t, resp) 865 require.Len(t, channels, 1, "should return 1 channel") 866 require.Equal(t, output[0], channels[0].DisplayName, "missing channel") 867 868 input = append(input, GenerateTestId()) 869 input = append(input, th.BasicChannel2.Id) 870 input = append(input, th.BasicPrivateChannel.Id) 871 output = append(output, th.BasicChannel2.DisplayName) 872 sort.Strings(output) 873 874 channels, resp = Client.GetPublicChannelsByIdsForTeam(teamId, input) 875 CheckNoError(t, resp) 876 require.Len(t, channels, 2, "should return 2 channels") 877 878 for i, c := range channels { 879 require.Equal(t, output[i], c.DisplayName, "missing channel") 880 } 881 882 _, resp = Client.GetPublicChannelsByIdsForTeam(GenerateTestId(), input) 883 CheckForbiddenStatus(t, resp) 884 885 _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{}) 886 CheckBadRequestStatus(t, resp) 887 888 _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{"junk"}) 889 CheckBadRequestStatus(t, resp) 890 891 _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{GenerateTestId()}) 892 CheckNotFoundStatus(t, resp) 893 894 _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, []string{th.BasicPrivateChannel.Id}) 895 CheckNotFoundStatus(t, resp) 896 897 Client.Logout() 898 899 _, resp = Client.GetPublicChannelsByIdsForTeam(teamId, input) 900 CheckUnauthorizedStatus(t, resp) 901 902 _, resp = th.SystemAdminClient.GetPublicChannelsByIdsForTeam(teamId, input) 903 CheckNoError(t, resp) 904 } 905 906 func TestGetChannelsForTeamForUser(t *testing.T) { 907 th := Setup(t).InitBasic() 908 defer th.TearDown() 909 Client := th.Client 910 911 t.Run("get channels for the team for user", func(t *testing.T) { 912 channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") 913 CheckNoError(t, resp) 914 915 found := make([]bool, 3) 916 for _, c := range channels { 917 if c.Id == th.BasicChannel.Id { 918 found[0] = true 919 } else if c.Id == th.BasicChannel2.Id { 920 found[1] = true 921 } else if c.Id == th.BasicPrivateChannel.Id { 922 found[2] = true 923 } 924 925 require.True(t, c.TeamId == "" || c.TeamId == th.BasicTeam.Id) 926 } 927 928 for _, f := range found { 929 require.True(t, f, "missing a channel") 930 } 931 932 channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, resp.Etag) 933 CheckEtag(t, channels, resp) 934 935 _, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", false, "") 936 CheckBadRequestStatus(t, resp) 937 938 _, resp = Client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, false, "") 939 CheckBadRequestStatus(t, resp) 940 941 _, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, false, "") 942 CheckForbiddenStatus(t, resp) 943 944 _, resp = Client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, false, "") 945 CheckForbiddenStatus(t, resp) 946 947 _, resp = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") 948 CheckNoError(t, resp) 949 }) 950 951 t.Run("deleted channel could be retrieved using the proper flag", func(t *testing.T) { 952 testChannel := &model.Channel{ 953 DisplayName: "dn_" + model.NewId(), 954 Name: GenerateTestChannelName(), 955 Type: model.CHANNEL_OPEN, 956 TeamId: th.BasicTeam.Id, 957 CreatorId: th.BasicUser.Id, 958 } 959 th.App.CreateChannel(th.Context, testChannel, true) 960 defer th.App.PermanentDeleteChannel(testChannel) 961 channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") 962 CheckNoError(t, resp) 963 assert.Equal(t, 6, len(channels)) 964 th.App.DeleteChannel(th.Context, testChannel, th.BasicUser.Id) 965 channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") 966 CheckNoError(t, resp) 967 assert.Equal(t, 5, len(channels)) 968 969 // Should return all channels including basicDeleted. 970 channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, true, "") 971 CheckNoError(t, resp) 972 assert.Equal(t, 7, len(channels)) 973 974 // Should stil return all channels including basicDeleted. 975 now := time.Now().Add(-time.Minute).Unix() * 1000 976 Client.GetChannelsForTeamAndUserWithLastDeleteAt(th.BasicTeam.Id, th.BasicUser.Id, 977 true, int(now), "") 978 CheckNoError(t, resp) 979 assert.Equal(t, 7, len(channels)) 980 }) 981 } 982 983 func TestGetAllChannels(t *testing.T) { 984 th := Setup(t).InitBasic() 985 defer th.TearDown() 986 Client := th.Client 987 988 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 989 channels, resp := client.GetAllChannels(0, 20, "") 990 CheckNoError(t, resp) 991 992 // At least, all the not-deleted channels created during the InitBasic 993 require.True(t, len(*channels) >= 3) 994 for _, c := range *channels { 995 require.NotEqual(t, c.TeamId, "") 996 } 997 998 channels, resp = client.GetAllChannels(0, 10, "") 999 CheckNoError(t, resp) 1000 require.True(t, len(*channels) >= 3) 1001 1002 channels, resp = client.GetAllChannels(1, 1, "") 1003 CheckNoError(t, resp) 1004 require.Len(t, *channels, 1) 1005 1006 channels, resp = client.GetAllChannels(10000, 10000, "") 1007 CheckNoError(t, resp) 1008 require.Empty(t, *channels) 1009 1010 channels, resp = client.GetAllChannels(0, 10000, "") 1011 require.Nil(t, resp.Error) 1012 beforeCount := len(*channels) 1013 1014 firstChannel := (*channels)[0].Channel 1015 1016 ok, resp := client.DeleteChannel(firstChannel.Id) 1017 require.Nil(t, resp.Error) 1018 require.True(t, ok) 1019 1020 channels, resp = client.GetAllChannels(0, 10000, "") 1021 var ids []string 1022 for _, item := range *channels { 1023 ids = append(ids, item.Channel.Id) 1024 } 1025 require.Nil(t, resp.Error) 1026 require.Len(t, *channels, beforeCount-1) 1027 require.NotContains(t, ids, firstChannel.Id) 1028 1029 channels, resp = client.GetAllChannelsIncludeDeleted(0, 10000, "") 1030 ids = []string{} 1031 for _, item := range *channels { 1032 ids = append(ids, item.Channel.Id) 1033 } 1034 require.Nil(t, resp.Error) 1035 require.True(t, len(*channels) > beforeCount) 1036 require.Contains(t, ids, firstChannel.Id) 1037 }) 1038 1039 _, resp := Client.GetAllChannels(0, 20, "") 1040 CheckForbiddenStatus(t, resp) 1041 1042 sysManagerChannels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "") 1043 CheckOKStatus(t, resp) 1044 policyChannel := (*sysManagerChannels)[0] 1045 policy, savePolicyErr := th.App.Srv().Store.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{ 1046 RetentionPolicy: model.RetentionPolicy{ 1047 DisplayName: "Policy 1", 1048 PostDuration: model.NewInt64(30), 1049 }, 1050 ChannelIDs: []string{policyChannel.Id}, 1051 }) 1052 require.NoError(t, savePolicyErr) 1053 1054 t.Run("exclude policy constrained", func(t *testing.T) { 1055 _, resp := th.SystemManagerClient.GetAllChannelsExcludePolicyConstrained(0, 10000, "") 1056 CheckForbiddenStatus(t, resp) 1057 1058 channels, resp := th.SystemAdminClient.GetAllChannelsExcludePolicyConstrained(0, 10000, "") 1059 CheckOKStatus(t, resp) 1060 found := false 1061 for _, channel := range *channels { 1062 if channel.Id == policyChannel.Id { 1063 found = true 1064 break 1065 } 1066 } 1067 require.False(t, found) 1068 }) 1069 1070 t.Run("does not return policy ID", func(t *testing.T) { 1071 channels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "") 1072 CheckOKStatus(t, resp) 1073 found := false 1074 for _, channel := range *channels { 1075 if channel.Id == policyChannel.Id { 1076 found = true 1077 require.Nil(t, channel.PolicyID) 1078 break 1079 } 1080 } 1081 require.True(t, found) 1082 }) 1083 1084 t.Run("returns policy ID", func(t *testing.T) { 1085 channels, resp := th.SystemAdminClient.GetAllChannels(0, 10000, "") 1086 CheckOKStatus(t, resp) 1087 found := false 1088 for _, channel := range *channels { 1089 if channel.Id == policyChannel.Id { 1090 found = true 1091 require.Equal(t, *channel.PolicyID, policy.ID) 1092 break 1093 } 1094 } 1095 require.True(t, found) 1096 }) 1097 } 1098 1099 func TestGetAllChannelsWithCount(t *testing.T) { 1100 th := Setup(t).InitBasic() 1101 defer th.TearDown() 1102 Client := th.Client 1103 1104 channels, total, resp := th.SystemAdminClient.GetAllChannelsWithCount(0, 20, "") 1105 CheckNoError(t, resp) 1106 1107 // At least, all the not-deleted channels created during the InitBasic 1108 require.True(t, len(*channels) >= 3) 1109 for _, c := range *channels { 1110 require.NotEqual(t, c.TeamId, "") 1111 } 1112 require.Equal(t, int64(6), total) 1113 1114 channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(0, 10, "") 1115 CheckNoError(t, resp) 1116 require.True(t, len(*channels) >= 3) 1117 1118 channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(1, 1, "") 1119 CheckNoError(t, resp) 1120 require.Len(t, *channels, 1) 1121 1122 channels, _, resp = th.SystemAdminClient.GetAllChannelsWithCount(10000, 10000, "") 1123 CheckNoError(t, resp) 1124 require.Empty(t, *channels) 1125 1126 _, _, resp = Client.GetAllChannelsWithCount(0, 20, "") 1127 CheckForbiddenStatus(t, resp) 1128 } 1129 1130 func TestSearchChannels(t *testing.T) { 1131 th := Setup(t).InitBasic() 1132 defer th.TearDown() 1133 Client := th.Client 1134 1135 search := &model.ChannelSearch{Term: th.BasicChannel.Name} 1136 1137 channels, resp := Client.SearchChannels(th.BasicTeam.Id, search) 1138 CheckNoError(t, resp) 1139 1140 found := false 1141 for _, c := range channels { 1142 require.Equal(t, model.CHANNEL_OPEN, c.Type, "should only return public channels") 1143 1144 if c.Id == th.BasicChannel.Id { 1145 found = true 1146 } 1147 } 1148 require.True(t, found, "didn't find channel") 1149 1150 search.Term = th.BasicPrivateChannel.Name 1151 channels, resp = Client.SearchChannels(th.BasicTeam.Id, search) 1152 CheckNoError(t, resp) 1153 1154 found = false 1155 for _, c := range channels { 1156 if c.Id == th.BasicPrivateChannel.Id { 1157 found = true 1158 } 1159 } 1160 require.False(t, found, "shouldn't find private channel") 1161 1162 search.Term = "" 1163 _, resp = Client.SearchChannels(th.BasicTeam.Id, search) 1164 CheckNoError(t, resp) 1165 1166 search.Term = th.BasicChannel.Name 1167 _, resp = Client.SearchChannels(model.NewId(), search) 1168 CheckNotFoundStatus(t, resp) 1169 1170 _, resp = Client.SearchChannels("junk", search) 1171 CheckBadRequestStatus(t, resp) 1172 1173 _, resp = th.SystemAdminClient.SearchChannels(th.BasicTeam.Id, search) 1174 CheckNoError(t, resp) 1175 1176 // Check the appropriate permissions are enforced. 1177 defaultRolePermissions := th.SaveDefaultRolePermissions() 1178 defer func() { 1179 th.RestoreDefaultRolePermissions(defaultRolePermissions) 1180 }() 1181 1182 // Remove list channels permission from the user 1183 th.RemovePermissionFromRole(model.PERMISSION_LIST_TEAM_CHANNELS.Id, model.TEAM_USER_ROLE_ID) 1184 1185 t.Run("Search for a BasicChannel, which the user is a member of", func(t *testing.T) { 1186 search.Term = th.BasicChannel.Name 1187 channelList, resp := Client.SearchChannels(th.BasicTeam.Id, search) 1188 CheckNoError(t, resp) 1189 1190 channelNames := []string{} 1191 for _, c := range channelList { 1192 channelNames = append(channelNames, c.Name) 1193 } 1194 require.Contains(t, channelNames, th.BasicChannel.Name) 1195 }) 1196 1197 t.Run("Remove the user from BasicChannel and search again, should not be returned", func(t *testing.T) { 1198 th.App.RemoveUserFromChannel(th.Context, th.BasicUser.Id, th.BasicUser.Id, th.BasicChannel) 1199 1200 search.Term = th.BasicChannel.Name 1201 channelList, resp := Client.SearchChannels(th.BasicTeam.Id, search) 1202 CheckNoError(t, resp) 1203 1204 channelNames := []string{} 1205 for _, c := range channelList { 1206 channelNames = append(channelNames, c.Name) 1207 } 1208 require.NotContains(t, channelNames, th.BasicChannel.Name) 1209 }) 1210 } 1211 1212 func TestSearchArchivedChannels(t *testing.T) { 1213 th := Setup(t).InitBasic() 1214 defer th.TearDown() 1215 Client := th.Client 1216 1217 search := &model.ChannelSearch{Term: th.BasicChannel.Name} 1218 1219 Client.DeleteChannel(th.BasicChannel.Id) 1220 1221 channels, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search) 1222 CheckNoError(t, resp) 1223 1224 found := false 1225 for _, c := range channels { 1226 require.Equal(t, model.CHANNEL_OPEN, c.Type) 1227 1228 if c.Id == th.BasicChannel.Id { 1229 found = true 1230 } 1231 } 1232 1233 require.True(t, found) 1234 1235 search.Term = th.BasicPrivateChannel.Name 1236 Client.DeleteChannel(th.BasicPrivateChannel.Id) 1237 1238 channels, resp = Client.SearchArchivedChannels(th.BasicTeam.Id, search) 1239 CheckNoError(t, resp) 1240 1241 found = false 1242 for _, c := range channels { 1243 if c.Id == th.BasicPrivateChannel.Id { 1244 found = true 1245 } 1246 } 1247 1248 require.True(t, found) 1249 1250 search.Term = "" 1251 _, resp = Client.SearchArchivedChannels(th.BasicTeam.Id, search) 1252 CheckNoError(t, resp) 1253 1254 search.Term = th.BasicDeletedChannel.Name 1255 _, resp = Client.SearchArchivedChannels(model.NewId(), search) 1256 CheckNotFoundStatus(t, resp) 1257 1258 _, resp = Client.SearchArchivedChannels("junk", search) 1259 CheckBadRequestStatus(t, resp) 1260 1261 _, resp = th.SystemAdminClient.SearchArchivedChannels(th.BasicTeam.Id, search) 1262 CheckNoError(t, resp) 1263 1264 // Check the appropriate permissions are enforced. 1265 defaultRolePermissions := th.SaveDefaultRolePermissions() 1266 defer func() { 1267 th.RestoreDefaultRolePermissions(defaultRolePermissions) 1268 }() 1269 1270 // Remove list channels permission from the user 1271 th.RemovePermissionFromRole(model.PERMISSION_LIST_TEAM_CHANNELS.Id, model.TEAM_USER_ROLE_ID) 1272 1273 t.Run("Search for a BasicDeletedChannel, which the user is a member of", func(t *testing.T) { 1274 search.Term = th.BasicDeletedChannel.Name 1275 channelList, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search) 1276 CheckNoError(t, resp) 1277 1278 channelNames := []string{} 1279 for _, c := range channelList { 1280 channelNames = append(channelNames, c.Name) 1281 } 1282 require.Contains(t, channelNames, th.BasicDeletedChannel.Name) 1283 }) 1284 1285 t.Run("Remove the user from BasicDeletedChannel and search again, should still return", func(t *testing.T) { 1286 th.App.RemoveUserFromChannel(th.Context, th.BasicUser.Id, th.BasicUser.Id, th.BasicDeletedChannel) 1287 1288 search.Term = th.BasicDeletedChannel.Name 1289 channelList, resp := Client.SearchArchivedChannels(th.BasicTeam.Id, search) 1290 CheckNoError(t, resp) 1291 1292 channelNames := []string{} 1293 for _, c := range channelList { 1294 channelNames = append(channelNames, c.Name) 1295 } 1296 require.Contains(t, channelNames, th.BasicDeletedChannel.Name) 1297 }) 1298 } 1299 1300 func TestSearchAllChannels(t *testing.T) { 1301 th := Setup(t).InitBasic() 1302 defer th.TearDown() 1303 Client := th.Client 1304 1305 openChannel, chanErr := th.SystemAdminClient.CreateChannel(&model.Channel{ 1306 DisplayName: "SearchAllChannels-FOOBARDISPLAYNAME", 1307 Name: "whatever", 1308 Type: model.CHANNEL_OPEN, 1309 TeamId: th.BasicTeam.Id, 1310 }) 1311 CheckNoError(t, chanErr) 1312 1313 privateChannel, privErr := th.SystemAdminClient.CreateChannel(&model.Channel{ 1314 DisplayName: "SearchAllChannels-private1", 1315 Name: "private1", 1316 Type: model.CHANNEL_PRIVATE, 1317 TeamId: th.BasicTeam.Id, 1318 }) 1319 CheckNoError(t, privErr) 1320 1321 team := th.CreateTeam() 1322 groupConstrainedChannel, groupErr := th.SystemAdminClient.CreateChannel(&model.Channel{ 1323 DisplayName: "SearchAllChannels-groupConstrained-1", 1324 Name: "groupconstrained1", 1325 Type: model.CHANNEL_PRIVATE, 1326 GroupConstrained: model.NewBool(true), 1327 TeamId: team.Id, 1328 }) 1329 CheckNoError(t, groupErr) 1330 1331 testCases := []struct { 1332 Description string 1333 Search *model.ChannelSearch 1334 ExpectedChannelIds []string 1335 }{ 1336 { 1337 "Middle of word search", 1338 &model.ChannelSearch{Term: "bardisplay"}, 1339 []string{openChannel.Id}, 1340 }, 1341 { 1342 "Prefix search", 1343 &model.ChannelSearch{Term: "SearchAllChannels-foobar"}, 1344 []string{openChannel.Id}, 1345 }, 1346 { 1347 "Suffix search", 1348 &model.ChannelSearch{Term: "displayname"}, 1349 []string{openChannel.Id}, 1350 }, 1351 { 1352 "Name search", 1353 &model.ChannelSearch{Term: "what"}, 1354 []string{openChannel.Id}, 1355 }, 1356 { 1357 "Name suffix search", 1358 &model.ChannelSearch{Term: "ever"}, 1359 []string{openChannel.Id}, 1360 }, 1361 { 1362 "Basic channel name middle of word search", 1363 &model.ChannelSearch{Term: th.BasicChannel.Name[2:14]}, 1364 []string{th.BasicChannel.Id}, 1365 }, 1366 { 1367 "Upper case search", 1368 &model.ChannelSearch{Term: strings.ToUpper(th.BasicChannel.Name)}, 1369 []string{th.BasicChannel.Id}, 1370 }, 1371 { 1372 "Mixed case search", 1373 &model.ChannelSearch{Term: th.BasicChannel.Name[0:2] + strings.ToUpper(th.BasicChannel.Name[2:5]) + th.BasicChannel.Name[5:]}, 1374 []string{th.BasicChannel.Id}, 1375 }, 1376 { 1377 "Non mixed case search", 1378 &model.ChannelSearch{Term: th.BasicChannel.Name}, 1379 []string{th.BasicChannel.Id}, 1380 }, 1381 { 1382 "Search private channel name", 1383 &model.ChannelSearch{Term: th.BasicPrivateChannel.Name}, 1384 []string{th.BasicPrivateChannel.Id}, 1385 }, 1386 { 1387 "Search with private channel filter", 1388 &model.ChannelSearch{Private: true}, 1389 []string{th.BasicPrivateChannel.Id, th.BasicPrivateChannel2.Id, privateChannel.Id, groupConstrainedChannel.Id}, 1390 }, 1391 { 1392 "Search with public channel filter", 1393 &model.ChannelSearch{Term: "SearchAllChannels", Public: true}, 1394 []string{openChannel.Id}, 1395 }, 1396 { 1397 "Search with private channel filter", 1398 &model.ChannelSearch{Term: "SearchAllChannels", Private: true}, 1399 []string{privateChannel.Id, groupConstrainedChannel.Id}, 1400 }, 1401 { 1402 "Search with teamIds channel filter", 1403 &model.ChannelSearch{Term: "SearchAllChannels", TeamIds: []string{th.BasicTeam.Id}}, 1404 []string{openChannel.Id, privateChannel.Id}, 1405 }, 1406 { 1407 "Search with deleted without IncludeDeleted filter", 1408 &model.ChannelSearch{Term: th.BasicDeletedChannel.Name}, 1409 []string{}, 1410 }, 1411 { 1412 "Search with deleted IncludeDeleted filter", 1413 &model.ChannelSearch{Term: th.BasicDeletedChannel.Name, IncludeDeleted: true}, 1414 []string{th.BasicDeletedChannel.Id}, 1415 }, 1416 { 1417 "Search with deleted IncludeDeleted filter", 1418 &model.ChannelSearch{Term: th.BasicDeletedChannel.Name, IncludeDeleted: true}, 1419 []string{th.BasicDeletedChannel.Id}, 1420 }, 1421 { 1422 "Search with deleted Deleted filter and empty term", 1423 &model.ChannelSearch{Term: "", Deleted: true}, 1424 []string{th.BasicDeletedChannel.Id}, 1425 }, 1426 { 1427 "Search for group constrained", 1428 &model.ChannelSearch{Term: "SearchAllChannels", GroupConstrained: true}, 1429 []string{groupConstrainedChannel.Id}, 1430 }, 1431 { 1432 "Search for group constrained and public", 1433 &model.ChannelSearch{Term: "SearchAllChannels", GroupConstrained: true, Public: true}, 1434 []string{}, 1435 }, 1436 { 1437 "Search for exclude group constrained", 1438 &model.ChannelSearch{Term: "SearchAllChannels", ExcludeGroupConstrained: true}, 1439 []string{openChannel.Id, privateChannel.Id}, 1440 }, 1441 } 1442 for _, testCase := range testCases { 1443 t.Run(testCase.Description, func(t *testing.T) { 1444 channels, resp := th.SystemAdminClient.SearchAllChannels(testCase.Search) 1445 CheckNoError(t, resp) 1446 assert.Equal(t, len(testCase.ExpectedChannelIds), len(*channels)) 1447 actualChannelIds := []string{} 1448 for _, channelWithTeamData := range *channels { 1449 actualChannelIds = append(actualChannelIds, channelWithTeamData.Channel.Id) 1450 } 1451 assert.ElementsMatch(t, testCase.ExpectedChannelIds, actualChannelIds) 1452 }) 1453 } 1454 1455 // Searching with no terms returns all default channels 1456 allChannels, resp := th.SystemAdminClient.SearchAllChannels(&model.ChannelSearch{Term: ""}) 1457 CheckNoError(t, resp) 1458 assert.True(t, len(*allChannels) >= 3) 1459 1460 _, resp = Client.SearchAllChannels(&model.ChannelSearch{Term: ""}) 1461 CheckForbiddenStatus(t, resp) 1462 1463 // Choose a policy which the system manager can read 1464 sysManagerChannels, resp := th.SystemManagerClient.GetAllChannels(0, 10000, "") 1465 CheckOKStatus(t, resp) 1466 policyChannel := (*sysManagerChannels)[0] 1467 policy, savePolicyErr := th.App.Srv().Store.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{ 1468 RetentionPolicy: model.RetentionPolicy{ 1469 DisplayName: "Policy 1", 1470 PostDuration: model.NewInt64(30), 1471 }, 1472 ChannelIDs: []string{policyChannel.Id}, 1473 }) 1474 require.NoError(t, savePolicyErr) 1475 1476 t.Run("does not return policy ID", func(t *testing.T) { 1477 channels, resp := th.SystemManagerClient.SearchAllChannels(&model.ChannelSearch{Term: policyChannel.Name}) 1478 CheckOKStatus(t, resp) 1479 found := false 1480 for _, channel := range *channels { 1481 if channel.Id == policyChannel.Id { 1482 found = true 1483 require.Nil(t, channel.PolicyID) 1484 break 1485 } 1486 } 1487 require.True(t, found) 1488 }) 1489 t.Run("returns policy ID", func(t *testing.T) { 1490 channels, resp := th.SystemAdminClient.SearchAllChannels(&model.ChannelSearch{Term: policyChannel.Name}) 1491 CheckOKStatus(t, resp) 1492 found := false 1493 for _, channel := range *channels { 1494 if channel.Id == policyChannel.Id { 1495 found = true 1496 require.Equal(t, *channel.PolicyID, policy.ID) 1497 break 1498 } 1499 } 1500 require.True(t, found) 1501 }) 1502 } 1503 1504 func TestSearchAllChannelsPaged(t *testing.T) { 1505 th := Setup(t).InitBasic() 1506 defer th.TearDown() 1507 Client := th.Client 1508 1509 search := &model.ChannelSearch{Term: th.BasicChannel.Name} 1510 search.Term = "" 1511 search.Page = model.NewInt(0) 1512 search.PerPage = model.NewInt(2) 1513 channelsWithCount, resp := th.SystemAdminClient.SearchAllChannelsPaged(search) 1514 CheckNoError(t, resp) 1515 require.Len(t, *channelsWithCount.Channels, 2) 1516 1517 search.Term = th.BasicChannel.Name 1518 _, resp = Client.SearchAllChannels(search) 1519 CheckForbiddenStatus(t, resp) 1520 } 1521 1522 func TestSearchGroupChannels(t *testing.T) { 1523 th := Setup(t).InitBasic() 1524 defer th.TearDown() 1525 Client := th.Client 1526 1527 u1 := th.CreateUserWithClient(th.SystemAdminClient) 1528 1529 // Create a group channel in which base user belongs but not sysadmin 1530 gc1, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, u1.Id}) 1531 CheckNoError(t, resp) 1532 defer th.Client.DeleteChannel(gc1.Id) 1533 1534 gc2, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, th.SystemAdminUser.Id}) 1535 CheckNoError(t, resp) 1536 defer th.Client.DeleteChannel(gc2.Id) 1537 1538 search := &model.ChannelSearch{Term: th.BasicUser2.Username} 1539 1540 // sysadmin should only find gc2 as he doesn't belong to gc1 1541 channels, resp := th.SystemAdminClient.SearchGroupChannels(search) 1542 CheckNoError(t, resp) 1543 1544 assert.Len(t, channels, 1) 1545 assert.Equal(t, channels[0].Id, gc2.Id) 1546 1547 // basic user should find both 1548 Client.Login(th.BasicUser.Username, th.BasicUser.Password) 1549 channels, resp = Client.SearchGroupChannels(search) 1550 CheckNoError(t, resp) 1551 1552 assert.Len(t, channels, 2) 1553 channelIds := []string{} 1554 for _, c := range channels { 1555 channelIds = append(channelIds, c.Id) 1556 } 1557 assert.ElementsMatch(t, channelIds, []string{gc1.Id, gc2.Id}) 1558 1559 // searching for sysadmin, it should only find gc1 1560 search = &model.ChannelSearch{Term: th.SystemAdminUser.Username} 1561 channels, resp = Client.SearchGroupChannels(search) 1562 CheckNoError(t, resp) 1563 1564 assert.Len(t, channels, 1) 1565 assert.Equal(t, channels[0].Id, gc2.Id) 1566 1567 // with an empty search, response should be empty 1568 search = &model.ChannelSearch{Term: ""} 1569 channels, resp = Client.SearchGroupChannels(search) 1570 CheckNoError(t, resp) 1571 1572 assert.Empty(t, channels) 1573 1574 // search unprivileged, forbidden 1575 th.Client.Logout() 1576 _, resp = Client.SearchAllChannels(search) 1577 CheckUnauthorizedStatus(t, resp) 1578 } 1579 1580 func TestDeleteChannel(t *testing.T) { 1581 th := Setup(t).InitBasic() 1582 defer th.TearDown() 1583 c := th.Client 1584 team := th.BasicTeam 1585 user := th.BasicUser 1586 user2 := th.BasicUser2 1587 1588 // successful delete of public channel 1589 th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { 1590 publicChannel1 := th.CreatePublicChannel() 1591 pass, resp := client.DeleteChannel(publicChannel1.Id) 1592 CheckNoError(t, resp) 1593 1594 require.True(t, pass, "should have passed") 1595 1596 ch, err := th.App.GetChannel(publicChannel1.Id) 1597 require.True(t, err != nil || ch.DeleteAt != 0, "should have failed to get deleted channel, or returned one with a populated DeleteAt.") 1598 1599 post1 := &model.Post{ChannelId: publicChannel1.Id, Message: "a" + GenerateTestId() + "a"} 1600 _, resp = client.CreatePost(post1) 1601 require.NotNil(t, resp, "expected response to not be nil") 1602 1603 // successful delete of private channel 1604 privateChannel2 := th.CreatePrivateChannel() 1605 _, resp = client.DeleteChannel(privateChannel2.Id) 1606 CheckNoError(t, resp) 1607 1608 // successful delete of channel with multiple members 1609 publicChannel3 := th.CreatePublicChannel() 1610 th.App.AddUserToChannel(user, publicChannel3, false) 1611 th.App.AddUserToChannel(user2, publicChannel3, false) 1612 _, resp = client.DeleteChannel(publicChannel3.Id) 1613 CheckNoError(t, resp) 1614 1615 // default channel cannot be deleted. 1616 defaultChannel, _ := th.App.GetChannelByName(model.DEFAULT_CHANNEL, team.Id, false) 1617 pass, resp = client.DeleteChannel(defaultChannel.Id) 1618 CheckBadRequestStatus(t, resp) 1619 require.False(t, pass, "should have failed") 1620 1621 // check system admin can delete a channel without any appropriate team or channel membership. 1622 sdTeam := th.CreateTeamWithClient(c) 1623 sdPublicChannel := &model.Channel{ 1624 DisplayName: "dn_" + model.NewId(), 1625 Name: GenerateTestChannelName(), 1626 Type: model.CHANNEL_OPEN, 1627 TeamId: sdTeam.Id, 1628 } 1629 sdPublicChannel, resp = c.CreateChannel(sdPublicChannel) 1630 CheckNoError(t, resp) 1631 _, resp = client.DeleteChannel(sdPublicChannel.Id) 1632 CheckNoError(t, resp) 1633 1634 sdPrivateChannel := &model.Channel{ 1635 DisplayName: "dn_" + model.NewId(), 1636 Name: GenerateTestChannelName(), 1637 Type: model.CHANNEL_PRIVATE, 1638 TeamId: sdTeam.Id, 1639 } 1640 sdPrivateChannel, resp = c.CreateChannel(sdPrivateChannel) 1641 CheckNoError(t, resp) 1642 _, resp = client.DeleteChannel(sdPrivateChannel.Id) 1643 CheckNoError(t, resp) 1644 }) 1645 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 1646 1647 th.LoginBasic() 1648 publicChannel5 := th.CreatePublicChannel() 1649 c.Logout() 1650 1651 c.Login(user.Id, user.Password) 1652 _, resp := c.DeleteChannel(publicChannel5.Id) 1653 CheckUnauthorizedStatus(t, resp) 1654 1655 _, resp = c.DeleteChannel("junk") 1656 CheckUnauthorizedStatus(t, resp) 1657 1658 c.Logout() 1659 _, resp = c.DeleteChannel(GenerateTestId()) 1660 CheckUnauthorizedStatus(t, resp) 1661 1662 _, resp = client.DeleteChannel(publicChannel5.Id) 1663 CheckNoError(t, resp) 1664 1665 }) 1666 1667 } 1668 1669 func TestDeleteChannel2(t *testing.T) { 1670 th := Setup(t).InitBasic() 1671 defer th.TearDown() 1672 Client := th.Client 1673 user := th.BasicUser 1674 1675 // Check the appropriate permissions are enforced. 1676 defaultRolePermissions := th.SaveDefaultRolePermissions() 1677 defer func() { 1678 th.RestoreDefaultRolePermissions(defaultRolePermissions) 1679 }() 1680 1681 th.AddPermissionToRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID) 1682 th.AddPermissionToRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID) 1683 1684 // channels created by SystemAdmin 1685 publicChannel6 := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_OPEN) 1686 privateChannel7 := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE) 1687 th.App.AddUserToChannel(user, publicChannel6, false) 1688 th.App.AddUserToChannel(user, privateChannel7, false) 1689 th.App.AddUserToChannel(user, privateChannel7, false) 1690 1691 // successful delete by user 1692 _, resp := Client.DeleteChannel(publicChannel6.Id) 1693 CheckNoError(t, resp) 1694 1695 _, resp = Client.DeleteChannel(privateChannel7.Id) 1696 CheckNoError(t, resp) 1697 1698 // Restrict permissions to Channel Admins 1699 th.RemovePermissionFromRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID) 1700 th.RemovePermissionFromRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_USER_ROLE_ID) 1701 th.AddPermissionToRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID) 1702 th.AddPermissionToRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID) 1703 1704 // channels created by SystemAdmin 1705 publicChannel6 = th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_OPEN) 1706 privateChannel7 = th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE) 1707 th.App.AddUserToChannel(user, publicChannel6, false) 1708 th.App.AddUserToChannel(user, privateChannel7, false) 1709 th.App.AddUserToChannel(user, privateChannel7, false) 1710 1711 // cannot delete by user 1712 _, resp = Client.DeleteChannel(publicChannel6.Id) 1713 CheckForbiddenStatus(t, resp) 1714 1715 _, resp = Client.DeleteChannel(privateChannel7.Id) 1716 CheckForbiddenStatus(t, resp) 1717 1718 // successful delete by channel admin 1719 th.MakeUserChannelAdmin(user, publicChannel6) 1720 th.MakeUserChannelAdmin(user, privateChannel7) 1721 th.App.Srv().Store.Channel().ClearCaches() 1722 1723 _, resp = Client.DeleteChannel(publicChannel6.Id) 1724 CheckNoError(t, resp) 1725 1726 _, resp = Client.DeleteChannel(privateChannel7.Id) 1727 CheckNoError(t, resp) 1728 1729 // Make sure team admins don't have permission to delete channels. 1730 th.RemovePermissionFromRole(model.PERMISSION_DELETE_PUBLIC_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID) 1731 th.RemovePermissionFromRole(model.PERMISSION_DELETE_PRIVATE_CHANNEL.Id, model.CHANNEL_ADMIN_ROLE_ID) 1732 1733 // last member of a public channel should have required permission to delete 1734 publicChannel6 = th.CreateChannelWithClient(th.Client, model.CHANNEL_OPEN) 1735 _, resp = Client.DeleteChannel(publicChannel6.Id) 1736 CheckForbiddenStatus(t, resp) 1737 1738 // last member of a private channel should not be able to delete it if they don't have required permissions 1739 privateChannel7 = th.CreateChannelWithClient(th.Client, model.CHANNEL_PRIVATE) 1740 _, resp = Client.DeleteChannel(privateChannel7.Id) 1741 CheckForbiddenStatus(t, resp) 1742 } 1743 1744 func TestPermanentDeleteChannel(t *testing.T) { 1745 th := Setup(t).InitBasic() 1746 defer th.TearDown() 1747 1748 enableAPIChannelDeletion := *th.App.Config().ServiceSettings.EnableAPIChannelDeletion 1749 defer func() { 1750 th.App.UpdateConfig(func(cfg *model.Config) { cfg.ServiceSettings.EnableAPIChannelDeletion = &enableAPIChannelDeletion }) 1751 }() 1752 1753 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPIChannelDeletion = false }) 1754 1755 publicChannel1 := th.CreatePublicChannel() 1756 t.Run("Permanent deletion not available through API if EnableAPIChannelDeletion is not set", func(t *testing.T) { 1757 _, resp := th.SystemAdminClient.PermanentDeleteChannel(publicChannel1.Id) 1758 CheckUnauthorizedStatus(t, resp) 1759 }) 1760 1761 t.Run("Permanent deletion available through local mode even if EnableAPIChannelDeletion is not set", func(t *testing.T) { 1762 ok, resp := th.LocalClient.PermanentDeleteChannel(publicChannel1.Id) 1763 CheckNoError(t, resp) 1764 assert.True(t, ok) 1765 }) 1766 1767 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableAPIChannelDeletion = true }) 1768 th.TestForSystemAdminAndLocal(t, func(t *testing.T, c *model.Client4) { 1769 publicChannel := th.CreatePublicChannel() 1770 ok, resp := c.PermanentDeleteChannel(publicChannel.Id) 1771 CheckNoError(t, resp) 1772 assert.True(t, ok) 1773 1774 _, err := th.App.GetChannel(publicChannel.Id) 1775 assert.NotNil(t, err) 1776 1777 ok, resp = c.PermanentDeleteChannel("junk") 1778 CheckBadRequestStatus(t, resp) 1779 require.False(t, ok, "should have returned false") 1780 }, "Permanent deletion with EnableAPIChannelDeletion set") 1781 } 1782 1783 func TestConvertChannelToPrivate(t *testing.T) { 1784 th := Setup(t).InitBasic() 1785 defer th.TearDown() 1786 Client := th.Client 1787 1788 defaultChannel, _ := th.App.GetChannelByName(model.DEFAULT_CHANNEL, th.BasicTeam.Id, false) 1789 _, resp := Client.ConvertChannelToPrivate(defaultChannel.Id) 1790 CheckForbiddenStatus(t, resp) 1791 1792 privateChannel := th.CreatePrivateChannel() 1793 _, resp = Client.ConvertChannelToPrivate(privateChannel.Id) 1794 CheckForbiddenStatus(t, resp) 1795 1796 publicChannel := th.CreatePublicChannel() 1797 _, resp = Client.ConvertChannelToPrivate(publicChannel.Id) 1798 CheckForbiddenStatus(t, resp) 1799 1800 th.LoginTeamAdmin() 1801 th.RemovePermissionFromRole(model.PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id, model.TEAM_ADMIN_ROLE_ID) 1802 1803 _, resp = Client.ConvertChannelToPrivate(publicChannel.Id) 1804 CheckForbiddenStatus(t, resp) 1805 1806 th.AddPermissionToRole(model.PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id, model.TEAM_ADMIN_ROLE_ID) 1807 1808 rchannel, resp := Client.ConvertChannelToPrivate(publicChannel.Id) 1809 CheckOKStatus(t, resp) 1810 require.Equal(t, model.CHANNEL_PRIVATE, rchannel.Type, "channel should be converted from public to private") 1811 1812 rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(privateChannel.Id) 1813 CheckBadRequestStatus(t, resp) 1814 require.Nil(t, rchannel, "should not return a channel") 1815 1816 rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(defaultChannel.Id) 1817 CheckBadRequestStatus(t, resp) 1818 require.Nil(t, rchannel, "should not return a channel") 1819 1820 WebSocketClient, err := th.CreateWebSocketClient() 1821 require.Nil(t, err) 1822 WebSocketClient.Listen() 1823 1824 publicChannel2 := th.CreatePublicChannel() 1825 rchannel, resp = th.SystemAdminClient.ConvertChannelToPrivate(publicChannel2.Id) 1826 CheckOKStatus(t, resp) 1827 require.Equal(t, model.CHANNEL_PRIVATE, rchannel.Type, "channel should be converted from public to private") 1828 1829 timeout := time.After(10 * time.Second) 1830 1831 for { 1832 select { 1833 case resp := <-WebSocketClient.EventChannel: 1834 if resp.EventType() == model.WEBSOCKET_EVENT_CHANNEL_CONVERTED && resp.GetData()["channel_id"].(string) == publicChannel2.Id { 1835 return 1836 } 1837 case <-timeout: 1838 require.Fail(t, "timed out waiting for channel_converted event") 1839 return 1840 } 1841 } 1842 } 1843 1844 func TestUpdateChannelPrivacy(t *testing.T) { 1845 th := Setup(t).InitBasic() 1846 defer th.TearDown() 1847 1848 defaultChannel, _ := th.App.GetChannelByName(model.DEFAULT_CHANNEL, th.BasicTeam.Id, false) 1849 1850 type testTable []struct { 1851 name string 1852 channel *model.Channel 1853 expectedPrivacy string 1854 } 1855 1856 t.Run("Should get a forbidden response if not logged in", func(t *testing.T) { 1857 privateChannel := th.CreatePrivateChannel() 1858 publicChannel := th.CreatePublicChannel() 1859 1860 tt := testTable{ 1861 {"Updating default channel should fail with forbidden status if not logged in", defaultChannel, model.CHANNEL_OPEN}, 1862 {"Updating private channel should fail with forbidden status if not logged in", privateChannel, model.CHANNEL_PRIVATE}, 1863 {"Updating public channel should fail with forbidden status if not logged in", publicChannel, model.CHANNEL_OPEN}, 1864 } 1865 1866 for _, tc := range tt { 1867 t.Run(tc.name, func(t *testing.T) { 1868 _, resp := th.Client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) 1869 CheckForbiddenStatus(t, resp) 1870 }) 1871 } 1872 }) 1873 1874 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 1875 privateChannel := th.CreatePrivateChannel() 1876 publicChannel := th.CreatePublicChannel() 1877 1878 tt := testTable{ 1879 {"Converting default channel to private should fail", defaultChannel, model.CHANNEL_PRIVATE}, 1880 {"Updating privacy to an invalid setting should fail", publicChannel, "invalid"}, 1881 } 1882 1883 for _, tc := range tt { 1884 t.Run(tc.name, func(t *testing.T) { 1885 _, resp := client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) 1886 CheckBadRequestStatus(t, resp) 1887 }) 1888 } 1889 1890 tt = testTable{ 1891 {"Default channel should stay public", defaultChannel, model.CHANNEL_OPEN}, 1892 {"Public channel should stay public", publicChannel, model.CHANNEL_OPEN}, 1893 {"Private channel should stay private", privateChannel, model.CHANNEL_PRIVATE}, 1894 {"Public channel should convert to private", publicChannel, model.CHANNEL_PRIVATE}, 1895 {"Private channel should convert to public", privateChannel, model.CHANNEL_OPEN}, 1896 } 1897 1898 for _, tc := range tt { 1899 t.Run(tc.name, func(t *testing.T) { 1900 updatedChannel, resp := client.UpdateChannelPrivacy(tc.channel.Id, tc.expectedPrivacy) 1901 CheckNoError(t, resp) 1902 assert.Equal(t, tc.expectedPrivacy, updatedChannel.Type) 1903 updatedChannel, err := th.App.GetChannel(tc.channel.Id) 1904 require.Nil(t, err) 1905 assert.Equal(t, tc.expectedPrivacy, updatedChannel.Type) 1906 }) 1907 } 1908 }) 1909 1910 t.Run("Enforces convert channel permissions", func(t *testing.T) { 1911 privateChannel := th.CreatePrivateChannel() 1912 publicChannel := th.CreatePublicChannel() 1913 1914 th.LoginTeamAdmin() 1915 1916 th.RemovePermissionFromRole(model.PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id, model.TEAM_ADMIN_ROLE_ID) 1917 th.RemovePermissionFromRole(model.PERMISSION_CONVERT_PRIVATE_CHANNEL_TO_PUBLIC.Id, model.TEAM_ADMIN_ROLE_ID) 1918 1919 _, resp := th.Client.UpdateChannelPrivacy(publicChannel.Id, model.CHANNEL_PRIVATE) 1920 CheckForbiddenStatus(t, resp) 1921 _, resp = th.Client.UpdateChannelPrivacy(privateChannel.Id, model.CHANNEL_OPEN) 1922 CheckForbiddenStatus(t, resp) 1923 1924 th.AddPermissionToRole(model.PERMISSION_CONVERT_PUBLIC_CHANNEL_TO_PRIVATE.Id, model.TEAM_ADMIN_ROLE_ID) 1925 th.AddPermissionToRole(model.PERMISSION_CONVERT_PRIVATE_CHANNEL_TO_PUBLIC.Id, model.TEAM_ADMIN_ROLE_ID) 1926 1927 _, resp = th.Client.UpdateChannelPrivacy(privateChannel.Id, model.CHANNEL_OPEN) 1928 CheckNoError(t, resp) 1929 _, resp = th.Client.UpdateChannelPrivacy(publicChannel.Id, model.CHANNEL_PRIVATE) 1930 CheckNoError(t, resp) 1931 }) 1932 } 1933 1934 func TestRestoreChannel(t *testing.T) { 1935 th := Setup(t).InitBasic() 1936 defer th.TearDown() 1937 1938 publicChannel1 := th.CreatePublicChannel() 1939 th.Client.DeleteChannel(publicChannel1.Id) 1940 1941 privateChannel1 := th.CreatePrivateChannel() 1942 th.Client.DeleteChannel(privateChannel1.Id) 1943 1944 _, resp := th.Client.RestoreChannel(publicChannel1.Id) 1945 CheckForbiddenStatus(t, resp) 1946 1947 _, resp = th.Client.RestoreChannel(privateChannel1.Id) 1948 CheckForbiddenStatus(t, resp) 1949 1950 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 1951 defer func() { 1952 client.DeleteChannel(publicChannel1.Id) 1953 client.DeleteChannel(privateChannel1.Id) 1954 }() 1955 1956 _, resp = client.RestoreChannel(publicChannel1.Id) 1957 CheckOKStatus(t, resp) 1958 1959 _, resp = client.RestoreChannel(privateChannel1.Id) 1960 CheckOKStatus(t, resp) 1961 }) 1962 } 1963 1964 func TestGetChannelByName(t *testing.T) { 1965 th := Setup(t).InitBasic() 1966 defer th.TearDown() 1967 Client := th.Client 1968 1969 channel, resp := Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") 1970 CheckNoError(t, resp) 1971 require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match") 1972 1973 channel, resp = Client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "") 1974 CheckNoError(t, resp) 1975 require.Equal(t, th.BasicPrivateChannel.Name, channel.Name, "names did not match") 1976 1977 _, resp = Client.GetChannelByName(strings.ToUpper(th.BasicPrivateChannel.Name), th.BasicTeam.Id, "") 1978 CheckNoError(t, resp) 1979 1980 _, resp = Client.GetChannelByName(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "") 1981 CheckNotFoundStatus(t, resp) 1982 1983 channel, resp = Client.GetChannelByNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Id, "") 1984 CheckNoError(t, resp) 1985 require.Equal(t, th.BasicDeletedChannel.Name, channel.Name, "names did not match") 1986 1987 Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) 1988 _, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") 1989 CheckNoError(t, resp) 1990 1991 Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) 1992 _, resp = Client.GetChannelByName(th.BasicPrivateChannel.Name, th.BasicTeam.Id, "") 1993 CheckNotFoundStatus(t, resp) 1994 1995 _, resp = Client.GetChannelByName(GenerateTestChannelName(), th.BasicTeam.Id, "") 1996 CheckNotFoundStatus(t, resp) 1997 1998 _, resp = Client.GetChannelByName(GenerateTestChannelName(), "junk", "") 1999 CheckBadRequestStatus(t, resp) 2000 2001 Client.Logout() 2002 _, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") 2003 CheckUnauthorizedStatus(t, resp) 2004 2005 user := th.CreateUser() 2006 Client.Login(user.Email, user.Password) 2007 _, resp = Client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") 2008 CheckForbiddenStatus(t, resp) 2009 2010 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 2011 _, resp = client.GetChannelByName(th.BasicChannel.Name, th.BasicTeam.Id, "") 2012 CheckNoError(t, resp) 2013 }) 2014 } 2015 2016 func TestGetChannelByNameForTeamName(t *testing.T) { 2017 th := Setup(t).InitBasic() 2018 defer th.TearDown() 2019 Client := th.Client 2020 2021 channel, resp := th.SystemAdminClient.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") 2022 CheckNoError(t, resp) 2023 require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match") 2024 2025 _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") 2026 CheckNoError(t, resp) 2027 require.Equal(t, th.BasicChannel.Name, channel.Name, "names did not match") 2028 2029 channel, resp = Client.GetChannelByNameForTeamName(th.BasicPrivateChannel.Name, th.BasicTeam.Name, "") 2030 CheckNoError(t, resp) 2031 require.Equal(t, th.BasicPrivateChannel.Name, channel.Name, "names did not match") 2032 2033 _, resp = Client.GetChannelByNameForTeamName(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "") 2034 CheckNotFoundStatus(t, resp) 2035 2036 channel, resp = Client.GetChannelByNameForTeamNameIncludeDeleted(th.BasicDeletedChannel.Name, th.BasicTeam.Name, "") 2037 CheckNoError(t, resp) 2038 require.Equal(t, th.BasicDeletedChannel.Name, channel.Name, "names did not match") 2039 2040 Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) 2041 _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") 2042 CheckNoError(t, resp) 2043 2044 Client.RemoveUserFromChannel(th.BasicPrivateChannel.Id, th.BasicUser.Id) 2045 _, resp = Client.GetChannelByNameForTeamName(th.BasicPrivateChannel.Name, th.BasicTeam.Name, "") 2046 CheckNotFoundStatus(t, resp) 2047 2048 _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, model.NewRandomString(15), "") 2049 CheckNotFoundStatus(t, resp) 2050 2051 _, resp = Client.GetChannelByNameForTeamName(GenerateTestChannelName(), th.BasicTeam.Name, "") 2052 CheckNotFoundStatus(t, resp) 2053 2054 Client.Logout() 2055 _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") 2056 CheckUnauthorizedStatus(t, resp) 2057 2058 user := th.CreateUser() 2059 Client.Login(user.Email, user.Password) 2060 _, resp = Client.GetChannelByNameForTeamName(th.BasicChannel.Name, th.BasicTeam.Name, "") 2061 CheckForbiddenStatus(t, resp) 2062 } 2063 2064 func TestGetChannelMembers(t *testing.T) { 2065 th := Setup(t).InitBasic() 2066 defer th.TearDown() 2067 th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { 2068 members, resp := client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") 2069 CheckNoError(t, resp) 2070 require.Len(t, *members, 3, "should only be 3 users in channel") 2071 2072 members, resp = client.GetChannelMembers(th.BasicChannel.Id, 0, 2, "") 2073 CheckNoError(t, resp) 2074 require.Len(t, *members, 2, "should only be 2 users") 2075 2076 members, resp = client.GetChannelMembers(th.BasicChannel.Id, 1, 1, "") 2077 CheckNoError(t, resp) 2078 require.Len(t, *members, 1, "should only be 1 user") 2079 2080 members, resp = client.GetChannelMembers(th.BasicChannel.Id, 1000, 100000, "") 2081 CheckNoError(t, resp) 2082 require.Empty(t, *members, "should be 0 users") 2083 2084 _, resp = client.GetChannelMembers("junk", 0, 60, "") 2085 CheckBadRequestStatus(t, resp) 2086 2087 _, resp = client.GetChannelMembers("", 0, 60, "") 2088 CheckBadRequestStatus(t, resp) 2089 2090 _, resp = client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") 2091 CheckNoError(t, resp) 2092 }) 2093 2094 _, resp := th.Client.GetChannelMembers(model.NewId(), 0, 60, "") 2095 CheckForbiddenStatus(t, resp) 2096 2097 th.Client.Logout() 2098 _, resp = th.Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") 2099 CheckUnauthorizedStatus(t, resp) 2100 2101 user := th.CreateUser() 2102 th.Client.Login(user.Email, user.Password) 2103 _, resp = th.Client.GetChannelMembers(th.BasicChannel.Id, 0, 60, "") 2104 CheckForbiddenStatus(t, resp) 2105 } 2106 2107 func TestGetChannelMembersByIds(t *testing.T) { 2108 th := Setup(t).InitBasic() 2109 defer th.TearDown() 2110 Client := th.Client 2111 2112 cm, resp := Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id}) 2113 CheckNoError(t, resp) 2114 require.Equal(t, th.BasicUser.Id, (*cm)[0].UserId, "returned wrong user") 2115 2116 _, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{}) 2117 CheckBadRequestStatus(t, resp) 2118 2119 cm1, resp := Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk"}) 2120 CheckNoError(t, resp) 2121 require.Empty(t, *cm1, "no users should be returned") 2122 2123 cm1, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{"junk", th.BasicUser.Id}) 2124 CheckNoError(t, resp) 2125 require.Len(t, *cm1, 1, "1 member should be returned") 2126 2127 cm1, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id}) 2128 CheckNoError(t, resp) 2129 require.Len(t, *cm1, 2, "2 members should be returned") 2130 2131 _, resp = Client.GetChannelMembersByIds("junk", []string{th.BasicUser.Id}) 2132 CheckBadRequestStatus(t, resp) 2133 2134 _, resp = Client.GetChannelMembersByIds(model.NewId(), []string{th.BasicUser.Id}) 2135 CheckForbiddenStatus(t, resp) 2136 2137 Client.Logout() 2138 _, resp = Client.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser.Id}) 2139 CheckUnauthorizedStatus(t, resp) 2140 2141 _, resp = th.SystemAdminClient.GetChannelMembersByIds(th.BasicChannel.Id, []string{th.BasicUser2.Id, th.BasicUser.Id}) 2142 CheckNoError(t, resp) 2143 } 2144 2145 func TestGetChannelMember(t *testing.T) { 2146 th := Setup(t).InitBasic() 2147 defer th.TearDown() 2148 c := th.Client 2149 th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { 2150 member, resp := client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2151 CheckNoError(t, resp) 2152 require.Equal(t, th.BasicChannel.Id, member.ChannelId, "wrong channel id") 2153 require.Equal(t, th.BasicUser.Id, member.UserId, "wrong user id") 2154 2155 _, resp = client.GetChannelMember("", th.BasicUser.Id, "") 2156 CheckNotFoundStatus(t, resp) 2157 2158 _, resp = client.GetChannelMember("junk", th.BasicUser.Id, "") 2159 CheckBadRequestStatus(t, resp) 2160 _, resp = client.GetChannelMember(th.BasicChannel.Id, "", "") 2161 CheckNotFoundStatus(t, resp) 2162 2163 _, resp = client.GetChannelMember(th.BasicChannel.Id, "junk", "") 2164 CheckBadRequestStatus(t, resp) 2165 2166 _, resp = client.GetChannelMember(th.BasicChannel.Id, model.NewId(), "") 2167 CheckNotFoundStatus(t, resp) 2168 2169 _, resp = client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2170 CheckNoError(t, resp) 2171 }) 2172 2173 _, resp := c.GetChannelMember(model.NewId(), th.BasicUser.Id, "") 2174 CheckForbiddenStatus(t, resp) 2175 2176 c.Logout() 2177 _, resp = c.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2178 CheckUnauthorizedStatus(t, resp) 2179 2180 user := th.CreateUser() 2181 c.Login(user.Email, user.Password) 2182 _, resp = c.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2183 CheckForbiddenStatus(t, resp) 2184 } 2185 2186 func TestGetChannelMembersForUser(t *testing.T) { 2187 th := Setup(t).InitBasic() 2188 defer th.TearDown() 2189 Client := th.Client 2190 2191 members, resp := Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") 2192 CheckNoError(t, resp) 2193 require.Len(t, *members, 6, "should have 6 members on team") 2194 2195 _, resp = Client.GetChannelMembersForUser("", th.BasicTeam.Id, "") 2196 CheckNotFoundStatus(t, resp) 2197 2198 _, resp = Client.GetChannelMembersForUser("junk", th.BasicTeam.Id, "") 2199 CheckBadRequestStatus(t, resp) 2200 2201 _, resp = Client.GetChannelMembersForUser(model.NewId(), th.BasicTeam.Id, "") 2202 CheckForbiddenStatus(t, resp) 2203 2204 _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, "", "") 2205 CheckNotFoundStatus(t, resp) 2206 2207 _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, "junk", "") 2208 CheckBadRequestStatus(t, resp) 2209 2210 _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, model.NewId(), "") 2211 CheckForbiddenStatus(t, resp) 2212 2213 Client.Logout() 2214 _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") 2215 CheckUnauthorizedStatus(t, resp) 2216 2217 user := th.CreateUser() 2218 Client.Login(user.Email, user.Password) 2219 _, resp = Client.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") 2220 CheckForbiddenStatus(t, resp) 2221 2222 _, resp = th.SystemAdminClient.GetChannelMembersForUser(th.BasicUser.Id, th.BasicTeam.Id, "") 2223 CheckNoError(t, resp) 2224 } 2225 2226 func TestViewChannel(t *testing.T) { 2227 th := Setup(t).InitBasic() 2228 defer th.TearDown() 2229 Client := th.Client 2230 2231 view := &model.ChannelView{ 2232 ChannelId: th.BasicChannel.Id, 2233 } 2234 2235 viewResp, resp := Client.ViewChannel(th.BasicUser.Id, view) 2236 CheckNoError(t, resp) 2237 require.Equal(t, "OK", viewResp.Status, "should have passed") 2238 2239 channel, _ := th.App.GetChannel(th.BasicChannel.Id) 2240 2241 require.Equal(t, channel.LastPostAt, viewResp.LastViewedAtTimes[channel.Id], "LastPostAt does not match returned LastViewedAt time") 2242 2243 view.PrevChannelId = th.BasicChannel.Id 2244 _, resp = Client.ViewChannel(th.BasicUser.Id, view) 2245 CheckNoError(t, resp) 2246 2247 view.PrevChannelId = "" 2248 _, resp = Client.ViewChannel(th.BasicUser.Id, view) 2249 CheckNoError(t, resp) 2250 2251 view.PrevChannelId = "junk" 2252 _, resp = Client.ViewChannel(th.BasicUser.Id, view) 2253 CheckBadRequestStatus(t, resp) 2254 2255 // All blank is OK we use it for clicking off of the browser. 2256 view.PrevChannelId = "" 2257 view.ChannelId = "" 2258 _, resp = Client.ViewChannel(th.BasicUser.Id, view) 2259 CheckNoError(t, resp) 2260 2261 view.PrevChannelId = "" 2262 view.ChannelId = "junk" 2263 _, resp = Client.ViewChannel(th.BasicUser.Id, view) 2264 CheckBadRequestStatus(t, resp) 2265 2266 view.ChannelId = "correctlysizedjunkdddfdfdf" 2267 _, resp = Client.ViewChannel(th.BasicUser.Id, view) 2268 CheckBadRequestStatus(t, resp) 2269 view.ChannelId = th.BasicChannel.Id 2270 2271 member, resp := Client.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2272 CheckNoError(t, resp) 2273 channel, resp = Client.GetChannel(th.BasicChannel.Id, "") 2274 CheckNoError(t, resp) 2275 require.Equal(t, channel.TotalMsgCount, member.MsgCount, "should match message counts") 2276 require.Equal(t, int64(0), member.MentionCount, "should have no mentions") 2277 require.Equal(t, int64(0), member.MentionCountRoot, "should have no mentions") 2278 2279 _, resp = Client.ViewChannel("junk", view) 2280 CheckBadRequestStatus(t, resp) 2281 2282 _, resp = Client.ViewChannel(th.BasicUser2.Id, view) 2283 CheckForbiddenStatus(t, resp) 2284 2285 r, err := Client.DoApiPost(fmt.Sprintf("/channels/members/%v/view", th.BasicUser.Id), "garbage") 2286 require.NotNil(t, err) 2287 require.Equal(t, http.StatusBadRequest, r.StatusCode) 2288 2289 Client.Logout() 2290 _, resp = Client.ViewChannel(th.BasicUser.Id, view) 2291 CheckUnauthorizedStatus(t, resp) 2292 2293 _, resp = th.SystemAdminClient.ViewChannel(th.BasicUser.Id, view) 2294 CheckNoError(t, resp) 2295 } 2296 2297 func TestGetChannelUnread(t *testing.T) { 2298 th := Setup(t).InitBasic() 2299 defer th.TearDown() 2300 Client := th.Client 2301 user := th.BasicUser 2302 channel := th.BasicChannel 2303 2304 channelUnread, resp := Client.GetChannelUnread(channel.Id, user.Id) 2305 CheckNoError(t, resp) 2306 require.Equal(t, th.BasicTeam.Id, channelUnread.TeamId, "wrong team id returned for a regular user call") 2307 require.Equal(t, channel.Id, channelUnread.ChannelId, "wrong team id returned for a regular user call") 2308 2309 _, resp = Client.GetChannelUnread("junk", user.Id) 2310 CheckBadRequestStatus(t, resp) 2311 2312 _, resp = Client.GetChannelUnread(channel.Id, "junk") 2313 CheckBadRequestStatus(t, resp) 2314 2315 _, resp = Client.GetChannelUnread(channel.Id, model.NewId()) 2316 CheckForbiddenStatus(t, resp) 2317 2318 _, resp = Client.GetChannelUnread(model.NewId(), user.Id) 2319 CheckForbiddenStatus(t, resp) 2320 2321 newUser := th.CreateUser() 2322 Client.Login(newUser.Email, newUser.Password) 2323 _, resp = Client.GetChannelUnread(th.BasicChannel.Id, user.Id) 2324 CheckForbiddenStatus(t, resp) 2325 2326 Client.Logout() 2327 2328 _, resp = th.SystemAdminClient.GetChannelUnread(channel.Id, user.Id) 2329 CheckNoError(t, resp) 2330 2331 _, resp = th.SystemAdminClient.GetChannelUnread(model.NewId(), user.Id) 2332 CheckForbiddenStatus(t, resp) 2333 2334 _, resp = th.SystemAdminClient.GetChannelUnread(channel.Id, model.NewId()) 2335 CheckNotFoundStatus(t, resp) 2336 } 2337 2338 func TestGetChannelStats(t *testing.T) { 2339 th := Setup(t).InitBasic() 2340 defer th.TearDown() 2341 Client := th.Client 2342 channel := th.CreatePrivateChannel() 2343 2344 stats, resp := Client.GetChannelStats(channel.Id, "") 2345 CheckNoError(t, resp) 2346 2347 require.Equal(t, channel.Id, stats.ChannelId, "couldnt't get extra info") 2348 require.Equal(t, int64(1), stats.MemberCount, "got incorrect member count") 2349 require.Equal(t, int64(0), stats.PinnedPostCount, "got incorrect pinned post count") 2350 2351 th.CreatePinnedPostWithClient(th.Client, channel) 2352 stats, resp = Client.GetChannelStats(channel.Id, "") 2353 CheckNoError(t, resp) 2354 require.Equal(t, int64(1), stats.PinnedPostCount, "should have returned 1 pinned post count") 2355 2356 _, resp = Client.GetChannelStats("junk", "") 2357 CheckBadRequestStatus(t, resp) 2358 2359 _, resp = Client.GetChannelStats(model.NewId(), "") 2360 CheckForbiddenStatus(t, resp) 2361 2362 Client.Logout() 2363 _, resp = Client.GetChannelStats(channel.Id, "") 2364 CheckUnauthorizedStatus(t, resp) 2365 2366 th.LoginBasic2() 2367 2368 _, resp = Client.GetChannelStats(channel.Id, "") 2369 CheckForbiddenStatus(t, resp) 2370 2371 _, resp = th.SystemAdminClient.GetChannelStats(channel.Id, "") 2372 CheckNoError(t, resp) 2373 } 2374 2375 func TestGetPinnedPosts(t *testing.T) { 2376 th := Setup(t).InitBasic() 2377 defer th.TearDown() 2378 Client := th.Client 2379 channel := th.BasicChannel 2380 2381 posts, resp := Client.GetPinnedPosts(channel.Id, "") 2382 CheckNoError(t, resp) 2383 require.Empty(t, posts.Posts, "should not have gotten a pinned post") 2384 2385 pinnedPost := th.CreatePinnedPost() 2386 posts, resp = Client.GetPinnedPosts(channel.Id, "") 2387 CheckNoError(t, resp) 2388 require.Len(t, posts.Posts, 1, "should have returned 1 pinned post") 2389 require.Contains(t, posts.Posts, pinnedPost.Id, "missing pinned post") 2390 2391 posts, resp = Client.GetPinnedPosts(channel.Id, resp.Etag) 2392 CheckEtag(t, posts, resp) 2393 2394 _, resp = Client.GetPinnedPosts(GenerateTestId(), "") 2395 CheckForbiddenStatus(t, resp) 2396 2397 _, resp = Client.GetPinnedPosts("junk", "") 2398 CheckBadRequestStatus(t, resp) 2399 2400 Client.Logout() 2401 _, resp = Client.GetPinnedPosts(channel.Id, "") 2402 CheckUnauthorizedStatus(t, resp) 2403 2404 _, resp = th.SystemAdminClient.GetPinnedPosts(channel.Id, "") 2405 CheckNoError(t, resp) 2406 } 2407 2408 func TestUpdateChannelRoles(t *testing.T) { 2409 th := Setup(t).InitBasic() 2410 defer th.TearDown() 2411 Client := th.Client 2412 2413 const ChannelAdmin = "channel_user channel_admin" 2414 const ChannelMember = "channel_user" 2415 2416 // User 1 creates a channel, making them channel admin by default. 2417 channel := th.CreatePublicChannel() 2418 2419 // Adds User 2 to the channel, making them a channel member by default. 2420 th.App.AddUserToChannel(th.BasicUser2, channel, false) 2421 2422 // User 1 promotes User 2 2423 pass, resp := Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelAdmin) 2424 CheckNoError(t, resp) 2425 require.True(t, pass, "should have passed") 2426 2427 member, resp := Client.GetChannelMember(channel.Id, th.BasicUser2.Id, "") 2428 CheckNoError(t, resp) 2429 require.Equal(t, ChannelAdmin, member.Roles, "roles don't match") 2430 2431 // User 1 demotes User 2 2432 _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelMember) 2433 CheckNoError(t, resp) 2434 2435 th.LoginBasic2() 2436 2437 // User 2 cannot demote User 1 2438 _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) 2439 CheckForbiddenStatus(t, resp) 2440 2441 // User 2 cannot promote self 2442 _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser2.Id, ChannelAdmin) 2443 CheckForbiddenStatus(t, resp) 2444 2445 th.LoginBasic() 2446 2447 // User 1 demotes self 2448 _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) 2449 CheckNoError(t, resp) 2450 2451 // System Admin promotes User 1 2452 _, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelAdmin) 2453 CheckNoError(t, resp) 2454 2455 // System Admin demotes User 1 2456 _, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelMember) 2457 CheckNoError(t, resp) 2458 2459 // System Admin promotes User 1 2460 _, resp = th.SystemAdminClient.UpdateChannelRoles(channel.Id, th.BasicUser.Id, ChannelAdmin) 2461 CheckNoError(t, resp) 2462 2463 th.LoginBasic() 2464 2465 _, resp = Client.UpdateChannelRoles(channel.Id, th.BasicUser.Id, "junk") 2466 CheckBadRequestStatus(t, resp) 2467 2468 _, resp = Client.UpdateChannelRoles(channel.Id, "junk", ChannelMember) 2469 CheckBadRequestStatus(t, resp) 2470 2471 _, resp = Client.UpdateChannelRoles("junk", th.BasicUser.Id, ChannelMember) 2472 CheckBadRequestStatus(t, resp) 2473 2474 _, resp = Client.UpdateChannelRoles(channel.Id, model.NewId(), ChannelMember) 2475 CheckNotFoundStatus(t, resp) 2476 2477 _, resp = Client.UpdateChannelRoles(model.NewId(), th.BasicUser.Id, ChannelMember) 2478 CheckForbiddenStatus(t, resp) 2479 } 2480 2481 func TestUpdateChannelMemberSchemeRoles(t *testing.T) { 2482 th := Setup(t).InitBasic() 2483 defer th.TearDown() 2484 SystemAdminClient := th.SystemAdminClient 2485 WebSocketClient, err := th.CreateWebSocketClient() 2486 WebSocketClient.Listen() 2487 require.Nil(t, err) 2488 2489 th.LoginBasic() 2490 2491 s1 := &model.SchemeRoles{ 2492 SchemeAdmin: false, 2493 SchemeUser: false, 2494 SchemeGuest: false, 2495 } 2496 _, r1 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s1) 2497 CheckNoError(t, r1) 2498 2499 timeout := time.After(600 * time.Millisecond) 2500 waiting := true 2501 for waiting { 2502 select { 2503 case event := <-WebSocketClient.EventChannel: 2504 if event.Event == model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED { 2505 require.Equal(t, model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED, event.Event) 2506 waiting = false 2507 } 2508 case <-timeout: 2509 require.Fail(t, "Should have received event channel member websocket event and not timedout") 2510 waiting = false 2511 } 2512 } 2513 2514 tm1, rtm1 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2515 CheckNoError(t, rtm1) 2516 assert.Equal(t, false, tm1.SchemeGuest) 2517 assert.Equal(t, false, tm1.SchemeUser) 2518 assert.Equal(t, false, tm1.SchemeAdmin) 2519 2520 s2 := &model.SchemeRoles{ 2521 SchemeAdmin: false, 2522 SchemeUser: true, 2523 SchemeGuest: false, 2524 } 2525 _, r2 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s2) 2526 CheckNoError(t, r2) 2527 2528 tm2, rtm2 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2529 CheckNoError(t, rtm2) 2530 assert.Equal(t, false, tm2.SchemeGuest) 2531 assert.Equal(t, true, tm2.SchemeUser) 2532 assert.Equal(t, false, tm2.SchemeAdmin) 2533 2534 s3 := &model.SchemeRoles{ 2535 SchemeAdmin: true, 2536 SchemeUser: false, 2537 SchemeGuest: false, 2538 } 2539 _, r3 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s3) 2540 CheckNoError(t, r3) 2541 2542 tm3, rtm3 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2543 CheckNoError(t, rtm3) 2544 assert.Equal(t, false, tm3.SchemeGuest) 2545 assert.Equal(t, false, tm3.SchemeUser) 2546 assert.Equal(t, true, tm3.SchemeAdmin) 2547 2548 s4 := &model.SchemeRoles{ 2549 SchemeAdmin: true, 2550 SchemeUser: true, 2551 SchemeGuest: false, 2552 } 2553 _, r4 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4) 2554 CheckNoError(t, r4) 2555 2556 tm4, rtm4 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2557 CheckNoError(t, rtm4) 2558 assert.Equal(t, false, tm4.SchemeGuest) 2559 assert.Equal(t, true, tm4.SchemeUser) 2560 assert.Equal(t, true, tm4.SchemeAdmin) 2561 2562 s5 := &model.SchemeRoles{ 2563 SchemeAdmin: false, 2564 SchemeUser: false, 2565 SchemeGuest: true, 2566 } 2567 _, r5 := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s5) 2568 CheckNoError(t, r5) 2569 2570 tm5, rtm5 := SystemAdminClient.GetChannelMember(th.BasicChannel.Id, th.BasicUser.Id, "") 2571 CheckNoError(t, rtm5) 2572 assert.Equal(t, true, tm5.SchemeGuest) 2573 assert.Equal(t, false, tm5.SchemeUser) 2574 assert.Equal(t, false, tm5.SchemeAdmin) 2575 2576 s6 := &model.SchemeRoles{ 2577 SchemeAdmin: false, 2578 SchemeUser: true, 2579 SchemeGuest: true, 2580 } 2581 _, resp := SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s6) 2582 CheckBadRequestStatus(t, resp) 2583 2584 _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(model.NewId(), th.BasicUser.Id, s4) 2585 CheckForbiddenStatus(t, resp) 2586 2587 _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, model.NewId(), s4) 2588 CheckNotFoundStatus(t, resp) 2589 2590 _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles("ASDF", th.BasicUser.Id, s4) 2591 CheckBadRequestStatus(t, resp) 2592 2593 _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, "ASDF", s4) 2594 CheckBadRequestStatus(t, resp) 2595 2596 th.LoginBasic2() 2597 _, resp = th.Client.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.BasicUser.Id, s4) 2598 CheckForbiddenStatus(t, resp) 2599 2600 SystemAdminClient.Logout() 2601 _, resp = SystemAdminClient.UpdateChannelMemberSchemeRoles(th.BasicChannel.Id, th.SystemAdminUser.Id, s4) 2602 CheckUnauthorizedStatus(t, resp) 2603 } 2604 2605 func TestUpdateChannelNotifyProps(t *testing.T) { 2606 th := Setup(t).InitBasic() 2607 defer th.TearDown() 2608 Client := th.Client 2609 2610 props := map[string]string{} 2611 props[model.DESKTOP_NOTIFY_PROP] = model.CHANNEL_NOTIFY_MENTION 2612 props[model.MARK_UNREAD_NOTIFY_PROP] = model.CHANNEL_MARK_UNREAD_MENTION 2613 2614 pass, resp := Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) 2615 CheckNoError(t, resp) 2616 require.True(t, pass, "should have passed") 2617 2618 member, err := th.App.GetChannelMember(context.Background(), th.BasicChannel.Id, th.BasicUser.Id) 2619 require.Nil(t, err) 2620 require.Equal(t, model.CHANNEL_NOTIFY_MENTION, member.NotifyProps[model.DESKTOP_NOTIFY_PROP], "bad update") 2621 require.Equal(t, model.CHANNEL_MARK_UNREAD_MENTION, member.NotifyProps[model.MARK_UNREAD_NOTIFY_PROP], "bad update") 2622 2623 _, resp = Client.UpdateChannelNotifyProps("junk", th.BasicUser.Id, props) 2624 CheckBadRequestStatus(t, resp) 2625 2626 _, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, "junk", props) 2627 CheckBadRequestStatus(t, resp) 2628 2629 _, resp = Client.UpdateChannelNotifyProps(model.NewId(), th.BasicUser.Id, props) 2630 CheckNotFoundStatus(t, resp) 2631 2632 _, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, model.NewId(), props) 2633 CheckForbiddenStatus(t, resp) 2634 2635 _, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, map[string]string{}) 2636 CheckNoError(t, resp) 2637 2638 Client.Logout() 2639 _, resp = Client.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) 2640 CheckUnauthorizedStatus(t, resp) 2641 2642 _, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.BasicUser.Id, props) 2643 CheckNoError(t, resp) 2644 } 2645 2646 func TestAddChannelMember(t *testing.T) { 2647 th := Setup(t).InitBasic() 2648 defer th.TearDown() 2649 Client := th.Client 2650 user := th.BasicUser 2651 user2 := th.BasicUser2 2652 team := th.BasicTeam 2653 publicChannel := th.CreatePublicChannel() 2654 privateChannel := th.CreatePrivateChannel() 2655 2656 user3 := th.CreateUserWithClient(th.SystemAdminClient) 2657 _, resp := th.SystemAdminClient.AddTeamMember(team.Id, user3.Id) 2658 CheckNoError(t, resp) 2659 2660 cm, resp := Client.AddChannelMember(publicChannel.Id, user2.Id) 2661 CheckNoError(t, resp) 2662 CheckCreatedStatus(t, resp) 2663 require.Equal(t, publicChannel.Id, cm.ChannelId, "should have returned exact channel") 2664 require.Equal(t, user2.Id, cm.UserId, "should have returned exact user added to public channel") 2665 2666 cm, resp = Client.AddChannelMember(privateChannel.Id, user2.Id) 2667 CheckNoError(t, resp) 2668 require.Equal(t, privateChannel.Id, cm.ChannelId, "should have returned exact channel") 2669 require.Equal(t, user2.Id, cm.UserId, "should have returned exact user added to private channel") 2670 2671 post := &model.Post{ChannelId: publicChannel.Id, Message: "a" + GenerateTestId() + "a"} 2672 rpost, err := Client.CreatePost(post) 2673 require.NotNil(t, err) 2674 2675 Client.RemoveUserFromChannel(publicChannel.Id, user.Id) 2676 _, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, rpost.Id) 2677 CheckNoError(t, resp) 2678 CheckCreatedStatus(t, resp) 2679 2680 Client.RemoveUserFromChannel(publicChannel.Id, user.Id) 2681 _, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, "junk") 2682 CheckBadRequestStatus(t, resp) 2683 2684 _, resp = Client.AddChannelMemberWithRootId(publicChannel.Id, user.Id, GenerateTestId()) 2685 CheckNotFoundStatus(t, resp) 2686 2687 Client.RemoveUserFromChannel(publicChannel.Id, user.Id) 2688 _, resp = Client.AddChannelMember(publicChannel.Id, user.Id) 2689 CheckNoError(t, resp) 2690 2691 cm, resp = Client.AddChannelMember(publicChannel.Id, "junk") 2692 CheckBadRequestStatus(t, resp) 2693 require.Nil(t, cm, "should return nothing") 2694 2695 _, resp = Client.AddChannelMember(publicChannel.Id, GenerateTestId()) 2696 CheckNotFoundStatus(t, resp) 2697 2698 _, resp = Client.AddChannelMember("junk", user2.Id) 2699 CheckBadRequestStatus(t, resp) 2700 2701 _, resp = Client.AddChannelMember(GenerateTestId(), user2.Id) 2702 CheckNotFoundStatus(t, resp) 2703 2704 otherUser := th.CreateUser() 2705 otherChannel := th.CreatePublicChannel() 2706 Client.Logout() 2707 Client.Login(user2.Id, user2.Password) 2708 2709 _, resp = Client.AddChannelMember(publicChannel.Id, otherUser.Id) 2710 CheckUnauthorizedStatus(t, resp) 2711 2712 _, resp = Client.AddChannelMember(privateChannel.Id, otherUser.Id) 2713 CheckUnauthorizedStatus(t, resp) 2714 2715 _, resp = Client.AddChannelMember(otherChannel.Id, otherUser.Id) 2716 CheckUnauthorizedStatus(t, resp) 2717 2718 Client.Logout() 2719 Client.Login(user.Id, user.Password) 2720 2721 // should fail adding user who is not a member of the team 2722 _, resp = Client.AddChannelMember(otherChannel.Id, otherUser.Id) 2723 CheckUnauthorizedStatus(t, resp) 2724 2725 Client.DeleteChannel(otherChannel.Id) 2726 2727 // should fail adding user to a deleted channel 2728 _, resp = Client.AddChannelMember(otherChannel.Id, user2.Id) 2729 CheckUnauthorizedStatus(t, resp) 2730 2731 Client.Logout() 2732 _, resp = Client.AddChannelMember(publicChannel.Id, user2.Id) 2733 CheckUnauthorizedStatus(t, resp) 2734 2735 _, resp = Client.AddChannelMember(privateChannel.Id, user2.Id) 2736 CheckUnauthorizedStatus(t, resp) 2737 2738 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 2739 _, resp = client.AddChannelMember(publicChannel.Id, user2.Id) 2740 CheckNoError(t, resp) 2741 2742 _, resp = client.AddChannelMember(privateChannel.Id, user2.Id) 2743 CheckNoError(t, resp) 2744 }) 2745 2746 // Check the appropriate permissions are enforced. 2747 defaultRolePermissions := th.SaveDefaultRolePermissions() 2748 defer func() { 2749 th.RestoreDefaultRolePermissions(defaultRolePermissions) 2750 }() 2751 2752 th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID) 2753 2754 // Check that a regular channel user can add other users. 2755 Client.Login(user2.Username, user2.Password) 2756 privateChannel = th.CreatePrivateChannel() 2757 _, resp = Client.AddChannelMember(privateChannel.Id, user.Id) 2758 CheckNoError(t, resp) 2759 Client.Logout() 2760 2761 Client.Login(user.Username, user.Password) 2762 _, resp = Client.AddChannelMember(privateChannel.Id, user3.Id) 2763 CheckNoError(t, resp) 2764 Client.Logout() 2765 2766 // Restrict the permission for adding users to Channel Admins 2767 th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_ADMIN_ROLE_ID) 2768 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID) 2769 2770 Client.Login(user2.Username, user2.Password) 2771 privateChannel = th.CreatePrivateChannel() 2772 _, resp = Client.AddChannelMember(privateChannel.Id, user.Id) 2773 CheckNoError(t, resp) 2774 Client.Logout() 2775 2776 Client.Login(user.Username, user.Password) 2777 _, resp = Client.AddChannelMember(privateChannel.Id, user3.Id) 2778 CheckForbiddenStatus(t, resp) 2779 Client.Logout() 2780 2781 th.MakeUserChannelAdmin(user, privateChannel) 2782 th.App.Srv().InvalidateAllCaches() 2783 2784 Client.Login(user.Username, user.Password) 2785 _, resp = Client.AddChannelMember(privateChannel.Id, user3.Id) 2786 CheckNoError(t, resp) 2787 Client.Logout() 2788 2789 // Set a channel to group-constrained 2790 privateChannel.GroupConstrained = model.NewBool(true) 2791 _, appErr := th.App.UpdateChannel(privateChannel) 2792 require.Nil(t, appErr) 2793 2794 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 2795 // User is not in associated groups so shouldn't be allowed 2796 _, resp = client.AddChannelMember(privateChannel.Id, user.Id) 2797 CheckErrorMessage(t, resp, "api.channel.add_members.user_denied") 2798 }) 2799 2800 // Associate group to team 2801 _, appErr = th.App.UpsertGroupSyncable(&model.GroupSyncable{ 2802 GroupId: th.Group.Id, 2803 SyncableId: privateChannel.Id, 2804 Type: model.GroupSyncableTypeChannel, 2805 }) 2806 require.Nil(t, appErr) 2807 2808 // Add user to group 2809 _, appErr = th.App.UpsertGroupMember(th.Group.Id, user.Id) 2810 require.Nil(t, appErr) 2811 2812 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 2813 _, resp = client.AddChannelMember(privateChannel.Id, user.Id) 2814 CheckNoError(t, resp) 2815 }) 2816 } 2817 2818 func TestAddChannelMemberAddMyself(t *testing.T) { 2819 th := Setup(t).InitBasic() 2820 defer th.TearDown() 2821 Client := th.Client 2822 user := th.CreateUser() 2823 th.LinkUserToTeam(user, th.BasicTeam) 2824 notMemberPublicChannel1 := th.CreatePublicChannel() 2825 notMemberPublicChannel2 := th.CreatePublicChannel() 2826 notMemberPrivateChannel := th.CreatePrivateChannel() 2827 2828 memberPublicChannel := th.CreatePublicChannel() 2829 memberPrivateChannel := th.CreatePrivateChannel() 2830 th.AddUserToChannel(user, memberPublicChannel) 2831 th.AddUserToChannel(user, memberPrivateChannel) 2832 2833 testCases := []struct { 2834 Name string 2835 Channel *model.Channel 2836 WithJoinPublicPermission bool 2837 ExpectedError string 2838 }{ 2839 { 2840 "Add myself to a public channel with JOIN_PUBLIC_CHANNEL permission", 2841 notMemberPublicChannel1, 2842 true, 2843 "", 2844 }, 2845 { 2846 "Try to add myself to a private channel with the JOIN_PUBLIC_CHANNEL permission", 2847 notMemberPrivateChannel, 2848 true, 2849 "api.context.permissions.app_error", 2850 }, 2851 { 2852 "Try to add myself to a public channel without the JOIN_PUBLIC_CHANNEL permission", 2853 notMemberPublicChannel2, 2854 false, 2855 "api.context.permissions.app_error", 2856 }, 2857 { 2858 "Add myself a public channel where I'm already a member, not having JOIN_PUBLIC_CHANNEL or MANAGE MEMBERS permission", 2859 memberPublicChannel, 2860 false, 2861 "", 2862 }, 2863 { 2864 "Add myself a private channel where I'm already a member, not having JOIN_PUBLIC_CHANNEL or MANAGE MEMBERS permission", 2865 memberPrivateChannel, 2866 false, 2867 "", 2868 }, 2869 } 2870 Client.Login(user.Email, user.Password) 2871 for _, tc := range testCases { 2872 t.Run(tc.Name, func(t *testing.T) { 2873 2874 // Check the appropriate permissions are enforced. 2875 defaultRolePermissions := th.SaveDefaultRolePermissions() 2876 defer func() { 2877 th.RestoreDefaultRolePermissions(defaultRolePermissions) 2878 }() 2879 2880 if !tc.WithJoinPublicPermission { 2881 th.RemovePermissionFromRole(model.PERMISSION_JOIN_PUBLIC_CHANNELS.Id, model.TEAM_USER_ROLE_ID) 2882 } 2883 2884 _, resp := Client.AddChannelMember(tc.Channel.Id, user.Id) 2885 if tc.ExpectedError == "" { 2886 CheckNoError(t, resp) 2887 } else { 2888 CheckErrorMessage(t, resp, tc.ExpectedError) 2889 } 2890 }) 2891 } 2892 } 2893 2894 func TestRemoveChannelMember(t *testing.T) { 2895 th := Setup(t).InitBasic() 2896 user1 := th.BasicUser 2897 user2 := th.BasicUser2 2898 team := th.BasicTeam 2899 defer th.TearDown() 2900 Client := th.Client 2901 2902 th.App.UpdateConfig(func(cfg *model.Config) { 2903 *cfg.ServiceSettings.EnableBotAccountCreation = true 2904 }) 2905 bot := th.CreateBotWithSystemAdminClient() 2906 th.App.AddUserToTeam(th.Context, team.Id, bot.UserId, "") 2907 2908 pass, resp := Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id) 2909 CheckNoError(t, resp) 2910 require.True(t, pass, "should have passed") 2911 2912 _, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, "junk") 2913 CheckBadRequestStatus(t, resp) 2914 2915 _, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, model.NewId()) 2916 CheckNotFoundStatus(t, resp) 2917 2918 _, resp = Client.RemoveUserFromChannel(model.NewId(), th.BasicUser2.Id) 2919 CheckNotFoundStatus(t, resp) 2920 2921 th.LoginBasic2() 2922 _, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) 2923 CheckForbiddenStatus(t, resp) 2924 2925 t.Run("success", func(t *testing.T) { 2926 // Setup the system administrator to listen for websocket events from the channels. 2927 th.LinkUserToTeam(th.SystemAdminUser, th.BasicTeam) 2928 _, err := th.App.AddUserToChannel(th.SystemAdminUser, th.BasicChannel, false) 2929 require.Nil(t, err) 2930 _, err = th.App.AddUserToChannel(th.SystemAdminUser, th.BasicChannel2, false) 2931 require.Nil(t, err) 2932 props := map[string]string{} 2933 props[model.DESKTOP_NOTIFY_PROP] = model.CHANNEL_NOTIFY_ALL 2934 _, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel.Id, th.SystemAdminUser.Id, props) 2935 _, resp = th.SystemAdminClient.UpdateChannelNotifyProps(th.BasicChannel2.Id, th.SystemAdminUser.Id, props) 2936 CheckNoError(t, resp) 2937 2938 wsClient, err := th.CreateWebSocketSystemAdminClient() 2939 require.Nil(t, err) 2940 wsClient.Listen() 2941 var closeWsClient sync.Once 2942 defer closeWsClient.Do(func() { 2943 wsClient.Close() 2944 }) 2945 2946 wsr := <-wsClient.EventChannel 2947 require.Equal(t, model.WEBSOCKET_EVENT_HELLO, wsr.EventType()) 2948 2949 // requirePost listens for websocket events and tries to find the post matching 2950 // the expected post's channel and message. 2951 requirePost := func(expectedPost *model.Post) { 2952 t.Helper() 2953 for { 2954 select { 2955 case event := <-wsClient.EventChannel: 2956 postData, ok := event.GetData()["post"] 2957 if !ok { 2958 continue 2959 } 2960 2961 post := model.PostFromJson(strings.NewReader(postData.(string))) 2962 if post.ChannelId == expectedPost.ChannelId && post.Message == expectedPost.Message { 2963 return 2964 } 2965 case <-time.After(5 * time.Second): 2966 require.FailNow(t, "failed to find expected post after 5 seconds") 2967 return 2968 } 2969 } 2970 } 2971 2972 th.App.AddUserToChannel(th.BasicUser2, th.BasicChannel, false) 2973 _, resp = Client.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser2.Id) 2974 CheckNoError(t, resp) 2975 2976 requirePost(&model.Post{ 2977 Message: fmt.Sprintf("@%s left the channel.", th.BasicUser2.Username), 2978 ChannelId: th.BasicChannel.Id, 2979 }) 2980 2981 _, resp = Client.RemoveUserFromChannel(th.BasicChannel2.Id, th.BasicUser.Id) 2982 CheckNoError(t, resp) 2983 requirePost(&model.Post{ 2984 Message: fmt.Sprintf("@%s removed from the channel.", th.BasicUser.Username), 2985 ChannelId: th.BasicChannel2.Id, 2986 }) 2987 2988 _, resp = th.SystemAdminClient.RemoveUserFromChannel(th.BasicChannel.Id, th.BasicUser.Id) 2989 CheckNoError(t, resp) 2990 requirePost(&model.Post{ 2991 Message: fmt.Sprintf("@%s removed from the channel.", th.BasicUser.Username), 2992 ChannelId: th.BasicChannel.Id, 2993 }) 2994 2995 closeWsClient.Do(func() { 2996 wsClient.Close() 2997 }) 2998 }) 2999 3000 // Leave deleted channel 3001 th.LoginBasic() 3002 deletedChannel := th.CreatePublicChannel() 3003 th.App.AddUserToChannel(th.BasicUser, deletedChannel, false) 3004 th.App.AddUserToChannel(th.BasicUser2, deletedChannel, false) 3005 3006 deletedChannel.DeleteAt = 1 3007 th.App.UpdateChannel(deletedChannel) 3008 3009 _, resp = Client.RemoveUserFromChannel(deletedChannel.Id, th.BasicUser.Id) 3010 CheckNoError(t, resp) 3011 3012 th.LoginBasic() 3013 private := th.CreatePrivateChannel() 3014 th.App.AddUserToChannel(th.BasicUser2, private, false) 3015 3016 _, resp = Client.RemoveUserFromChannel(private.Id, th.BasicUser2.Id) 3017 CheckNoError(t, resp) 3018 3019 th.LoginBasic2() 3020 _, resp = Client.RemoveUserFromChannel(private.Id, th.BasicUser.Id) 3021 CheckForbiddenStatus(t, resp) 3022 3023 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 3024 th.App.AddUserToChannel(th.BasicUser, private, false) 3025 _, resp = client.RemoveUserFromChannel(private.Id, th.BasicUser.Id) 3026 CheckNoError(t, resp) 3027 }) 3028 3029 th.LoginBasic() 3030 th.UpdateUserToNonTeamAdmin(user1, team) 3031 th.App.Srv().InvalidateAllCaches() 3032 3033 // Check the appropriate permissions are enforced. 3034 defaultRolePermissions := th.SaveDefaultRolePermissions() 3035 defer func() { 3036 th.RestoreDefaultRolePermissions(defaultRolePermissions) 3037 }() 3038 3039 th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID) 3040 3041 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 3042 // Check that a regular channel user can remove other users. 3043 privateChannel := th.CreateChannelWithClient(client, model.CHANNEL_PRIVATE) 3044 _, resp = client.AddChannelMember(privateChannel.Id, user1.Id) 3045 CheckNoError(t, resp) 3046 _, resp = client.AddChannelMember(privateChannel.Id, user2.Id) 3047 CheckNoError(t, resp) 3048 3049 _, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id) 3050 CheckNoError(t, resp) 3051 }) 3052 3053 // Restrict the permission for adding users to Channel Admins 3054 th.AddPermissionToRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_ADMIN_ROLE_ID) 3055 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, model.CHANNEL_USER_ROLE_ID) 3056 3057 privateChannel := th.CreateChannelWithClient(th.SystemAdminClient, model.CHANNEL_PRIVATE) 3058 _, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user1.Id) 3059 CheckNoError(t, resp) 3060 _, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, user2.Id) 3061 CheckNoError(t, resp) 3062 _, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, bot.UserId) 3063 CheckNoError(t, resp) 3064 3065 _, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id) 3066 CheckForbiddenStatus(t, resp) 3067 3068 th.MakeUserChannelAdmin(user1, privateChannel) 3069 th.App.Srv().InvalidateAllCaches() 3070 3071 _, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id) 3072 CheckNoError(t, resp) 3073 3074 _, resp = th.SystemAdminClient.AddChannelMember(privateChannel.Id, th.SystemAdminUser.Id) 3075 CheckNoError(t, resp) 3076 3077 // If the channel is group-constrained the user cannot be removed 3078 privateChannel.GroupConstrained = model.NewBool(true) 3079 _, err := th.App.UpdateChannel(privateChannel) 3080 require.Nil(t, err) 3081 _, resp = Client.RemoveUserFromChannel(privateChannel.Id, user2.Id) 3082 require.Equal(t, "api.channel.remove_member.group_constrained.app_error", resp.Error.Id) 3083 3084 // If the channel is group-constrained user can remove self 3085 _, resp = th.SystemAdminClient.RemoveUserFromChannel(privateChannel.Id, th.SystemAdminUser.Id) 3086 CheckNoError(t, resp) 3087 3088 // Test on preventing removal of user from a direct channel 3089 directChannel, resp := Client.CreateDirectChannel(user1.Id, user2.Id) 3090 CheckNoError(t, resp) 3091 3092 // If the channel is group-constrained a user can remove a bot 3093 _, resp = Client.RemoveUserFromChannel(privateChannel.Id, bot.UserId) 3094 CheckNoError(t, resp) 3095 3096 _, resp = Client.RemoveUserFromChannel(directChannel.Id, user1.Id) 3097 CheckBadRequestStatus(t, resp) 3098 3099 _, resp = Client.RemoveUserFromChannel(directChannel.Id, user2.Id) 3100 CheckBadRequestStatus(t, resp) 3101 3102 _, resp = th.SystemAdminClient.RemoveUserFromChannel(directChannel.Id, user1.Id) 3103 CheckBadRequestStatus(t, resp) 3104 3105 // Test on preventing removal of user from a group channel 3106 user3 := th.CreateUser() 3107 groupChannel, resp := Client.CreateGroupChannel([]string{user1.Id, user2.Id, user3.Id}) 3108 CheckNoError(t, resp) 3109 3110 th.TestForAllClients(t, func(t *testing.T, client *model.Client4) { 3111 _, resp = client.RemoveUserFromChannel(groupChannel.Id, user1.Id) 3112 CheckBadRequestStatus(t, resp) 3113 }) 3114 } 3115 3116 func TestAutocompleteChannels(t *testing.T) { 3117 th := Setup(t).InitBasic() 3118 defer th.TearDown() 3119 3120 // A private channel to make sure private channels are not used 3121 utils.DisableDebugLogForTest() 3122 ptown, _ := th.Client.CreateChannel(&model.Channel{ 3123 DisplayName: "Town", 3124 Name: "town", 3125 Type: model.CHANNEL_PRIVATE, 3126 TeamId: th.BasicTeam.Id, 3127 }) 3128 tower, _ := th.Client.CreateChannel(&model.Channel{ 3129 DisplayName: "Tower", 3130 Name: "tower", 3131 Type: model.CHANNEL_OPEN, 3132 TeamId: th.BasicTeam.Id, 3133 }) 3134 utils.EnableDebugLogForTest() 3135 defer func() { 3136 th.Client.DeleteChannel(ptown.Id) 3137 th.Client.DeleteChannel(tower.Id) 3138 }() 3139 3140 for _, tc := range []struct { 3141 description string 3142 teamId string 3143 fragment string 3144 expectedIncludes []string 3145 expectedExcludes []string 3146 }{ 3147 { 3148 "Basic town-square", 3149 th.BasicTeam.Id, 3150 "town", 3151 []string{"town-square"}, 3152 []string{"off-topic", "town", "tower"}, 3153 }, 3154 { 3155 "Basic off-topic", 3156 th.BasicTeam.Id, 3157 "off-to", 3158 []string{"off-topic"}, 3159 []string{"town-square", "town", "tower"}, 3160 }, 3161 { 3162 "Basic town square and off topic", 3163 th.BasicTeam.Id, 3164 "tow", 3165 []string{"town-square", "tower"}, 3166 []string{"off-topic", "town"}, 3167 }, 3168 } { 3169 t.Run(tc.description, func(t *testing.T) { 3170 channels, resp := th.Client.AutocompleteChannelsForTeam(tc.teamId, tc.fragment) 3171 require.Nil(t, resp.Error) 3172 names := make([]string, len(*channels)) 3173 for i, c := range *channels { 3174 names[i] = c.Name 3175 } 3176 for _, name := range tc.expectedIncludes { 3177 require.Contains(t, names, name, "channel not included") 3178 } 3179 for _, name := range tc.expectedExcludes { 3180 require.NotContains(t, names, name, "channel not excluded") 3181 } 3182 }) 3183 } 3184 } 3185 3186 func TestAutocompleteChannelsForSearch(t *testing.T) { 3187 th := Setup(t).InitBasic() 3188 defer th.TearDown() 3189 3190 th.LoginSystemAdminWithClient(th.SystemAdminClient) 3191 th.LoginBasicWithClient(th.Client) 3192 3193 u1 := th.CreateUserWithClient(th.SystemAdminClient) 3194 defer th.App.PermanentDeleteUser(th.Context, u1) 3195 u2 := th.CreateUserWithClient(th.SystemAdminClient) 3196 defer th.App.PermanentDeleteUser(th.Context, u2) 3197 u3 := th.CreateUserWithClient(th.SystemAdminClient) 3198 defer th.App.PermanentDeleteUser(th.Context, u3) 3199 u4 := th.CreateUserWithClient(th.SystemAdminClient) 3200 defer th.App.PermanentDeleteUser(th.Context, u4) 3201 3202 // A private channel to make sure private channels are not used 3203 utils.DisableDebugLogForTest() 3204 ptown, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ 3205 DisplayName: "Town", 3206 Name: "town", 3207 Type: model.CHANNEL_PRIVATE, 3208 TeamId: th.BasicTeam.Id, 3209 }) 3210 defer func() { 3211 th.Client.DeleteChannel(ptown.Id) 3212 }() 3213 mypriv, _ := th.Client.CreateChannel(&model.Channel{ 3214 DisplayName: "My private town", 3215 Name: "townpriv", 3216 Type: model.CHANNEL_PRIVATE, 3217 TeamId: th.BasicTeam.Id, 3218 }) 3219 defer func() { 3220 th.Client.DeleteChannel(mypriv.Id) 3221 }() 3222 utils.EnableDebugLogForTest() 3223 3224 dc1, resp := th.Client.CreateDirectChannel(th.BasicUser.Id, u1.Id) 3225 CheckNoError(t, resp) 3226 defer func() { 3227 th.Client.DeleteChannel(dc1.Id) 3228 }() 3229 3230 dc2, resp := th.SystemAdminClient.CreateDirectChannel(u2.Id, u3.Id) 3231 CheckNoError(t, resp) 3232 defer func() { 3233 th.SystemAdminClient.DeleteChannel(dc2.Id) 3234 }() 3235 3236 gc1, resp := th.Client.CreateGroupChannel([]string{th.BasicUser.Id, u2.Id, u3.Id}) 3237 CheckNoError(t, resp) 3238 defer func() { 3239 th.Client.DeleteChannel(gc1.Id) 3240 }() 3241 3242 gc2, resp := th.SystemAdminClient.CreateGroupChannel([]string{u2.Id, u3.Id, u4.Id}) 3243 CheckNoError(t, resp) 3244 defer func() { 3245 th.SystemAdminClient.DeleteChannel(gc2.Id) 3246 }() 3247 3248 for _, tc := range []struct { 3249 description string 3250 teamID string 3251 fragment string 3252 expectedIncludes []string 3253 expectedExcludes []string 3254 }{ 3255 { 3256 "Basic town-square", 3257 th.BasicTeam.Id, 3258 "town", 3259 []string{"town-square", "townpriv"}, 3260 []string{"off-topic", "town"}, 3261 }, 3262 { 3263 "Basic off-topic", 3264 th.BasicTeam.Id, 3265 "off-to", 3266 []string{"off-topic"}, 3267 []string{"town-square", "town", "townpriv"}, 3268 }, 3269 { 3270 "Basic town square and townpriv", 3271 th.BasicTeam.Id, 3272 "tow", 3273 []string{"town-square", "townpriv"}, 3274 []string{"off-topic", "town"}, 3275 }, 3276 { 3277 "Direct and group messages", 3278 th.BasicTeam.Id, 3279 "fakeuser", 3280 []string{dc1.Name, gc1.Name}, 3281 []string{dc2.Name, gc2.Name}, 3282 }, 3283 } { 3284 t.Run(tc.description, func(t *testing.T) { 3285 channels, resp := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamID, tc.fragment) 3286 require.Nil(t, resp.Error) 3287 names := make([]string, len(*channels)) 3288 for i, c := range *channels { 3289 names[i] = c.Name 3290 } 3291 for _, name := range tc.expectedIncludes { 3292 require.Contains(t, names, name, "channel not included") 3293 } 3294 for _, name := range tc.expectedExcludes { 3295 require.NotContains(t, names, name, "channel not excluded") 3296 } 3297 }) 3298 } 3299 } 3300 3301 func TestAutocompleteChannelsForSearchGuestUsers(t *testing.T) { 3302 th := Setup(t).InitBasic() 3303 defer th.TearDown() 3304 3305 u1 := th.CreateUserWithClient(th.SystemAdminClient) 3306 defer th.App.PermanentDeleteUser(th.Context, u1) 3307 3308 enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable 3309 defer func() { 3310 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts }) 3311 th.App.Srv().RemoveLicense() 3312 }() 3313 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) 3314 th.App.Srv().SetLicense(model.NewTestLicense()) 3315 3316 id := model.NewId() 3317 guest := &model.User{ 3318 Email: "success+" + id + "@simulator.amazonses.com", 3319 Username: "un_" + id, 3320 Nickname: "nn_" + id, 3321 Password: "Password1", 3322 EmailVerified: true, 3323 } 3324 guest, err := th.App.CreateGuest(th.Context, guest) 3325 require.Nil(t, err) 3326 3327 th.LoginSystemAdminWithClient(th.SystemAdminClient) 3328 3329 _, resp := th.SystemAdminClient.AddTeamMember(th.BasicTeam.Id, guest.Id) 3330 CheckNoError(t, resp) 3331 3332 // A private channel to make sure private channels are not used 3333 utils.DisableDebugLogForTest() 3334 town, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ 3335 DisplayName: "Town", 3336 Name: "town", 3337 Type: model.CHANNEL_OPEN, 3338 TeamId: th.BasicTeam.Id, 3339 }) 3340 defer func() { 3341 th.SystemAdminClient.DeleteChannel(town.Id) 3342 }() 3343 _, resp = th.SystemAdminClient.AddChannelMember(town.Id, guest.Id) 3344 CheckNoError(t, resp) 3345 3346 mypriv, _ := th.SystemAdminClient.CreateChannel(&model.Channel{ 3347 DisplayName: "My private town", 3348 Name: "townpriv", 3349 Type: model.CHANNEL_PRIVATE, 3350 TeamId: th.BasicTeam.Id, 3351 }) 3352 defer func() { 3353 th.SystemAdminClient.DeleteChannel(mypriv.Id) 3354 }() 3355 _, resp = th.SystemAdminClient.AddChannelMember(mypriv.Id, guest.Id) 3356 CheckNoError(t, resp) 3357 3358 utils.EnableDebugLogForTest() 3359 3360 dc1, resp := th.SystemAdminClient.CreateDirectChannel(th.BasicUser.Id, guest.Id) 3361 CheckNoError(t, resp) 3362 defer func() { 3363 th.SystemAdminClient.DeleteChannel(dc1.Id) 3364 }() 3365 3366 dc2, resp := th.SystemAdminClient.CreateDirectChannel(th.BasicUser.Id, th.BasicUser2.Id) 3367 CheckNoError(t, resp) 3368 defer func() { 3369 th.SystemAdminClient.DeleteChannel(dc2.Id) 3370 }() 3371 3372 gc1, resp := th.SystemAdminClient.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, guest.Id}) 3373 CheckNoError(t, resp) 3374 defer func() { 3375 th.SystemAdminClient.DeleteChannel(gc1.Id) 3376 }() 3377 3378 gc2, resp := th.SystemAdminClient.CreateGroupChannel([]string{th.BasicUser.Id, th.BasicUser2.Id, u1.Id}) 3379 CheckNoError(t, resp) 3380 defer func() { 3381 th.SystemAdminClient.DeleteChannel(gc2.Id) 3382 }() 3383 3384 _, resp = th.Client.Login(guest.Username, "Password1") 3385 CheckNoError(t, resp) 3386 3387 for _, tc := range []struct { 3388 description string 3389 teamID string 3390 fragment string 3391 expectedIncludes []string 3392 expectedExcludes []string 3393 }{ 3394 { 3395 "Should return those channel where is member", 3396 th.BasicTeam.Id, 3397 "town", 3398 []string{"town", "townpriv"}, 3399 []string{"town-square", "off-topic"}, 3400 }, 3401 { 3402 "Should return empty if not member of the searched channels", 3403 th.BasicTeam.Id, 3404 "off-to", 3405 []string{}, 3406 []string{"off-topic", "town-square", "town", "townpriv"}, 3407 }, 3408 { 3409 "Should return direct and group messages", 3410 th.BasicTeam.Id, 3411 "fakeuser", 3412 []string{dc1.Name, gc1.Name}, 3413 []string{dc2.Name, gc2.Name}, 3414 }, 3415 } { 3416 t.Run(tc.description, func(t *testing.T) { 3417 channels, resp := th.Client.AutocompleteChannelsForTeamForSearch(tc.teamID, tc.fragment) 3418 require.Nil(t, resp.Error) 3419 names := make([]string, len(*channels)) 3420 for i, c := range *channels { 3421 names[i] = c.Name 3422 } 3423 for _, name := range tc.expectedIncludes { 3424 require.Contains(t, names, name, "channel not included") 3425 } 3426 for _, name := range tc.expectedExcludes { 3427 require.NotContains(t, names, name, "channel not excluded") 3428 } 3429 }) 3430 } 3431 } 3432 3433 func TestUpdateChannelScheme(t *testing.T) { 3434 th := Setup(t) 3435 defer th.TearDown() 3436 3437 th.App.Srv().SetLicense(model.NewTestLicense("")) 3438 3439 th.App.SetPhase2PermissionsMigrationStatus(true) 3440 3441 team, resp := th.SystemAdminClient.CreateTeam(&model.Team{ 3442 DisplayName: "Name", 3443 Description: "Some description", 3444 CompanyName: "Some company name", 3445 AllowOpenInvite: false, 3446 InviteId: "inviteid0", 3447 Name: "z-z-" + model.NewId() + "a", 3448 Email: "success+" + model.NewId() + "@simulator.amazonses.com", 3449 Type: model.TEAM_OPEN, 3450 }) 3451 CheckNoError(t, resp) 3452 3453 channel, resp := th.SystemAdminClient.CreateChannel(&model.Channel{ 3454 DisplayName: "Name", 3455 Name: "z-z-" + model.NewId() + "a", 3456 Type: model.CHANNEL_OPEN, 3457 TeamId: team.Id, 3458 }) 3459 CheckNoError(t, resp) 3460 3461 channelScheme, resp := th.SystemAdminClient.CreateScheme(&model.Scheme{ 3462 DisplayName: "DisplayName", 3463 Name: model.NewId(), 3464 Description: "Some description", 3465 Scope: model.SCHEME_SCOPE_CHANNEL, 3466 }) 3467 CheckNoError(t, resp) 3468 3469 teamScheme, resp := th.SystemAdminClient.CreateScheme(&model.Scheme{ 3470 DisplayName: "DisplayName", 3471 Name: model.NewId(), 3472 Description: "Some description", 3473 Scope: model.SCHEME_SCOPE_TEAM, 3474 }) 3475 CheckNoError(t, resp) 3476 3477 // Test the setup/base case. 3478 _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) 3479 CheckNoError(t, resp) 3480 3481 // Test various invalid channel and scheme id combinations. 3482 _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, "x") 3483 CheckBadRequestStatus(t, resp) 3484 _, resp = th.SystemAdminClient.UpdateChannelScheme("x", channelScheme.Id) 3485 CheckBadRequestStatus(t, resp) 3486 _, resp = th.SystemAdminClient.UpdateChannelScheme("x", "x") 3487 CheckBadRequestStatus(t, resp) 3488 3489 // Test that permissions are required. 3490 _, resp = th.Client.UpdateChannelScheme(channel.Id, channelScheme.Id) 3491 CheckForbiddenStatus(t, resp) 3492 3493 // Test that a license is required. 3494 th.App.Srv().SetLicense(nil) 3495 _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) 3496 CheckNotImplementedStatus(t, resp) 3497 th.App.Srv().SetLicense(model.NewTestLicense("")) 3498 3499 // Test an invalid scheme scope. 3500 _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, teamScheme.Id) 3501 CheckBadRequestStatus(t, resp) 3502 3503 // Test that an unauthenticated user gets rejected. 3504 th.SystemAdminClient.Logout() 3505 _, resp = th.SystemAdminClient.UpdateChannelScheme(channel.Id, channelScheme.Id) 3506 CheckUnauthorizedStatus(t, resp) 3507 } 3508 3509 func TestGetChannelMembersTimezones(t *testing.T) { 3510 th := Setup(t).InitBasic() 3511 defer th.TearDown() 3512 Client := th.Client 3513 3514 user := th.BasicUser 3515 user.Timezone["useAutomaticTimezone"] = "false" 3516 user.Timezone["manualTimezone"] = "XOXO/BLABLA" 3517 _, resp := Client.UpdateUser(user) 3518 CheckNoError(t, resp) 3519 3520 user2 := th.BasicUser2 3521 user2.Timezone["automaticTimezone"] = "NoWhere/Island" 3522 _, resp = th.SystemAdminClient.UpdateUser(user2) 3523 CheckNoError(t, resp) 3524 3525 timezone, resp := Client.GetChannelMembersTimezones(th.BasicChannel.Id) 3526 CheckNoError(t, resp) 3527 require.Len(t, timezone, 2, "should return 2 timezones") 3528 3529 //both users have same timezone 3530 user2.Timezone["automaticTimezone"] = "XOXO/BLABLA" 3531 _, resp = th.SystemAdminClient.UpdateUser(user2) 3532 CheckNoError(t, resp) 3533 3534 timezone, resp = Client.GetChannelMembersTimezones(th.BasicChannel.Id) 3535 CheckNoError(t, resp) 3536 require.Len(t, timezone, 1, "should return 1 timezone") 3537 3538 //no timezone set should return empty 3539 user2.Timezone["automaticTimezone"] = "" 3540 _, resp = th.SystemAdminClient.UpdateUser(user2) 3541 CheckNoError(t, resp) 3542 3543 user.Timezone["manualTimezone"] = "" 3544 _, resp = Client.UpdateUser(user) 3545 CheckNoError(t, resp) 3546 3547 timezone, resp = Client.GetChannelMembersTimezones(th.BasicChannel.Id) 3548 CheckNoError(t, resp) 3549 require.Empty(t, timezone, "should return 0 timezone") 3550 } 3551 3552 func TestChannelMembersMinusGroupMembers(t *testing.T) { 3553 th := Setup(t).InitBasic() 3554 defer th.TearDown() 3555 3556 user1 := th.BasicUser 3557 user2 := th.BasicUser2 3558 3559 channel := th.CreatePrivateChannel() 3560 3561 _, err := th.App.AddChannelMember(th.Context, user1.Id, channel, app.ChannelMemberOpts{}) 3562 require.Nil(t, err) 3563 _, err = th.App.AddChannelMember(th.Context, user2.Id, channel, app.ChannelMemberOpts{}) 3564 require.Nil(t, err) 3565 3566 channel.GroupConstrained = model.NewBool(true) 3567 channel, err = th.App.UpdateChannel(channel) 3568 require.Nil(t, err) 3569 3570 group1 := th.CreateGroup() 3571 group2 := th.CreateGroup() 3572 3573 _, err = th.App.UpsertGroupMember(group1.Id, user1.Id) 3574 require.Nil(t, err) 3575 _, err = th.App.UpsertGroupMember(group2.Id, user2.Id) 3576 require.Nil(t, err) 3577 3578 // No permissions 3579 _, _, res := th.Client.ChannelMembersMinusGroupMembers(channel.Id, []string{group1.Id, group2.Id}, 0, 100, "") 3580 require.Equal(t, "api.context.permissions.app_error", res.Error.Id) 3581 3582 testCases := map[string]struct { 3583 groupIDs []string 3584 page int 3585 perPage int 3586 length int 3587 count int 3588 otherAssertions func([]*model.UserWithGroups) 3589 }{ 3590 "All groups, expect no users removed": { 3591 groupIDs: []string{group1.Id, group2.Id}, 3592 page: 0, 3593 perPage: 100, 3594 length: 0, 3595 count: 0, 3596 }, 3597 "Some nonexistent group, page 0": { 3598 groupIDs: []string{model.NewId()}, 3599 page: 0, 3600 perPage: 1, 3601 length: 1, 3602 count: 2, 3603 }, 3604 "Some nonexistent group, page 1": { 3605 groupIDs: []string{model.NewId()}, 3606 page: 1, 3607 perPage: 1, 3608 length: 1, 3609 count: 2, 3610 }, 3611 "One group, expect one user removed": { 3612 groupIDs: []string{group1.Id}, 3613 page: 0, 3614 perPage: 100, 3615 length: 1, 3616 count: 1, 3617 otherAssertions: func(uwg []*model.UserWithGroups) { 3618 require.Equal(t, uwg[0].Id, user2.Id) 3619 }, 3620 }, 3621 "Other group, expect other user removed": { 3622 groupIDs: []string{group2.Id}, 3623 page: 0, 3624 perPage: 100, 3625 length: 1, 3626 count: 1, 3627 otherAssertions: func(uwg []*model.UserWithGroups) { 3628 require.Equal(t, uwg[0].Id, user1.Id) 3629 }, 3630 }, 3631 } 3632 3633 for name, tc := range testCases { 3634 t.Run(name, func(t *testing.T) { 3635 uwg, count, res := th.SystemAdminClient.ChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs, tc.page, tc.perPage, "") 3636 require.Nil(t, res.Error) 3637 require.Len(t, uwg, tc.length) 3638 require.Equal(t, tc.count, int(count)) 3639 if tc.otherAssertions != nil { 3640 tc.otherAssertions(uwg) 3641 } 3642 }) 3643 } 3644 } 3645 3646 func TestGetChannelModerations(t *testing.T) { 3647 th := Setup(t).InitBasic() 3648 defer th.TearDown() 3649 3650 channel := th.BasicChannel 3651 team := th.BasicTeam 3652 3653 th.App.SetPhase2PermissionsMigrationStatus(true) 3654 3655 t.Run("Errors without a license", func(t *testing.T) { 3656 _, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") 3657 require.Equal(t, "api.channel.get_channel_moderations.license.error", res.Error.Id) 3658 }) 3659 3660 th.App.Srv().SetLicense(model.NewTestLicense()) 3661 3662 t.Run("Errors as a non sysadmin", func(t *testing.T) { 3663 _, res := th.Client.GetChannelModerations(channel.Id, "") 3664 require.Equal(t, "api.context.permissions.app_error", res.Error.Id) 3665 }) 3666 3667 th.App.Srv().SetLicense(model.NewTestLicense()) 3668 3669 t.Run("Returns default moderations with default roles", func(t *testing.T) { 3670 moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") 3671 require.Nil(t, res.Error) 3672 require.Equal(t, len(moderations), 4) 3673 for _, moderation := range moderations { 3674 if moderation.Name == "manage_members" { 3675 require.Empty(t, moderation.Roles.Guests) 3676 } else { 3677 require.Equal(t, moderation.Roles.Guests.Value, true) 3678 require.Equal(t, moderation.Roles.Guests.Enabled, true) 3679 } 3680 3681 require.Equal(t, moderation.Roles.Members.Value, true) 3682 require.Equal(t, moderation.Roles.Members.Enabled, true) 3683 } 3684 }) 3685 3686 t.Run("Returns value false and enabled false for permissions that are not present in higher scoped scheme when no channel scheme present", func(t *testing.T) { 3687 scheme := th.SetupTeamScheme() 3688 team.SchemeId = &scheme.Id 3689 _, err := th.App.UpdateTeamScheme(team) 3690 require.Nil(t, err) 3691 3692 th.RemovePermissionFromRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole) 3693 defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole) 3694 3695 moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") 3696 require.Nil(t, res.Error) 3697 for _, moderation := range moderations { 3698 if moderation.Name == model.PERMISSION_CREATE_POST.Id { 3699 require.Equal(t, moderation.Roles.Members.Value, true) 3700 require.Equal(t, moderation.Roles.Members.Enabled, true) 3701 require.Equal(t, moderation.Roles.Guests.Value, false) 3702 require.Equal(t, moderation.Roles.Guests.Enabled, false) 3703 } 3704 } 3705 }) 3706 3707 t.Run("Returns value false and enabled true for permissions that are not present in channel scheme but present in team scheme", func(t *testing.T) { 3708 scheme := th.SetupChannelScheme() 3709 channel.SchemeId = &scheme.Id 3710 _, err := th.App.UpdateChannelScheme(channel) 3711 require.Nil(t, err) 3712 3713 th.RemovePermissionFromRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole) 3714 defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole) 3715 3716 moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") 3717 require.Nil(t, res.Error) 3718 for _, moderation := range moderations { 3719 if moderation.Name == model.PERMISSION_CREATE_POST.Id { 3720 require.Equal(t, moderation.Roles.Members.Value, true) 3721 require.Equal(t, moderation.Roles.Members.Enabled, true) 3722 require.Equal(t, moderation.Roles.Guests.Value, false) 3723 require.Equal(t, moderation.Roles.Guests.Enabled, true) 3724 } 3725 } 3726 }) 3727 3728 t.Run("Returns value false and enabled false for permissions that are not present in channel & team scheme", func(t *testing.T) { 3729 teamScheme := th.SetupTeamScheme() 3730 team.SchemeId = &teamScheme.Id 3731 th.App.UpdateTeamScheme(team) 3732 3733 scheme := th.SetupChannelScheme() 3734 channel.SchemeId = &scheme.Id 3735 th.App.UpdateChannelScheme(channel) 3736 3737 th.RemovePermissionFromRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole) 3738 th.RemovePermissionFromRole(model.PERMISSION_CREATE_POST.Id, teamScheme.DefaultChannelGuestRole) 3739 3740 defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelGuestRole) 3741 defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, teamScheme.DefaultChannelGuestRole) 3742 3743 moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") 3744 require.Nil(t, res.Error) 3745 for _, moderation := range moderations { 3746 if moderation.Name == model.PERMISSION_CREATE_POST.Id { 3747 require.Equal(t, moderation.Roles.Members.Value, true) 3748 require.Equal(t, moderation.Roles.Members.Enabled, true) 3749 require.Equal(t, moderation.Roles.Guests.Value, false) 3750 require.Equal(t, moderation.Roles.Guests.Enabled, false) 3751 } 3752 } 3753 }) 3754 3755 t.Run("Returns the correct value for manage_members depending on whether the channel is public or private", func(t *testing.T) { 3756 scheme := th.SetupTeamScheme() 3757 team.SchemeId = &scheme.Id 3758 _, err := th.App.UpdateTeamScheme(team) 3759 require.Nil(t, err) 3760 3761 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id, scheme.DefaultChannelUserRole) 3762 defer th.AddPermissionToRole(model.PERMISSION_CREATE_POST.Id, scheme.DefaultChannelUserRole) 3763 3764 // public channel does not have the permission 3765 moderations, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") 3766 require.Nil(t, res.Error) 3767 for _, moderation := range moderations { 3768 if moderation.Name == "manage_members" { 3769 require.Equal(t, moderation.Roles.Members.Value, false) 3770 } 3771 } 3772 3773 // private channel does have the permission 3774 moderations, res = th.SystemAdminClient.GetChannelModerations(th.BasicPrivateChannel.Id, "") 3775 require.Nil(t, res.Error) 3776 for _, moderation := range moderations { 3777 if moderation.Name == "manage_members" { 3778 require.Equal(t, moderation.Roles.Members.Value, true) 3779 } 3780 } 3781 }) 3782 3783 t.Run("Does not return an error if the team scheme has a blank DefaultChannelGuestRole field", func(t *testing.T) { 3784 scheme := th.SetupTeamScheme() 3785 scheme.DefaultChannelGuestRole = "" 3786 3787 mockStore := mocks.Store{} 3788 mockSchemeStore := mocks.SchemeStore{} 3789 mockSchemeStore.On("Get", mock.Anything).Return(scheme, nil) 3790 mockStore.On("Scheme").Return(&mockSchemeStore) 3791 mockStore.On("Team").Return(th.App.Srv().Store.Team()) 3792 mockStore.On("Channel").Return(th.App.Srv().Store.Channel()) 3793 mockStore.On("User").Return(th.App.Srv().Store.User()) 3794 mockStore.On("Post").Return(th.App.Srv().Store.Post()) 3795 mockStore.On("FileInfo").Return(th.App.Srv().Store.FileInfo()) 3796 mockStore.On("Webhook").Return(th.App.Srv().Store.Webhook()) 3797 mockStore.On("System").Return(th.App.Srv().Store.System()) 3798 mockStore.On("License").Return(th.App.Srv().Store.License()) 3799 mockStore.On("Role").Return(th.App.Srv().Store.Role()) 3800 mockStore.On("Close").Return(nil) 3801 th.App.Srv().Store = &mockStore 3802 3803 team.SchemeId = &scheme.Id 3804 _, err := th.App.UpdateTeamScheme(team) 3805 require.Nil(t, err) 3806 3807 _, res := th.SystemAdminClient.GetChannelModerations(channel.Id, "") 3808 require.Nil(t, res.Error) 3809 }) 3810 } 3811 3812 func TestPatchChannelModerations(t *testing.T) { 3813 th := Setup(t).InitBasic() 3814 defer th.TearDown() 3815 3816 channel := th.BasicChannel 3817 3818 emptyPatch := []*model.ChannelModerationPatch{} 3819 3820 createPosts := model.ChannelModeratedPermissions[0] 3821 3822 th.App.SetPhase2PermissionsMigrationStatus(true) 3823 3824 t.Run("Errors without a license", func(t *testing.T) { 3825 _, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) 3826 require.Equal(t, "api.channel.patch_channel_moderations.license.error", res.Error.Id) 3827 }) 3828 3829 th.App.Srv().SetLicense(model.NewTestLicense()) 3830 3831 t.Run("Errors as a non sysadmin", func(t *testing.T) { 3832 _, res := th.Client.PatchChannelModerations(channel.Id, emptyPatch) 3833 require.Equal(t, "api.context.permissions.app_error", res.Error.Id) 3834 }) 3835 3836 th.App.Srv().SetLicense(model.NewTestLicense()) 3837 3838 t.Run("Returns default moderations with empty patch", func(t *testing.T) { 3839 moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) 3840 require.Nil(t, res.Error) 3841 require.Equal(t, len(moderations), 4) 3842 for _, moderation := range moderations { 3843 if moderation.Name == "manage_members" { 3844 require.Empty(t, moderation.Roles.Guests) 3845 } else { 3846 require.Equal(t, moderation.Roles.Guests.Value, true) 3847 require.Equal(t, moderation.Roles.Guests.Enabled, true) 3848 } 3849 3850 require.Equal(t, moderation.Roles.Members.Value, true) 3851 require.Equal(t, moderation.Roles.Members.Enabled, true) 3852 } 3853 3854 require.Nil(t, channel.SchemeId) 3855 }) 3856 3857 t.Run("Creates a scheme and returns the updated channel moderations when patching an existing permission", func(t *testing.T) { 3858 patch := []*model.ChannelModerationPatch{ 3859 { 3860 Name: &createPosts, 3861 Roles: &model.ChannelModeratedRolesPatch{Members: model.NewBool(false)}, 3862 }, 3863 } 3864 3865 moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) 3866 require.Nil(t, res.Error) 3867 require.Equal(t, len(moderations), 4) 3868 for _, moderation := range moderations { 3869 if moderation.Name == "manage_members" { 3870 require.Empty(t, moderation.Roles.Guests) 3871 } else { 3872 require.Equal(t, moderation.Roles.Guests.Value, true) 3873 require.Equal(t, moderation.Roles.Guests.Enabled, true) 3874 } 3875 3876 if moderation.Name == createPosts { 3877 require.Equal(t, moderation.Roles.Members.Value, false) 3878 require.Equal(t, moderation.Roles.Members.Enabled, true) 3879 } else { 3880 require.Equal(t, moderation.Roles.Members.Value, true) 3881 require.Equal(t, moderation.Roles.Members.Enabled, true) 3882 } 3883 } 3884 channel, _ = th.App.GetChannel(channel.Id) 3885 require.NotNil(t, channel.SchemeId) 3886 }) 3887 3888 t.Run("Removes the existing scheme when moderated permissions are set back to higher scoped values", func(t *testing.T) { 3889 channel, _ = th.App.GetChannel(channel.Id) 3890 schemeId := channel.SchemeId 3891 3892 scheme, _ := th.App.GetScheme(*schemeId) 3893 require.Equal(t, scheme.DeleteAt, int64(0)) 3894 3895 patch := []*model.ChannelModerationPatch{ 3896 { 3897 Name: &createPosts, 3898 Roles: &model.ChannelModeratedRolesPatch{Members: model.NewBool(true)}, 3899 }, 3900 } 3901 3902 moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) 3903 require.Nil(t, res.Error) 3904 require.Equal(t, len(moderations), 4) 3905 for _, moderation := range moderations { 3906 if moderation.Name == "manage_members" { 3907 require.Empty(t, moderation.Roles.Guests) 3908 } else { 3909 require.Equal(t, moderation.Roles.Guests.Value, true) 3910 require.Equal(t, moderation.Roles.Guests.Enabled, true) 3911 } 3912 3913 require.Equal(t, moderation.Roles.Members.Value, true) 3914 require.Equal(t, moderation.Roles.Members.Enabled, true) 3915 } 3916 3917 channel, _ = th.App.GetChannel(channel.Id) 3918 require.Nil(t, channel.SchemeId) 3919 3920 scheme, _ = th.App.GetScheme(*schemeId) 3921 require.NotEqual(t, scheme.DeleteAt, int64(0)) 3922 }) 3923 3924 t.Run("Does not return an error if the team scheme has a blank DefaultChannelGuestRole field", func(t *testing.T) { 3925 team := th.BasicTeam 3926 scheme := th.SetupTeamScheme() 3927 scheme.DefaultChannelGuestRole = "" 3928 3929 mockStore := mocks.Store{} 3930 mockSchemeStore := mocks.SchemeStore{} 3931 mockSchemeStore.On("Get", mock.Anything).Return(scheme, nil) 3932 mockSchemeStore.On("Save", mock.Anything).Return(scheme, nil) 3933 mockSchemeStore.On("Delete", mock.Anything).Return(scheme, nil) 3934 mockStore.On("Scheme").Return(&mockSchemeStore) 3935 mockStore.On("Team").Return(th.App.Srv().Store.Team()) 3936 mockStore.On("Channel").Return(th.App.Srv().Store.Channel()) 3937 mockStore.On("User").Return(th.App.Srv().Store.User()) 3938 mockStore.On("Post").Return(th.App.Srv().Store.Post()) 3939 mockStore.On("FileInfo").Return(th.App.Srv().Store.FileInfo()) 3940 mockStore.On("Webhook").Return(th.App.Srv().Store.Webhook()) 3941 mockStore.On("System").Return(th.App.Srv().Store.System()) 3942 mockStore.On("License").Return(th.App.Srv().Store.License()) 3943 mockStore.On("Role").Return(th.App.Srv().Store.Role()) 3944 mockStore.On("Close").Return(nil) 3945 th.App.Srv().Store = &mockStore 3946 3947 team.SchemeId = &scheme.Id 3948 _, err := th.App.UpdateTeamScheme(team) 3949 require.Nil(t, err) 3950 3951 moderations, res := th.SystemAdminClient.PatchChannelModerations(channel.Id, emptyPatch) 3952 require.Nil(t, res.Error) 3953 require.Equal(t, len(moderations), 4) 3954 for _, moderation := range moderations { 3955 if moderation.Name == "manage_members" { 3956 require.Empty(t, moderation.Roles.Guests) 3957 } else { 3958 require.Equal(t, moderation.Roles.Guests.Value, false) 3959 require.Equal(t, moderation.Roles.Guests.Enabled, false) 3960 } 3961 3962 require.Equal(t, moderation.Roles.Members.Value, true) 3963 require.Equal(t, moderation.Roles.Members.Enabled, true) 3964 } 3965 3966 patch := []*model.ChannelModerationPatch{ 3967 { 3968 Name: &createPosts, 3969 Roles: &model.ChannelModeratedRolesPatch{Members: model.NewBool(true)}, 3970 }, 3971 } 3972 3973 moderations, res = th.SystemAdminClient.PatchChannelModerations(channel.Id, patch) 3974 require.Nil(t, res.Error) 3975 require.Equal(t, len(moderations), 4) 3976 for _, moderation := range moderations { 3977 if moderation.Name == "manage_members" { 3978 require.Empty(t, moderation.Roles.Guests) 3979 } else { 3980 require.Equal(t, moderation.Roles.Guests.Value, false) 3981 require.Equal(t, moderation.Roles.Guests.Enabled, false) 3982 } 3983 3984 require.Equal(t, moderation.Roles.Members.Value, true) 3985 require.Equal(t, moderation.Roles.Members.Enabled, true) 3986 } 3987 }) 3988 3989 } 3990 3991 func TestGetChannelMemberCountsByGroup(t *testing.T) { 3992 th := Setup(t).InitBasic() 3993 defer th.TearDown() 3994 3995 channel := th.BasicChannel 3996 t.Run("Errors without a license", func(t *testing.T) { 3997 _, res := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") 3998 require.Equal(t, "api.channel.channel_member_counts_by_group.license.error", res.Error.Id) 3999 }) 4000 4001 th.App.Srv().SetLicense(model.NewTestLicense()) 4002 4003 t.Run("Errors without read permission to the channel", func(t *testing.T) { 4004 _, res := th.Client.GetChannelMemberCountsByGroup(model.NewId(), false, "") 4005 require.Equal(t, "api.context.permissions.app_error", res.Error.Id) 4006 }) 4007 4008 t.Run("Returns empty for a channel with no members or groups", func(t *testing.T) { 4009 memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") 4010 require.Equal(t, []*model.ChannelMemberCountByGroup{}, memberCounts) 4011 }) 4012 4013 user := th.BasicUser 4014 user.Timezone["useAutomaticTimezone"] = "false" 4015 user.Timezone["manualTimezone"] = "XOXO/BLABLA" 4016 _, err := th.App.UpsertGroupMember(th.Group.Id, user.Id) 4017 require.Nil(t, err) 4018 _, resp := th.SystemAdminClient.UpdateUser(user) 4019 CheckNoError(t, resp) 4020 4021 user2 := th.BasicUser2 4022 user2.Timezone["automaticTimezone"] = "NoWhere/Island" 4023 _, err = th.App.UpsertGroupMember(th.Group.Id, user2.Id) 4024 require.Nil(t, err) 4025 _, resp = th.SystemAdminClient.UpdateUser(user2) 4026 CheckNoError(t, resp) 4027 4028 t.Run("Returns users in group without timezones", func(t *testing.T) { 4029 memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, false, "") 4030 expectedMemberCounts := []*model.ChannelMemberCountByGroup{ 4031 { 4032 GroupId: th.Group.Id, 4033 ChannelMemberCount: 2, 4034 ChannelMemberTimezonesCount: 0, 4035 }, 4036 } 4037 require.Equal(t, expectedMemberCounts, memberCounts) 4038 }) 4039 4040 t.Run("Returns users in group with timezones", func(t *testing.T) { 4041 memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, true, "") 4042 expectedMemberCounts := []*model.ChannelMemberCountByGroup{ 4043 { 4044 GroupId: th.Group.Id, 4045 ChannelMemberCount: 2, 4046 ChannelMemberTimezonesCount: 2, 4047 }, 4048 } 4049 require.Equal(t, expectedMemberCounts, memberCounts) 4050 }) 4051 4052 id := model.NewId() 4053 group := &model.Group{ 4054 DisplayName: "dn_" + id, 4055 Name: model.NewString("name" + id), 4056 Source: model.GroupSourceLdap, 4057 RemoteId: model.NewId(), 4058 } 4059 4060 _, err = th.App.CreateGroup(group) 4061 require.Nil(t, err) 4062 _, err = th.App.UpsertGroupMember(group.Id, user.Id) 4063 require.Nil(t, err) 4064 4065 t.Run("Returns multiple groups with users in group with timezones", func(t *testing.T) { 4066 memberCounts, _ := th.SystemAdminClient.GetChannelMemberCountsByGroup(channel.Id, true, "") 4067 expectedMemberCounts := []*model.ChannelMemberCountByGroup{ 4068 { 4069 GroupId: group.Id, 4070 ChannelMemberCount: 1, 4071 ChannelMemberTimezonesCount: 1, 4072 }, 4073 { 4074 GroupId: th.Group.Id, 4075 ChannelMemberCount: 2, 4076 ChannelMemberTimezonesCount: 2, 4077 }, 4078 } 4079 require.ElementsMatch(t, expectedMemberCounts, memberCounts) 4080 }) 4081 } 4082 4083 func TestMoveChannel(t *testing.T) { 4084 th := Setup(t).InitBasic() 4085 defer th.TearDown() 4086 4087 Client := th.Client 4088 team1 := th.BasicTeam 4089 team2 := th.CreateTeam() 4090 4091 t.Run("Should move channel", func(t *testing.T) { 4092 publicChannel := th.CreatePublicChannel() 4093 ch, resp := th.SystemAdminClient.MoveChannel(publicChannel.Id, team2.Id, false) 4094 require.Nil(t, resp.Error) 4095 require.Equal(t, team2.Id, ch.TeamId) 4096 }) 4097 4098 t.Run("Should move private channel", func(t *testing.T) { 4099 channel := th.CreatePrivateChannel() 4100 ch, resp := th.SystemAdminClient.MoveChannel(channel.Id, team1.Id, false) 4101 require.Nil(t, resp.Error) 4102 require.Equal(t, team1.Id, ch.TeamId) 4103 }) 4104 4105 t.Run("Should fail when trying to move a DM channel", func(t *testing.T) { 4106 user := th.CreateUser() 4107 dmChannel := th.CreateDmChannel(user) 4108 _, resp := Client.MoveChannel(dmChannel.Id, team1.Id, false) 4109 require.NotNil(t, resp.Error) 4110 CheckErrorMessage(t, resp, "api.channel.move_channel.type.invalid") 4111 }) 4112 4113 t.Run("Should fail when trying to move a group channel", func(t *testing.T) { 4114 user := th.CreateUser() 4115 4116 gmChannel, err := th.App.CreateGroupChannel([]string{th.BasicUser.Id, th.SystemAdminUser.Id, th.TeamAdminUser.Id}, user.Id) 4117 require.Nil(t, err) 4118 _, resp := Client.MoveChannel(gmChannel.Id, team1.Id, false) 4119 require.NotNil(t, resp.Error) 4120 CheckErrorMessage(t, resp, "api.channel.move_channel.type.invalid") 4121 }) 4122 4123 t.Run("Should fail due to permissions", func(t *testing.T) { 4124 publicChannel := th.CreatePublicChannel() 4125 _, resp := Client.MoveChannel(publicChannel.Id, team1.Id, false) 4126 require.NotNil(t, resp.Error) 4127 CheckErrorMessage(t, resp, "api.context.permissions.app_error") 4128 }) 4129 4130 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 4131 publicChannel := th.CreatePublicChannel() 4132 user := th.BasicUser 4133 4134 _, resp := client.RemoveTeamMember(team2.Id, user.Id) 4135 CheckNoError(t, resp) 4136 4137 _, resp = client.AddChannelMember(publicChannel.Id, user.Id) 4138 CheckNoError(t, resp) 4139 4140 _, resp = client.MoveChannel(publicChannel.Id, team2.Id, false) 4141 require.NotNil(t, resp.Error) 4142 CheckErrorMessage(t, resp, "app.channel.move_channel.members_do_not_match.error") 4143 }, "Should fail to move public channel due to a member not member of target team") 4144 4145 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 4146 privateChannel := th.CreatePrivateChannel() 4147 user := th.BasicUser 4148 4149 _, resp := client.RemoveTeamMember(team2.Id, user.Id) 4150 CheckNoError(t, resp) 4151 4152 _, resp = client.AddChannelMember(privateChannel.Id, user.Id) 4153 CheckNoError(t, resp) 4154 4155 _, resp = client.MoveChannel(privateChannel.Id, team2.Id, false) 4156 require.NotNil(t, resp.Error) 4157 CheckErrorMessage(t, resp, "app.channel.move_channel.members_do_not_match.error") 4158 }, "Should fail to move private channel due to a member not member of target team") 4159 4160 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 4161 publicChannel := th.CreatePublicChannel() 4162 user := th.BasicUser 4163 4164 _, resp := client.RemoveTeamMember(team2.Id, user.Id) 4165 CheckNoError(t, resp) 4166 4167 _, resp = client.AddChannelMember(publicChannel.Id, user.Id) 4168 CheckNoError(t, resp) 4169 4170 newChannel, resp := client.MoveChannel(publicChannel.Id, team2.Id, true) 4171 require.Nil(t, resp.Error) 4172 require.Equal(t, team2.Id, newChannel.TeamId) 4173 }, "Should be able to (force) move public channel by a member that is not member of target team") 4174 4175 th.TestForSystemAdminAndLocal(t, func(t *testing.T, client *model.Client4) { 4176 privateChannel := th.CreatePrivateChannel() 4177 user := th.BasicUser 4178 4179 _, resp := client.RemoveTeamMember(team2.Id, user.Id) 4180 CheckNoError(t, resp) 4181 4182 _, resp = client.AddChannelMember(privateChannel.Id, user.Id) 4183 CheckNoError(t, resp) 4184 4185 newChannel, resp := client.MoveChannel(privateChannel.Id, team2.Id, true) 4186 require.Nil(t, resp.Error) 4187 require.Equal(t, team2.Id, newChannel.TeamId) 4188 }, "Should be able to (force) move private channel by a member that is not member of target team") 4189 } 4190 4191 func TestRootMentionsCount(t *testing.T) { 4192 th := Setup(t).InitBasic() 4193 defer th.TearDown() 4194 4195 Client := th.Client 4196 user := th.BasicUser 4197 channel := th.BasicChannel 4198 4199 // initially, MentionCountRoot is 0 in the database 4200 channelMember, err := th.App.Srv().Store.Channel().GetMember(context.Background(), channel.Id, user.Id) 4201 require.NoError(t, err) 4202 require.Equal(t, int64(0), channelMember.MentionCountRoot) 4203 require.Equal(t, int64(0), channelMember.MentionCount) 4204 4205 // mention the user in a root post 4206 post1, resp := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username}) 4207 CheckNoError(t, resp) 4208 // mention the user in a reply post 4209 post2 := &model.Post{ChannelId: channel.Id, Message: "reply at @" + user.Username, RootId: post1.Id} 4210 _, resp = th.SystemAdminClient.CreatePost(post2) 4211 CheckNoError(t, resp) 4212 4213 // this should perform lazy migration and populate the field 4214 channelUnread, resp := Client.GetChannelUnread(channel.Id, user.Id) 4215 CheckNoError(t, resp) 4216 // reply post is not counted, so we should have one root mention 4217 require.EqualValues(t, int64(1), channelUnread.MentionCountRoot) 4218 // regular count stays the same 4219 require.Equal(t, int64(2), channelUnread.MentionCount) 4220 // validate that DB is updated 4221 channelMember, err = th.App.Srv().Store.Channel().GetMember(context.Background(), channel.Id, user.Id) 4222 require.NoError(t, err) 4223 require.EqualValues(t, int64(1), channelMember.MentionCountRoot) 4224 4225 // validate that Team level counts are calculated 4226 counts, appErr := th.App.GetTeamUnread(channel.TeamId, user.Id) 4227 require.Nil(t, appErr) 4228 require.Equal(t, int64(1), counts.MentionCountRoot) 4229 require.Equal(t, int64(2), counts.MentionCount) 4230 } 4231 4232 func TestViewChannelWithoutCollapsedThreads(t *testing.T) { 4233 th := Setup(t).InitBasic() 4234 defer th.TearDown() 4235 4236 os.Setenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS", "true") 4237 defer os.Unsetenv("MM_FEATUREFLAGS_COLLAPSEDTHREADS") 4238 th.App.UpdateConfig(func(cfg *model.Config) { 4239 *cfg.ServiceSettings.ThreadAutoFollow = true 4240 *cfg.ServiceSettings.CollapsedThreads = model.COLLAPSED_THREADS_DEFAULT_ON 4241 }) 4242 4243 Client := th.Client 4244 user := th.BasicUser 4245 team := th.BasicTeam 4246 channel := th.BasicChannel 4247 4248 // mention the user in a root post 4249 post1, resp := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username}) 4250 CheckNoError(t, resp) 4251 // mention the user in a reply post 4252 post2 := &model.Post{ChannelId: channel.Id, Message: "reply at @" + user.Username, RootId: post1.Id} 4253 _, resp = th.SystemAdminClient.CreatePost(post2) 4254 CheckNoError(t, resp) 4255 4256 threads, resp := Client.GetUserThreads(user.Id, team.Id, model.GetUserThreadsOpts{}) 4257 CheckNoError(t, resp) 4258 require.EqualValues(t, int64(1), threads.TotalUnreadMentions) 4259 4260 // simulate opening the channel from an old client 4261 _, resp = Client.ViewChannel(user.Id, &model.ChannelView{ 4262 ChannelId: channel.Id, 4263 PrevChannelId: "", 4264 CollapsedThreadsSupported: false, 4265 }) 4266 CheckNoError(t, resp) 4267 4268 threads, resp = Client.GetUserThreads(user.Id, team.Id, model.GetUserThreadsOpts{}) 4269 CheckNoError(t, resp) 4270 require.Zero(t, threads.TotalUnreadMentions) 4271 }