MM-18636: limit configuration writes to 4Mb (#12266)

* MM-18636: limit configuration writes to 4Mb

By default, MySQL silently truncates writes that exceed the column type in question. Change the column type from `TEXT` to `MEDIUMTEXT` to allow writes to the `Configurations` and `ConfigurationFiles` table to exceed 65535 bytes.  This is a backwards compatible migration, but does require a rewrite of the table.

However, MySQL is further constrained by the default `max_allowed_packet` value of 4Mb, so limit writes accordingly.

Fixes: https://mattermost.atlassian.net/browse/MM-18636

* simplify unit tests

* fix import
Этот коммит содержится в:
Jesse Hallam
2019-09-27 09:10:38 -03:00
коммит произвёл GitHub
родитель 975055a7e7
Коммит 340287890a
2 изменённых файлов: 79 добавлений и 4 удалений

Просмотреть файл

@@ -451,7 +451,6 @@ func TestDatabaseStoreSet(t *testing.T) {
})
t.Run("persist failed", func(t *testing.T) {
t.Skip("skipping persistence test inside Set")
_, tearDown := setupConfigDatabase(t, emptyConfig, nil)
defer tearDown()
@@ -466,13 +465,29 @@ func TestDatabaseStoreSet(t *testing.T) {
newCfg := &model.Config{}
_, err = ds.Set(newCfg)
if assert.Error(t, err) {
assert.True(t, strings.HasPrefix(err.Error(), "failed to persist: failed to write to database"))
}
require.Error(t, err)
assert.True(t, strings.HasPrefix(err.Error(), "failed to persist: failed to query active configuration"), "unexpected error: "+err.Error())
assert.Equal(t, "", *ds.Get().ServiceSettings.SiteURL)
})
t.Run("persist failed: too long", func(t *testing.T) {
_, tearDown := setupConfigDatabase(t, emptyConfig, nil)
defer tearDown()
ds, err := config.NewDatabaseStore(fmt.Sprintf("%s://%s", *sqlSettings.DriverName, *sqlSettings.DataSource))
require.NoError(t, err)
defer ds.Close()
longSiteURL := fmt.Sprintf("http://%s", strings.Repeat("a", config.MaxWriteLength))
newCfg := emptyConfig.Clone()
newCfg.ServiceSettings.SiteURL = sToP(longSiteURL)
_, err = ds.Set(newCfg)
require.Error(t, err)
assert.True(t, strings.HasPrefix(err.Error(), "failed to persist: marshalled configuration failed length check: value is too long"), "unexpected error: "+err.Error())
})
t.Run("listeners notified", func(t *testing.T) {
activeId, tearDown := setupConfigDatabase(t, emptyConfig, nil)
defer tearDown()
@@ -809,6 +824,22 @@ func TestDatabaseSetFile(t *testing.T) {
require.NoError(t, err)
require.Equal(t, []byte("overwritten file"), data)
})
t.Run("max length", func(t *testing.T) {
longFile := bytes.Repeat([]byte{0x0}, config.MaxWriteLength)
err := ds.SetFile("toolong", longFile)
require.NoError(t, err)
})
t.Run("too long", func(t *testing.T) {
longFile := bytes.Repeat([]byte{0x0}, config.MaxWriteLength+1)
err := ds.SetFile("toolong", longFile)
if assert.Error(t, err) {
assert.True(t, strings.HasPrefix(err.Error(), "file data failed length check: value is too long"))
}
})
}
func TestDatabaseHasFile(t *testing.T) {