diff --git a/api4/system.go b/api4/system.go index 870e0058c5..1f1a6d1f41 100644 --- a/api4/system.go +++ b/api4/system.go @@ -130,6 +130,20 @@ func updateConfig(c *Context, w http.ResponseWriter, r *http.Request) { // Do not allow plugin uploads to be toggled through the API cfg.PluginSettings.EnableUploads = c.App.GetConfig().PluginSettings.EnableUploads + // If the Message Export feature has been toggled in the System Console, rewrite the ExportFromTimestamp field to an + // appropriate value. The rewriting occurs here to ensure it doesn't affect values written to the config file + // directly and not through the System Console UI. + if *cfg.MessageExportSettings.EnableExport != *c.App.GetConfig().MessageExportSettings.EnableExport { + if *cfg.MessageExportSettings.EnableExport && *cfg.MessageExportSettings.ExportFromTimestamp == int64(0) { + // When the feature is toggled on, use the current timestamp as the start time for future exports. + cfg.MessageExportSettings.ExportFromTimestamp = model.NewInt64(model.GetMillis()) + } else if !*cfg.MessageExportSettings.EnableExport { + // When the feature is disabled, reset the timestamp so that the timestamp will be set if + // the feature is re-enabled from the System Console in future. + cfg.MessageExportSettings.ExportFromTimestamp = model.NewInt64(0) + } + } + err := c.App.SaveConfig(cfg, true) if err != nil { c.Err = err diff --git a/api4/system_test.go b/api4/system_test.go index ba7d9b24a2..570530df18 100644 --- a/api4/system_test.go +++ b/api4/system_test.go @@ -147,6 +147,74 @@ func TestUpdateConfig(t *testing.T) { }) } +func TestUpdateConfigMessageExportSpecialHandling(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + + messageExportEnabled := *th.App.Config().MessageExportSettings.EnableExport + messageExportTimestamp := *th.App.Config().MessageExportSettings.ExportFromTimestamp + + defer th.App.UpdateConfig(func(cfg *model.Config) { + *cfg.MessageExportSettings.EnableExport = messageExportEnabled + *cfg.MessageExportSettings.ExportFromTimestamp = messageExportTimestamp + }) + + th.App.UpdateConfig(func(cfg *model.Config) { + *cfg.MessageExportSettings.EnableExport = false + *cfg.MessageExportSettings.ExportFromTimestamp = int64(0) + }) + + // Turn it on, timestamp should be updated. + cfg, resp := th.SystemAdminClient.GetConfig() + CheckNoError(t, resp) + + *cfg.MessageExportSettings.EnableExport = true + cfg, resp = th.SystemAdminClient.UpdateConfig(cfg) + CheckNoError(t, resp) + + assert.True(t, *th.App.Config().MessageExportSettings.EnableExport) + assert.NotEqual(t, int64(0), *th.App.Config().MessageExportSettings.ExportFromTimestamp) + + // Turn it off, timestamp should be cleared. + cfg, resp = th.SystemAdminClient.GetConfig() + CheckNoError(t, resp) + + *cfg.MessageExportSettings.EnableExport = false + cfg, resp = th.SystemAdminClient.UpdateConfig(cfg) + CheckNoError(t, resp) + + assert.False(t, *th.App.Config().MessageExportSettings.EnableExport) + assert.Equal(t, int64(0), *th.App.Config().MessageExportSettings.ExportFromTimestamp) + + // Set a value from the config file. + th.App.UpdateConfig(func(cfg *model.Config) { + *cfg.MessageExportSettings.EnableExport = false + *cfg.MessageExportSettings.ExportFromTimestamp = int64(12345) + }) + + // Turn it on, timestamp should *not* be updated. + cfg, resp = th.SystemAdminClient.GetConfig() + CheckNoError(t, resp) + + *cfg.MessageExportSettings.EnableExport = true + cfg, resp = th.SystemAdminClient.UpdateConfig(cfg) + CheckNoError(t, resp) + + assert.True(t, *th.App.Config().MessageExportSettings.EnableExport) + assert.Equal(t, int64(12345), *th.App.Config().MessageExportSettings.ExportFromTimestamp) + + // Turn it off, timestamp should be cleared. + cfg, resp = th.SystemAdminClient.GetConfig() + CheckNoError(t, resp) + + *cfg.MessageExportSettings.EnableExport = false + cfg, resp = th.SystemAdminClient.UpdateConfig(cfg) + CheckNoError(t, resp) + + assert.False(t, *th.App.Config().MessageExportSettings.EnableExport) + assert.Equal(t, int64(0), *th.App.Config().MessageExportSettings.ExportFromTimestamp) +} + func TestGetEnvironmentConfig(t *testing.T) { os.Setenv("MM_SERVICESETTINGS_SITEURL", "http://example.mattermost.com") os.Setenv("MM_SERVICESETTINGS_ENABLECUSTOMEMOJI", "true") diff --git a/model/config.go b/model/config.go index ab7975d466..c7ce669ee1 100644 --- a/model/config.go +++ b/model/config.go @@ -1886,14 +1886,6 @@ func (s *MessageExportSettings) SetDefaults() { s.ExportFromTimestamp = NewInt64(0) } - if s.EnableExport != nil && *s.EnableExport && *s.ExportFromTimestamp == int64(0) { - // when the feature is enabled via the System Console, use the current timestamp as the start time for future exports - s.ExportFromTimestamp = NewInt64(GetMillis()) - } else if s.EnableExport != nil && !*s.EnableExport { - // when the feature is disabled, reset the timestamp so that the timestamp will be set if the feature is re-enabled - s.ExportFromTimestamp = NewInt64(0) - } - if s.BatchSize == nil { s.BatchSize = NewInt(10000) } diff --git a/model/config_test.go b/model/config_test.go index 179bab8e2b..79b6e4389c 100644 --- a/model/config_test.go +++ b/model/config_test.go @@ -360,6 +360,7 @@ func TestMessageExportSetDefaults(t *testing.T) { } func TestMessageExportSetDefaultsExportEnabledExportFromTimestampNil(t *testing.T) { + // Test retained as protection against regression of MM-13185 mes := &MessageExportSettings{ EnableExport: NewBool(true), } @@ -367,12 +368,13 @@ func TestMessageExportSetDefaultsExportEnabledExportFromTimestampNil(t *testing. require.True(t, *mes.EnableExport) require.Equal(t, "01:00", *mes.DailyRunTime) - require.NotEqual(t, int64(0), *mes.ExportFromTimestamp) + require.Equal(t, int64(0), *mes.ExportFromTimestamp) require.True(t, *mes.ExportFromTimestamp <= GetMillis()) require.Equal(t, 10000, *mes.BatchSize) } func TestMessageExportSetDefaultsExportEnabledExportFromTimestampZero(t *testing.T) { + // Test retained as protection against regression of MM-13185 mes := &MessageExportSettings{ EnableExport: NewBool(true), ExportFromTimestamp: NewInt64(0), @@ -381,7 +383,7 @@ func TestMessageExportSetDefaultsExportEnabledExportFromTimestampZero(t *testing require.True(t, *mes.EnableExport) require.Equal(t, "01:00", *mes.DailyRunTime) - require.NotEqual(t, int64(0), *mes.ExportFromTimestamp) + require.Equal(t, int64(0), *mes.ExportFromTimestamp) require.True(t, *mes.ExportFromTimestamp <= GetMillis()) require.Equal(t, 10000, *mes.BatchSize) } @@ -425,6 +427,7 @@ func TestMessageExportSetDefaultsExportDisabledExportFromTimestampZero(t *testin } func TestMessageExportSetDefaultsExportDisabledExportFromTimestampNonZero(t *testing.T) { + // Test retained as protection against regression of MM-13185 mes := &MessageExportSettings{ EnableExport: NewBool(false), ExportFromTimestamp: NewInt64(12345), @@ -433,7 +436,7 @@ func TestMessageExportSetDefaultsExportDisabledExportFromTimestampNonZero(t *tes require.False(t, *mes.EnableExport) require.Equal(t, "01:00", *mes.DailyRunTime) - require.Equal(t, int64(0), *mes.ExportFromTimestamp) + require.Equal(t, int64(12345), *mes.ExportFromTimestamp) require.Equal(t, 10000, *mes.BatchSize) }