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
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
975055a7e7
Коммит
340287890a
@@ -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) {
|
||||
|
||||
Ссылка в новой задаче
Block a user