github.com/mattermost/mattermost-server/v5@v5.39.3/store/storetest/role_store.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package storetest 5 6 import ( 7 "context" 8 "fmt" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 14 "github.com/mattermost/mattermost-server/v5/model" 15 "github.com/mattermost/mattermost-server/v5/store" 16 ) 17 18 func TestRoleStore(t *testing.T, ss store.Store, s SqlStore) { 19 t.Run("Save", func(t *testing.T) { testRoleStoreSave(t, ss) }) 20 t.Run("Get", func(t *testing.T) { testRoleStoreGet(t, ss) }) 21 t.Run("GetAll", func(t *testing.T) { testRoleStoreGetAll(t, ss) }) 22 t.Run("GetByName", func(t *testing.T) { testRoleStoreGetByName(t, ss) }) 23 t.Run("GetNames", func(t *testing.T) { testRoleStoreGetByNames(t, ss) }) 24 t.Run("Delete", func(t *testing.T) { testRoleStoreDelete(t, ss) }) 25 t.Run("PermanentDeleteAll", func(t *testing.T) { testRoleStorePermanentDeleteAll(t, ss) }) 26 t.Run("LowerScopedChannelSchemeRoles_AllChannelSchemeRoles", func(t *testing.T) { testRoleStoreLowerScopedChannelSchemeRoles(t, ss) }) 27 t.Run("ChannelHigherScopedPermissionsBlankTeamSchemeChannelGuest", func(t *testing.T) { testRoleStoreChannelHigherScopedPermissionsBlankTeamSchemeChannelGuest(t, ss, s) }) 28 } 29 30 func testRoleStoreSave(t *testing.T, ss store.Store) { 31 // Save a new role. 32 r1 := &model.Role{ 33 Name: model.NewId(), 34 DisplayName: model.NewId(), 35 Description: model.NewId(), 36 Permissions: []string{ 37 "invite_user", 38 "create_public_channel", 39 "add_user_to_team", 40 }, 41 SchemeManaged: false, 42 } 43 44 d1, err := ss.Role().Save(r1) 45 assert.NoError(t, err) 46 assert.Len(t, d1.Id, 26) 47 assert.Equal(t, r1.Name, d1.Name) 48 assert.Equal(t, r1.DisplayName, d1.DisplayName) 49 assert.Equal(t, r1.Description, d1.Description) 50 assert.Equal(t, r1.Permissions, d1.Permissions) 51 assert.Equal(t, r1.SchemeManaged, d1.SchemeManaged) 52 53 // Change the role permissions and update. 54 d1.Permissions = []string{ 55 "invite_user", 56 "add_user_to_team", 57 "delete_public_channel", 58 } 59 60 d2, err := ss.Role().Save(d1) 61 assert.NoError(t, err) 62 assert.Len(t, d2.Id, 26) 63 assert.Equal(t, r1.Name, d2.Name) 64 assert.Equal(t, r1.DisplayName, d2.DisplayName) 65 assert.Equal(t, r1.Description, d2.Description) 66 assert.Equal(t, d1.Permissions, d2.Permissions) 67 assert.Equal(t, r1.SchemeManaged, d2.SchemeManaged) 68 69 // Try saving one with an invalid ID set. 70 r3 := &model.Role{ 71 Id: model.NewId(), 72 Name: model.NewId(), 73 DisplayName: model.NewId(), 74 Description: model.NewId(), 75 Permissions: []string{ 76 "invite_user", 77 "create_public_channel", 78 "add_user_to_team", 79 }, 80 SchemeManaged: false, 81 } 82 83 _, err = ss.Role().Save(r3) 84 assert.Error(t, err) 85 86 // Try saving one with a duplicate "name" field. 87 r4 := &model.Role{ 88 Name: r1.Name, 89 DisplayName: model.NewId(), 90 Description: model.NewId(), 91 Permissions: []string{ 92 "invite_user", 93 "create_public_channel", 94 "add_user_to_team", 95 }, 96 SchemeManaged: false, 97 } 98 99 _, err = ss.Role().Save(r4) 100 assert.Error(t, err) 101 } 102 103 func testRoleStoreGetAll(t *testing.T, ss store.Store) { 104 prev, err := ss.Role().GetAll() 105 require.NoError(t, err) 106 prevCount := len(prev) 107 108 // Save a role to test with. 109 r1 := &model.Role{ 110 Name: model.NewId(), 111 DisplayName: model.NewId(), 112 Description: model.NewId(), 113 Permissions: []string{ 114 "invite_user", 115 "create_public_channel", 116 "add_user_to_team", 117 }, 118 SchemeManaged: false, 119 } 120 121 _, err = ss.Role().Save(r1) 122 require.NoError(t, err) 123 124 r2 := &model.Role{ 125 Name: model.NewId(), 126 DisplayName: model.NewId(), 127 Description: model.NewId(), 128 Permissions: []string{ 129 "invite_user", 130 "create_public_channel", 131 "add_user_to_team", 132 }, 133 SchemeManaged: false, 134 } 135 _, err = ss.Role().Save(r2) 136 require.NoError(t, err) 137 138 data, err := ss.Role().GetAll() 139 require.NoError(t, err) 140 assert.Len(t, data, prevCount+2) 141 } 142 143 func testRoleStoreGet(t *testing.T, ss store.Store) { 144 // Save a role to test with. 145 r1 := &model.Role{ 146 Name: model.NewId(), 147 DisplayName: model.NewId(), 148 Description: model.NewId(), 149 Permissions: []string{ 150 "invite_user", 151 "create_public_channel", 152 "add_user_to_team", 153 }, 154 SchemeManaged: false, 155 } 156 157 d1, err := ss.Role().Save(r1) 158 assert.NoError(t, err) 159 assert.Len(t, d1.Id, 26) 160 161 // Get a valid role 162 d2, err := ss.Role().Get(d1.Id) 163 assert.NoError(t, err) 164 assert.Equal(t, d1.Id, d2.Id) 165 assert.Equal(t, r1.Name, d2.Name) 166 assert.Equal(t, r1.DisplayName, d2.DisplayName) 167 assert.Equal(t, r1.Description, d2.Description) 168 assert.Equal(t, r1.Permissions, d2.Permissions) 169 assert.Equal(t, r1.SchemeManaged, d2.SchemeManaged) 170 171 // Get an invalid role 172 _, err = ss.Role().Get(model.NewId()) 173 assert.Error(t, err) 174 } 175 176 func testRoleStoreGetByName(t *testing.T, ss store.Store) { 177 // Save a role to test with. 178 r1 := &model.Role{ 179 Name: model.NewId(), 180 DisplayName: model.NewId(), 181 Description: model.NewId(), 182 Permissions: []string{ 183 "invite_user", 184 "create_public_channel", 185 "add_user_to_team", 186 }, 187 SchemeManaged: false, 188 } 189 190 d1, err := ss.Role().Save(r1) 191 assert.NoError(t, err) 192 assert.Len(t, d1.Id, 26) 193 194 // Get a valid role 195 d2, err := ss.Role().GetByName(context.Background(), d1.Name) 196 assert.NoError(t, err) 197 assert.Equal(t, d1.Id, d2.Id) 198 assert.Equal(t, r1.Name, d2.Name) 199 assert.Equal(t, r1.DisplayName, d2.DisplayName) 200 assert.Equal(t, r1.Description, d2.Description) 201 assert.Equal(t, r1.Permissions, d2.Permissions) 202 assert.Equal(t, r1.SchemeManaged, d2.SchemeManaged) 203 204 // Get an invalid role 205 _, err = ss.Role().GetByName(context.Background(), model.NewId()) 206 assert.Error(t, err) 207 } 208 209 func testRoleStoreGetByNames(t *testing.T, ss store.Store) { 210 // Save some roles to test with. 211 r1 := &model.Role{ 212 Name: model.NewId(), 213 DisplayName: model.NewId(), 214 Description: model.NewId(), 215 Permissions: []string{ 216 "invite_user", 217 "create_public_channel", 218 "add_user_to_team", 219 }, 220 SchemeManaged: false, 221 } 222 r2 := &model.Role{ 223 Name: model.NewId(), 224 DisplayName: model.NewId(), 225 Description: model.NewId(), 226 Permissions: []string{ 227 "read_channel", 228 "create_public_channel", 229 "add_user_to_team", 230 }, 231 SchemeManaged: false, 232 } 233 r3 := &model.Role{ 234 Name: model.NewId(), 235 DisplayName: model.NewId(), 236 Description: model.NewId(), 237 Permissions: []string{ 238 "invite_user", 239 "delete_private_channel", 240 "add_user_to_team", 241 }, 242 SchemeManaged: false, 243 } 244 245 d1, err := ss.Role().Save(r1) 246 assert.NoError(t, err) 247 assert.Len(t, d1.Id, 26) 248 249 d2, err := ss.Role().Save(r2) 250 assert.NoError(t, err) 251 assert.Len(t, d2.Id, 26) 252 253 d3, err := ss.Role().Save(r3) 254 assert.NoError(t, err) 255 assert.Len(t, d3.Id, 26) 256 257 // Get two valid roles. 258 n4 := []string{r1.Name, r2.Name} 259 roles4, err := ss.Role().GetByNames(n4) 260 assert.NoError(t, err) 261 assert.Len(t, roles4, 2) 262 assert.Contains(t, roles4, d1) 263 assert.Contains(t, roles4, d2) 264 assert.NotContains(t, roles4, d3) 265 266 // Get two invalid roles. 267 n5 := []string{model.NewId(), model.NewId()} 268 roles5, err := ss.Role().GetByNames(n5) 269 assert.NoError(t, err) 270 assert.Empty(t, roles5) 271 272 // Get one valid one and one invalid one. 273 n6 := []string{r1.Name, model.NewId()} 274 roles6, err := ss.Role().GetByNames(n6) 275 assert.NoError(t, err) 276 assert.Len(t, roles6, 1) 277 assert.Contains(t, roles6, d1) 278 assert.NotContains(t, roles6, d2) 279 assert.NotContains(t, roles6, d3) 280 } 281 282 func testRoleStoreDelete(t *testing.T, ss store.Store) { 283 // Save a role to test with. 284 r1 := &model.Role{ 285 Name: model.NewId(), 286 DisplayName: model.NewId(), 287 Description: model.NewId(), 288 Permissions: []string{ 289 "invite_user", 290 "create_public_channel", 291 "add_user_to_team", 292 }, 293 SchemeManaged: false, 294 } 295 296 d1, err := ss.Role().Save(r1) 297 assert.NoError(t, err) 298 assert.Len(t, d1.Id, 26) 299 300 // Check the role is there. 301 _, err = ss.Role().Get(d1.Id) 302 assert.NoError(t, err) 303 304 // Delete the role. 305 _, err = ss.Role().Delete(d1.Id) 306 assert.NoError(t, err) 307 308 // Check the role is deleted there. 309 d2, err := ss.Role().Get(d1.Id) 310 assert.NoError(t, err) 311 assert.NotZero(t, d2.DeleteAt) 312 313 d3, err := ss.Role().GetByName(context.Background(), d1.Name) 314 assert.NoError(t, err) 315 assert.NotZero(t, d3.DeleteAt) 316 317 // Try and delete a role that does not exist. 318 _, err = ss.Role().Delete(model.NewId()) 319 assert.Error(t, err) 320 } 321 322 func testRoleStorePermanentDeleteAll(t *testing.T, ss store.Store) { 323 r1 := &model.Role{ 324 Name: model.NewId(), 325 DisplayName: model.NewId(), 326 Description: model.NewId(), 327 Permissions: []string{ 328 "invite_user", 329 "create_public_channel", 330 "add_user_to_team", 331 }, 332 SchemeManaged: false, 333 } 334 335 r2 := &model.Role{ 336 Name: model.NewId(), 337 DisplayName: model.NewId(), 338 Description: model.NewId(), 339 Permissions: []string{ 340 "read_channel", 341 "create_public_channel", 342 "add_user_to_team", 343 }, 344 SchemeManaged: false, 345 } 346 347 _, err := ss.Role().Save(r1) 348 require.NoError(t, err) 349 _, err = ss.Role().Save(r2) 350 require.NoError(t, err) 351 352 roles, err := ss.Role().GetByNames([]string{r1.Name, r2.Name}) 353 assert.NoError(t, err) 354 assert.Len(t, roles, 2) 355 356 err = ss.Role().PermanentDeleteAll() 357 assert.NoError(t, err) 358 359 roles, err = ss.Role().GetByNames([]string{r1.Name, r2.Name}) 360 assert.NoError(t, err) 361 assert.Empty(t, roles) 362 } 363 364 func testRoleStoreLowerScopedChannelSchemeRoles(t *testing.T, ss store.Store) { 365 createDefaultRoles(ss) 366 367 teamScheme1 := &model.Scheme{ 368 DisplayName: model.NewId(), 369 Name: model.NewId(), 370 Description: model.NewId(), 371 Scope: model.SCHEME_SCOPE_TEAM, 372 } 373 teamScheme1, err := ss.Scheme().Save(teamScheme1) 374 require.NoError(t, err) 375 defer ss.Scheme().Delete(teamScheme1.Id) 376 377 teamScheme2 := &model.Scheme{ 378 DisplayName: model.NewId(), 379 Name: model.NewId(), 380 Description: model.NewId(), 381 Scope: model.SCHEME_SCOPE_TEAM, 382 } 383 teamScheme2, err = ss.Scheme().Save(teamScheme2) 384 require.NoError(t, err) 385 defer ss.Scheme().Delete(teamScheme2.Id) 386 387 channelScheme1 := &model.Scheme{ 388 DisplayName: model.NewId(), 389 Name: model.NewId(), 390 Description: model.NewId(), 391 Scope: model.SCHEME_SCOPE_CHANNEL, 392 } 393 channelScheme1, err = ss.Scheme().Save(channelScheme1) 394 require.NoError(t, err) 395 defer ss.Scheme().Delete(channelScheme1.Id) 396 397 channelScheme2 := &model.Scheme{ 398 DisplayName: model.NewId(), 399 Name: model.NewId(), 400 Description: model.NewId(), 401 Scope: model.SCHEME_SCOPE_CHANNEL, 402 } 403 channelScheme2, err = ss.Scheme().Save(channelScheme2) 404 require.NoError(t, err) 405 defer ss.Scheme().Delete(channelScheme1.Id) 406 407 team1 := &model.Team{ 408 DisplayName: "Name", 409 Name: "zz" + model.NewId(), 410 Email: MakeEmail(), 411 Type: model.TEAM_OPEN, 412 SchemeId: &teamScheme1.Id, 413 } 414 team1, err = ss.Team().Save(team1) 415 require.NoError(t, err) 416 defer ss.Team().PermanentDelete(team1.Id) 417 418 team2 := &model.Team{ 419 DisplayName: "Name", 420 Name: "zz" + model.NewId(), 421 Email: MakeEmail(), 422 Type: model.TEAM_OPEN, 423 SchemeId: &teamScheme2.Id, 424 } 425 team2, err = ss.Team().Save(team2) 426 require.NoError(t, err) 427 defer ss.Team().PermanentDelete(team2.Id) 428 429 channel1 := &model.Channel{ 430 TeamId: team1.Id, 431 DisplayName: "Display " + model.NewId(), 432 Name: "zz" + model.NewId() + "b", 433 Type: model.CHANNEL_OPEN, 434 SchemeId: &channelScheme1.Id, 435 } 436 channel1, nErr := ss.Channel().Save(channel1, -1) 437 require.NoError(t, nErr) 438 defer ss.Channel().Delete(channel1.Id, 0) 439 440 channel2 := &model.Channel{ 441 TeamId: team2.Id, 442 DisplayName: "Display " + model.NewId(), 443 Name: "zz" + model.NewId() + "b", 444 Type: model.CHANNEL_OPEN, 445 SchemeId: &channelScheme2.Id, 446 } 447 channel2, nErr = ss.Channel().Save(channel2, -1) 448 require.NoError(t, nErr) 449 defer ss.Channel().Delete(channel2.Id, 0) 450 451 t.Run("ChannelRolesUnderTeamRole", func(t *testing.T) { 452 t.Run("guest role for the right team's channels are returned", func(t *testing.T) { 453 actualRoles, err := ss.Role().ChannelRolesUnderTeamRole(teamScheme1.DefaultChannelGuestRole) 454 require.NoError(t, err) 455 456 var actualRoleNames []string 457 for _, role := range actualRoles { 458 actualRoleNames = append(actualRoleNames, role.Name) 459 } 460 461 require.Contains(t, actualRoleNames, channelScheme1.DefaultChannelGuestRole) 462 require.NotContains(t, actualRoleNames, channelScheme2.DefaultChannelGuestRole) 463 }) 464 465 t.Run("user role for the right team's channels are returned", func(t *testing.T) { 466 actualRoles, err := ss.Role().ChannelRolesUnderTeamRole(teamScheme1.DefaultChannelUserRole) 467 require.NoError(t, err) 468 469 var actualRoleNames []string 470 for _, role := range actualRoles { 471 actualRoleNames = append(actualRoleNames, role.Name) 472 } 473 474 require.Contains(t, actualRoleNames, channelScheme1.DefaultChannelUserRole) 475 require.NotContains(t, actualRoleNames, channelScheme2.DefaultChannelUserRole) 476 }) 477 478 t.Run("admin role for the right team's channels are returned", func(t *testing.T) { 479 actualRoles, err := ss.Role().ChannelRolesUnderTeamRole(teamScheme1.DefaultChannelAdminRole) 480 require.NoError(t, err) 481 482 var actualRoleNames []string 483 for _, role := range actualRoles { 484 actualRoleNames = append(actualRoleNames, role.Name) 485 } 486 487 require.Contains(t, actualRoleNames, channelScheme1.DefaultChannelAdminRole) 488 require.NotContains(t, actualRoleNames, channelScheme2.DefaultChannelAdminRole) 489 }) 490 }) 491 492 t.Run("AllChannelSchemeRoles", func(t *testing.T) { 493 t.Run("guest role for the right team's channels are returned", func(t *testing.T) { 494 actualRoles, err := ss.Role().AllChannelSchemeRoles() 495 require.NoError(t, err) 496 497 var actualRoleNames []string 498 for _, role := range actualRoles { 499 actualRoleNames = append(actualRoleNames, role.Name) 500 } 501 502 allRoleNames := []string{ 503 channelScheme1.DefaultChannelGuestRole, 504 channelScheme2.DefaultChannelGuestRole, 505 506 channelScheme1.DefaultChannelUserRole, 507 channelScheme2.DefaultChannelUserRole, 508 509 channelScheme1.DefaultChannelAdminRole, 510 channelScheme2.DefaultChannelAdminRole, 511 } 512 513 for _, roleName := range allRoleNames { 514 require.Contains(t, actualRoleNames, roleName) 515 } 516 }) 517 }) 518 } 519 520 func testRoleStoreChannelHigherScopedPermissionsBlankTeamSchemeChannelGuest(t *testing.T, ss store.Store, s SqlStore) { 521 teamScheme := &model.Scheme{ 522 DisplayName: model.NewId(), 523 Name: model.NewId(), 524 Description: model.NewId(), 525 Scope: model.SCHEME_SCOPE_TEAM, 526 } 527 teamScheme, err := ss.Scheme().Save(teamScheme) 528 require.NoError(t, err) 529 defer ss.Scheme().Delete(teamScheme.Id) 530 531 channelScheme := &model.Scheme{ 532 DisplayName: model.NewId(), 533 Name: model.NewId(), 534 Description: model.NewId(), 535 Scope: model.SCHEME_SCOPE_CHANNEL, 536 } 537 channelScheme, err = ss.Scheme().Save(channelScheme) 538 require.NoError(t, err) 539 defer ss.Scheme().Delete(channelScheme.Id) 540 541 team := &model.Team{ 542 DisplayName: "Name", 543 Name: "zz" + model.NewId(), 544 Email: MakeEmail(), 545 Type: model.TEAM_OPEN, 546 SchemeId: &teamScheme.Id, 547 } 548 team, err = ss.Team().Save(team) 549 require.NoError(t, err) 550 defer ss.Team().PermanentDelete(team.Id) 551 552 channel := &model.Channel{ 553 TeamId: team.Id, 554 DisplayName: "Display " + model.NewId(), 555 Name: "zz" + model.NewId() + "b", 556 Type: model.CHANNEL_OPEN, 557 SchemeId: &channelScheme.Id, 558 } 559 channel, nErr := ss.Channel().Save(channel, -1) 560 require.NoError(t, nErr) 561 defer ss.Channel().Delete(channel.Id, 0) 562 563 channelSchemeUserRole, err := ss.Role().GetByName(context.Background(), channelScheme.DefaultChannelUserRole) 564 require.NoError(t, err) 565 channelSchemeUserRole.Permissions = []string{} 566 _, err = ss.Role().Save(channelSchemeUserRole) 567 require.NoError(t, err) 568 569 teamSchemeUserRole, err := ss.Role().GetByName(context.Background(), teamScheme.DefaultChannelUserRole) 570 require.NoError(t, err) 571 teamSchemeUserRole.Permissions = []string{model.PERMISSION_UPLOAD_FILE.Id} 572 _, err = ss.Role().Save(teamSchemeUserRole) 573 require.NoError(t, err) 574 575 // get the channel scheme user role again and ensure that it has the permission inherited from the team 576 // scheme user role 577 roleMapBefore, err := ss.Role().ChannelHigherScopedPermissions([]string{channelSchemeUserRole.Name}) 578 require.NoError(t, err) 579 580 // blank-out the guest role to simulate an old team scheme, ensure it's blank 581 result, sqlErr := s.GetMaster().Exec(fmt.Sprintf("UPDATE Schemes SET DefaultChannelGuestRole = '' WHERE Id = '%s'", teamScheme.Id)) 582 require.NoError(t, sqlErr) 583 rows, serr := result.RowsAffected() 584 require.NoError(t, serr) 585 require.Equal(t, int64(1), rows) 586 teamScheme, err = ss.Scheme().Get(teamScheme.Id) 587 require.NoError(t, err) 588 require.Equal(t, "", teamScheme.DefaultChannelGuestRole) 589 590 // trigger a cache clear 591 _, err = ss.Role().Save(channelSchemeUserRole) 592 require.NoError(t, err) 593 594 roleMapAfter, err := ss.Role().ChannelHigherScopedPermissions([]string{channelSchemeUserRole.Name}) 595 require.NoError(t, err) 596 597 require.Equal(t, len(roleMapBefore), len(roleMapAfter)) 598 }