diff --git a/api4/user_test.go b/api4/user_test.go index 2f4079a92d..f17c63206d 100644 --- a/api4/user_test.go +++ b/api4/user_test.go @@ -15,6 +15,7 @@ import ( "github.com/mattermost/mattermost-server/v5/app" "github.com/mattermost/mattermost-server/v5/model" "github.com/mattermost/mattermost-server/v5/services/mailservice" + "github.com/mattermost/mattermost-server/v5/store/localcachelayer" "github.com/mattermost/mattermost-server/v5/utils/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -4341,3 +4342,114 @@ func TestLoginLockout(t *testing.T) { _, resp = th.Client.Login(th.BasicUser2.Email, th.BasicUser2.Password) CheckErrorMessage(t, resp, "api.user.check_user_login_attempts.too_many.app_error") } + +func TestDemoteUserToGuest(t *testing.T) { + t.Run("websocket update user event", func(t *testing.T) { + th := Setup().InitBasic() + th.Server.Store = localcachelayer.NewLocalCacheLayer(th.Server.Store, + th.Server.Metrics, th.Server.Cluster, th.Server.CacheProvider) + defer th.TearDown() + + user := th.BasicUser + + webSocketClient, err := th.CreateWebSocketClient() + assert.Nil(t, err) + defer webSocketClient.Close() + + webSocketClient.Listen() + + time.Sleep(300 * time.Millisecond) + resp := <-webSocketClient.ResponseChannel + require.Equal(t, model.STATUS_OK, resp.Status) + + adminWebSocketClient, err := th.CreateWebSocketSystemAdminClient() + assert.Nil(t, err) + defer adminWebSocketClient.Close() + + adminWebSocketClient.Listen() + + time.Sleep(300 * time.Millisecond) + resp = <-adminWebSocketClient.ResponseChannel + require.Equal(t, model.STATUS_OK, resp.Status) + + enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable + defer func() { + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts }) + th.App.RemoveLicense() + }() + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) + th.App.SetLicense(model.NewTestLicense()) + _, respErr := th.SystemAdminClient.GetUser(user.Id, "") + CheckNoError(t, respErr) + _, respErr = th.SystemAdminClient.DemoteUserToGuest(user.Id) + CheckNoError(t, respErr) + + assertExpectedWebsocketEvent(t, webSocketClient, model.WEBSOCKET_EVENT_USER_UPDATED, func(event *model.WebSocketEvent) { + eventUser, ok := event.GetData()["user"].(*model.User) + require.True(t, ok, "expected user") + assert.Equal(t, "system_guest", eventUser.Roles) + }) + assertExpectedWebsocketEvent(t, adminWebSocketClient, model.WEBSOCKET_EVENT_USER_UPDATED, func(event *model.WebSocketEvent) { + eventUser, ok := event.GetData()["user"].(*model.User) + require.True(t, ok, "expected user") + assert.Equal(t, "system_guest", eventUser.Roles) + }) + th.App.InvalidateAllCaches() + }) +} + +func TestPromoteGuestToUser(t *testing.T) { + t.Run("websocket update user event", func(t *testing.T) { + th := Setup().InitBasic() + th.Server.Store = localcachelayer.NewLocalCacheLayer(th.Server.Store, + th.Server.Metrics, th.Server.Cluster, th.Server.CacheProvider) + defer th.TearDown() + + user := th.BasicUser + th.App.UpdateUserRoles(user.Id, model.SYSTEM_GUEST_ROLE_ID, false) + + webSocketClient, err := th.CreateWebSocketClient() + assert.Nil(t, err) + defer webSocketClient.Close() + + webSocketClient.Listen() + + time.Sleep(300 * time.Millisecond) + resp := <-webSocketClient.ResponseChannel + require.Equal(t, model.STATUS_OK, resp.Status) + + adminWebSocketClient, err := th.CreateWebSocketSystemAdminClient() + assert.Nil(t, err) + defer adminWebSocketClient.Close() + + adminWebSocketClient.Listen() + + time.Sleep(300 * time.Millisecond) + resp = <-adminWebSocketClient.ResponseChannel + require.Equal(t, model.STATUS_OK, resp.Status) + + enableGuestAccounts := *th.App.Config().GuestAccountsSettings.Enable + defer func() { + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = enableGuestAccounts }) + th.App.RemoveLicense() + }() + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.GuestAccountsSettings.Enable = true }) + th.App.SetLicense(model.NewTestLicense()) + _, respErr := th.SystemAdminClient.GetUser(user.Id, "") + CheckNoError(t, respErr) + _, respErr = th.SystemAdminClient.PromoteGuestToUser(user.Id) + CheckNoError(t, respErr) + + assertExpectedWebsocketEvent(t, webSocketClient, model.WEBSOCKET_EVENT_USER_UPDATED, func(event *model.WebSocketEvent) { + eventUser, ok := event.GetData()["user"].(*model.User) + require.True(t, ok, "expected user") + assert.Equal(t, "system_user", eventUser.Roles) + }) + assertExpectedWebsocketEvent(t, adminWebSocketClient, model.WEBSOCKET_EVENT_USER_UPDATED, func(event *model.WebSocketEvent) { + eventUser, ok := event.GetData()["user"].(*model.User) + require.True(t, ok, "expected user") + assert.Equal(t, "system_user", eventUser.Roles) + }) + th.App.InvalidateAllCaches() + }) +} diff --git a/app/user.go b/app/user.go index a3b03b0b07..eda8dfeff5 100644 --- a/app/user.go +++ b/app/user.go @@ -2269,6 +2269,7 @@ func (a *App) getListOfAllowedChannelsForTeam(teamId string, viewRestrictions *m // guest roles to regular user roles. func (a *App) PromoteGuestToUser(user *model.User, requestorId string) *model.AppError { err := a.Srv.Store.User().PromoteGuestToUser(user.Id) + a.InvalidateCacheForUser(user.Id) if err != nil { return err } @@ -2314,7 +2315,6 @@ func (a *App) PromoteGuestToUser(user *model.User, requestorId string) *model.Ap } } - a.InvalidateCacheForUser(user.Id) a.ClearSessionCacheForUser(user.Id) return nil } @@ -2323,6 +2323,7 @@ func (a *App) PromoteGuestToUser(user *model.User, requestorId string) *model.Ap // regular user roles to guest roles. func (a *App) DemoteUserToGuest(user *model.User) *model.AppError { err := a.Srv.Store.User().DemoteUserToGuest(user.Id) + a.InvalidateCacheForUser(user.Id) if err != nil { return err } @@ -2357,7 +2358,6 @@ func (a *App) DemoteUserToGuest(user *model.User) *model.AppError { } } - a.InvalidateCacheForUser(user.Id) a.ClearSessionCacheForUser(user.Id) return nil