diff --git a/api4/apitestlib.go b/api4/apitestlib.go index e7754c2817..32bf4c09b6 100644 --- a/api4/apitestlib.go +++ b/api4/apitestlib.go @@ -136,7 +136,7 @@ func setupTestHelper(dbStore store.Store, searchEngine *searchengine.Broker, ent } th := &TestHelper{ - App: app.New(app.ServerConnector(s)), + App: app.New(app.ServerConnector(s.Channels())), Server: s, ConfigStore: configStore, IncludeCacheLayer: includeCache, diff --git a/app/app.go b/app/app.go index 252fcef0e7..bd929472dc 100644 --- a/app/app.go +++ b/app/app.go @@ -24,7 +24,7 @@ import ( // It is a request-scoped struct constructed every time a request hits the server, // and its only purpose is to provide business logic to Server via its methods. type App struct { - srv *Server + ch *Channels } func New(options ...AppOption) *App { @@ -82,56 +82,56 @@ func (s *Server) getFirstServerRunTimestamp() (int64, *model.AppError) { } func (a *App) Srv() *Server { - return a.srv + return a.ch.srv } func (a *App) Log() *mlog.Logger { - return a.srv.Log + return a.ch.srv.Log } func (a *App) NotificationsLog() *mlog.Logger { - return a.srv.NotificationsLog + return a.ch.srv.NotificationsLog } func (a *App) AccountMigration() einterfaces.AccountMigrationInterface { - return a.srv.AccountMigration + return a.ch.srv.AccountMigration } func (a *App) Cluster() einterfaces.ClusterInterface { - return a.srv.Cluster + return a.ch.srv.Cluster } func (a *App) Compliance() einterfaces.ComplianceInterface { - return a.srv.Compliance + return a.ch.srv.Compliance } func (a *App) DataRetention() einterfaces.DataRetentionInterface { - return a.srv.DataRetention + return a.ch.srv.DataRetention } func (a *App) SearchEngine() *searchengine.Broker { - return a.srv.SearchEngine + return a.ch.srv.SearchEngine } func (a *App) Ldap() einterfaces.LdapInterface { - return a.srv.Ldap + return a.ch.srv.Ldap } func (a *App) MessageExport() einterfaces.MessageExportInterface { - return a.srv.MessageExport + return a.ch.srv.MessageExport } func (a *App) Metrics() einterfaces.MetricsInterface { - return a.srv.Metrics + return a.ch.srv.Metrics } func (a *App) Notification() einterfaces.NotificationInterface { - return a.srv.Notification + return a.ch.srv.Notification } func (a *App) Saml() einterfaces.SamlInterface { - return a.srv.Saml + return a.ch.srv.Saml } func (a *App) Cloud() einterfaces.CloudInterface { - return a.srv.Cloud + return a.ch.srv.Cloud } func (a *App) HTTPService() httpservice.HTTPService { - return a.srv.httpService + return a.ch.httpService } func (a *App) ImageProxy() *imageproxy.ImageProxy { - return a.srv.ImageProxy + return a.ch.srv.ImageProxy } func (a *App) Timezones() *timezones.Timezones { - return a.srv.timezones + return a.ch.srv.timezones } func (a *App) DBHealthCheckWrite() error { @@ -156,8 +156,12 @@ func (a *App) CheckIntegrity() <-chan model.IntegrityCheckResult { return a.Srv().Store.CheckIntegrity() } +func (a *App) SetChannels(ch *Channels) { + a.ch = ch +} + func (a *App) SetServer(srv *Server) { - a.srv = srv + a.ch.srv = srv } func (a *App) UpdateExpiredDNDStatuses() ([]*model.Status, error) { diff --git a/app/app_iface.go b/app/app_iface.go index f129aa5001..ef3cca2450 100644 --- a/app/app_iface.go +++ b/app/app_iface.go @@ -990,6 +990,7 @@ type AppIface interface { SessionHasPermissionToUserOrBot(session model.Session, userID string) bool SetActiveChannel(userID string, channelID string) *model.AppError SetAutoResponderStatus(user *model.User, oldNotifyProps model.StringMap) + SetChannels(ch *Channels) SetCustomStatus(userID string, cs *model.CustomStatus) *model.AppError SetDefaultProfileImage(user *model.User) *model.AppError SetPhase2PermissionsMigrationStatus(isComplete bool) error diff --git a/app/brand.go b/app/brand.go index b543bbfff8..0465dff32a 100644 --- a/app/brand.go +++ b/app/brand.go @@ -32,13 +32,13 @@ func (a *App) SaveBrandImage(imageData *multipart.FileHeader) *model.AppError { return model.NewAppError("SaveBrandImage", "brand.save_brand_image.check_image_limits.app_error", nil, err.Error(), http.StatusBadRequest) } - img, _, err := a.srv.imgDecoder.Decode(file) + img, _, err := a.ch.srv.imgDecoder.Decode(file) if err != nil { return model.NewAppError("SaveBrandImage", "brand.save_brand_image.decode.app_error", nil, err.Error(), http.StatusBadRequest) } buf := new(bytes.Buffer) - err = a.srv.imgEncoder.EncodePNG(buf, img) + err = a.ch.srv.imgEncoder.EncodePNG(buf, img) if err != nil { return model.NewAppError("SaveBrandImage", "brand.save_brand_image.encode.app_error", nil, err.Error(), http.StatusInternalServerError) } diff --git a/app/channel_test.go b/app/channel_test.go index 3f7fd4c297..3af2f90205 100644 --- a/app/channel_test.go +++ b/app/channel_test.go @@ -1972,12 +1972,12 @@ func TestMarkChannelsAsViewedPanic(t *testing.T) { mockSessionStore := mocks.SessionStore{} mockOAuthStore := mocks.OAuthStore{} var err error - th.App.srv.userService, err = users.New(users.ServiceConfig{ + th.App.ch.srv.userService, err = users.New(users.ServiceConfig{ UserStore: &mockUserStore, SessionStore: &mockSessionStore, OAuthStore: &mockOAuthStore, - ConfigFn: th.App.srv.Config, - LicenseFn: th.App.srv.License, + ConfigFn: th.App.ch.srv.Config, + LicenseFn: th.App.ch.srv.License, }) require.NoError(t, err) mockPreferenceStore := mocks.PreferenceStore{} diff --git a/app/channels.go b/app/channels.go index 6ae4a057e6..1aefcb4793 100644 --- a/app/channels.go +++ b/app/channels.go @@ -3,9 +3,13 @@ package app +import "github.com/mattermost/mattermost-server/v6/services/httpservice" + // Channels contains all channels related state. type Channels struct { - s *Server + srv *Server + + httpService httpservice.HTTPService } func init() { @@ -16,7 +20,8 @@ func init() { func NewChannels(s *Server) (*Channels, error) { return &Channels{ - s: s, + srv: s, + httpService: httpservice.MakeHTTPService(s), }, nil } @@ -27,3 +32,7 @@ func (c *Channels) Start() error { func (c *Channels) Stop() error { return nil } + +func (c *Channels) HTTPService() httpservice.HTTPService { + return c.httpService +} diff --git a/app/expirynotify.go b/app/expirynotify.go index 78973d3011..efee6ce939 100644 --- a/app/expirynotify.go +++ b/app/expirynotify.go @@ -19,14 +19,14 @@ const ( func (a *App) NotifySessionsExpired() *model.AppError { if *a.Config().EmailSettings.SendPushNotifications { pushServer := *a.Config().EmailSettings.PushNotificationServer - if license := a.srv.License(); pushServer == model.MHPNS && (license == nil || !*license.Features.MHPNS) { + if license := a.ch.srv.License(); pushServer == model.MHPNS && (license == nil || !*license.Features.MHPNS) { mlog.Warn("Push notifications are disabled. Go to System Console > Notifications > Mobile Push to enable them.") return nil } } // Get all mobile sessions that expired within the last hour. - sessions, err := a.srv.Store.Session().GetSessionsExpired(OneHourMillis, true, true) + sessions, err := a.ch.srv.Store.Session().GetSessionsExpired(OneHourMillis, true, true) if err != nil { return model.NewAppError("NotifySessionsExpired", "app.session.analytics_session_count.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -66,7 +66,7 @@ func (a *App) NotifySessionsExpired() *model.AppError { a.Metrics().IncrementPostSentPush() } - err = a.srv.Store.Session().UpdateExpiredNotify(session.Id, true) + err = a.ch.srv.Store.Session().UpdateExpiredNotify(session.Id, true) if err != nil { mlog.Error("Failed to update ExpiredNotify flag", mlog.String("sessionid", session.Id), mlog.Err(err)) } diff --git a/app/file.go b/app/file.go index 793a1d79d3..2643424452 100644 --- a/app/file.go +++ b/app/file.go @@ -98,7 +98,7 @@ func (a *App) TestFileStoreConnectionWithConfig(cfg *model.FileSettings) *model. } func (a *App) ReadFile(path string) ([]byte, *model.AppError) { - return a.srv.ReadFile(path) + return a.ch.srv.ReadFile(path) } func (s *Server) fileReader(path string) (filestore.ReadCloseSeeker, *model.AppError) { @@ -703,8 +703,8 @@ func (a *App) UploadFileX(c *request.Context, channelID, name string, input io.R Input: input, maxFileSize: *a.Config().FileSettings.MaxFileSize, maxImageRes: *a.Config().FileSettings.MaxImageResolution, - imgDecoder: a.srv.imgDecoder, - imgEncoder: a.srv.imgEncoder, + imgDecoder: a.ch.srv.imgDecoder, + imgEncoder: a.ch.srv.imgEncoder, } for _, o := range opts { o(t) @@ -1040,7 +1040,7 @@ func (a *App) HandleImages(previewPathList []string, thumbnailPathList []string, wg := new(sync.WaitGroup) for i := range fileData { - img, release, err := prepareImage(a.srv.imgDecoder, bytes.NewReader(fileData[i])) + img, release, err := prepareImage(a.ch.srv.imgDecoder, bytes.NewReader(fileData[i])) if err != nil { mlog.Debug("Failed to prepare image", mlog.Err(err)) continue @@ -1088,7 +1088,7 @@ func prepareImage(imgDecoder *imaging.Decoder, imgData io.ReadSeeker) (img image func (a *App) generateThumbnailImage(img image.Image, thumbnailPath string) { var buf bytes.Buffer - if err := a.srv.imgEncoder.EncodeJPEG(&buf, imaging.GenerateThumbnail(img, imageThumbnailWidth, imageThumbnailHeight), jpegEncQuality); err != nil { + if err := a.ch.srv.imgEncoder.EncodeJPEG(&buf, imaging.GenerateThumbnail(img, imageThumbnailWidth, imageThumbnailHeight), jpegEncQuality); err != nil { mlog.Error("Unable to encode image as jpeg", mlog.String("path", thumbnailPath), mlog.Err(err)) return } @@ -1103,7 +1103,7 @@ func (a *App) generatePreviewImage(img image.Image, previewPath string) { var buf bytes.Buffer preview := imaging.GeneratePreview(img, imagePreviewWidth) - if err := a.srv.imgEncoder.EncodeJPEG(&buf, preview, jpegEncQuality); err != nil { + if err := a.ch.srv.imgEncoder.EncodeJPEG(&buf, preview, jpegEncQuality); err != nil { mlog.Error("Unable to encode image as preview jpg", mlog.Err(err), mlog.String("path", previewPath)) return } @@ -1124,7 +1124,7 @@ func (a *App) generateMiniPreview(fi *model.FileInfo) { return } defer file.Close() - img, release, err := prepareImage(a.srv.imgDecoder, file) + img, release, err := prepareImage(a.ch.srv.imgDecoder, file) if err != nil { mlog.Debug("generateMiniPreview: prepareImage failed", mlog.Err(err), mlog.String("fileinfo_id", fi.Id), mlog.String("channel_id", fi.ChannelId), diff --git a/app/helper_test.go b/app/helper_test.go index 890eee5c39..359c2780e5 100644 --- a/app/helper_test.go +++ b/app/helper_test.go @@ -98,7 +98,7 @@ func setupTestHelper(dbStore store.Store, enterprise bool, includeCacheLayer boo } th := &TestHelper{ - App: New(ServerConnector(s)), + App: New(ServerConnector(s.Channels())), Context: &request.Context{}, Server: s, LogBuffer: buffer, diff --git a/app/import_functions.go b/app/import_functions.go index fe5a508170..78ef2692b7 100644 --- a/app/import_functions.go +++ b/app/import_functions.go @@ -485,7 +485,7 @@ func (a *App) importUser(data *UserImportData, dryRun bool) *model.AppError { var savedUser *model.User var err error if user.Id == "" { - if savedUser, err = a.srv.userService.CreateUser(user, users.UserCreateOptions{FromImport: true}); err != nil { + if savedUser, err = a.ch.srv.userService.CreateUser(user, users.UserCreateOptions{FromImport: true}); err != nil { var appErr *model.AppError var invErr *store.ErrInvalidInput switch { diff --git a/app/integration_action.go b/app/integration_action.go index 941a276875..a09713c609 100644 --- a/app/integration_action.go +++ b/app/integration_action.go @@ -423,7 +423,7 @@ func (a *App) doPluginRequest(c *request.Context, method, rawURL string, values params["plugin_id"] = pluginID r = mux.SetURLVars(r, params) - a.srv.ServePluginRequest(w, r) + a.ch.srv.ServePluginRequest(w, r) resp := &http.Response{ StatusCode: w.status, diff --git a/app/login.go b/app/login.go index eac0436c6d..148a443f50 100644 --- a/app/login.go +++ b/app/login.go @@ -177,7 +177,7 @@ func (a *App) DoLogin(c *request.Context, w http.ResponseWriter, r *http.Request session.GenerateCSRF() if deviceID != "" { - a.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthMobileInDays) + a.ch.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthMobileInDays) // A special case where we logout of all other sessions with the same Id if err := a.RevokeSessionsForDeviceId(user.Id, deviceID, ""); err != nil { @@ -185,11 +185,11 @@ func (a *App) DoLogin(c *request.Context, w http.ResponseWriter, r *http.Request return err } } else if isMobile { - a.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthMobileInDays) + a.ch.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthMobileInDays) } else if isOAuthUser || isSaml { - a.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthSSOInDays) + a.ch.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthSSOInDays) } else { - a.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthWebInDays) + a.ch.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthWebInDays) } ua := uasurfer.Parse(r.UserAgent()) diff --git a/app/notification_push.go b/app/notification_push.go index fa4c962c05..862bde9ead 100644 --- a/app/notification_push.go +++ b/app/notification_push.go @@ -281,7 +281,7 @@ func (s *Server) createPushNotificationsHub() { buffer := *s.Config().EmailSettings.PushNotificationBuffer hub := PushNotificationsHub{ notificationsChan: make(chan PushNotification, buffer), - app: New(ServerConnector(s)), + app: New(ServerConnector(s.Channels())), wg: new(sync.WaitGroup), semaWg: new(sync.WaitGroup), sema: make(chan struct{}, runtime.NumCPU()*8), // numCPU * 8 is a good amount of concurrency. diff --git a/app/notification_push_test.go b/app/notification_push_test.go index 044882897c..6a8538b6f8 100644 --- a/app/notification_push_test.go +++ b/app/notification_push_test.go @@ -1380,8 +1380,13 @@ func TestPushNotificationRace(t *testing.T) { s := &Server{ configStore: memoryStore, Store: mockStore, + products: make(map[string]Product), } - app := New(ServerConnector(s)) + ch, err := NewChannels(s) + require.NoError(t, err) + s.products["channels"] = ch + + app := New(ServerConnector(s.Channels())) require.NotPanics(t, func() { s.createPushNotificationsHub() diff --git a/app/oauth.go b/app/oauth.go index 12c4de5fd0..ea747fb75d 100644 --- a/app/oauth.go +++ b/app/oauth.go @@ -371,7 +371,7 @@ func (a *App) newSession(appName string, user *model.User) (*model.Session, *mod // Set new token an session session := &model.Session{UserId: user.Id, Roles: user.Roles, IsOAuth: true} session.GenerateCSRF() - a.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthSSOInDays) + a.ch.srv.userService.SetSessionExpireInDays(session, *a.Config().ServiceSettings.SessionLengthSSOInDays) session.AddProp(model.SessionPropPlatform, appName) session.AddProp(model.SessionPropOs, "OAuth2") session.AddProp(model.SessionPropBrowser, "OAuth2") @@ -381,7 +381,7 @@ func (a *App) newSession(appName string, user *model.User) (*model.Session, *mod return nil, model.NewAppError("newSession", "api.oauth.get_access_token.internal_session.app_error", nil, "", http.StatusInternalServerError) } - a.srv.userService.AddSessionToCache(session) + a.ch.srv.userService.AddSessionToCache(session) return session, nil } @@ -520,7 +520,7 @@ func (a *App) RegenerateOAuthAppSecret(app *model.OAuthApp) (*model.OAuthApp, *m } func (a *App) RevokeAccessToken(token string) *model.AppError { - if err := a.srv.userService.RevokeAccessToken(token); err != nil { + if err := a.ch.srv.userService.RevokeAccessToken(token); err != nil { switch { case errors.Is(err, users.GetTokenError): return model.NewAppError("RevokeAccessToken", "api.oauth.revoke_access_token.get.app_error", nil, err.Error(), http.StatusBadRequest) diff --git a/app/oauth_test.go b/app/oauth_test.go index 2dae3859e8..7b0ccd492a 100644 --- a/app/oauth_test.go +++ b/app/oauth_test.go @@ -107,7 +107,7 @@ func TestOAuthDeleteApp(t *testing.T) { session.Token = model.NewId() session.Roles = model.SystemUserRoleId session.IsOAuth = true - th.App.srv.userService.SetSessionExpireInDays(session, 1) + th.App.ch.srv.userService.SetSessionExpireInDays(session, 1) session, _ = th.App.CreateSession(session) diff --git a/app/opentracing/opentracing_layer.go b/app/opentracing/opentracing_layer.go index c9b6e649ec..45d798e935 100644 --- a/app/opentracing/opentracing_layer.go +++ b/app/opentracing/opentracing_layer.go @@ -14692,6 +14692,21 @@ func (a *OpenTracingAppLayer) SetAutoResponderStatus(user *model.User, oldNotify a.app.SetAutoResponderStatus(user, oldNotifyProps) } +func (a *OpenTracingAppLayer) SetChannels(ch *app.Channels) { + origCtx := a.ctx + span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.SetChannels") + + a.ctx = newCtx + a.app.Srv().Store.SetContext(newCtx) + defer func() { + a.app.Srv().Store.SetContext(origCtx) + a.ctx = origCtx + }() + + defer span.Finish() + a.app.SetChannels(ch) +} + func (a *OpenTracingAppLayer) SetCustomStatus(userID string, cs *model.CustomStatus) *model.AppError { origCtx := a.ctx span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.SetCustomStatus") diff --git a/app/options.go b/app/options.go index 462b2d9ba8..167816fb0f 100644 --- a/app/options.go +++ b/app/options.go @@ -106,8 +106,8 @@ func SkipPostInitializiation() Option { type AppOption func(a *App) type AppOptionCreator func() []AppOption -func ServerConnector(s *Server) AppOption { +func ServerConnector(ch *Channels) AppOption { return func(a *App) { - a.srv = s + a.ch = ch } } diff --git a/app/permissions_migrations.go b/app/permissions_migrations.go index 9f2c91bbca..249728ee0b 100644 --- a/app/permissions_migrations.go +++ b/app/permissions_migrations.go @@ -921,7 +921,7 @@ func (a *App) DoPermissionsMigrations() error { } func (s *Server) doPermissionsMigrations() error { - a := New(ServerConnector(s)) + a := New(ServerConnector(s.Channels())) PermissionsMigrations := []struct { Key string Migration func() (permissionsMap, error) diff --git a/app/plugin.go b/app/plugin.go index 02e73b6543..e9d70a5d77 100644 --- a/app/plugin.go +++ b/app/plugin.go @@ -196,7 +196,7 @@ func (s *Server) initPlugins(c *request.Context, pluginDir, webappPluginDir stri } newAPIFunc := func(manifest *model.Manifest) plugin.API { - return New(ServerConnector(s)).NewPluginAPI(c, manifest) + return New(ServerConnector(s.Channels())).NewPluginAPI(c, manifest) } env, err := plugin.NewEnvironment(newAPIFunc, NewDriverImpl(s), pluginDir, webappPluginDir, s.Log, s.Metrics) diff --git a/app/plugin_api_test.go b/app/plugin_api_test.go index ac7ccc02c1..92c6a64383 100644 --- a/app/plugin_api_test.go +++ b/app/plugin_api_test.go @@ -92,7 +92,7 @@ func setupMultiPluginAPITest(t *testing.T, pluginCodes []string, pluginManifests return app.NewPluginAPI(c, manifest) } - env, err := plugin.NewEnvironment(newPluginAPI, NewDriverImpl(app.srv), pluginDir, webappPluginDir, app.Log(), nil) + env, err := plugin.NewEnvironment(newPluginAPI, NewDriverImpl(app.Srv()), pluginDir, webappPluginDir, app.Log(), nil) require.NoError(t, err) require.Equal(t, len(pluginCodes), len(pluginIDs)) @@ -867,7 +867,7 @@ func TestInstallPlugin(t *testing.T) { return app.NewPluginAPI(c, manifest) } - env, err := plugin.NewEnvironment(newPluginAPI, NewDriverImpl(app.srv), pluginDir, webappPluginDir, app.Log(), nil) + env, err := plugin.NewEnvironment(newPluginAPI, NewDriverImpl(app.Srv()), pluginDir, webappPluginDir, app.Log(), nil) require.NoError(t, err) app.SetPluginsEnvironment(env) @@ -1066,7 +1066,7 @@ func pluginAPIHookTest(t *testing.T, th *TestHelper, fileName string, id string, if settingsSchema != "" { schema = settingsSchema } - th.App.srv.sqlStore = th.GetSqlStore() + th.App.ch.srv.sqlStore = th.GetSqlStore() setupPluginAPITest(t, code, fmt.Sprintf(`{"id": "%v", "server": {"executable": "backend.exe"}, "settings_schema": %v}`, id, schema), id, th.App, th.Context) diff --git a/app/plugin_hooks_test.go b/app/plugin_hooks_test.go index 3298493941..e8d9a1397c 100644 --- a/app/plugin_hooks_test.go +++ b/app/plugin_hooks_test.go @@ -34,7 +34,7 @@ func SetAppEnvironmentWithPlugins(t *testing.T, pluginCode []string, app *App, a webappPluginDir, err := ioutil.TempDir("", "") require.NoError(t, err) - env, err := plugin.NewEnvironment(apiFunc, NewDriverImpl(app.srv), pluginDir, webappPluginDir, app.Log(), nil) + env, err := plugin.NewEnvironment(apiFunc, NewDriverImpl(app.Srv()), pluginDir, webappPluginDir, app.Log(), nil) require.NoError(t, err) app.SetPluginsEnvironment(env) diff --git a/app/plugin_requests.go b/app/plugin_requests.go index 4006a32301..8b044c1f6a 100644 --- a/app/plugin_requests.go +++ b/app/plugin_requests.go @@ -141,7 +141,7 @@ func (s *Server) servePluginRequest(w http.ResponseWriter, r *http.Request, hand r.Header.Del("Mattermost-User-Id") if token != "" { - session, err := New(ServerConnector(s)).GetSession(token) + session, err := New(ServerConnector(s.Channels())).GetSession(token) defer s.userService.ReturnSessionToPool(session) csrfCheckPassed := false diff --git a/app/plugin_requests_test.go b/app/plugin_requests_test.go index 5a35aa7f4b..20a6fc5af1 100644 --- a/app/plugin_requests_test.go +++ b/app/plugin_requests_test.go @@ -4,43 +4,27 @@ package app import ( - "hash/maphash" "net/http" "net/http/httptest" "testing" - "github.com/gorilla/mux" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/mattermost/mattermost-server/v6/config" "github.com/mattermost/mattermost-server/v6/model" ) func TestServePluginPublicRequest(t *testing.T) { t.Run("returns not found when plugins environment is nil", func(t *testing.T) { - cfg := model.Config{} - cfg.SetDefaults() - configStore := config.NewTestMemoryStore() - configStore.Set(&cfg) - - srv := &Server{ - goroutineExitSignal: make(chan struct{}, 1), - RootRouter: mux.NewRouter(), - LocalRouter: mux.NewRouter(), - licenseListeners: map[string]func(*model.License, *model.License){}, - hashSeed: maphash.MakeSeed(), - uploadLockMap: map[string]bool{}, - configStore: configStore, - } - app := New(ServerConnector(srv)) - app.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = true }) + th := Setup(t) + defer th.TearDown() + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.PluginSettings.Enable = true }) req, err := http.NewRequest("GET", "/plugins", nil) require.NoError(t, err) rr := httptest.NewRecorder() - handler := http.HandlerFunc(srv.ServePluginPublicRequest) + handler := http.HandlerFunc(th.App.Srv().ServePluginPublicRequest) handler.ServeHTTP(rr, req) assert.Equal(t, http.StatusNotFound, rr.Code) diff --git a/app/plugin_test.go b/app/plugin_test.go index c85f4f61b2..c12494854e 100644 --- a/app/plugin_test.go +++ b/app/plugin_test.go @@ -342,7 +342,7 @@ func TestServePluginRequest(t *testing.T) { w := httptest.NewRecorder() r := httptest.NewRequest("GET", "/plugins/foo/bar", nil) - th.App.srv.ServePluginRequest(w, r) + th.App.ch.srv.ServePluginRequest(w, r) assert.Equal(t, http.StatusNotImplemented, w.Result().StatusCode) } @@ -386,7 +386,7 @@ func TestPrivateServePluginRequest(t *testing.T) { request = mux.SetURLVars(request, map[string]string{"plugin_id": "id"}) - th.App.srv.servePluginRequest(recorder, request, handler) + th.App.ch.srv.servePluginRequest(recorder, request, handler) }) } @@ -409,7 +409,7 @@ func TestHandlePluginRequest(t *testing.T) { var assertions func(*http.Request) router := mux.NewRouter() router.HandleFunc("/plugins/{plugin_id:[A-Za-z0-9\\_\\-\\.]+}/{anything:.*}", func(_ http.ResponseWriter, r *http.Request) { - th.App.srv.servePluginRequest(nil, r, func(_ *plugin.Context, _ http.ResponseWriter, r *http.Request) { + th.App.ch.srv.servePluginRequest(nil, r, func(_ *plugin.Context, _ http.ResponseWriter, r *http.Request) { assertions(r) }) }) diff --git a/app/post_test.go b/app/post_test.go index 411bc7d424..13e8ceb547 100644 --- a/app/post_test.go +++ b/app/post_test.go @@ -606,8 +606,10 @@ func TestMaxPostSize(t *testing.T) { mockStore.PostStore.On("GetMaxPostSize").Return(testCase.StoreMaxPostSize) app := App{ - srv: &Server{ - Store: mockStore, + ch: &Channels{ + srv: &Server{ + Store: mockStore, + }, }, } @@ -2360,7 +2362,7 @@ func TestSharedChannelSyncForPostActions(t *testing.T) { defer th.TearDown() remoteClusterService := NewMockSharedChannelService(nil) - th.App.srv.sharedChannelService = remoteClusterService + th.App.ch.srv.sharedChannelService = remoteClusterService testCluster := &testlib.FakeClusterInterface{} th.Server.Cluster = testCluster @@ -2384,7 +2386,7 @@ func TestSharedChannelSyncForPostActions(t *testing.T) { defer th.TearDown() remoteClusterService := NewMockSharedChannelService(nil) - th.App.srv.sharedChannelService = remoteClusterService + th.App.ch.srv.sharedChannelService = remoteClusterService testCluster := &testlib.FakeClusterInterface{} th.Server.Cluster = testCluster @@ -2412,7 +2414,7 @@ func TestSharedChannelSyncForPostActions(t *testing.T) { defer th.TearDown() remoteClusterService := NewMockSharedChannelService(nil) - th.App.srv.sharedChannelService = remoteClusterService + th.App.ch.srv.sharedChannelService = remoteClusterService testCluster := &testlib.FakeClusterInterface{} th.Server.Cluster = testCluster diff --git a/app/reaction_test.go b/app/reaction_test.go index ffda6717ac..3976175ddf 100644 --- a/app/reaction_test.go +++ b/app/reaction_test.go @@ -18,7 +18,7 @@ func TestSharedChannelSyncForReactionActions(t *testing.T) { th := Setup(t).InitBasic() sharedChannelService := NewMockSharedChannelService(nil) - th.App.srv.sharedChannelService = sharedChannelService + th.App.ch.srv.sharedChannelService = sharedChannelService testCluster := &testlib.FakeClusterInterface{} th.Server.Cluster = testCluster @@ -53,7 +53,7 @@ func TestSharedChannelSyncForReactionActions(t *testing.T) { th := Setup(t).InitBasic() sharedChannelService := NewMockSharedChannelService(nil) - th.App.srv.sharedChannelService = sharedChannelService + th.App.ch.srv.sharedChannelService = sharedChannelService testCluster := &testlib.FakeClusterInterface{} th.Server.Cluster = testCluster diff --git a/app/saml.go b/app/saml.go index 0d76cbd522..4677a81831 100644 --- a/app/saml.go +++ b/app/saml.go @@ -288,7 +288,7 @@ func (a *App) ResetSamlAuthDataToEmail(includeDeleted bool, dryRun bool, userIDs appErr = model.NewAppError("ResetAuthDataToEmail", "api.admin.saml.not_available.app_error", nil, "", http.StatusNotImplemented) return } - numAffected, err := a.srv.Store.User().ResetAuthDataToEmailForUsers(model.UserAuthServiceSaml, userIDs, includeDeleted, dryRun) + numAffected, err := a.Srv().Store.User().ResetAuthDataToEmailForUsers(model.UserAuthServiceSaml, userIDs, includeDeleted, dryRun) if err != nil { appErr = model.NewAppError("ResetAuthDataToEmail", "api.admin.saml.failure_reset_authdata_to_email.app_error", nil, err.Error(), http.StatusInternalServerError) return diff --git a/app/searchengine.go b/app/searchengine.go index b58c3c9bc2..b8c107c5e6 100644 --- a/app/searchengine.go +++ b/app/searchengine.go @@ -32,7 +32,7 @@ func (a *App) TestElasticsearch(cfg *model.Config) *model.AppError { } func (a *App) SetSearchEngine(se *searchengine.Broker) { - a.srv.SearchEngine = se + a.ch.srv.SearchEngine = se } func (a *App) PurgeElasticsearchIndexes() *model.AppError { diff --git a/app/server.go b/app/server.go index 34e5ccb47d..9393f4095d 100644 --- a/app/server.go +++ b/app/server.go @@ -162,8 +162,6 @@ type Server struct { phase2PermissionsMigrationComplete bool - httpService httpservice.HTTPService - ImageProxy *imageproxy.ImageProxy Audit *audit.Audit @@ -267,9 +265,19 @@ func NewServer(options ...Option) (*Server, error) { // This is called after initLogging() to avoid a race condition. mlog.Info("Server is initializing...", mlog.String("go_version", runtime.Version())) + // Initialize products + for name, initializer := range products { + prod, err := initializer(s) + if err != nil { + return nil, errors.Wrapf(err, "error initializing product: %s", name) + } + + s.products[name] = prod + } + // It is important to initialize the hub only after the global logger is set // to avoid race conditions while logging from inside the hub. - app := New(ServerConnector(s)) + app := New(ServerConnector(s.Channels())) app.HubStart() if *s.Config().LogSettings.EnableDiagnostics && *s.Config().LogSettings.EnableSentry { @@ -304,8 +312,7 @@ func NewServer(options ...Option) (*Server, error) { s.tracer = tracer } - s.httpService = httpservice.MakeHTTPService(s) - s.pushNotificationClient = s.httpService.MakeClient(true) + s.pushNotificationClient = s.Channels().HTTPService().MakeClient(true) s.ImageProxy = imageproxy.MakeImageProxy(s, s.HTTPService(), s.Log) @@ -349,6 +356,7 @@ func NewServer(options ...Option) (*Server, error) { return nil, errors.Wrapf(err2, "unable to load Mattermost translation files") } + // initEnterprise needs to be called after products initialization. s.initEnterprise() if s.newStore == nil { @@ -695,16 +703,6 @@ func NewServer(options ...Option) (*Server, error) { } }) - // Initialize products - for name, initializer := range products { - prod, err := initializer(s) - if err != nil { - return nil, errors.Wrapf(err, "error initializing product: %s", name) - } - - s.products[name] = prod - } - s.AddConfigListener(func(oldCfg, newCfg *model.Config) { if !oldCfg.FeatureFlags.TimedDND && newCfg.FeatureFlags.TimedDND { runDNDStatusExpireJob(app) @@ -788,10 +786,15 @@ func (s *Server) runJobs() { // Global app options that should be applied to apps created by this server func (s *Server) AppOptions() []AppOption { return []AppOption{ - ServerConnector(s), + ServerConnector(s.Channels()), } } +func (s *Server) Channels() *Channels { + ch, _ := s.products["channels"].(*Channels) + return ch +} + // Return Database type (postgres or mysql) and current version of Mattermost func (s *Server) DatabaseTypeAndMattermostVersion() (string, string) { mattermostVersion, _ := s.Store.System().GetByName("Version") @@ -1957,7 +1960,7 @@ func (s *Server) TelemetryId() string { } func (s *Server) HTTPService() httpservice.HTTPService { - return s.httpService + return s.Channels().HTTPService() } func (s *Server) SetLog(l *mlog.Logger) { @@ -2258,18 +2261,18 @@ func (s *Server) ReadFile(path string) ([]byte, *model.AppError) { // } func createDNDStatusExpirationRecurringTask(a *App) { - a.srv.dndTaskMut.Lock() - a.srv.dndTask = model.CreateRecurringTaskFromNextIntervalTime("Unset DND Statuses", a.UpdateDNDStatusOfUsers, 5*time.Minute) - a.srv.dndTaskMut.Unlock() + a.ch.srv.dndTaskMut.Lock() + a.ch.srv.dndTask = model.CreateRecurringTaskFromNextIntervalTime("Unset DND Statuses", a.UpdateDNDStatusOfUsers, 5*time.Minute) + a.ch.srv.dndTaskMut.Unlock() } func cancelDNDStatusExpirationRecurringTask(a *App) { - a.srv.dndTaskMut.Lock() - if a.srv.dndTask != nil { - a.srv.dndTask.Cancel() - a.srv.dndTask = nil + a.ch.srv.dndTaskMut.Lock() + if a.ch.srv.dndTask != nil { + a.ch.srv.dndTask.Cancel() + a.ch.srv.dndTask = nil } - a.srv.dndTaskMut.Unlock() + a.ch.srv.dndTaskMut.Unlock() } func runDNDStatusExpireJob(a *App) { @@ -2279,7 +2282,7 @@ func runDNDStatusExpireJob(a *App) { if a.IsLeader() { createDNDStatusExpirationRecurringTask(a) } - a.srv.AddClusterLeaderChangedListener(func() { + a.ch.srv.AddClusterLeaderChangedListener(func() { mlog.Info("Cluster leader changed. Determining if unset DNS status task should be running", mlog.Bool("isLeader", a.IsLeader())) if a.IsLeader() { createDNDStatusExpirationRecurringTask(a) diff --git a/app/server_test.go b/app/server_test.go index 71012feb7f..f23ee95433 100644 --- a/app/server_test.go +++ b/app/server_test.go @@ -771,7 +771,7 @@ func TestAdminAdvisor(t *testing.T) { AuthService: "", Roles: model.SystemAdminRoleId + " " + model.SystemUserRoleId, } - ruser, err := th.App.srv.userService.CreateUser(&user, users.UserCreateOptions{FromImport: true}) + ruser, err := th.App.ch.srv.userService.CreateUser(&user, users.UserCreateOptions{FromImport: true}) assert.NoError(t, err, "User should be created") userList = append(userList, ruser) defer th.App.PermanentDeleteUser(th.Context, ruser) diff --git a/app/session.go b/app/session.go index 7eeb40bf37..89d42b7769 100644 --- a/app/session.go +++ b/app/session.go @@ -18,7 +18,7 @@ import ( ) func (a *App) CreateSession(session *model.Session) (*model.Session, *model.AppError) { - session, err := a.srv.userService.CreateSession(session) + session, err := a.ch.srv.userService.CreateSession(session) if err != nil { var invErr *store.ErrInvalidInput switch { @@ -66,13 +66,13 @@ func (a *App) GetSession(token string) (*model.Session, *model.AppError) { var session *model.Session // We intentionally skip the error check here, we only want to check if the token is valid. // If we don't have the session we are going to create one with the token eventually. - if session, _ = a.srv.userService.GetSession(token); session != nil { + if session, _ = a.ch.srv.userService.GetSession(token); session != nil { if session.Token != token { return nil, model.NewAppError("GetSession", "api.context.invalid_token.error", map[string]interface{}{"Token": token, "Error": ""}, "session token is different from the one in DB", http.StatusUnauthorized) } if !session.IsExpired() { - a.srv.userService.AddSessionToCache(session) + a.ch.srv.userService.AddSessionToCache(session) } } @@ -124,7 +124,7 @@ func (a *App) GetSession(token string) (*model.Session, *model.AppError) { } func (a *App) GetSessions(userID string) ([]*model.Session, *model.AppError) { - sessions, err := a.srv.userService.GetSessions(userID) + sessions, err := a.ch.srv.userService.GetSessions(userID) if err != nil { return nil, model.NewAppError("GetSessions", "app.session.get_sessions.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -133,7 +133,7 @@ func (a *App) GetSessions(userID string) ([]*model.Session, *model.AppError) { } func (a *App) RevokeAllSessions(userID string) *model.AppError { - if err := a.srv.userService.RevokeAllSessions(userID); err != nil { + if err := a.ch.srv.userService.RevokeAllSessions(userID); err != nil { switch { case errors.Is(err, users.GetSessionError): return model.NewAppError("RevokeAllSessions", "app.session.get_sessions.app_error", nil, err.Error(), http.StatusInternalServerError) @@ -148,13 +148,13 @@ func (a *App) RevokeAllSessions(userID string) *model.AppError { } func (a *App) AddSessionToCache(session *model.Session) { - a.srv.userService.AddSessionToCache(session) + a.ch.srv.userService.AddSessionToCache(session) } // RevokeSessionsFromAllUsers will go through all the sessions active // in the server and revoke them func (a *App) RevokeSessionsFromAllUsers() *model.AppError { - if err := a.srv.userService.RevokeSessionsFromAllUsers(); err != nil { + if err := a.ch.srv.userService.RevokeSessionsFromAllUsers(); err != nil { switch { case errors.Is(err, users.DeleteAllAccessDataError): return model.NewAppError("RevokeSessionsFromAllUsers", "app.oauth.remove_access_data.app_error", nil, err.Error(), http.StatusInternalServerError) @@ -167,15 +167,15 @@ func (a *App) RevokeSessionsFromAllUsers() *model.AppError { } func (a *App) ReturnSessionToPool(session *model.Session) { - a.srv.userService.ReturnSessionToPool(session) + a.ch.srv.userService.ReturnSessionToPool(session) } func (a *App) ClearSessionCacheForUser(userID string) { - a.srv.userService.ClearUserSessionCache(userID) + a.ch.srv.userService.ClearUserSessionCache(userID) } func (a *App) ClearSessionCacheForAllUsers() { - a.srv.userService.ClearAllUsersSessionCache() + a.ch.srv.userService.ClearAllUsersSessionCache() } func (a *App) ClearSessionCacheForUserSkipClusterSend(userID string) { @@ -187,7 +187,7 @@ func (a *App) ClearSessionCacheForAllUsersSkipClusterSend() { } func (a *App) RevokeSessionsForDeviceId(userID string, deviceID string, currentSessionId string) *model.AppError { - if err := a.srv.userService.RevokeSessionsForDeviceId(userID, deviceID, currentSessionId); err != nil { + if err := a.ch.srv.userService.RevokeSessionsForDeviceId(userID, deviceID, currentSessionId); err != nil { return model.NewAppError("RevokeSessionsForDeviceId", "app.session.get_sessions.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -195,7 +195,7 @@ func (a *App) RevokeSessionsForDeviceId(userID string, deviceID string, currentS } func (a *App) GetSessionById(sessionID string) (*model.Session, *model.AppError) { - session, err := a.srv.userService.GetSessionByID(sessionID) + session, err := a.ch.srv.userService.GetSessionByID(sessionID) if err != nil { return nil, model.NewAppError("GetSessionById", "app.session.get.app_error", nil, err.Error(), http.StatusBadRequest) } @@ -213,7 +213,7 @@ func (a *App) RevokeSessionById(sessionID string) *model.AppError { } func (a *App) RevokeSession(session *model.Session) *model.AppError { - if err := a.srv.userService.RevokeSession(session); err != nil { + if err := a.ch.srv.userService.RevokeSession(session); err != nil { switch { case errors.Is(err, users.DeleteSessionError): return model.NewAppError("RevokeSession", "app.session.remove.app_error", nil, err.Error(), http.StatusInternalServerError) @@ -248,7 +248,7 @@ func (a *App) UpdateLastActivityAtIfNeeded(session model.Session) { } session.LastActivityAt = now - a.srv.userService.AddSessionToCache(&session) + a.ch.srv.userService.AddSessionToCache(&session) } // ExtendSessionExpiryIfNeeded extends Session.ExpiresAt based on session lengths in config. @@ -296,7 +296,7 @@ func (a *App) ExtendSessionExpiryIfNeeded(session *model.Session) bool { // ensures each node will get an extended expiry within the next 10 minutes. // Worst case is another node may generate a redundant expiry update. session.ExpiresAt = newExpiry - a.srv.userService.AddSessionToCache(session) + a.ch.srv.userService.AddSessionToCache(session) mlog.Debug("Session extended", mlog.String("user_id", session.UserId), mlog.String("session_id", session.Id), mlog.Int64("newExpiry", newExpiry), mlog.Int64("session_length", sessionLength)) @@ -328,11 +328,11 @@ func (a *App) GetSessionLengthInMillis(session *model.Session) int64 { // relative to either the session creation date or the current time, depending // on the `ExtendSessionOnActivity` config setting. func (a *App) SetSessionExpireInDays(session *model.Session, days int) { - a.srv.userService.SetSessionExpireInDays(session, days) + a.ch.srv.userService.SetSessionExpireInDays(session, days) } func (a *App) CreateUserAccessToken(token *model.UserAccessToken) (*model.UserAccessToken, *model.AppError) { - user, nErr := a.srv.userService.GetUser(token.UserId) + user, nErr := a.ch.srv.userService.GetUser(token.UserId) if nErr != nil { var nfErr *store.ErrNotFound switch { @@ -417,7 +417,7 @@ func (a *App) createSessionForUserAccessToken(tokenString string) (*model.Sessio } else { session.AddProp(model.SessionPropIsGuest, "false") } - a.srv.userService.SetSessionExpireInDays(session, model.SessionUserAccessTokenExpiry) + a.ch.srv.userService.SetSessionExpireInDays(session, model.SessionUserAccessTokenExpiry) session, nErr = a.Srv().Store.Session().Save(session) if nErr != nil { @@ -430,7 +430,7 @@ func (a *App) createSessionForUserAccessToken(tokenString string) (*model.Sessio } } - a.srv.userService.AddSessionToCache(session) + a.ch.srv.userService.AddSessionToCache(session) return session, nil @@ -438,7 +438,7 @@ func (a *App) createSessionForUserAccessToken(tokenString string) (*model.Sessio func (a *App) RevokeUserAccessToken(token *model.UserAccessToken) *model.AppError { var session *model.Session - session, _ = a.srv.userService.GetSessionContext(context.Background(), token.Token) + session, _ = a.ch.srv.userService.GetSessionContext(context.Background(), token.Token) if err := a.Srv().Store.UserAccessToken().Delete(token.Id); err != nil { return model.NewAppError("RevokeUserAccessToken", "app.user_access_token.delete.app_error", nil, err.Error(), http.StatusInternalServerError) @@ -453,7 +453,7 @@ func (a *App) RevokeUserAccessToken(token *model.UserAccessToken) *model.AppErro func (a *App) DisableUserAccessToken(token *model.UserAccessToken) *model.AppError { var session *model.Session - session, _ = a.srv.userService.GetSessionContext(context.Background(), token.Token) + session, _ = a.ch.srv.userService.GetSessionContext(context.Background(), token.Token) if err := a.Srv().Store.UserAccessToken().UpdateTokenDisable(token.Id); err != nil { return model.NewAppError("DisableUserAccessToken", "app.user_access_token.update_token_disable.app_error", nil, err.Error(), http.StatusInternalServerError) @@ -468,7 +468,7 @@ func (a *App) DisableUserAccessToken(token *model.UserAccessToken) *model.AppErr func (a *App) EnableUserAccessToken(token *model.UserAccessToken) *model.AppError { var session *model.Session - session, _ = a.srv.userService.GetSessionContext(context.Background(), token.Token) + session, _ = a.ch.srv.userService.GetSessionContext(context.Background(), token.Token) err := a.Srv().Store.UserAccessToken().UpdateTokenEnable(token.Id) if err != nil { diff --git a/app/session_test.go b/app/session_test.go index 77629a970b..4b4ee8ce83 100644 --- a/app/session_test.go +++ b/app/session_test.go @@ -317,7 +317,7 @@ func TestApp_ExtendExpiryIfNeeded(t *testing.T) { require.False(t, session.IsExpired()) // check cache was updated - cachedSession, errGet := th.App.srv.userService.GetSession(session.Token) + cachedSession, errGet := th.App.ch.srv.userService.GetSession(session.Token) require.NoError(t, errGet) require.Equal(t, session.ExpiresAt, cachedSession.ExpiresAt) diff --git a/app/shared_channel_notifier_test.go b/app/shared_channel_notifier_test.go index 1199f09075..9454b5dba0 100644 --- a/app/shared_channel_notifier_test.go +++ b/app/shared_channel_notifier_test.go @@ -18,9 +18,9 @@ func TestServerSyncSharedChannelHandler(t *testing.T) { mockService := NewMockSharedChannelService(nil) mockService.active = false - th.App.srv.SetSharedChannelSyncService(mockService) + th.App.ch.srv.SetSharedChannelSyncService(mockService) - th.App.srv.SharedChannelSyncHandler(&model.WebSocketEvent{}) + th.App.ch.srv.SharedChannelSyncHandler(&model.WebSocketEvent{}) assert.Empty(t, mockService.channelNotifications) }) @@ -30,12 +30,12 @@ func TestServerSyncSharedChannelHandler(t *testing.T) { mockService := NewMockSharedChannelService(nil) mockService.active = true - th.App.srv.SetSharedChannelSyncService(mockService) + th.App.ch.srv.SetSharedChannelSyncService(mockService) channel := th.CreateChannel(th.BasicTeam, WithShared(true)) websocketEvent := model.NewWebSocketEvent(model.WebsocketEventAddedToTeam, model.NewId(), channel.Id, "", nil) - th.App.srv.SharedChannelSyncHandler(websocketEvent) + th.App.ch.srv.SharedChannelSyncHandler(websocketEvent) assert.Empty(t, mockService.channelNotifications) }) @@ -45,11 +45,11 @@ func TestServerSyncSharedChannelHandler(t *testing.T) { mockService := NewMockSharedChannelService(nil) mockService.active = true - th.App.srv.SetSharedChannelSyncService(mockService) + th.App.ch.srv.SetSharedChannelSyncService(mockService) websocketEvent := model.NewWebSocketEvent(model.WebsocketEventPosted, model.NewId(), model.NewId(), "", nil) - th.App.srv.SharedChannelSyncHandler(websocketEvent) + th.App.ch.srv.SharedChannelSyncHandler(websocketEvent) assert.Empty(t, mockService.channelNotifications) }) @@ -59,12 +59,12 @@ func TestServerSyncSharedChannelHandler(t *testing.T) { mockService := NewMockSharedChannelService(nil) mockService.active = true - th.App.srv.SetSharedChannelSyncService(mockService) + th.App.ch.srv.SetSharedChannelSyncService(mockService) channel := th.CreateChannel(th.BasicTeam, WithShared(true)) websocketEvent := model.NewWebSocketEvent(model.WebsocketEventPosted, model.NewId(), channel.Id, "", nil) - th.App.srv.SharedChannelSyncHandler(websocketEvent) + th.App.ch.srv.SharedChannelSyncHandler(websocketEvent) assert.Len(t, mockService.channelNotifications, 1) assert.Equal(t, channel.Id, mockService.channelNotifications[0]) }) diff --git a/app/slack.go b/app/slack.go index 61fa49127f..58c1e2f32d 100644 --- a/app/slack.go +++ b/app/slack.go @@ -38,10 +38,10 @@ func (a *App) SlackImport(c *request.Context, fileData multipart.File, fileSize }, GenerateThumbnailImage: a.generateThumbnailImage, GeneratePreviewImage: a.generatePreviewImage, - InvalidateAllCaches: func() { a.srv.InvalidateAllCaches() }, - MaxPostSize: func() int { return a.srv.MaxPostSize() }, + InvalidateAllCaches: func() { a.ch.srv.InvalidateAllCaches() }, + MaxPostSize: func() int { return a.ch.srv.MaxPostSize() }, PrepareImage: func(fileData []byte) (image.Image, func(), error) { - img, release, err := prepareImage(a.srv.imgDecoder, bytes.NewReader(fileData)) + img, release, err := prepareImage(a.ch.srv.imgDecoder, bytes.NewReader(fileData)) if err != nil { return nil, nil, err } @@ -49,7 +49,7 @@ func (a *App) SlackImport(c *request.Context, fileData multipart.File, fileSize }, } - importer := slackimport.New(a.srv.Store, actions, a.Config()) + importer := slackimport.New(a.ch.srv.Store, actions, a.Config()) return importer.SlackImport(fileData, fileSize, teamID) } diff --git a/app/slashcommands/helper_test.go b/app/slashcommands/helper_test.go index ca9f435744..6cfeb9e0c6 100644 --- a/app/slashcommands/helper_test.go +++ b/app/slashcommands/helper_test.go @@ -90,7 +90,7 @@ func setupTestHelper(dbStore store.Store, enterprise bool, includeCacheLayer boo } th := &TestHelper{ - App: app.New(app.ServerConnector(s)), + App: app.New(app.ServerConnector(s.Channels())), Context: &request.Context{}, Server: s, LogBuffer: buffer, diff --git a/app/team.go b/app/team.go index 34fd60c278..73d13ae200 100644 --- a/app/team.go +++ b/app/team.go @@ -1969,7 +1969,7 @@ func (a *App) SetTeamIconFromFile(team *model.Team, file io.Reader) *model.AppEr img = imaging.FillCenter(img, teamIconWidthAndHeight, teamIconWidthAndHeight) buf := new(bytes.Buffer) - err = a.srv.imgEncoder.EncodePNG(buf, img) + err = a.Srv().imgEncoder.EncodePNG(buf, img) if err != nil { return model.NewAppError("SetTeamIcon", "api.team.set_team_icon.encode.app_error", nil, err.Error(), http.StatusInternalServerError) } diff --git a/app/user.go b/app/user.go index 0014a67373..8e9f63f34e 100644 --- a/app/user.go +++ b/app/user.go @@ -198,7 +198,7 @@ func (a *App) IsUserSignUpAllowed() *model.AppError { } func (a *App) IsFirstUserAccount() bool { - return a.srv.userService.IsFirstUserAccount() + return a.ch.srv.userService.IsFirstUserAccount() } // CreateUser creates a user and sets several fields of the returned User struct to @@ -214,7 +214,7 @@ func (a *App) CreateGuest(c *request.Context, user *model.User) (*model.User, *m } func (a *App) createUserOrGuest(c *request.Context, user *model.User, guest bool) (*model.User, *model.AppError) { - ruser, nErr := a.srv.userService.CreateUser(user, users.UserCreateOptions{Guest: guest}) + ruser, nErr := a.ch.srv.userService.CreateUser(user, users.UserCreateOptions{Guest: guest}) if nErr != nil { var appErr *model.AppError var invErr *store.ErrInvalidInput @@ -245,7 +245,7 @@ func (a *App) createUserOrGuest(c *request.Context, user *model.User, guest bool if user.EmailVerified { a.InvalidateCacheForUser(ruser.Id) - nUser, err := a.srv.userService.GetUser(ruser.Id) + nUser, err := a.ch.srv.userService.GetUser(ruser.Id) if err != nil { var nfErr *store.ErrNotFound switch { @@ -305,18 +305,18 @@ func (a *App) CreateOAuthUser(c *request.Context, service string, userData io.Re found := true count := 0 for found { - if found = a.srv.userService.IsUsernameTaken(user.Username); found { + if found = a.ch.srv.userService.IsUsernameTaken(user.Username); found { user.Username = user.Username + strconv.Itoa(count) count++ } } - userByAuth, _ := a.srv.userService.GetUserByAuth(user.AuthData, service) + userByAuth, _ := a.ch.srv.userService.GetUserByAuth(user.AuthData, service) if userByAuth != nil { return userByAuth, nil } - userByEmail, _ := a.srv.userService.GetUserByEmail(user.Email) + userByEmail, _ := a.ch.srv.userService.GetUserByEmail(user.Email) if userByEmail != nil { if userByEmail.AuthService == "" { return nil, model.NewAppError("CreateOAuthUser", "api.user.create_oauth_user.already_attached.app_error", map[string]interface{}{"Service": service, "Auth": model.UserAuthServiceEmail}, "email="+user.Email, http.StatusBadRequest) @@ -354,7 +354,7 @@ func (a *App) CreateOAuthUser(c *request.Context, service string, userData io.Re } func (a *App) GetUser(userID string) (*model.User, *model.AppError) { - user, err := a.srv.userService.GetUser(userID) + user, err := a.ch.srv.userService.GetUser(userID) if err != nil { var nfErr *store.ErrNotFound switch { @@ -369,7 +369,7 @@ func (a *App) GetUser(userID string) (*model.User, *model.AppError) { } func (a *App) GetUserByUsername(username string) (*model.User, *model.AppError) { - result, err := a.srv.userService.GetUserByUsername(username) + result, err := a.ch.srv.userService.GetUserByUsername(username) if err != nil { var nfErr *store.ErrNotFound switch { @@ -383,7 +383,7 @@ func (a *App) GetUserByUsername(username string) (*model.User, *model.AppError) } func (a *App) GetUserByEmail(email string) (*model.User, *model.AppError) { - user, err := a.srv.userService.GetUserByEmail(email) + user, err := a.ch.srv.userService.GetUserByEmail(email) if err != nil { var nfErr *store.ErrNotFound switch { @@ -397,7 +397,7 @@ func (a *App) GetUserByEmail(email string) (*model.User, *model.AppError) { } func (a *App) GetUserByAuth(authData *string, authService string) (*model.User, *model.AppError) { - user, err := a.srv.userService.GetUserByAuth(authData, authService) + user, err := a.ch.srv.userService.GetUserByAuth(authData, authService) if err != nil { var invErr *store.ErrInvalidInput var nfErr *store.ErrNotFound @@ -415,7 +415,7 @@ func (a *App) GetUserByAuth(authData *string, authService string) (*model.User, } func (a *App) GetUsers(options *model.UserGetOptions) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsers(options) + users, err := a.ch.srv.userService.GetUsers(options) if err != nil { return nil, model.NewAppError("GetUsers", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -424,7 +424,7 @@ func (a *App) GetUsers(options *model.UserGetOptions) ([]*model.User, *model.App } func (a *App) GetUsersPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersPage(options, asAdmin) + users, err := a.ch.srv.userService.GetUsersPage(options, asAdmin) if err != nil { return nil, model.NewAppError("GetUsersPage", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -433,11 +433,11 @@ func (a *App) GetUsersPage(options *model.UserGetOptions, asAdmin bool) ([]*mode } func (a *App) GetUsersEtag(restrictionsHash string) string { - return a.srv.userService.GetUsersEtag(restrictionsHash) + return a.ch.srv.userService.GetUsersEtag(restrictionsHash) } func (a *App) GetUsersInTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersInTeam(options) + users, err := a.ch.srv.userService.GetUsersInTeam(options) if err != nil { return nil, model.NewAppError("GetUsersInTeam", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -446,7 +446,7 @@ func (a *App) GetUsersInTeam(options *model.UserGetOptions) ([]*model.User, *mod } func (a *App) GetUsersNotInTeam(teamID string, groupConstrained bool, offset int, limit int, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersNotInTeam(teamID, groupConstrained, offset, limit, viewRestrictions) + users, err := a.ch.srv.userService.GetUsersNotInTeam(teamID, groupConstrained, offset, limit, viewRestrictions) if err != nil { return nil, model.NewAppError("GetUsersNotInTeam", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -455,7 +455,7 @@ func (a *App) GetUsersNotInTeam(teamID string, groupConstrained bool, offset int } func (a *App) GetUsersInTeamPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersInTeamPage(options, asAdmin) + users, err := a.ch.srv.userService.GetUsersInTeamPage(options, asAdmin) if err != nil { return nil, model.NewAppError("GetUsersInTeamPage", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -464,7 +464,7 @@ func (a *App) GetUsersInTeamPage(options *model.UserGetOptions, asAdmin bool) ([ } func (a *App) GetUsersNotInTeamPage(teamID string, groupConstrained bool, page int, perPage int, asAdmin bool, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersNotInTeamPage(teamID, groupConstrained, page*perPage, perPage, asAdmin, viewRestrictions) + users, err := a.ch.srv.userService.GetUsersNotInTeamPage(teamID, groupConstrained, page*perPage, perPage, asAdmin, viewRestrictions) if err != nil { return nil, model.NewAppError("GetUsersNotInTeamPage", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -473,11 +473,11 @@ func (a *App) GetUsersNotInTeamPage(teamID string, groupConstrained bool, page i } func (a *App) GetUsersInTeamEtag(teamID string, restrictionsHash string) string { - return a.srv.userService.GetUsersInTeamEtag(teamID, restrictionsHash) + return a.ch.srv.userService.GetUsersInTeamEtag(teamID, restrictionsHash) } func (a *App) GetUsersNotInTeamEtag(teamID string, restrictionsHash string) string { - return a.srv.userService.GetUsersNotInTeamEtag(teamID, restrictionsHash) + return a.ch.srv.userService.GetUsersNotInTeamEtag(teamID, restrictionsHash) } func (a *App) GetUsersInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) { @@ -565,7 +565,7 @@ func (a *App) GetUsersNotInChannelPage(teamID string, channelID string, groupCon } func (a *App) GetUsersWithoutTeamPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersWithoutTeamPage(options, asAdmin) + users, err := a.ch.srv.userService.GetUsersWithoutTeamPage(options, asAdmin) if err != nil { return nil, model.NewAppError("GetUsersWithoutTeamPage", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -574,7 +574,7 @@ func (a *App) GetUsersWithoutTeamPage(options *model.UserGetOptions, asAdmin boo } func (a *App) GetUsersWithoutTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersWithoutTeam(options) + users, err := a.ch.srv.userService.GetUsersWithoutTeam(options) if err != nil { return nil, model.NewAppError("GetUsersWithoutTeam", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -603,7 +603,7 @@ func (a *App) GetChannelGroupUsers(channelID string) ([]*model.User, *model.AppE } func (a *App) GetUsersByIds(userIDs []string, options *store.UserGetByIdsOpts) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersByIds(userIDs, options) + users, err := a.ch.srv.userService.GetUsersByIds(userIDs, options) if err != nil { return nil, model.NewAppError("GetUsersByIds", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -624,7 +624,7 @@ func (a *App) GetUsersByGroupChannelIds(c *request.Context, channelIDs []string, } func (a *App) GetUsersByUsernames(usernames []string, asAdmin bool, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError) { - users, err := a.srv.userService.GetUsersByUsernames(usernames, &model.UserGetOptions{ViewRestrictions: viewRestrictions}) + users, err := a.ch.srv.userService.GetUsersByUsernames(usernames, &model.UserGetOptions{ViewRestrictions: viewRestrictions}) if err != nil { return nil, model.NewAppError("GetUsersByUsernames", "app.user.get_profiles.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -649,7 +649,7 @@ func (a *App) GenerateMfaSecret(userID string) (*model.MfaSecret, *model.AppErro return nil, model.NewAppError("GenerateMfaSecret", "mfa.mfa_disabled.app_error", nil, "", http.StatusNotImplemented) } - mfaSecret, err := a.srv.userService.GenerateMfaSecret(user) + mfaSecret, err := a.ch.srv.userService.GenerateMfaSecret(user) if err != nil { return nil, model.NewAppError("GenerateMfaSecret", "mfa.generate_qr_code.create_code.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -671,7 +671,7 @@ func (a *App) ActivateMfa(userID, token string) *model.AppError { return model.NewAppError("ActivateMfa", "mfa.mfa_disabled.app_error", nil, "", http.StatusNotImplemented) } - if err := a.srv.userService.ActivateMfa(user, token); err != nil { + if err := a.ch.srv.userService.ActivateMfa(user, token); err != nil { switch { case errors.Is(err, mfa.InvalidToken): return model.NewAppError("ActivateMfa", "mfa.activate.bad_token.app_error", nil, "", http.StatusUnauthorized) @@ -692,7 +692,7 @@ func (a *App) DeactivateMfa(userID string) *model.AppError { return appErr } - if err := a.srv.userService.DeactivateMfa(user); err != nil { + if err := a.ch.srv.userService.DeactivateMfa(user); err != nil { return model.NewAppError("DeactivateMfa", "mfa.deactivate.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -703,11 +703,11 @@ func (a *App) DeactivateMfa(userID string) *model.AppError { } func (a *App) GetProfileImage(user *model.User) ([]byte, bool, *model.AppError) { - return a.srv.GetProfileImage(user) + return a.ch.srv.GetProfileImage(user) } func (a *App) GetDefaultProfileImage(user *model.User) ([]byte, *model.AppError) { - return a.srv.GetDefaultProfileImage(user) + return a.ch.srv.GetDefaultProfileImage(user) } func (a *App) SetDefaultProfileImage(user *model.User) *model.AppError { @@ -762,7 +762,7 @@ func (a *App) SetProfileImageFromMultiPartFile(userID string, file multipart.Fil func (a *App) AdjustImage(file io.Reader) (*bytes.Buffer, *model.AppError) { // Decode image into Image object - img, _, err := a.srv.imgDecoder.Decode(file) + img, _, err := a.ch.srv.imgDecoder.Decode(file) if err != nil { return nil, model.NewAppError("SetProfileImage", "api.user.upload_profile_user.decode.app_error", nil, err.Error(), http.StatusBadRequest) } @@ -775,7 +775,7 @@ func (a *App) AdjustImage(file io.Reader) (*bytes.Buffer, *model.AppError) { img = imaging.FillCenter(img, profileWidthAndHeight, profileWidthAndHeight) buf := new(bytes.Buffer) - err = a.srv.imgEncoder.EncodePNG(buf, img) + err = a.ch.srv.imgEncoder.EncodePNG(buf, img) if err != nil { return nil, model.NewAppError("SetProfileImage", "api.user.upload_profile_user.encode.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -884,7 +884,7 @@ func (a *App) UpdateActive(c *request.Context, user *model.User, active bool) (* user.DeleteAt = user.UpdateAt } - userUpdate, err := a.srv.userService.UpdateUser(user, true) + userUpdate, err := a.ch.srv.userService.UpdateUser(user, true) if err != nil { var appErr *model.AppError var invErr *store.ErrInvalidInput @@ -917,7 +917,7 @@ func (a *App) UpdateActive(c *request.Context, user *model.User, active bool) (* } func (a *App) DeactivateGuests(c *request.Context) *model.AppError { - userIDs, err := a.srv.userService.DeactivateAllGuests() + userIDs, err := a.ch.srv.userService.DeactivateAllGuests() if err != nil { return model.NewAppError("DeactivateGuests", "app.user.update_active_for_multiple_users.updating.app_error", nil, err.Error(), http.StatusInternalServerError) } @@ -938,11 +938,11 @@ func (a *App) DeactivateGuests(c *request.Context) *model.AppError { } func (a *App) GetSanitizeOptions(asAdmin bool) map[string]bool { - return a.srv.userService.GetSanitizeOptions(asAdmin) + return a.ch.srv.userService.GetSanitizeOptions(asAdmin) } func (a *App) SanitizeProfile(user *model.User, asAdmin bool) { - options := a.srv.userService.GetSanitizeOptions(asAdmin) + options := a.ch.srv.userService.GetSanitizeOptions(asAdmin) user.SanitizeProfile(options) } @@ -1034,7 +1034,7 @@ func (a *App) sendUpdatedUserEvent(user model.User) { } func (a *App) UpdateUser(user *model.User, sendNotifications bool) (*model.User, *model.AppError) { - prev, err := a.srv.userService.GetUser(user.Id) + prev, err := a.ch.srv.userService.GetUser(user.Id) if err != nil { var nfErr *store.ErrNotFound switch { @@ -1077,7 +1077,7 @@ func (a *App) UpdateUser(user *model.User, sendNotifications bool) (*model.User, } } - userUpdate, err := a.srv.userService.UpdateUser(user, false) + userUpdate, err := a.ch.srv.userService.UpdateUser(user, false) if err != nil { var appErr *model.AppError var invErr *store.ErrInvalidInput @@ -1144,7 +1144,7 @@ func (a *App) UpdateUserActive(c *request.Context, userID string, active bool) * } func (a *App) updateUserNotifyProps(userID string, props map[string]string) *model.AppError { - err := a.srv.userService.UpdateUserNotifyProps(userID, props) + err := a.ch.srv.userService.UpdateUserNotifyProps(userID, props) if err != nil { var appErr *model.AppError switch { @@ -2035,7 +2035,7 @@ func (a *App) GetViewUsersRestrictions(userID string) (*model.ViewUsersRestricti // PromoteGuestToUser Convert user's roles and all his mermbership's roles from // guest roles to regular user roles. func (a *App) PromoteGuestToUser(c *request.Context, user *model.User, requestorId string) *model.AppError { - nErr := a.srv.userService.PromoteGuestToUser(user) + nErr := a.ch.srv.userService.PromoteGuestToUser(user) a.InvalidateCacheForUser(user.Id) if nErr != nil { return model.NewAppError("PromoteGuestToUser", "app.user.promote_guest.user_update.app_error", nil, nErr.Error(), http.StatusInternalServerError) @@ -2057,7 +2057,7 @@ func (a *App) PromoteGuestToUser(c *request.Context, user *model.User, requestor mlog.Warn("Failed to get user on promote guest to user", mlog.Err(err)) } else { a.sendUpdatedUserEvent(*promotedUser) - if uErr := a.srv.userService.UpdateSessionsIsGuest(promotedUser.Id, promotedUser.IsGuest()); uErr != nil { + if uErr := a.ch.srv.userService.UpdateSessionsIsGuest(promotedUser.Id, promotedUser.IsGuest()); uErr != nil { mlog.Warn("Unable to update user sessions", mlog.String("user_id", promotedUser.Id), mlog.Err(uErr)) } } @@ -2095,14 +2095,14 @@ func (a *App) PromoteGuestToUser(c *request.Context, user *model.User, requestor // DemoteUserToGuest Convert user's roles and all his mermbership's roles from // regular user roles to guest roles. func (a *App) DemoteUserToGuest(user *model.User) *model.AppError { - demotedUser, nErr := a.srv.userService.DemoteUserToGuest(user) + demotedUser, nErr := a.ch.srv.userService.DemoteUserToGuest(user) a.InvalidateCacheForUser(user.Id) if nErr != nil { return model.NewAppError("DemoteUserToGuest", "app.user.demote_user_to_guest.user_update.app_error", nil, nErr.Error(), http.StatusInternalServerError) } a.sendUpdatedUserEvent(*demotedUser) - if uErr := a.srv.userService.UpdateSessionsIsGuest(demotedUser.Id, demotedUser.IsGuest()); uErr != nil { + if uErr := a.ch.srv.userService.UpdateSessionsIsGuest(demotedUser.Id, demotedUser.IsGuest()); uErr != nil { mlog.Warn("Unable to update user sessions", mlog.String("user_id", demotedUser.Id), mlog.Err(uErr)) } diff --git a/app/user_test.go b/app/user_test.go index 7c497463b6..acc51c6c94 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -1554,12 +1554,12 @@ func TestUpdateThreadReadForUser(t *testing.T) { mockThreadStore.On("MaintainMembership", "user1", "postid", mock.Anything).Return(nil, errors.New("error")) var err error - th.App.srv.userService, err = users.New(users.ServiceConfig{ + th.App.ch.srv.userService, err = users.New(users.ServiceConfig{ UserStore: &mockUserStore, SessionStore: &storemocks.SessionStore{}, OAuthStore: &storemocks.OAuthStore{}, - ConfigFn: th.App.srv.Config, - LicenseFn: th.App.srv.License, + ConfigFn: th.App.ch.srv.Config, + LicenseFn: th.App.ch.srv.License, }) require.NoError(t, err) mockStore.On("User").Return(&mockUserStore) diff --git a/app/web_conn.go b/app/web_conn.go index 4bd511babc..6d58ce9a85 100644 --- a/app/web_conn.go +++ b/app/web_conn.go @@ -172,7 +172,7 @@ func (a *App) NewWebConn(cfg *WebConnConfig) *WebConn { cfg.activeQueue = make(chan model.WebSocketMessage, sendQueueSize) } - if cfg.deadQueue == nil && *a.srv.Config().ServiceSettings.EnableReliableWebSockets { + if cfg.deadQueue == nil && *a.ch.srv.Config().ServiceSettings.EnableReliableWebSockets { cfg.deadQueue = make([]*model.WebSocketEvent, deadQueueSize) } @@ -287,7 +287,7 @@ func (wc *WebConn) SetSession(v *model.Session) { // Pump starts the WebConn instance. After this, the websocket // is ready to send/receive messages. func (wc *WebConn) Pump() { - defer wc.App.srv.userService.ReturnSessionToPool(wc.GetSession()) + defer wc.App.Srv().userService.ReturnSessionToPool(wc.GetSession()) var wg sync.WaitGroup wg.Add(1) @@ -365,7 +365,7 @@ func (wc *WebConn) writePump() { wc.WebSocket.Close() }() - if *wc.App.srv.Config().ServiceSettings.EnableReliableWebSockets && wc.Sequence != 0 { + if *wc.App.Srv().Config().ServiceSettings.EnableReliableWebSockets && wc.Sequence != 0 { if ok, index := wc.isInDeadQueue(wc.Sequence); ok { if err := wc.drainDeadQueue(index); err != nil { wc.logSocketErr("websocket.drainDeadQueue", err) @@ -462,7 +462,7 @@ func (wc *WebConn) writePump() { mlog.Warn("websocket.full", logData...) } - if *wc.App.srv.Config().ServiceSettings.EnableReliableWebSockets && + if *wc.App.Srv().Config().ServiceSettings.EnableReliableWebSockets && evtOk { wc.addToDeadQueue(evt) } diff --git a/app/web_hub.go b/app/web_hub.go index a6785d7be0..868e380f73 100644 --- a/app/web_hub.go +++ b/app/web_hub.go @@ -101,7 +101,7 @@ func (a *App) HubStart() { } // Assigning to the hubs slice without any mutex is fine because it is only assigned once // during the start of the program and always read from after that. - a.srv.hubs = hubs + a.ch.srv.hubs = hubs } func (a *App) invalidateCacheForWebhook(webhookID string) { @@ -259,7 +259,7 @@ func (a *App) invalidateCacheForChannelPosts(channelID string) { func (a *App) InvalidateCacheForUser(userID string) { a.Srv().invalidateCacheForUserSkipClusterSend(userID) - a.srv.userService.InvalidateCacheForUser(userID) + a.ch.srv.userService.InvalidateCacheForUser(userID) } func (a *App) invalidateCacheForUserTeams(userID string) { diff --git a/app/web_hub_test.go b/app/web_hub_test.go index 32de04a2cb..294c8a4e9a 100644 --- a/app/web_hub_test.go +++ b/app/web_hub_test.go @@ -165,13 +165,13 @@ func TestHubSessionRevokeRace(t *testing.T) { UserStore: &mockUserStore, SessionStore: &mockSessionStore, OAuthStore: &mockOAuthStore, - ConfigFn: th.App.srv.Config, + ConfigFn: th.App.ch.srv.Config, Metrics: th.App.Metrics(), Cluster: th.App.Cluster(), - LicenseFn: th.App.srv.License, + LicenseFn: th.App.ch.srv.License, }) require.NoError(t, err) - th.App.srv.userService = userService + th.App.ch.srv.userService = userService // This needs to be false for the condition to trigger th.App.UpdateConfig(func(cfg *model.Config) { @@ -189,7 +189,7 @@ func TestHubSessionRevokeRace(t *testing.T) { time.Sleep(time.Second) // We override the LastActivityAt which happens in NewWebConn. // This is needed to call RevokeSessionById which triggers the race. - th.App.srv.userService.AddSessionToCache(sess1) + th.App.ch.srv.userService.AddSessionToCache(sess1) go func() { for i := 0; i <= broadcastQueueSize; i++ { diff --git a/cmd/mattermost/commands/init.go b/cmd/mattermost/commands/init.go index 62b785db7c..3a53514561 100644 --- a/cmd/mattermost/commands/init.go +++ b/cmd/mattermost/commands/init.go @@ -49,7 +49,7 @@ func initDBCommandContext(configDSN string, readOnlyConfigStore bool) (*app.App, return nil, err } - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) if model.BuildEnterpriseReady == "true" { a.Srv().LoadLicense() diff --git a/cmd/mattermost/commands/server.go b/cmd/mattermost/commands/server.go index 1e7ca9e2e9..94183fda5c 100644 --- a/cmd/mattermost/commands/server.go +++ b/cmd/mattermost/commands/server.go @@ -93,7 +93,7 @@ func runServer(configStore *config.Store, interruptChan chan os.Signal) error { } }() - a := app.New(app.ServerConnector(server)) + a := app.New(app.ServerConnector(server.Channels())) api := api4.Init(a, server.Router) wsapi.Init(server) diff --git a/jobs/active_users/worker.go b/jobs/active_users/worker.go index 6c49c6268a..4fdb26ce9a 100644 --- a/jobs/active_users/worker.go +++ b/jobs/active_users/worker.go @@ -28,7 +28,7 @@ type Worker struct { func init() { app.RegisterJobsActiveUsersInterface(func(s *app.Server) tjobs.ActiveUsersJobInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ActiveUsersJobInterfaceImpl{a} }) } diff --git a/jobs/expirynotify/expirynotify.go b/jobs/expirynotify/expirynotify.go index 3451cabca0..ae8bc98d44 100644 --- a/jobs/expirynotify/expirynotify.go +++ b/jobs/expirynotify/expirynotify.go @@ -14,7 +14,7 @@ type ExpiryNotifyJobInterfaceImpl struct { func init() { app.RegisterJobsExpiryNotifyJobInterface(func(s *app.Server) tjobs.ExpiryNotifyJobInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ExpiryNotifyJobInterfaceImpl{a} }) } diff --git a/jobs/export_delete/worker.go b/jobs/export_delete/worker.go index 2a3e459d10..099f813c72 100644 --- a/jobs/export_delete/worker.go +++ b/jobs/export_delete/worker.go @@ -16,7 +16,7 @@ import ( func init() { app.RegisterJobsExportDeleteInterface(func(s *app.Server) tjobs.ExportDeleteInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ExportDeleteInterfaceImpl{a} }) } diff --git a/jobs/export_process/worker.go b/jobs/export_process/worker.go index ecde5bc604..14e5e9c7d3 100644 --- a/jobs/export_process/worker.go +++ b/jobs/export_process/worker.go @@ -16,7 +16,7 @@ import ( func init() { app.RegisterJobsExportProcessInterface(func(s *app.Server) tjobs.ExportProcessInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ExportProcessInterfaceImpl{a} }) } diff --git a/jobs/extract_content/worker.go b/jobs/extract_content/worker.go index ed6a427246..2352e024a3 100644 --- a/jobs/extract_content/worker.go +++ b/jobs/extract_content/worker.go @@ -24,7 +24,7 @@ var ignoredFiles = map[string]bool{ func init() { app.RegisterJobsExtractContentInterface(func(s *app.Server) tjobs.ExtractContentInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ExtractContentInterfaceImpl{a} }) } diff --git a/jobs/import_delete/worker.go b/jobs/import_delete/worker.go index 9bdc8bb94e..7ef420baf8 100644 --- a/jobs/import_delete/worker.go +++ b/jobs/import_delete/worker.go @@ -18,7 +18,7 @@ import ( func init() { app.RegisterJobsImportDeleteInterface(func(s *app.Server) tjobs.ImportDeleteInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ImportDeleteInterfaceImpl{a} }) } diff --git a/jobs/import_process/worker.go b/jobs/import_process/worker.go index bbf13981cd..a7c284af66 100644 --- a/jobs/import_process/worker.go +++ b/jobs/import_process/worker.go @@ -22,7 +22,7 @@ import ( func init() { app.RegisterJobsImportProcessInterface(func(s *app.Server) tjobs.ImportProcessInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ImportProcessInterfaceImpl{a} }) } diff --git a/jobs/product_notices/product_notices.go b/jobs/product_notices/product_notices.go index b495b0df67..69e0271d02 100644 --- a/jobs/product_notices/product_notices.go +++ b/jobs/product_notices/product_notices.go @@ -14,7 +14,7 @@ type ProductNoticesJobInterfaceImpl struct { func init() { app.RegisterProductNoticesJobInterface(func(s *app.Server) tjobs.ProductNoticesJobInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ProductNoticesJobInterfaceImpl{a} }) } diff --git a/jobs/resend_invitation_email/resend_invitation_email.go b/jobs/resend_invitation_email/resend_invitation_email.go index d47fef878b..ea2f038f90 100644 --- a/jobs/resend_invitation_email/resend_invitation_email.go +++ b/jobs/resend_invitation_email/resend_invitation_email.go @@ -13,7 +13,7 @@ type ResendInvitationEmailJobInterfaceImpl struct { func init() { app.RegisterJobsResendInvitationEmailInterface(func(s *app.Server) ejobs.ResendInvitationEmailJobInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &ResendInvitationEmailJobInterfaceImpl{a} }) } diff --git a/migrations/helper_test.go b/migrations/helper_test.go index 261d87426b..4f98abe881 100644 --- a/migrations/helper_test.go +++ b/migrations/helper_test.go @@ -67,7 +67,7 @@ func setupTestHelper(enterprise bool) *TestHelper { } th := &TestHelper{ - App: app.New(app.ServerConnector(s)), + App: app.New(app.ServerConnector(s.Channels())), Context: &request.Context{}, Server: s, TestLogger: testLogger, diff --git a/plugin/scheduler/plugin.go b/plugin/scheduler/plugin.go index d035c39f67..63dcc56835 100644 --- a/plugin/scheduler/plugin.go +++ b/plugin/scheduler/plugin.go @@ -14,7 +14,7 @@ type PluginsJobInterfaceImpl struct { func init() { app.RegisterJobsPluginsJobInterface(func(s *app.Server) tjobs.PluginsJobInterface { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) return &PluginsJobInterfaceImpl{a} }) } diff --git a/web/web_test.go b/web/web_test.go index 200bf2efdc..f3ed6d09fc 100644 --- a/web/web_test.go +++ b/web/web_test.go @@ -120,7 +120,7 @@ func setupTestHelper(tb testing.TB, includeCacheLayer bool) *TestHelper { }) ctx := &request.Context{} - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) web := New(a, s.Router) URL = fmt.Sprintf("http://localhost:%v", s.ListenAddr.Port) diff --git a/wsapi/api.go b/wsapi/api.go index ca01cbae4d..98efd84845 100644 --- a/wsapi/api.go +++ b/wsapi/api.go @@ -13,7 +13,7 @@ type API struct { } func Init(s *app.Server) { - a := app.New(app.ServerConnector(s)) + a := app.New(app.ServerConnector(s.Channels())) api := &API{ App: a, Router: s.WebSocketRouter,